-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Started working on #4 (support for stable Rust). First issue we need to solve is to get access to the harness (since we don't really want to implement it ourselves). There is https://crates.io/crates/libtest crate, which is recent version of Rust internal test harness, extracted as a crate. However, it only compiles on nightly, so it won't help us here. There is also https://crates.io/crates/rustc-test, but it is 2 years old. I haven't checked its features, but might not support some of the desired functionality (like, JSON output in tests? colored output?). So, the third option (which I'm using here) is to use `test` crate from the Rust itself and also set `RUSTC_BOOTSTRAP=1` for our crate so we can access it on stable channel. Not great, but works for now. Second issue is to get access to the tests. On nightly, we use `#[test_case]` to hijack Rust tests registration so we can get access to them in nightly. Cannot do that on stable. What would help here is something along the lines of https://internals.rust-lang.org/t/idea-global-static-variables-extendable-at-compile-time/9879 or https://internals.rust-lang.org/t/pre-rfc-add-language-support-for-global-constructor-functions. Don't have that, so we use https://crates.io/crates/ctor crate to build our own registry of tests, similar to https://crates.io/crates/inventory. The caveat here is potentially hitting dtolnay/inventory#7 issue which would manifest itself as test being silently ignored. Not great, but let's see how bad it will be. Third piece of the puzzle is to intercept execution of tests. This is done by asking users to use `harness = false` in their `Cargo.toml`, in which case we take full control of test execution. Finally, the last challenge is that with `harness = false`, we don't have a good way to intercept "standard" tests (`#[test]`): https://users.rust-lang.org/t/capturing-test-when-harness-false-in-cargo-toml/28115 So, the plan here is to provide `#[datatest::test]` attribute that will behave similar to built-in `#[test]` attribute, but will use our own registry for tests. No need to support `#[bench]` as it is not supported on stable channel anyway. The caveat in this case is that if you use built-in `#[test]`, your test will be silently ignored. Not great, not sure what to do about it. Proper solution, of course, would be driving RFC for custom test frameworks: rust-lang/rust#50297 😅
- Loading branch information
Ivan Dubrov
committed
Aug 17, 2019
1 parent
5d2d53d
commit 68c5f6a
Showing
10 changed files
with
420 additions
and
266 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
[package] | ||
name = "datatest" | ||
version = "0.3.5" | ||
version = "0.4.0" | ||
authors = ["Ivan Dubrov <[email protected]>"] | ||
edition = "2018" | ||
repository = "https://github.com/commure/datatest" | ||
|
@@ -10,13 +10,21 @@ description = """ | |
Data-driven tests in Rust | ||
""" | ||
|
||
[[test]] | ||
name = "datatest_stable" | ||
harness = false | ||
|
||
[build-dependencies] | ||
version_check = "0.9.1" | ||
|
||
[dependencies] | ||
datatest-derive = { path = "datatest-derive", version = "=0.3.5" } | ||
datatest-derive = { path = "datatest-derive", version = "=0.4.0" } | ||
regex = "1.0.0" | ||
walkdir = "2.1.4" | ||
serde = "1.0.84" | ||
serde_yaml = "0.8.7" | ||
yaml-rust = "0.4.2" | ||
ctor = "0.1.10" | ||
|
||
[dev-dependencies] | ||
serde = { version = "1.0.84", features = ["derive"] } | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
use version_check::Channel; | ||
|
||
fn main() { | ||
let is_nightly = Channel::read().map_or(false, |ch| ch.is_nightly()); | ||
if is_nightly { | ||
println!("cargo:rustc-cfg=feature=\"nightly\""); | ||
} else { | ||
println!("cargo:rustc-cfg=feature=\"stable\""); | ||
} | ||
println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
[package] | ||
name = "datatest-derive" | ||
version = "0.3.5" | ||
version = "0.4.0" | ||
authors = ["Ivan Dubrov <[email protected]>"] | ||
edition = "2018" | ||
repository = "https://github.com/commure/datatest" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.