blob: e837918604af9e14d3b9394e0c840ba00836a402 [file] [log] [blame]
import 'package:test/test.dart';
import 'package:fxtest/fxtest.dart';
import 'package:mockito/mockito.dart';
// Mock this because it checks environment variables
class MockEnvReader extends Mock implements EnvReader {}
void main() {
group('tests.json entries are correctly parsed', () {
var envReader = MockEnvReader();
when(envReader.getEnv('FUCHSIA_DIR')).thenReturn('/root/path/fuchsia');
when(envReader.getEnv('FUCHSIA_BUILD_DIR')).thenReturn(
'/root/path/fuchsia/out/default',
);
var fuchsiaLocator = FuchsiaLocator(envReader: envReader);
test('with respect to custom fuchsia locations', () {
var testDef = TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx, // <-- this one is all that matters for this test
os: 'linux',
path: 'random-letters',
name: 'host test',
);
expect(
testDef.executionHandle.fx,
'/root/path/fuchsia/.jiri_root/bin/fx',
);
});
test('for host tests', () {
TestsManifestReader tr = TestsManifestReader();
List<dynamic> testJson = [
{
'environments': [],
'test': {
'cpu': 'x64',
'runtime_deps':
'host_x64/gen/topaz/tools/doc_checker/doc_checker_tests.deps.json',
'path': 'host_x64/doc_checker_tests',
'name': '//topaz/tools/doc_checker:doc_checker_tests',
'os': 'linux'
}
},
];
List<TestDefinition> tds = tr.parseManifest(
testJson: testJson,
buildDir: fuchsiaLocator.buildDir,
fxLocation: fuchsiaLocator.fx,
);
expect(tds, hasLength(1));
expect(tds[0].packageUrl, null);
expect(tds[0].runtimeDeps, testJson[0]['test']['runtime_deps']);
expect(tds[0].path, testJson[0]['test']['path']);
expect(tds[0].name, testJson[0]['test']['name']);
expect(tds[0].cpu, testJson[0]['test']['cpu']);
expect(tds[0].os, testJson[0]['test']['os']);
expect(tds[0].executionHandle.testType, TestType.host);
});
test('for device tests', () {
TestsManifestReader tr = TestsManifestReader();
List<dynamic> testJson = [
{
'environments': [],
'test': {
'cpu': 'arm64',
'path':
'/pkgfs/packages/run_test_component_test/0/test/run_test_component_test',
'name':
'//garnet/bin/run_test_component/test:run_test_component_test',
'os': 'fuchsia',
'package_url':
'fuchsia-pkg://fuchsia.com/run_test_component_test#meta/run_test_component_test.cmx',
}
},
];
List<TestDefinition> tds = tr.parseManifest(
testJson: testJson,
buildDir: fuchsiaLocator.buildDir,
fxLocation: fuchsiaLocator.fx,
);
expect(tds, hasLength(1));
expect(tds[0].packageUrl.toString(), testJson[0]['test']['package_url']);
expect(tds[0].runtimeDeps, '');
expect(tds[0].path, testJson[0]['test']['path']);
expect(tds[0].name, testJson[0]['test']['name']);
expect(tds[0].cpu, testJson[0]['test']['cpu']);
expect(tds[0].os, testJson[0]['test']['os']);
expect(tds[0].executionHandle.testType, TestType.component);
});
test('for unsupported tests', () {
TestsManifestReader tr = TestsManifestReader();
List<dynamic> testJson = [
{
'environments': [],
'test': {
'cpu': 'arm64',
'name':
'//garnet/bin/run_test_component/test:run_test_component_test',
'os': 'fuchsia',
}
},
];
List<TestDefinition> tds = tr.parseManifest(
testJson: testJson,
buildDir: fuchsiaLocator.buildDir,
fxLocation: fuchsiaLocator.fx,
);
expect(tds, hasLength(1));
expect(tds[0].path, '');
expect(tds[0].executionHandle.testType, TestType.unsupported);
});
test('for unsupported device tests', () {
TestsManifestReader tr = TestsManifestReader();
List<dynamic> testJson = [
{
'environments': [],
'test': {
'cpu': 'arm64',
'name': 'some_name',
'path': '//asdf',
'os': 'fuchsia',
}
},
];
List<TestDefinition> tds = tr.parseManifest(
testJson: testJson,
buildDir: fuchsiaLocator.buildDir,
fxLocation: fuchsiaLocator.fx,
);
expect(tds, hasLength(1));
expect(tds[0].executionHandle.testType, TestType.unsupportedDeviceTest);
});
});
group('tests are aggregated correctly', () {
var envReader = MockEnvReader();
when(envReader.getCwd()).thenReturn('/root/path/fuchsia/out/default');
when(envReader.getEnv('FUCHSIA_DIR')).thenReturn('/root/path/fuchsia');
when(envReader.getEnv('FUCHSIA_BUILD_DIR'))
.thenReturn('/root/path/fuchsia/out/default');
var fuchsiaLocator = FuchsiaLocator(envReader: envReader);
TestRunner buildTestRunner(TestsConfig testsConfig) => TestRunner();
void _ignoreEvents(TestEvent _) {}
TestsManifestReader tr = TestsManifestReader();
List<TestDefinition> testDefinitions = [
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
os: 'fuchsia',
fx: fuchsiaLocator.fx,
packageUrl: PackageUrl.fromString(
'fuchsia-pkg://fuchsia.com/fancy#meta/test1.cmx'),
name: 'device test',
),
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
os: 'linux',
path: '/asdf',
name: '//host/test',
),
];
// Helper function to parse lots of data for tests
ParsedManifest parseFromArgs({
List<String> args = const [],
List<TestDefinition> testDefs,
}) {
TestsConfig testsConfig = TestsConfig.fromRawArgs(rawArgs: args);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
return tr.aggregateTests(
eventEmitter: _ignoreEvents,
matchLength: testsConfig.flags.matchLength,
testBundleBuilder: cmd.testBundleBuilder,
testsConfig: testsConfig,
testDefinitions: testDefs ?? testDefinitions,
);
}
test('when the --exact flag is passed for a test name', () {
// --exact correctly catches exact name matches
ParsedManifest parsedManifest =
parseFromArgs(args: ['//host/test', '--exact']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, '//host/test');
// --exact kills partial name matches
parsedManifest = parseFromArgs(args: ['//host', '--exact']);
expect(parsedManifest.testBundles, hasLength(0));
});
test('when the --exact flag is passed for a test path', () {
// --exact correctly catches exact path matches
ParsedManifest parsedManifest = parseFromArgs(args: ['/asdf', '--exact']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.path, '/asdf');
// --exact kills partial path matches
parsedManifest = parseFromArgs(args: ['asdf', '--exact']);
expect(parsedManifest.testBundles, hasLength(0));
});
test('when the --exact flag is passed for a test packageUrl', () {
// --exact correctly catches exact packageUrl matches
ParsedManifest parsedManifest = parseFromArgs(
args: ['fuchsia-pkg://fuchsia.com/fancy#meta/test1.cmx', '--exact']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, 'device test');
// --exact kills partial packageUrl matches
parsedManifest =
parseFromArgs(args: ['fuchsia-pkg://fuchsia.com/fancy', '--exact']);
expect(parsedManifest.testBundles, hasLength(0));
});
test('when the -h flag is passed', () {
ParsedManifest parsedManifest = parseFromArgs(args: ['//host/test']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, '//host/test');
});
test('when the -d flag is passed', () {
ParsedManifest parsedManifest = parseFromArgs(
args: ['fuchsia-pkg://fuchsia.com/fancy#meta/test1.cmx', '--device'],
);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, 'device test');
});
test('when no flags are passed', () {
ParsedManifest parsedManifest = parseFromArgs();
expect(parsedManifest.testBundles, hasLength(2));
});
test('when packageUrl.resourcePath is matched', () {
ParsedManifest parsedManifest = parseFromArgs(args: ['test1.cmx']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, 'device test');
});
test('when packageUrl.rawResource is matched', () {
ParsedManifest parsedManifest = parseFromArgs(args: ['test1']);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, 'device test');
});
test('when packageUrl.resourcePath are not components', () {
expect(
() => TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
os: 'fuchsia',
packageUrl: PackageUrl.fromString(
'fuchsia-pkg://fuchsia.com/fancy#meta/not-component'),
name: 'asdf-one',
),
throwsA(TypeMatcher<MalformedFuchsiaUrlException>()),
);
expect(
() => TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
os: 'fuchsia',
packageUrl: PackageUrl.fromString(
'fuchsia-pkg://fuchsia.com/fancy#bin/def-not-comp.so'),
name: 'asdf-two',
),
throwsA(TypeMatcher<MalformedFuchsiaUrlException>()),
);
});
test('when packageUrl.packageName is matched', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(rawArgs: ['fancy']);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: testDefinitions,
testsConfig: testsConfig,
);
expect(parsedManifest.testBundles, hasLength(1));
expect(parsedManifest.testBundles[0].testDefinition.name, 'device test');
});
test(
'when packageUrl.packageName is matched but discriminating '
'flag prevents', () {
TestsConfig testsConfig =
TestsConfig.fromRawArgs(rawArgs: ['fancy', '--host']);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: testDefinitions,
testsConfig: testsConfig,
);
expect(parsedManifest.testBundles, hasLength(0));
});
test('when . is passed from the build dir', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(
rawArgs: ['.', '--host'],
fuchsiaLocator: fuchsiaLocator,
);
// Copy the list
var tds = testDefinitions.sublist(0)
..addAll([
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
name: 'awesome host test',
os: 'linux',
path: 'host_x64/test',
),
]);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
expect(parsedManifest.testBundles, hasLength(1));
expect(
parsedManifest.testBundles[0].testDefinition.name,
'awesome host test',
);
});
test('when . is passed from the build dir and there\'s device tests', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(
rawArgs: ['.'],
fuchsiaLocator: fuchsiaLocator,
);
// Copy the list
var tds = testDefinitions.sublist(0)
..addAll([
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
name: 'awesome device test',
os: 'fuchsia',
path: '/pkgfs/stuff',
),
]);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
expect(parsedManifest.testBundles, hasLength(0));
});
});
group('test hints are generated correctly', () {
var fxtestDef = TestDefinition.fromJson(
{
'environments': [],
'test': {
'cpu': 'x64',
'label': '//scripts/fxtest:fxtest_tests(//build/toolchain:host_x64)',
'name': 'fxtest_tests',
'os': 'linux',
'path': 'host_x64/fxtest_tests',
'runtime_deps': 'host_x64/gen/scripts/fxtest/fxtest_tests.deps.json'
}
},
buildDir: '/whatever',
fx: 'fx',
);
var randomDef = TestDefinition.fromJson(
{
'environments': [],
'test': {
'cpu': 'x64',
'label': '//path/whatever:whatever_tests(//build/toolchain:host_x64)',
'name': 'whatever_tests',
'os': 'linux',
'path': 'host_x64/whatever_tests',
'runtime_deps':
'host_x64/gen/scripts/whatever/whatever_tests.deps.json'
}
},
buildDir: '/whatever',
fx: 'fx',
);
test('with a typo inside a path', () {
var reader = TestsManifestReader();
var config = TestsConfig.fromRawArgs(rawArgs: ['scripts/fxtets']);
var parsedManifest = reader.aggregateTests(
comparer: FuzzyComparer(threshold: 3),
eventEmitter: (TestEvent event) => null,
matchLength: MatchLength.partial,
testBundleBuilder: (TestDefinition _testDef, [double confidence]) =>
TestBundle.build(
testDefinition: _testDef,
testRunnerBuilder: (testsConfig) => TestRunner(),
timeElapsedSink: (duration, cmd, output) => null,
workingDirectory: '/whatever',
testsConfig: config,
),
testDefinitions: [fxtestDef, randomDef],
testsConfig: config,
);
expect(parsedManifest.testBundles.length, 1);
expect(parsedManifest.testBundles[0].testDefinition.name, 'fxtest_tests');
});
test('with an fxtest typo', () {
var reader = TestsManifestReader();
var config = TestsConfig.fromRawArgs(rawArgs: ['fxtest_tetss']);
var parsedManifest = reader.aggregateTests(
comparer: FuzzyComparer(threshold: 3),
eventEmitter: (TestEvent event) => null,
matchLength: MatchLength.partial,
testBundleBuilder: (TestDefinition _testDef, [double confidence]) =>
TestBundle.build(
testDefinition: _testDef,
testRunnerBuilder: (testsConfig) => TestRunner(),
timeElapsedSink: (duration, cmd, output) => null,
workingDirectory: '/whatever',
testsConfig: config,
),
testDefinitions: [fxtestDef, randomDef],
testsConfig: config,
);
expect(parsedManifest.testBundles.length, 1);
});
});
group('tests are aggregated correctly with the -a flag', () {
var envReader = MockEnvReader();
when(envReader.getEnv('FUCHSIA_DIR')).thenReturn('/root/path/fuchsia');
when(envReader.getEnv('FUCHSIA_BUILD_DIR'))
.thenReturn('/root/path/fuchsia/out/default');
var fuchsiaLocator = FuchsiaLocator(envReader: envReader);
TestRunner buildTestRunner(TestsConfig testsConfig) => TestRunner();
void _ignoreEvents(TestEvent _) {}
TestsManifestReader tr = TestsManifestReader();
var tds = <TestDefinition>[
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
os: 'fuchsia',
fx: fuchsiaLocator.fx,
packageUrl: PackageUrl.fromString(
'fuchsia-pkg://fuchsia.com/pkg1#meta/test1.cmx'),
name: 'pkg 1 test 1',
),
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
os: 'fuchsia',
fx: fuchsiaLocator.fx,
packageUrl:
PackageUrl.fromString('fuchsia-pkg://fuchsia.com/pkg1#test2.cmx'),
name: 'pkg 1 test 2',
),
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
os: 'fuchsia',
fx: fuchsiaLocator.fx,
packageUrl:
PackageUrl.fromString('fuchsia-pkg://fuchsia.com/pkg2#test1.cmx'),
name: 'pkg 2 test 1',
path: '//gnsubtree',
),
TestDefinition(
buildDir: fuchsiaLocator.buildDir,
fx: fuchsiaLocator.fx,
os: 'linux',
path: '/asdf',
name: '//host/test',
),
];
test('specifies a non-trailing component name with no package name', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(
rawArgs: ['-c', 'test2', '//host/test'],
);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
var bundles = parsedManifest.testBundles;
expect(bundles, hasLength(2));
expect(bundles[0].testDefinition.name, 'pkg 1 test 2');
expect(bundles[1].testDefinition.name, '//host/test');
});
test('specifies an impossible combination of two valid filters', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(
rawArgs: ['pkg1', '-a', '//host/test'],
);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
expect(parsedManifest.testBundles, hasLength(0));
});
test('is not present to remove other pkg matches', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(rawArgs: ['pkg1']);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
var bundles = parsedManifest.testBundles;
expect(bundles, hasLength(2));
expect(bundles[0].testDefinition.name, 'pkg 1 test 1');
expect(bundles[1].testDefinition.name, 'pkg 1 test 2');
});
test('combines filters from different fields', () {
TestsConfig testsConfig =
TestsConfig.fromRawArgs(rawArgs: ['//gnsubtree', '-a', 'test1']);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
var bundles = parsedManifest.testBundles;
expect(bundles, hasLength(1));
expect(bundles[0].testDefinition.name, 'pkg 2 test 1');
});
test('is not present to remove other component matches', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(rawArgs: ['test1']);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
var bundles = parsedManifest.testBundles;
expect(bundles, hasLength(2));
expect(bundles[0].testDefinition.name, 'pkg 1 test 1');
expect(bundles[1].testDefinition.name, 'pkg 2 test 1');
});
test('when it removes other matches', () {
TestsConfig testsConfig = TestsConfig.fromRawArgs(
// `-a` flag will filter out `test1`
rawArgs: ['pkg1', '-a', 'test2', '//host/test'],
);
var cmd = FuchsiaTestCommand.fromConfig(
testsConfig,
testRunnerBuilder: buildTestRunner,
);
ParsedManifest parsedManifest = tr.aggregateTests(
eventEmitter: _ignoreEvents,
testBundleBuilder: cmd.testBundleBuilder,
testDefinitions: tds,
testsConfig: testsConfig,
);
var bundles = parsedManifest.testBundles;
expect(bundles, hasLength(2));
expect(bundles[0].testDefinition.name, 'pkg 1 test 2');
expect(bundles[1].testDefinition.name, '//host/test');
});
});
}