blob: 033f0d64ee65060b5694f8c8a692d2d875cbf5c6 [file] [log] [blame]
// Copyright (c) 2015, 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.
library coverage.test.lcov_test;
import 'dart:async';
import 'dart:io';
import 'package:coverage/coverage.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
final _sampleAppPath = p.join('test', 'test_files', 'test_app.dart');
final _isolateLibPath = p.join('test', 'test_files', 'test_app_isolate.dart');
final _collectAppPath = p.join('bin', 'collect_coverage.dart');
final _sampleAppFileUri = p.toUri(p.absolute(_sampleAppPath)).toString();
final _isolateLibFileUri = p.toUri(p.absolute(_isolateLibPath)).toString();
const _timeout = const Duration(seconds: 5);
void main() {
test('validate hitMap', () async {
var hitmap = await _getHitMap();
expect(hitmap, contains(_sampleAppFileUri));
expect(hitmap, contains(_isolateLibFileUri));
expect(hitmap, contains('package:coverage/src/util.dart'));
var sampleAppHitMap = hitmap[_sampleAppFileUri];
expect(sampleAppHitMap, containsPair(40, greaterThanOrEqualTo(1)),
reason: 'be careful if you modify the test file');
expect(sampleAppHitMap, containsPair(44, 0),
reason: 'be careful if you modify the test file');
expect(sampleAppHitMap, isNot(contains(28)),
reason: 'be careful if you modify the test file');
});
group('LcovFormatter', () {
test('format()', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new LcovFormatter(resolver);
String res = await formatter.format(hitmap);
expect(res, contains(p.absolute(_sampleAppPath)));
expect(res, contains(p.absolute(_isolateLibPath)));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
});
test('format() includes files in reportOn list', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new LcovFormatter(resolver);
String res = await formatter.format(hitmap, reportOn: ['lib/', 'test/']);
expect(res, contains(p.absolute(_sampleAppPath)));
expect(res, contains(p.absolute(_isolateLibPath)));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
});
test('format() excludes files not in reportOn list', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new LcovFormatter(resolver);
String res = await formatter.format(hitmap, reportOn: ['lib/']);
expect(res, isNot(contains(p.absolute(_sampleAppPath))));
expect(res, isNot(contains(p.absolute(_isolateLibPath))));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
});
});
group('PrettyPrintFormatter', () {
test('format()', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new PrettyPrintFormatter(resolver, new Loader());
String res = await formatter.format(hitmap);
expect(res, contains(p.absolute(_sampleAppPath)));
expect(res, contains(p.absolute(_isolateLibPath)));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
// be very careful if you change the test file
expect(res, contains(" 0| return a - b;"));
expect(res, contains('| return _withTimeout(() async {'),
reason: 'be careful if you change lib/src/util.dart');
var hitLineRegexp = new RegExp(r'\s+(\d+)\| return a \+ b;');
var match = hitLineRegexp.allMatches(res).single;
var hitCount = int.parse(match[1]);
expect(hitCount, greaterThanOrEqualTo(1));
});
test('format() includes files in reportOn list', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new PrettyPrintFormatter(resolver, new Loader());
String res = await formatter.format(hitmap, reportOn: ['lib/', 'test/']);
expect(res, contains(p.absolute(_sampleAppPath)));
expect(res, contains(p.absolute(_isolateLibPath)));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
});
test('format() excludes files not in reportOn list', () async {
var hitmap = await _getHitMap();
var resolver = new Resolver(packageRoot: 'packages');
var formatter = new PrettyPrintFormatter(resolver, new Loader());
String res = await formatter.format(hitmap, reportOn: ['lib/']);
expect(res, isNot(contains(p.absolute(_sampleAppPath))));
expect(res, isNot(contains(p.absolute(_isolateLibPath))));
expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
});
});
}
Map _hitMap;
Future<Map> _getHitMap() async {
if (_hitMap == null) {
var tempDir = await Directory.systemTemp.createTemp('coverage.test.');
try {
var files = await _collectCoverage(tempDir);
_hitMap = await parseCoverage(files, 1);
} finally {
await tempDir.delete(recursive: true);
}
}
return _hitMap;
}
Future<List<File>> _collectCoverage(Directory tempDir) async {
expect(await FileSystemEntity.isFile(_sampleAppPath), isTrue);
var args = [
"--enable-vm-service=0",
"--coverage_dir=${tempDir.path}",
_sampleAppPath
];
var result = await Process.run("dart", args);
if (result.exitCode != 0) {
throw new ProcessException(
'dart',
args,
'There was a critical error. Exit code: ${result.exitCode}',
result.exitCode);
}
return await tempDir.list(recursive: false, followLinks: false).toList();
}