blob: 58e8497410ba43b7884e44fc6b004e58224870ea [file] [log] [blame]
// Copyright (c) 2022, 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 'dart:convert' show json;
import 'dart:io';
import 'package:coverage/coverage.dart';
import 'package:coverage/src/util.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_process/test_process.dart';
import 'test_util.dart';
final _collectAppPath = p.join('bin', 'collect_coverage.dart');
final _funcCovApp = p.join('test', 'test_files', 'function_coverage_app.dart');
final _sampleAppFileUri = p.toUri(p.absolute(_funcCovApp)).toString();
void main() {
test('Function coverage', () async {
final resultString = await _collectCoverage();
final jsonResult = json.decode(resultString) as Map<String, dynamic>;
final coverage = jsonResult['coverage'] as List;
final hitMap = await HitMap.parseJson(
coverage.cast<Map<String, dynamic>>(),
);
// function_coverage_app.dart.
expect(hitMap, contains(_sampleAppFileUri));
final isolateFile = hitMap[_sampleAppFileUri]!;
expect(isolateFile.funcHits, {
7: 1,
16: 1,
21: 1,
25: 1,
29: 1,
36: 1,
42: 1,
47: 1,
});
expect(isolateFile.funcNames, {
7: 'normalFunction',
16: 'SomeClass.SomeClass',
21: 'SomeClass.normalMethod',
25: 'SomeClass.staticMethod',
29: 'SomeClass.abstractMethod',
36: 'SomeExtension.extensionMethod',
42: 'OtherClass.otherMethod',
47: 'main',
});
// test_library.dart.
final testLibraryPath =
p.absolute(p.join('test', 'test_files', 'test_library.dart'));
final testLibraryUri = p.toUri(testLibraryPath).toString();
expect(hitMap, contains(testLibraryUri));
final libraryfile = hitMap[testLibraryUri]!;
expect(libraryfile.funcHits, {9: 1});
expect(libraryfile.funcNames, {9: 'libraryFunction'});
// test_library_part.dart.
final testLibraryPartPath =
p.absolute(p.join('test', 'test_files', 'test_library_part.dart'));
final testLibraryPartUri = p.toUri(testLibraryPartPath).toString();
expect(hitMap, contains(testLibraryPartUri));
final libraryPartFile = hitMap[testLibraryPartUri]!;
expect(libraryPartFile.funcHits, {7: 1});
expect(libraryPartFile.funcNames, {7: 'otherLibraryFunction'});
});
}
Future<String> _collectCoverage() async {
expect(FileSystemEntity.isFileSync(_funcCovApp), isTrue);
final openPort = await getOpenPort();
// Run the sample app with the right flags.
final sampleProcess = await TestProcess.start(Platform.resolvedExecutable, [
'--enable-vm-service=$openPort',
'--pause_isolates_on_exit',
_funcCovApp
]);
final serviceUri = await serviceUriFromProcess(sampleProcess.stdoutStream());
// Run the collection tool.
final toolResult = await TestProcess.start(Platform.resolvedExecutable, [
_collectAppPath,
'--function-coverage',
'--uri',
'$serviceUri',
'--resume-isolates',
'--wait-paused'
]);
await toolResult.shouldExit(0).timeout(
timeout,
onTimeout: () =>
throw StateError('We timed out waiting for the tool to finish.'),
);
await sampleProcess.shouldExit();
return toolResult.stdoutStream().join('\n');
}