From ea0ddc94ccc63cec77bcac3ef02832806adcd667 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Thu, 27 Oct 2022 19:24:00 -0700 Subject: [PATCH] Fix NPE in coverage collector (#114177) --- .../lib/src/test/coverage_collector.dart | 2 +- .../coverage_collector_test.dart | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart index 1a96cdb2134..3036c93c36a 100644 --- a/packages/flutter_tools/lib/src/test/coverage_collector.dart +++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart @@ -36,7 +36,7 @@ class CoverageCollector extends TestWatcher { Set? libraryNames; final coverage.Resolver? resolver; - final Map>> _ignoredLinesInFilesCache = >>{}; + final Map>?> _ignoredLinesInFilesCache = >?>{}; final TestTimeRecorder? testTimeRecorder; diff --git a/packages/flutter_tools/test/general.shard/coverage_collector_test.dart b/packages/flutter_tools/test/general.shard/coverage_collector_test.dart index 23bd2523871..aa41240f6cc 100644 --- a/packages/flutter_tools/test/general.shard/coverage_collector_test.dart +++ b/packages/flutter_tools/test/general.shard/coverage_collector_test.dart @@ -481,6 +481,40 @@ void main() { } }); + testWithoutContext('Coverage collector respects ignore whole file', () async { + Directory? tempDir; + try { + tempDir = Directory.systemTemp.createTempSync('flutter_coverage_collector_test.'); + final File packagesFile = writeFooBarPackagesJson(tempDir); + final Directory fooDir = Directory('${tempDir.path}/foo/'); + fooDir.createSync(); + final File fooFile = File('${fooDir.path}/foo.dart'); + fooFile.writeAsStringSync('hit\nnohit but ignored // coverage:ignore-file\nhit\n'); + + final String packagesPath = packagesFile.path; + final CoverageCollector collector = CoverageCollector( + libraryNames: {'foo', 'bar'}, + verbose: false, + packagesPath: packagesPath, + resolver: await CoverageCollector.getResolver(packagesPath) + ); + await collector.collectCoverage( + TestTestDevice(), + serviceOverride: createFakeVmServiceHostWithFooAndBar(libraryFilters: ['package:foo/', 'package:bar/']).vmService, + ); + + final Map gottenHitmap = {}; + await collector.finalizeCoverage(formatter: (Map hitmap) { + gottenHitmap.addAll(hitmap); + return ''; + }); + expect(gottenHitmap.keys.toList()..sort(), ['package:bar/bar.dart']); + expect(gottenHitmap['package:bar/bar.dart']!.lineHits, {21: 1, 32: 0, 47: 1, 86: 0}); + } finally { + tempDir?.deleteSync(recursive: true); + } + }); + testWithoutContext('Coverage collector records test timings when provided TestTimeRecorder', () async { Directory? tempDir; try {