diff options
author | Florian Hahn <flo@fhahn.com> | 2016-01-28 00:58:15 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2016-02-04 16:00:09 +0100 |
commit | dfdbcabc2e9803a1beb975af8c3aa37331476f85 (patch) | |
tree | 5ee88933118bfa47d0b18c110489c7c05852bf31 | |
parent | 46b3eb653579a40632f91497a3d48f1d7fbd40cc (diff) | |
download | servo-dfdbcabc2e9803a1beb975af8c3aa37331476f85.tar.gz servo-dfdbcabc2e9803a1beb975af8c3aa37331476f85.zip |
Add infrastructure for compiletests
Also adds compilefail tests for some lints, closes #5646.
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | components/servo/Cargo.lock | 25 | ||||
-rw-r--r-- | components/servo/Cargo.toml | 6 | ||||
-rw-r--r-- | python/servo/testing_commands.py | 64 | ||||
-rw-r--r-- | tests/compiletest/helper/Cargo.toml | 12 | ||||
-rw-r--r-- | tests/compiletest/helper/lib.rs | 29 | ||||
-rw-r--r-- | tests/compiletest/plugin/Cargo.toml | 15 | ||||
-rw-r--r-- | tests/compiletest/plugin/compile-fail/ban.rs | 18 | ||||
-rw-r--r-- | tests/compiletest/plugin/compile-fail/privatize.rs | 16 | ||||
-rw-r--r-- | tests/compiletest/plugin/compile-fail/str_to_string.rs | 16 | ||||
-rw-r--r-- | tests/compiletest/plugin/compile-fail/transmute_type.rs | 19 | ||||
-rw-r--r-- | tests/compiletest/plugin/compile-fail/unrooted_must_root.rs | 27 | ||||
-rw-r--r-- | tests/compiletest/plugin/lib.rs | 10 |
13 files changed, 257 insertions, 1 deletions
diff --git a/.travis.yml b/.travis.yml index 5c810b5064b..63fc4ddddcc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ matrix: script: - ./mach build -d --verbose - ./mach test-unit + - ./mach test-compiletest - bash etc/ci/lockfile_changed.sh - bash etc/ci/manifest_changed.sh cache: diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 57069e9b9ea..30c67e8bdef 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -6,6 +6,7 @@ dependencies = [ "bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "canvas 0.0.1", "canvas_traits 0.0.1", + "compiletest_helper 0.0.1", "compositing 0.0.1", "devtools 0.0.1", "devtools_traits 0.0.1", @@ -28,6 +29,7 @@ dependencies = [ "net_traits 0.0.1", "net_traits_tests 0.0.1", "offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)", + "plugin_compiletest 0.0.1", "plugin_tests 0.0.1", "profile 0.0.1", "profile_traits 0.0.1", @@ -237,6 +239,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "compiletest_helper" +version = "0.0.1" +dependencies = [ + "compiletest_rs 0.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "compiletest_rs" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "compositing" version = "0.0.1" dependencies = [ @@ -1374,6 +1391,14 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "plugin_compiletest" +version = "0.0.1" +dependencies = [ + "compiletest_helper 0.0.1", + "plugins 0.0.1", +] + +[[package]] name = "plugin_tests" version = "0.0.1" dependencies = [ diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index e2c8c6766b8..242eb9f2777 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -41,6 +41,12 @@ path = "../../tests/unit/style" [dev-dependencies.util_tests] path = "../../tests/unit/util" +[dev-dependencies.compiletest_helper] +path = "../../tests/compiletest/helper" + +[dev-dependencies.plugin_compiletest] +path = "../../tests/compiletest/plugin" + [[test]] name = "reftest" path = "../../tests/reftest.rs" diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py index 142a59e766f..d9d26366d20 100644 --- a/python/servo/testing_commands.py +++ b/python/servo/testing_commands.py @@ -109,7 +109,10 @@ class MachCommands(CommandBase): "include_arg": "include"}), ("unit", {"kwargs": {}, "paths": [path.abspath(path.join("tests", "unit"))], - "include_arg": "test_name"}) + "include_arg": "test_name"}), + ("compiletest", {"kwargs": {"release": release}, + "paths": [path.abspath(path.join("tests", "compiletest"))], + "include_arg": "test_name"}) ]) suites_by_prefix = {path: k for k, v in suites.iteritems() if "paths" in v for path in v["paths"]} @@ -207,6 +210,65 @@ class MachCommands(CommandBase): if result != 0: return result + @Command('test-compiletest', + description='Run compiletests', + category='testing') + @CommandArgument('--package', '-p', default=None, help="Specific package to test") + @CommandArgument('test_name', nargs=argparse.REMAINDER, + help="Only run tests that match this pattern or file path") + @CommandArgument('--release', default=False, action="store_true", + help="Run with a release build of servo") + def test_compiletest(self, test_name=None, package=None, release=False): + if test_name is None: + test_name = [] + + self.ensure_bootstrapped() + + if package: + packages = {package} + else: + packages = set() + + test_patterns = [] + for test in test_name: + # add package if 'tests/compiletest/<package>' + match = re.search("tests/compiletest/(\\w+)/?$", test) + if match: + packages.add(match.group(1)) + # add package & test if '<package>/<test>', 'tests/compiletest/<package>/<test>.rs', or similar + elif re.search("\\w/\\w", test): + tokens = test.split("/") + packages.add(tokens[-2]) + test_prefix = tokens[-1] + if test_prefix.endswith(".rs"): + test_prefix = test_prefix[:-3] + test_prefix += "::" + test_patterns.append(test_prefix) + # add test as-is otherwise + else: + test_patterns.append(test) + + if not packages: + packages = set(os.listdir(path.join(self.context.topdir, "tests", "compiletest"))) + + packages.remove("helper") + + args = ["cargo", "test"] + for crate in packages: + args += ["-p", "%s_compiletest" % crate] + args += test_patterns + + env = self.build_env() + if release: + env["BUILD_MODE"] = "release" + args += ["--release"] + else: + env["BUILD_MODE"] = "debug" + + result = call(args, env=env, cwd=self.servo_crate()) + if result != 0: + return result + @Command('test-ref', description='Run the reference tests', category='testing') diff --git a/tests/compiletest/helper/Cargo.toml b/tests/compiletest/helper/Cargo.toml new file mode 100644 index 00000000000..a5c3028d53c --- /dev/null +++ b/tests/compiletest/helper/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "compiletest_helper" +version = "0.0.1" +authors = ["The Servo Project Developers"] + +[lib] +name = "compiletest_helper" +path = "lib.rs" +doctest = false + +[dependencies.compiletest_rs] +compiletest_rs = "0.11" diff --git a/tests/compiletest/helper/lib.rs b/tests/compiletest/helper/lib.rs new file mode 100644 index 00000000000..2ec43d3f522 --- /dev/null +++ b/tests/compiletest/helper/lib.rs @@ -0,0 +1,29 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate compiletest_rs as compiletest; + +use std::env; +use std::path::PathBuf; + +pub fn run_mode(mode: &'static str) { + + let mut config = compiletest::default_config(); + let cfg_mode = mode.parse().ok().expect("Invalid mode"); + + config.mode = cfg_mode; + config.src_base = PathBuf::from(format!("{}", mode)); + + let mut base_path = env::current_dir().expect("Current directory is invalid"); + base_path.pop(); + base_path.pop(); + base_path.pop(); + + let mode = env::var("BUILD_MODE").expect("BUILD_MODE environment variable must be set"); + let debug_path = base_path.join(PathBuf::from(format!("target/{}", mode))); + let deps_path = base_path.join(PathBuf::from(format!("target/{}/deps", mode))); + + config.target_rustcflags = Some(format!("-L {} -L {}", debug_path.display(), deps_path.display())); + compiletest::run_tests(&config); +} diff --git a/tests/compiletest/plugin/Cargo.toml b/tests/compiletest/plugin/Cargo.toml new file mode 100644 index 00000000000..6ba2a22f198 --- /dev/null +++ b/tests/compiletest/plugin/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "plugin_compiletest" +version = "0.0.1" +authors = ["The Servo Project Developers"] + +[lib] +name = "plugin_compiletest" +path = "lib.rs" +doctest = false + +[dependencies.compiletest_helper] +path = "../helper" + +[dependencies.plugins] +path = "../../../components/plugins" diff --git a/tests/compiletest/plugin/compile-fail/ban.rs b/tests/compiletest/plugin/compile-fail/ban.rs new file mode 100644 index 00000000000..b789597d59d --- /dev/null +++ b/tests/compiletest/plugin/compile-fail/ban.rs @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(plugin)] +#![plugin(plugins)] + +extern crate js; + +use js::jsval::JSVal; +use std::cell::Cell; + +struct Foo { + bar: Cell<JSVal> + //~^ ERROR Banned type Cell<JSVal> detected. Use MutHeap<JSVal> instead, +} + +fn main() {} diff --git a/tests/compiletest/plugin/compile-fail/privatize.rs b/tests/compiletest/plugin/compile-fail/privatize.rs new file mode 100644 index 00000000000..a6f2ffdbe62 --- /dev/null +++ b/tests/compiletest/plugin/compile-fail/privatize.rs @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(plugin, custom_attribute)] +#![plugin(plugins)] +#![allow(dead_code)] + +#[privatize] +struct Foo { + pub v1: i32, + //~^ ERROR Field v1 is public where only private fields are allowed + v2: i32 +} + +fn main() {} diff --git a/tests/compiletest/plugin/compile-fail/str_to_string.rs b/tests/compiletest/plugin/compile-fail/str_to_string.rs new file mode 100644 index 00000000000..ee45ee39b96 --- /dev/null +++ b/tests/compiletest/plugin/compile-fail/str_to_string.rs @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(plugin)] +#![plugin(plugins)] + + +fn main() { + let x = "foo".to_string(); + //~^ ERROR str.to_owned() is more efficient than str.to_string() + + let x = &x[..]; + x.to_string(); + //~^ ERROR str.to_owned() is more efficient than str.to_string() +} diff --git a/tests/compiletest/plugin/compile-fail/transmute_type.rs b/tests/compiletest/plugin/compile-fail/transmute_type.rs new file mode 100644 index 00000000000..42bdd8c8c0f --- /dev/null +++ b/tests/compiletest/plugin/compile-fail/transmute_type.rs @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(plugin)] +#![plugin(plugins)] +#![allow(dead_code)] +#![deny(transmute_type_lint)] + +use std::mem::{self, transmute}; + + +fn main() { + let _: &[u8] = unsafe { transmute("Rust") }; + //~^ ERROR Transmute to &[u8] from &'static str detected + + let _: &[u8] = unsafe { mem::transmute("Rust") }; + //~^ ERROR Transmute to &[u8] from &'static str detected +} diff --git a/tests/compiletest/plugin/compile-fail/unrooted_must_root.rs b/tests/compiletest/plugin/compile-fail/unrooted_must_root.rs new file mode 100644 index 00000000000..f9b6d29dbee --- /dev/null +++ b/tests/compiletest/plugin/compile-fail/unrooted_must_root.rs @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(plugin)] +#![plugin(plugins)] +#![allow(dead_code)] + +#[must_root] +struct Foo { + v: i32 +} + +struct Bar { + f: Foo + //~^ ERROR Type must be rooted, use #[must_root] on the struct definition to propagate +} + +fn foo1(_: Foo) {} //~ ERROR Type must be rooted + + +fn foo2() -> Foo { //~ ERROR Type must be rooted + Foo { v: 10 } +} + + +fn main() {} diff --git a/tests/compiletest/plugin/lib.rs b/tests/compiletest/plugin/lib.rs new file mode 100644 index 00000000000..d3466c57b9b --- /dev/null +++ b/tests/compiletest/plugin/lib.rs @@ -0,0 +1,10 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate compiletest_helper; + +#[test] +fn compile_test() { + compiletest_helper::run_mode("compile-fail"); +} |