blob: 998c6253d9149098e609879aca64678d68e33ec7 [file] [log] [blame]
// Copyright 2016 The Vanadium 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 'package:coverage/coverage.dart';
import 'package:path/path.dart' as path;
import '../globals.dart';
class CoverageCollector {
List<Future<Null>> _jobs = <Future<Null>>[];
Map<String, dynamic> _globalHitmap;
void collectCoverage(String observatoryUrl) {
RegExp urlPattern = new RegExp(r'http://(.*):(\d+)');
Match urlMatcher = urlPattern.firstMatch(observatoryUrl);
if (urlMatcher == null) {
printError('Cannot parse host name and port '
'from observatory url $observatoryUrl');
return;
}
String host = urlMatcher.group(1);
int port = int.parse(urlMatcher.group(2));
_jobs.add(_startJob(
host: host,
port: port
));
}
Future<Null> _startJob({
String host,
int port
}) async {
Map<String, dynamic> data = await collect(host, port, false, false);
Map<String, dynamic> hitmap = createHitmap(data['coverage']);
if (_globalHitmap == null) {
_globalHitmap = hitmap;
} else {
mergeHitmaps(hitmap, _globalHitmap);
}
}
Future<Null> finishPendingJobs() async {
await Future.wait(
_jobs.toList(),
eagerError: true
).catchError(
(e) {
print('Collecting coverage error: ${e.error}');
}
);
}
Future<String> finalizeCoverage(String appRootPath) async {
if (_globalHitmap == null)
return null;
Resolver resolver
= new Resolver(packagesPath: path.join(appRootPath, '.packages'));
LcovFormatter formatter = new LcovFormatter(resolver);
List<String> reportOn = <String>[path.join(appRootPath, 'lib')];
return await formatter.format(
_globalHitmap,
reportOn: reportOn,
basePath: appRootPath
);
}
}