Auto merge of #9469 - fhahn:compiletest2, r=jdm

Integrate compiletest_rs

This PR integrates `compiletest_rs` as suggested in #5646. I created a new  `tests/compiletest` directory which contains separate crates for the tests.

Currently this PR includes `compile-fail` tests for some lints (acutally all except  inheritance_integrity, beacuse I'm not sure how to include the dom stuff in a way the `#[dom_struct]` works).

I gathered that there should be more crates for which compiletests make sense and would appreciate any pointers to relevant crates.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9469)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-02-04 21:00:21 +05:30
commit d574b78313
13 changed files with 257 additions and 1 deletions

View file

@ -11,6 +11,7 @@ matrix:
script: script:
- ./mach build -d --verbose - ./mach build -d --verbose
- ./mach test-unit - ./mach test-unit
- ./mach test-compiletest
- bash etc/ci/lockfile_changed.sh - bash etc/ci/lockfile_changed.sh
- bash etc/ci/manifest_changed.sh - bash etc/ci/manifest_changed.sh
cache: cache:

View file

@ -6,6 +6,7 @@ dependencies = [
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"canvas 0.0.1", "canvas 0.0.1",
"canvas_traits 0.0.1", "canvas_traits 0.0.1",
"compiletest_helper 0.0.1",
"compositing 0.0.1", "compositing 0.0.1",
"devtools 0.0.1", "devtools 0.0.1",
"devtools_traits 0.0.1", "devtools_traits 0.0.1",
@ -28,6 +29,7 @@ dependencies = [
"net_traits 0.0.1", "net_traits 0.0.1",
"net_traits_tests 0.0.1", "net_traits_tests 0.0.1",
"offscreen_gl_context 0.1.0 (git+https://github.com/ecoal95/rust-offscreen-rendering-context)", "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", "plugin_tests 0.0.1",
"profile 0.0.1", "profile 0.0.1",
"profile_traits 0.0.1", "profile_traits 0.0.1",
@ -238,6 +240,21 @@ name = "color_quant"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" 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]] [[package]]
name = "compositing" name = "compositing"
version = "0.0.1" version = "0.0.1"
@ -1384,6 +1401,14 @@ name = "pkg-config"
version = "0.3.5" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" 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]] [[package]]
name = "plugin_tests" name = "plugin_tests"
version = "0.0.1" version = "0.0.1"

View file

@ -41,6 +41,12 @@ path = "../../tests/unit/style"
[dev-dependencies.util_tests] [dev-dependencies.util_tests]
path = "../../tests/unit/util" path = "../../tests/unit/util"
[dev-dependencies.compiletest_helper]
path = "../../tests/compiletest/helper"
[dev-dependencies.plugin_compiletest]
path = "../../tests/compiletest/plugin"
[[test]] [[test]]
name = "reftest" name = "reftest"
path = "../../tests/reftest.rs" path = "../../tests/reftest.rs"

View file

@ -109,7 +109,10 @@ class MachCommands(CommandBase):
"include_arg": "include"}), "include_arg": "include"}),
("unit", {"kwargs": {}, ("unit", {"kwargs": {},
"paths": [path.abspath(path.join("tests", "unit"))], "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"]} 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: if result != 0:
return result 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', @Command('test-ref',
description='Run the reference tests', description='Run the reference tests',
category='testing') category='testing')

View file

@ -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"

View file

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

View file

@ -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"

View file

@ -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() {}

View file

@ -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() {}

View file

@ -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()
}

View file

@ -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
}

View file

@ -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() {}

View file

@ -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");
}