forked from flutter/flutter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tool_subsharding.dart
79 lines (67 loc) · 2.2 KB
/
tool_subsharding.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright 2014 The Flutter Authors. 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:convert';
import 'dart:io';
class TestSpecs {
TestSpecs({
required this.path,
required this.startTime,
});
final String path;
int startTime;
int? _endTime;
int get milliseconds {
return endTime - startTime;
}
set endTime(int value) {
_endTime = value;
}
int get endTime {
if (_endTime == null) {
return 0;
}
return _endTime!;
}
String toJson() {
return json.encode(
<String, String>{'path': path, 'runtime': milliseconds.toString()}
);
}
}
/// Intended to parse the output file of `dart test --file-reporter json:file_name
Map<int, TestSpecs> generateMetrics(File metrics) {
final Map<int, TestSpecs> allTestSpecs = <int, TestSpecs>{};
if (!metrics.existsSync()) {
return allTestSpecs;
}
bool success = false;
for(final String metric in metrics.readAsLinesSync()) {
final Map<String, dynamic> entry = json.decode(metric) as Map<String, dynamic>;
if (entry.containsKey('suite')) {
final Map<dynamic, dynamic> suite = entry['suite'] as Map<dynamic, dynamic>;
allTestSpecs[suite['id'] as int] = TestSpecs(
path: suite['path'] as String,
startTime: entry['time'] as int,
);
} else if (_isMetricDone(entry, allTestSpecs)) {
final Map<dynamic, dynamic> group = entry['group'] as Map<dynamic, dynamic>;
final int suiteID = group['suiteID'] as int;
final TestSpecs testSpec = allTestSpecs[suiteID]!;
testSpec.endTime = entry['time'] as int;
} else if (entry.containsKey('success') && entry['success'] == true) {
success = true;
}
}
if (!success) { // means that not all tests succeeded therefore no metrics are stored
return <int, TestSpecs>{};
}
return allTestSpecs;
}
bool _isMetricDone(Map<String, dynamic> entry, Map<int, TestSpecs> allTestSpecs) {
if (entry.containsKey('group') && entry['type'] as String == 'group') {
final Map<dynamic, dynamic> group = entry['group'] as Map<dynamic, dynamic>;
return allTestSpecs.containsKey(group['suiteID'] as int);
}
return false;
}