// 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( {'path': path, 'runtime': milliseconds.toString()} ); } } /// Intended to parse the output file of `dart test --file-reporter json:file_name Map generateMetrics(File metrics) { final Map allTestSpecs = {}; if (!metrics.existsSync()) { return allTestSpecs; } bool success = false; for(final String metric in metrics.readAsLinesSync()) { final Map entry = json.decode(metric) as Map; if (entry.containsKey('suite')) { final Map suite = entry['suite'] as Map; allTestSpecs[suite['id'] as int] = TestSpecs( path: suite['path'] as String, startTime: entry['time'] as int, ); } else if (_isMetricDone(entry, allTestSpecs)) { final Map group = entry['group'] as Map; 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 {}; } return allTestSpecs; } bool _isMetricDone(Map entry, Map allTestSpecs) { if (entry.containsKey('group') && entry['type'] as String == 'group') { final Map group = entry['group'] as Map; return allTestSpecs.containsKey(group['suiteID'] as int); } return false; }