blob: d1c022efa1345867da685486d6ff9fd5017ccb6a [file] [log] [blame]
// Copyright (c) 2020, 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.
import 'package:expect/minitest.dart';
import 'package:smith/smith.dart';
import 'test_helpers.dart';
final configurations = Configuration.expandTemplate(
"foo-(ia32|x64|arm)-(none|dart2js|dartk)-(debug|release)-(d8|vm)-"
"(linux|mac|win)",
{});
void main() {
group("Step", () {
test("non-test step", () {
var step = Step.parse({
"script": "foo.py",
"name": "foo",
}, {}, configurations);
expect(step.isTestStep, isFalse);
expect(step.testedConfiguration, null);
});
test("explicit test step", () {
var step = Step.parse({
"name": "foo",
"script": "tools/test.py",
"arguments": ["-nfoo-x64-none-debug-d8-linux"]
}, {}, configurations);
expect(step.isTestStep, isTrue);
expect(step.testedConfiguration?.name, "foo-x64-none-debug-d8-linux");
});
test("custom test runner step", () {
var step = Step.parse({
"name": "foo",
"script": "foo.py",
"testRunner": true,
"arguments": ["-nfoo-x64-none-debug-d8-linux"]
}, {}, configurations);
expect(step.isTestStep, isTrue);
expect(step.testedConfiguration?.name, "foo-x64-none-debug-d8-linux");
});
test("implicit test step", () {
var step = Step.parse({
"name": "foo",
"arguments": ["-nfoo-x64-none-debug-d8-linux"]
}, {}, configurations);
expect(step.isTestStep, isTrue);
expect(step.testedConfiguration?.name, "foo-x64-none-debug-d8-linux");
});
test("a step can only test one configuration", () {
expectFormatError(
"Step tests multiple configurations: "
"[-nfoo-x64-none-debug-d8-linux, -nfoo-x64-none-release-d8-linux]",
() {
Step.parse({
"name": "foo",
"arguments": [
"-nfoo-x64-none-debug-d8-linux",
"-nfoo-x64-none-release-d8-linux"
]
}, {}, configurations);
});
});
test("a test step using the long option name", () {
var step = Step.parse({
"name": "foo",
"arguments": ["--named_configuration foo-x64-none-debug-d8-linux"]
}, {}, configurations);
expect(step.isTestStep, isTrue);
expect(step.testedConfiguration?.name, "foo-x64-none-debug-d8-linux");
});
test("a test step using multiple values for the argument", () {
expectFormatError(
"Step tests multiple configurations: [-n foo-x64-none-debug-d8-linux,"
"foo-x64-none-release-d8-linux]", () {
Step.parse({
"name": "foo",
"arguments": [
"-n foo-x64-none-debug-d8-linux,foo-x64-none-release-d8-linux"
]
}, {}, configurations);
});
});
test("step arguments can contain arbitrary options and flags", () {
var step = Step.parse({
"name": "foo",
"arguments": ["-nfoo-x64-none-debug-d8-linux", "--bar", "-b=az"]
}, {}, configurations);
expect(step.isTestStep, isTrue);
expect(step.testedConfiguration?.name, "foo-x64-none-debug-d8-linux");
});
test("in non-test steps, argument -n can have arbitrary values", () {
var step = Step.parse({
"script": "foo.py",
"name": "foo",
"arguments": ["-n not-a-configuration"]
}, {}, configurations);
expect(step.isTestStep, isFalse);
});
});
group("Builder", () {
test("'system' is parsed from builder name", () {
expectTestedConfigurations({
"builders": ["foo-linux", "foo-mac", "foo-win"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-debug-d8-${system}"]
}
],
}, [
"foo-x64-none-debug-d8-linux",
"foo-x64-none-debug-d8-mac",
"foo-x64-none-debug-d8-win"
]);
});
});
test("'mode' is parsed from builder name", () {
expectTestedConfigurations({
"builders": ["foo-debug", "foo-release"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-${mode}-d8-linux"]
}
],
}, [
"foo-x64-none-debug-d8-linux",
"foo-x64-none-release-d8-linux"
]);
});
test("'arch' is parsed from builder name", () {
expectTestedConfigurations({
"builders": ["foo-ia32", "foo-x64", "foo-arm"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-${arch}-none-debug-d8-linux"]
}
],
}, [
"foo-ia32-none-debug-d8-linux",
"foo-x64-none-debug-d8-linux",
"foo-arm-none-debug-d8-linux"
]);
});
test("'runtime' is parsed from builder name", () {
expectTestedConfigurations({
"builders": ["foo-d8", "foo-vm"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-debug-${runtime}-linux"]
}
],
}, [
"foo-x64-none-debug-d8-linux",
"foo-x64-none-debug-vm-linux"
]);
});
test("'system' defaults to 'linux'", () {
expectTestedConfigurations({
"builders": ["foo"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-debug-d8-${system}"]
}
],
}, [
"foo-x64-none-debug-d8-linux",
]);
});
test("'mode' defaults to 'release'", () {
expectTestedConfigurations({
"builders": ["foo"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-${mode}-d8-linux"]
}
],
}, [
"foo-x64-none-release-d8-linux",
]);
});
test("'arch' defaults to 'x64'", () {
expectTestedConfigurations({
"builders": ["foo"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-${arch}-none-release-d8-linux"]
}
],
}, [
"foo-x64-none-release-d8-linux",
]);
});
test("'runtime' is not implied by builder name", () {
expectFormatError(
r"Undefined value for 'runtime' in "
r"'-nfoo-x64-none-debug-${runtime}-linux'", () {
parseBuilders([
{
"builders": ["foo"],
"steps": [
{
"name": "foo",
"arguments": [r"-nfoo-x64-none-debug-${runtime}-linux"]
}
],
}
], configurations);
});
});
}
void expectTestedConfigurations(
Map builderConfiguration, List<String> expectedConfigurations) {
var builders = parseBuilders([builderConfiguration], configurations);
int numberOfConfigurations = expectedConfigurations.length;
expect(builders.length, numberOfConfigurations);
for (var builderId = 0; builderId < numberOfConfigurations; builderId++) {
var builder = builders[builderId];
expect(builder.steps.length, 1);
var step = builder.steps[0];
expect(step.isTestStep, isTrue);
}
expect(builders.map((b) => b.steps[0].testedConfiguration!.name).toList(),
equals(expectedConfigurations));
}