blob: fa6e54705485b6e2ce3e274271293c3a0972f9bd [file] [log] [blame]
// Copyright (c) 2017, 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.
@TestOn("vm")
import 'dart:io';
import 'package:test_descriptor/test_descriptor.dart' as d;
import 'package:test_process/test_process.dart';
import 'package:test/src/backend/test_platform.dart';
import 'package:test/src/runner/browser/default_settings.dart';
import 'package:test/src/util/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';
import '../../io.dart';
void main() {
setUp(() async {
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""").create();
});
group("override_platforms", () {
group("can override a browser", () {
test("without any changes", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings: {}
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
test("that's user-defined", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings: {}
override_platforms:
chromium:
settings: {}
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
test("with a basename-only executable", () async {
await d.file("dart_test.yaml", """
override_platforms:
dartium:
settings:
executable:
linux: dartium
mac_os: dartium
windows: dartium.exe
""").create();
var test = await runTest(["-p", "dartium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "dartium");
test("with an absolute-path executable", () async {
String path;
if (Platform.isLinux) {
var process = await TestProcess.start("which", ["google-chrome"]);
path = await process.stdout.next;
await process.shouldExit(0);
} else {
path = defaultSettings[TestPlatform.chrome].executable;
}
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable: $path
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
});
test("can override Node.js without any changes", () async {
await d.file("dart_test.yaml", """
override_platforms:
node:
settings: {}
""").create();
var test = await runTest(["-p", "node", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "node");
group("errors", () {
test("rejects a non-map value", () async {
await d.file("dart_test.yaml", "override_platforms: 12").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["override_platforms must be a map.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-string key", () async {
await d
.file("dart_test.yaml", "override_platforms: {12: null}")
.create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["Platform identifier must be a string.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-identifier-like key", () async {
await d
.file("dart_test.yaml", "override_platforms: {foo bar: null}")
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder([
"Platform identifier must be an (optionally hyphenated) Dart "
"identifier.",
"^^^^^^^"
]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-map definition", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome: 12
""").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["Platform definition must be a map.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("requires a settings key", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome: {}
""").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(['Missing required field "settings".', "^^"]));
await test.shouldExit(exit_codes.data);
});
test("settings must be a map", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings: null
""").create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['Must be a map.', "^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("the overridden platform must exist", () async {
await d.file("dart_test.yaml", """
override_platforms:
chromium:
settings: {}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stderr,
containsInOrder(['Unknown platform "chromium".', "^^^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("uncustomizable platforms can't be overridden", () async {
await d.file("dart_test.yaml", """
override_platforms:
vm:
settings: {}
""").create();
var test = await runTest(["-p", "vm", "test.dart"]);
expect(test.stdout,
containsInOrder(['The "vm" platform can\'t be customized.', "^^"]));
await test.shouldExit(1);
});
group("when overriding browsers", () {
test("executable must be a string or map", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable: 12
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout,
containsInOrder(['Must be a map or a string.', "^^"]));
await test.shouldExit(1);
});
test("executable string may not be relative on POSIX", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable: foo/bar
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
},
// We allow relative executables for Windows so that Windows users
// can set a global executable without having to explicitly write
// `windows:`.
testOn: "!windows");
test("Linux executable must be a string", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable:
linux: 12
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("Linux executable may not be relative", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable:
linux: foo/bar
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
});
test("Mac OS executable must be a string", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable:
mac_os: 12
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("Mac OS executable may not be relative", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable:
mac_os: foo/bar
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
});
test("Windows executable must be a string", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable:
windows: 12
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("executable must exist", () async {
await d.file("dart_test.yaml", """
override_platforms:
chrome:
settings:
executable: _does_not_exist
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(
test.stdout,
emitsThrough(
contains("Failed to run Chrome: $noSuchFileMessage")));
await test.shouldExit(1);
});
test("executable must exist for Node.js", () async {
await d.file("dart_test.yaml", """
override_platforms:
node:
settings:
executable: _does_not_exist
""").create();
var test = await runTest(["-p", "node", "test.dart"]);
expect(
test.stdout,
emitsThrough(
contains("Failed to run Node.js: $noSuchFileMessage")));
await test.shouldExit(1);
}, tags: "node");
});
});
});
group("define_platforms", () {
group("can define a new browser", () {
group("without any changes", () {
setUp(() async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings: {}
""").create();
});
test("that can be used to run tests", () async {
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
test("that can be used in platform selectors", () async {
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {}, testOn: "chromium");
}
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
test = await runTest(["-p", "chrome", "test.dart"]);
expect(test.stdout, emitsThrough(contains("No tests ran.")));
await test.shouldExit(0);
}, tags: "chrome");
test("that counts as its parent", () async {
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {}, testOn: "chrome");
}
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
});
test("with a basename-only executable", () async {
await d.file("dart_test.yaml", """
define_platforms:
my-dartium:
name: My Dartium
extends: dartium
settings:
executable:
linux: dartium
mac_os: dartium
windows: dartium.exe
""").create();
var test = await runTest(["-p", "my-dartium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "dartium");
test("with an absolute-path executable", () async {
String path;
if (Platform.isLinux) {
var process = await TestProcess.start("which", ["google-chrome"]);
path = await process.stdout.next;
await process.shouldExit(0);
} else {
path = defaultSettings[TestPlatform.chrome].executable;
}
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable: $path
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
}, tags: "chrome");
});
group("errors", () {
test("rejects a non-map value", () async {
await d.file("dart_test.yaml", "define_platforms: 12").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["define_platforms must be a map.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-string key", () async {
await d.file("dart_test.yaml", "define_platforms: {12: null}").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["Platform identifier must be a string.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-identifier-like key", () async {
await d
.file("dart_test.yaml", "define_platforms: {foo bar: null}")
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder([
"Platform identifier must be an (optionally hyphenated) Dart "
"identifier.",
"^^^^^^^"
]));
await test.shouldExit(exit_codes.data);
});
test("rejects a non-map definition", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium: 12
""").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["Platform definition must be a map.", "^^"]));
await test.shouldExit(exit_codes.data);
});
test("requires a name key", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
extends: chrome
settings: {}
""").create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Missing required field "name".', "^^^^^^^^^^^^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("name must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: null
extends: chrome
settings: {}
""").create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['Must be a string.', "^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("requires an extends key", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
settings: {}
""").create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Missing required field "extends".', "^^^^^^^^^^^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("extends must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: null
settings: {}
""").create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(['Platform parent must be a string.', "^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("extends must be identifier-like", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: foo bar
settings: {}
""").create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder([
"Platform parent must be an (optionally hyphenated) Dart "
"identifier.",
"^^^^^^^"
]));
await test.shouldExit(exit_codes.data);
});
test("requires a settings key", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
""").create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Missing required field "settings".', "^^^^^^^^^^^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("settings must be a map", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings: null
""").create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['Must be a map.', "^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("the new platform may not override an existing platform", () async {
await d.file("dart_test.yaml", """
define_platforms:
chrome:
name: Chromium
extends: firefox
settings: {}
""").create();
await d.dir("test").create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder([
'The platform "chrome" already exists. Use override_platforms to '
'override it.',
"^^^^^^"
]));
await test.shouldExit(exit_codes.data);
});
test("the new platform must extend an existing platform", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: foobar
settings: {}
""").create();
await d.dir("test").create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['Unknown platform.', "^^^^^^"]));
await test.shouldExit(exit_codes.data);
});
test("the new platform can't extend an uncustomizable platform",
() async {
await d.file("dart_test.yaml", """
define_platforms:
myvm:
name: My VM
extends: vm
settings: {}
""").create();
var test = await runTest(["-p", "myvm", "test.dart"]);
expect(test.stdout,
containsInOrder(['The "vm" platform can\'t be customized.', "^^"]));
await test.shouldExit(1);
});
group("when overriding browsers", () {
test("executable must be a string or map", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable: 12
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout,
containsInOrder(['Must be a map or a string.', "^^"]));
await test.shouldExit(1);
});
test("executable string may not be relative on POSIX", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable: foo/bar
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
},
// We allow relative executables for Windows so that Windows users
// can set a global executable without having to explicitly write
// `windows:`.
testOn: "!windows");
test("Linux executable must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable:
linux: 12
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("Linux executable may not be relative", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable:
linux: foo/bar
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
});
test("Mac OS executable must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable:
mac_os: 12
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("Mac OS executable may not be relative", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable:
mac_os: foo/bar
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(
test.stdout,
containsInOrder([
'Linux and Mac OS executables may not be relative paths.',
"^^^^^^^"
]));
await test.shouldExit(1);
});
test("Windows executable must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable:
windows: 12
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("executable must exist", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
executable: _does_not_exist
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(
test.stdout,
emitsThrough(
contains("Failed to run Chrome: $noSuchFileMessage")));
await test.shouldExit(1);
});
test("arguments must be a string", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
arguments: 12
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout, containsInOrder(['Must be a string.', "^^"]));
await test.shouldExit(1);
});
test("arguments must be shell parseable", () async {
await d.file("dart_test.yaml", """
define_platforms:
chromium:
name: Chromium
extends: chrome
settings:
arguments: --foo 'bar
""").create();
var test = await runTest(["-p", "chromium", "test.dart"]);
expect(test.stdout,
containsInOrder(['Unmatched single quote.', "^^^^^^^^^^"]));
await test.shouldExit(1);
});
test("with an argument that causes the browser to quit", () async {
await d.file("dart_test.yaml", """
define_platforms:
myfox:
name: My Firefox
extends: firefox
settings:
arguments: --version
""").create();
var test = await runTest(["-p", "myfox", "test.dart"]);
expect(test.stdout,
emitsThrough(contains("My Firefox exited before connecting.")));
await test.shouldExit(1);
}, tags: "firefox");
});
});
});
}