summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-11-15 13:22:19 -0600
committerGitHub <noreply@github.com>2016-11-15 13:22:19 -0600
commit09dc05c8188bc63f4a30456901d0ff1eeeac5fc5 (patch)
tree88940b04b1a414b220e7547f642af1fd9f84bb3c
parent6b285e617ede6d3dbd6d2d0129ac81bc992a1593 (diff)
parenta6aa516270225f387e9e615dcfa6eebca71f5475 (diff)
Auto merge of #261 - jdub:named-tests, r=emilio
Generate a separate test function for every header - Header tests can now be run selectively, e.g. `cargo test header` will test all headers `cargo test union` will test headers with 'union' in the file name - The list of test functions is generated by `build.rs`, so never needs to be updated - Clever approach suggested by @fitzgen This PR depends on #204, so will include those changes until they're merged into master and this can be rebased. But I'll keep the commits separate.
-rw-r--r--libbindgen/build.rs39
-rw-r--r--libbindgen/tests/tests.rs58
2 files changed, 51 insertions, 46 deletions
diff --git a/libbindgen/build.rs b/libbindgen/build.rs
index b9cf3e60..228a7f22 100644
--- a/libbindgen/build.rs
+++ b/libbindgen/build.rs
@@ -1,10 +1,9 @@
mod codegen {
extern crate quasi_codegen;
use std::path::Path;
- use std::env;
pub fn main() {
- let out_dir = env::var_os("OUT_DIR").unwrap();
+ let out_dir = Path::new(env!("OUT_DIR"));
let src = Path::new("src/codegen/mod.rs");
let dst = Path::new(&out_dir).join("codegen.rs");
@@ -14,6 +13,42 @@ mod codegen {
}
}
+mod testgen {
+ use std::char;
+ use std::ffi::OsStr;
+ use std::fs::{self, File};
+ use std::io::Write;
+ use std::path::Path;
+
+ pub fn main() {
+ let out_dir = Path::new(env!("OUT_DIR"));
+ let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap();
+
+ let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
+ let headers_dir = manifest_dir.join("tests").join("headers");
+
+ let entries = fs::read_dir(headers_dir)
+ .expect("Couldn't read headers dir")
+ .map(|result| result.expect("Couldn't read header file"));
+
+ for entry in entries {
+ match entry.path().extension().and_then(OsStr::to_str) {
+ Some("h") | Some("hpp") => {
+ let func = entry.file_name().to_str().unwrap()
+ .replace(|c| !char::is_alphanumeric(c), "_")
+ .replace("__", "_")
+ .to_lowercase();
+ let _ = writeln!(dst, "test_header!(header_{}, {:?});",
+ func, entry.path());
+ }
+ _ => {}
+ }
+ }
+ let _ = dst.flush();
+ }
+}
+
fn main() {
codegen::main();
+ testgen::main();
}
diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs
index c9826260..c0786406 100644
--- a/libbindgen/tests/tests.rs
+++ b/libbindgen/tests/tests.rs
@@ -6,10 +6,9 @@ extern crate libbindgen;
extern crate log;
extern crate shlex;
-use std::env;
use std::fs;
use std::io::{BufRead, BufReader, Error, ErrorKind, Read};
-use std::path::{Path, PathBuf};
+use std::path::PathBuf;
#[path="../../src/options.rs"]
mod options;
@@ -93,46 +92,17 @@ fn create_bindgen_builder(header: &PathBuf)
builder_from_flags(args).map(|(builder, _)| builder.no_unstable_rust())
}
-#[test]
-fn run_bindgen_tests() {
- log::set_logger(|max_log_level| {
- use env_logger::Logger;
- let env_logger = Logger::new();
- max_log_level.set(env_logger.filter());
- Box::new(env_logger)
- })
- .expect("Failed to set logger.");
-
- let manifest_env = env::var("CARGO_MANIFEST_DIR")
- .expect("CARGO_MANIFEST_DIR not set!");
- let manifest_dir = Path::new(&manifest_env);
- let headers_dir = manifest_dir.join("tests").join("headers");
-
- let entries = fs::read_dir(&headers_dir)
- .expect("Couldn't read headers dir")
- .map(|result| result.expect("Couldn't read header file"));
-
- let headers: Vec<_> = entries.filter_map(|entry| {
- match entry.path().extension().and_then(|s| s.to_str()) {
- Some("h") | Some("hpp") => Some(entry.path()),
- _ => None,
- }
- })
- .collect();
-
- let failures: Vec<_> = headers.iter()
- .filter_map(|header| {
- create_bindgen_builder(header)
- .and_then(|builder| compare_generated_header(header, builder))
- .err()
- })
- .collect();
-
- let num_failures = failures.len();
-
- if num_failures > 0 {
- panic!("{} test{} failed!",
- num_failures,
- if num_failures > 1 {"s"} else {""});
- }
+macro_rules! test_header {
+ ($function:ident, $header:expr) => (
+ #[test]
+ fn $function() {
+ let header = PathBuf::from($header);
+ let _ = create_bindgen_builder(&header)
+ .and_then(|builder| compare_generated_header(&header, builder))
+ .map_err(|err| panic!(format!("{}", err)) );
+ }
+ )
}
+
+// This file is generated by build.rs
+include!(concat!(env!("OUT_DIR"), "/tests.rs"));