flutter/packages/flutter_tools/lib/src/test/coverage_collector.dart

76 lines
2.1 KiB
Dart

// Copyright 2016 The Chromium 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:async';
import 'dart:io';
import 'package:coverage/coverage.dart';
import 'package:path/path.dart' as path;
import '../dart/package_map.dart';
import '../globals.dart';
class CoverageCollector {
static final CoverageCollector instance = new CoverageCollector();
bool enabled = false;
void collectCoverage({
String host,
int port,
Process processToKill
}) {
if (enabled) {
assert(_jobs != null);
_jobs.add(_startJob(
host: host,
port: port,
processToKill: processToKill
));
} else {
processToKill.kill();
}
}
Future<Null> _startJob({
String host,
int port,
Process processToKill
}) async {
int pid = processToKill.pid;
printTrace('collecting coverage data from pid $pid on port $port');
Map<String, dynamic> data = await collect(host, port, false, false);
printTrace('done collecting coverage data from pid $pid');
processToKill.kill();
Map<String, dynamic> hitmap = createHitmap(data['coverage']);
if (_globalHitmap == null)
_globalHitmap = hitmap;
else
mergeHitmaps(hitmap, _globalHitmap);
printTrace('done merging data from pid $pid into global coverage map');
}
Future<Null> finishPendingJobs() async {
await Future.wait(_jobs.toList(), eagerError: true);
}
List<Future<Null>> _jobs = <Future<Null>>[];
Map<String, dynamic> _globalHitmap;
Future<String> finalizeCoverage({ Formatter formatter }) async {
assert(enabled);
await finishPendingJobs();
printTrace('formating coverage data');
if (_globalHitmap == null)
return null;
if (formatter == null) {
Resolver resolver = new Resolver(packagesPath: PackageMap.globalPackagesPath);
String packagePath = Directory.current.path;
List<String> reportOn = <String>[path.join(packagePath, 'lib')];
formatter = new LcovFormatter(resolver, reportOn: reportOn, basePath: packagePath);
}
return await formatter.format(_globalHitmap);
}
}