// 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 'package:flutter_tools/src/test/coverage_collector.dart'; import 'package:vm_service/vm_service.dart'; import '../src/common.dart'; import '../src/fake_vm_services.dart'; void main() { testWithoutContext('Coverage collector Can handle coverage SentinelException', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ FakeVmServiceRequest( method: 'getVersion', jsonResponse: Version(major: 3, minor: 51).toJson(), ), FakeVmServiceRequest( method: 'getVM', jsonResponse: (VM.parse({})! ..isolates = [ IsolateRef.parse({ 'id': '1', })!, ] ).toJson(), ), const FakeVmServiceRequest( method: 'getScripts', args: { 'isolateId': '1', }, jsonResponse: { 'type': 'Sentinel', }, ), ], ); final Map result = await collect( null, {'foo'}, connector: (Uri? uri) async { return fakeVmServiceHost.vmService; }, ); expect(result, {'type': 'CodeCoverage', 'coverage': []}); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); testWithoutContext('Coverage collector processes coverage and script data', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ FakeVmServiceRequest( method: 'getVersion', jsonResponse: Version(major: 3, minor: 51).toJson(), ), FakeVmServiceRequest( method: 'getVM', jsonResponse: (VM.parse({})! ..isolates = [ IsolateRef.parse({ 'id': '1', })!, ] ).toJson(), ), FakeVmServiceRequest( method: 'getScripts', args: { 'isolateId': '1', }, jsonResponse: ScriptList(scripts: [ ScriptRef(uri: 'package:foo/foo.dart', id: '1'), ScriptRef(uri: 'package:bar/bar.dart', id: '2'), ]).toJson(), ), FakeVmServiceRequest( method: 'getSourceReport', args: { 'isolateId': '1', 'reports': ['Coverage'], 'scriptId': '1', 'forceCompile': true, 'reportLines': true, }, jsonResponse: SourceReport( ranges: [ SourceReportRange( scriptIndex: 0, startPos: 0, endPos: 0, compiled: true, coverage: SourceReportCoverage( hits: [1, 3], misses: [2], ), ), ], scripts: [ ScriptRef( uri: 'package:foo/foo.dart', id: '1', ), ], ).toJson(), ), ], ); final Map result = await collect( null, {'foo'}, connector: (Uri? uri) async { return fakeVmServiceHost.vmService; }, ); expect(result, { 'type': 'CodeCoverage', 'coverage': [ { 'source': 'package:foo/foo.dart', 'script': { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/package%3Afoo%2Ffoo.dart', 'uri': 'package:foo/foo.dart', '_kind': 'library', }, 'hits': [1, 1, 3, 1, 2, 0], }, ], }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); testWithoutContext('Coverage collector with null libraryNames accepts all libraries', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ FakeVmServiceRequest( method: 'getVersion', jsonResponse: Version(major: 3, minor: 51).toJson(), ), FakeVmServiceRequest( method: 'getVM', jsonResponse: (VM.parse({})! ..isolates = [ IsolateRef.parse({ 'id': '1', })!, ] ).toJson(), ), FakeVmServiceRequest( method: 'getScripts', args: { 'isolateId': '1', }, jsonResponse: ScriptList(scripts: [ ScriptRef(uri: 'package:foo/foo.dart', id: '1'), ScriptRef(uri: 'package:bar/bar.dart', id: '2'), ]).toJson(), ), FakeVmServiceRequest( method: 'getSourceReport', args: { 'isolateId': '1', 'reports': ['Coverage'], 'scriptId': '1', 'forceCompile': true, 'reportLines': true, }, jsonResponse: SourceReport( ranges: [ SourceReportRange( scriptIndex: 0, startPos: 0, endPos: 0, compiled: true, coverage: SourceReportCoverage( hits: [1, 3], misses: [2], ), ), ], scripts: [ ScriptRef( uri: 'package:foo/foo.dart', id: '1', ), ], ).toJson(), ), FakeVmServiceRequest( method: 'getSourceReport', args: { 'isolateId': '1', 'reports': ['Coverage'], 'scriptId': '2', 'forceCompile': true, 'reportLines': true, }, jsonResponse: SourceReport( ranges: [ SourceReportRange( scriptIndex: 0, startPos: 0, endPos: 0, compiled: true, coverage: SourceReportCoverage( hits: [47, 21], misses: [32, 86], ), ), ], scripts: [ ScriptRef( uri: 'package:bar/bar.dart', id: '2', ), ], ).toJson(), ), ], ); final Map result = await collect( null, null, connector: (Uri? uri) async { return fakeVmServiceHost.vmService; }, ); expect(result, { 'type': 'CodeCoverage', 'coverage': [ { 'source': 'package:foo/foo.dart', 'script': { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/package%3Afoo%2Ffoo.dart', 'uri': 'package:foo/foo.dart', '_kind': 'library', }, 'hits': [1, 1, 3, 1, 2, 0], }, { 'source': 'package:bar/bar.dart', 'script': { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/package%3Abar%2Fbar.dart', 'uri': 'package:bar/bar.dart', '_kind': 'library', }, 'hits': [47, 1, 21, 1, 32, 0, 86, 0], }, ], }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); testWithoutContext('Coverage collector with libraryFilters', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ FakeVmServiceRequest( method: 'getVersion', jsonResponse: Version(major: 3, minor: 57).toJson(), ), FakeVmServiceRequest( method: 'getVM', jsonResponse: (VM.parse({})! ..isolates = [ IsolateRef.parse({ 'id': '1', })!, ] ).toJson(), ), FakeVmServiceRequest( method: 'getSourceReport', args: { 'isolateId': '1', 'reports': ['Coverage'], 'forceCompile': true, 'reportLines': true, 'libraryFilters': ['package:foo/'], }, jsonResponse: SourceReport( ranges: [ SourceReportRange( scriptIndex: 0, startPos: 0, endPos: 0, compiled: true, coverage: SourceReportCoverage( hits: [1, 3], misses: [2], ), ), ], scripts: [ ScriptRef( uri: 'package:foo/foo.dart', id: '1', ), ], ).toJson(), ), ], ); final Map result = await collect( null, {'foo'}, connector: (Uri? uri) async { return fakeVmServiceHost.vmService; }, ); expect(result, { 'type': 'CodeCoverage', 'coverage': [ { 'source': 'package:foo/foo.dart', 'script': { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/package%3Afoo%2Ffoo.dart', 'uri': 'package:foo/foo.dart', '_kind': 'library', }, 'hits': [1, 1, 3, 1, 2, 0], }, ], }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); testWithoutContext('Coverage collector with libraryFilters and null libraryNames', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ FakeVmServiceRequest( method: 'getVersion', jsonResponse: Version(major: 3, minor: 57).toJson(), ), FakeVmServiceRequest( method: 'getVM', jsonResponse: (VM.parse({})! ..isolates = [ IsolateRef.parse({ 'id': '1', })!, ] ).toJson(), ), FakeVmServiceRequest( method: 'getSourceReport', args: { 'isolateId': '1', 'reports': ['Coverage'], 'forceCompile': true, 'reportLines': true, }, jsonResponse: SourceReport( ranges: [ SourceReportRange( scriptIndex: 0, startPos: 0, endPos: 0, compiled: true, coverage: SourceReportCoverage( hits: [1, 3], misses: [2], ), ), ], scripts: [ ScriptRef( uri: 'package:foo/foo.dart', id: '1', ), ], ).toJson(), ), ], ); final Map result = await collect( null, null, connector: (Uri? uri) async { return fakeVmServiceHost.vmService; }, ); expect(result, { 'type': 'CodeCoverage', 'coverage': [ { 'source': 'package:foo/foo.dart', 'script': { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/package%3Afoo%2Ffoo.dart', 'uri': 'package:foo/foo.dart', '_kind': 'library', }, 'hits': [1, 1, 3, 1, 2, 0], }, ], }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); }