chromium/tools/perfbot-analysis/swarming-task.js

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

// SwarmingTask represents a task in the swarming server.
class SwarmingTask {
  constructor(runner, json) {
    this.query_runner_ = runner;
    this.task_id_ = json.task_id;
    this.run_id_ = json.run_id || undefined;
    this.failure_ = json.failure;
    this.state_ = json.state;
    this.tags_ = {};
    json.tags.map(tag => {
      const parts = tag.split(':');
      this.tags_[parts.shift()] = parts.join(':');
    });
  }

  get name() {
    return this.tags_.name;
  }
  get task_id() {
    return this.task_id_;
  }
};

// A ChildSwarmingTask is the task that actually runs tests and contains
// artifacts. So to find all the failed tests, it downloads the artifacts from
// the swarming server, and parses the `output.json` file.
class ChildSwarmingTask extends SwarmingTask {
  // Returns a promoise for a parsed JSON object from the contents in
  // `filename` for this task.
  async downloadJSONFile(filename) {
    return this.query_runner_.retrieveJSONFile(this.task_id_, filename);
  }
};

// A ParentSwarmingTask itself does not run tests. It delegates the job of
// running the tests to a ChildSwarmingTask. Therefore, to find all the all
// failing tests, it needs to aggregate the failed tests of all its children
// swarming tasks.
class ParentSwarmingTask extends SwarmingTask {
  findChildTasks() {
    const results =
        this.query_runner_.retrieveTasks(`parent_task_id:${this.run_id_}`);
    return results.map(r => new ChildSwarmingTask(this.query_runner_, r));
  }
};

module.exports = {
  ParentSwarmingTask,
};