mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Bumps the Dart version to 3.8 across the repo (excluding engine/src/flutter/third_party) and applies formatting updates from Dart 3.8. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
99 lines
3.5 KiB
Dart
99 lines
3.5 KiB
Dart
// 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 => endTime - startTime;
|
|
|
|
set endTime(int value) {
|
|
_endTime = value;
|
|
}
|
|
|
|
int get endTime => _endTime ?? 0;
|
|
|
|
String toJson() {
|
|
return json.encode(<String, String>{'path': path, 'runtime': milliseconds.toString()});
|
|
}
|
|
}
|
|
|
|
class TestFileReporterResults {
|
|
TestFileReporterResults._({
|
|
required this.allTestSpecs,
|
|
required this.hasFailedTests,
|
|
required this.errors,
|
|
});
|
|
|
|
/// Intended to parse the output file of `dart test --file-reporter json:file_name
|
|
factory TestFileReporterResults.fromFile(File metrics) {
|
|
if (!metrics.existsSync()) {
|
|
throw Exception('${metrics.path} does not exist');
|
|
}
|
|
|
|
final Map<int, TestSpecs> testSpecs = <int, TestSpecs>{};
|
|
bool hasFailedTests = true;
|
|
final List<String> errors = <String>[];
|
|
|
|
for (final String metric in metrics.readAsLinesSync()) {
|
|
/// Using print within a test adds the printed content to the json file report
|
|
/// as \u0000 making the file parsing step fail. The content of the json file
|
|
/// is expected to be a json dictionary per line and the following line removes
|
|
/// all the additional content at the beginning of the line until it finds the
|
|
/// first opening curly bracket.
|
|
// TODO(godofredoc): remove when https://github.com/flutter/flutter/issues/145553 is fixed.
|
|
final String sanitizedMetric = metric.replaceAll(RegExp(r'$.*{'), '{');
|
|
final Map<String, Object?> entry = json.decode(sanitizedMetric) as Map<String, Object?>;
|
|
if (entry.containsKey('suite')) {
|
|
final Map<String, Object?> suite = entry['suite']! as Map<String, Object?>;
|
|
addTestSpec(suite, entry['time']! as int, testSpecs);
|
|
} else if (isMetricDone(entry, testSpecs)) {
|
|
final Map<String, Object?> group = entry['group']! as Map<String, Object?>;
|
|
final int suiteID = group['suiteID']! as int;
|
|
addMetricDone(suiteID, entry['time']! as int, testSpecs);
|
|
} else if (entry.containsKey('error')) {
|
|
final String stackTrace = entry.containsKey('stackTrace')
|
|
? entry['stackTrace']! as String
|
|
: '';
|
|
errors.add('${entry['error']}\n $stackTrace');
|
|
} else if (entry.containsKey('success') && entry['success'] == true) {
|
|
hasFailedTests = false;
|
|
}
|
|
}
|
|
|
|
return TestFileReporterResults._(
|
|
allTestSpecs: testSpecs,
|
|
hasFailedTests: hasFailedTests,
|
|
errors: errors,
|
|
);
|
|
}
|
|
|
|
final Map<int, TestSpecs> allTestSpecs;
|
|
final bool hasFailedTests;
|
|
final List<String> errors;
|
|
|
|
static void addTestSpec(Map<String, Object?> suite, int time, Map<int, TestSpecs> allTestSpecs) {
|
|
allTestSpecs[suite['id']! as int] = TestSpecs(path: suite['path']! as String, startTime: time);
|
|
}
|
|
|
|
static void addMetricDone(int suiteID, int time, Map<int, TestSpecs> allTestSpecs) {
|
|
final TestSpecs testSpec = allTestSpecs[suiteID]!;
|
|
testSpec.endTime = time;
|
|
}
|
|
|
|
static bool isMetricDone(Map<String, Object?> entry, Map<int, TestSpecs> allTestSpecs) {
|
|
if (entry.containsKey('group') && entry['type']! as String == 'group') {
|
|
final Map<String, Object?> group = entry['group']! as Map<String, Object?>;
|
|
return allTestSpecs.containsKey(group['suiteID']! as int);
|
|
}
|
|
return false;
|
|
}
|
|
}
|