// 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. @Tags(['integration']) library; 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; final coverage = jsonResult['coverage'] as List; final hitMap = await HitMap.parseJson( coverage.cast>(), ); // 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, {7: 1}); expect(libraryfile.funcNames, {7: '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 _collectCoverage() async { expect(FileSystemEntity.isFileSync(_funcCovApp), isTrue); // Run the sample app with the right flags. final sampleProcess = await TestProcess.start(Platform.resolvedExecutable, ['--enable-vm-service=0', '--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'); }