2019-02-28 16:59:11 +00:00
|
|
|
// Copyright (c) 2019, 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.
|
|
|
|
|
|
|
|
// Add fields with data about the test run and the commit tested, and
|
|
|
|
// with the result on the last build tested, to the test results file.
|
|
|
|
|
2020-11-05 07:53:22 +00:00
|
|
|
// @dart = 2.9
|
|
|
|
|
2019-02-28 16:59:11 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
|
Move "test.dart" (well, most of its contents) into pkg/test_runner.
I don't like having a large volume of Dart code sitting under tools/
where it is hard to analyze, lint, test, and reuse. Also, eventually
we want to merge test.dart and test.py. This seems like an easy mostly
mechanical first step.
All I did was:
1. Move the contents of tools/test.dart to
pkg/test_runner/lib/test_runner.dart. (That's not a great file name
since we already have pkg/test_runner/bin/test_runner.dart, but it
was the best I could come up with.
2. Copy tools/bots/results to pkg/test_runner/bot_results.dart. I
don't like duplicating this, but there are other scripts under tools
that import the old location. Eventually, we should have those
scripts import it from package:test_runner/bot_results.dart, but I
didn't want to do that here since I'm not familiar with those other
scripts.
3. Make tools/test.dart import and forward to
pkg/test_runner/lib/test_runner.dart.
4. Fix any linter and type errors. The test_runner package has a bunch
of strictness checks and lints enable to keep it cleaner.
5. Run dartfmt --fix to format and get rid of "new", etc.
Change-Id: Ifc89817508d3fc147fa78dbc6744d547aeaf4c55
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/155240
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Auto-Submit: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Jonas Termansen <sortie@google.com>
2020-07-22 23:00:49 +00:00
|
|
|
import 'package:test_runner/bot_results.dart';
|
2019-02-28 16:59:11 +00:00
|
|
|
|
2020-02-14 13:25:25 +00:00
|
|
|
const skipped = 'skipped';
|
|
|
|
|
2019-02-28 16:59:11 +00:00
|
|
|
main(List<String> args) async {
|
|
|
|
final resultsPath = args[0];
|
|
|
|
final priorResultsPath = args[1];
|
|
|
|
final flakyPath = args[2];
|
|
|
|
final priorFlakyPath = args[3];
|
|
|
|
final builderName = args[4];
|
|
|
|
final buildNumber = args[5];
|
|
|
|
final commitTime = int.parse(args[6]);
|
|
|
|
final commitHash = args[7];
|
|
|
|
final newResultsPath = args[8];
|
|
|
|
// Load the input and the flakiness data if specified.
|
|
|
|
final results = await loadResultsMap(resultsPath);
|
|
|
|
final priorResults = await loadResultsMap(priorResultsPath);
|
|
|
|
final flakes = await loadResultsMap(flakyPath);
|
|
|
|
final priorFlakes = await loadResultsMap(priorFlakyPath);
|
2019-07-30 11:42:26 +00:00
|
|
|
final firstPriorResult =
|
|
|
|
priorResults.isEmpty ? null : priorResults.values.first;
|
2019-02-28 16:59:11 +00:00
|
|
|
|
2020-02-14 13:25:25 +00:00
|
|
|
priorResults.forEach((key, priorResult) {
|
|
|
|
if (priorResult['result'] != skipped) {
|
|
|
|
results.putIfAbsent(key, () => constructNotRunResult(priorResult));
|
|
|
|
}
|
|
|
|
});
|
2019-02-28 16:59:11 +00:00
|
|
|
for (final String key in results.keys) {
|
|
|
|
final Map<String, dynamic> result = results[key];
|
|
|
|
final Map<String, dynamic> priorResult = priorResults[key];
|
|
|
|
final Map<String, dynamic> flaky = flakes[key];
|
|
|
|
final Map<String, dynamic> priorFlaky = priorFlakes[key];
|
|
|
|
result['commit_hash'] = commitHash;
|
|
|
|
result['commit_time'] = commitTime;
|
|
|
|
result['build_number'] = buildNumber;
|
|
|
|
result['builder_name'] = builderName;
|
2020-11-20 13:00:05 +00:00
|
|
|
result['flaky'] = flaky != null && (flaky['active'] ?? true) == true;
|
|
|
|
result['previous_flaky'] =
|
|
|
|
priorFlaky != null && (priorFlaky['active'] ?? true) == true;
|
2019-07-30 11:42:26 +00:00
|
|
|
if (firstPriorResult != null) {
|
|
|
|
result['previous_commit_hash'] = firstPriorResult['commit_hash'];
|
|
|
|
result['previous_commit_time'] = firstPriorResult['commit_time'];
|
|
|
|
result['previous_build_number'] = firstPriorResult['build_number'];
|
|
|
|
}
|
2019-02-28 16:59:11 +00:00
|
|
|
if (priorResult != null) {
|
|
|
|
result['previous_result'] = priorResult['result'];
|
2021-09-29 13:07:19 +00:00
|
|
|
result['changed'] = !(result['result'] == result['previous_result'] &&
|
|
|
|
result['flaky'] == result['previous_flaky'] &&
|
|
|
|
result['expected'] == priorResult['expected']);
|
|
|
|
} else {
|
|
|
|
result['changed'] = true;
|
2019-02-28 16:59:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
final sink = new File(newResultsPath).openWrite();
|
|
|
|
final sorted = results.keys.toList()..sort();
|
|
|
|
for (final key in sorted) {
|
|
|
|
sink.writeln(jsonEncode(results[key]));
|
|
|
|
}
|
|
|
|
sink.close();
|
|
|
|
}
|
2020-02-14 13:25:25 +00:00
|
|
|
|
|
|
|
Map<String, dynamic> constructNotRunResult(Map<String, dynamic> previous) => {
|
|
|
|
for (final key in [
|
|
|
|
'name',
|
|
|
|
'configuration',
|
|
|
|
'suite',
|
|
|
|
'test_name',
|
|
|
|
'expected'
|
|
|
|
])
|
|
|
|
key: previous[key],
|
|
|
|
'time_ms': 0,
|
|
|
|
'result': skipped,
|
|
|
|
'matches': true,
|
|
|
|
'bot_name': '',
|
|
|
|
};
|