| // 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)); |
| } |