blob: b054cb503bc8121b75b407e3ca0a0541f9265636 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:args/command_runner.dart';
import 'package:gardening/src/buildbucket.dart';
import 'package:gardening/src/luci.dart';
import 'package:gardening/src/luci_api.dart';
import 'package:gardening/src/results/result_models.dart' as models;
import 'package:gardening/src/results/test_result_service.dart';
import 'package:gardening/src/util.dart';
/// [TestMatrixCommand] handles when given command 'test-matrix'.
class TestMatrixCommand extends Command {
String get usage => "Run the command by results.dart test-matrix <master>.";
@override
String get description => "Generates a test-matrix for configurations run "
"for a master.";
@override
String get name => "test-matrix";
TestMatrixCommand() {
argParser.addFlag("json",
help: "Set if tool should generate root test-matrix.json",
negatable: false);
}
Future run() async {
if (argResults.rest.length == 0) {
print("Too few arguments given.");
print(usage);
return;
}
if (argResults.rest.length > 1) {
print("Too many arguments given.");
print(usage);
return;
}
String client = argResults.rest.first;
bool isBuildBucket = client == "luci.dart.try";
var logger = createLogger();
var cache = createCacheFunction(logger);
Iterable<String> builders;
if (isBuildBucket) {
Iterable<Builder> luciBuilders = await fetchBuilders(client);
if (luciBuilders != null) {
builders = (await fetchBuilders(client)).map((builder) => builder.name);
}
} else {
var api = new LuciApi();
builders = await getAllBuilders(api, client, cache());
}
if (builders == null) {
print("Could not find any builders for $client. "
"Make sure the name is correct");
return;
}
TestResultService service = new TestResultService(logger, cache);
Iterable<BuilderWithSteps> buildersWithSteps =
await Future.wait(builders.map((builder) async {
Iterable<BuildStepTestResult> steps;
if (isBuildBucket) {
steps = await stepsFromBuildBucket(service, builder);
}
return new BuilderWithSteps(builder, steps);
}));
buildersWithSteps.forEach((buildWithStep) {
print(buildWithStep.name);
buildWithStep.steps.forEach((step) {
print("\t${step.name}");
});
});
}
/// Gets the last build from [builder] and find all steps with [TestResult]
/// for that build.
Future<Iterable<BuildStepTestResult>> stepsFromBuildBucket(
TestResultService service, String builder) async {
Iterable<BuildBucketBuild> builds = await buildsFromBuilder(builder);
if (builds == null || builds.length == 0) {
return [];
}
String prefix = "buildbucket/cr-buildbucket.appspot.com/${builds.first.id}";
return await service.fromPrefix("dart", prefix, true);
}
}
/// Class to hold information about a builder and specific test steps that
/// generates result logs.
class BuilderWithSteps {
final String name;
final Iterable<BuildStepTestResult> steps;
BuilderWithSteps(this.name, this.steps);
}