aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2016-01-28 00:58:15 +0100
committerFlorian Hahn <flo@fhahn.com>2016-02-04 16:00:09 +0100
commitdfdbcabc2e9803a1beb975af8c3aa37331476f85 (patch)
tree5ee88933118bfa47d0b18c110489c7c05852bf31
parent46b3eb653579a40632f91497a3d48f1d7fbd40cc (diff)
downloadservo-dfdbcabc2e9803a1beb975af8c3aa37331476f85.tar.gz
servo-dfdbcabc2e9803a1beb975af8c3aa37331476f85.zip
Add infrastructure for compiletests
Also adds compilefail tests for some lints, closes #5646.
-rw-r--r--.travis.yml1
-rw-r--r--components/servo/Cargo.lock25
-rw-r--r--components/servo/Cargo.toml6
-rw-r--r--python/servo/testing_commands.py64
-rw-r--r--tests/compiletest/helper/Cargo.toml12
-rw-r--r--tests/compiletest/helper/lib.rs29
-rw-r--r--tests/compiletest/plugin/Cargo.toml15
-rw-r--r--tests/compiletest/plugin/compile-fail/ban.rs18
-rw-r--r--tests/compiletest/plugin/compile-fail/privatize.rs16
-rw-r--r--tests/compiletest/plugin/compile-fail/str_to_string.rs16
-rw-r--r--tests/compiletest/plugin/compile-fail/transmute_type.rs19
-rw-r--r--tests/compiletest/plugin/compile-fail/unrooted_must_root.rs27
-rw-r--r--tests/compiletest/plugin/lib.rs10
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");
+}