Skip to content

Commit 09dc05c

Browse files
author
bors-servo
authored
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.
2 parents 6b285e6 + a6aa516 commit 09dc05c

File tree

2 files changed

+51
-46
lines changed

2 files changed

+51
-46
lines changed

libbindgen/build.rs

+37-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
mod codegen {
22
extern crate quasi_codegen;
33
use std::path::Path;
4-
use std::env;
54

65
pub fn main() {
7-
let out_dir = env::var_os("OUT_DIR").unwrap();
6+
let out_dir = Path::new(env!("OUT_DIR"));
87
let src = Path::new("src/codegen/mod.rs");
98
let dst = Path::new(&out_dir).join("codegen.rs");
109

@@ -14,6 +13,42 @@ mod codegen {
1413
}
1514
}
1615

16+
mod testgen {
17+
use std::char;
18+
use std::ffi::OsStr;
19+
use std::fs::{self, File};
20+
use std::io::Write;
21+
use std::path::Path;
22+
23+
pub fn main() {
24+
let out_dir = Path::new(env!("OUT_DIR"));
25+
let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap();
26+
27+
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
28+
let headers_dir = manifest_dir.join("tests").join("headers");
29+
30+
let entries = fs::read_dir(headers_dir)
31+
.expect("Couldn't read headers dir")
32+
.map(|result| result.expect("Couldn't read header file"));
33+
34+
for entry in entries {
35+
match entry.path().extension().and_then(OsStr::to_str) {
36+
Some("h") | Some("hpp") => {
37+
let func = entry.file_name().to_str().unwrap()
38+
.replace(|c| !char::is_alphanumeric(c), "_")
39+
.replace("__", "_")
40+
.to_lowercase();
41+
let _ = writeln!(dst, "test_header!(header_{}, {:?});",
42+
func, entry.path());
43+
}
44+
_ => {}
45+
}
46+
}
47+
let _ = dst.flush();
48+
}
49+
}
50+
1751
fn main() {
1852
codegen::main();
53+
testgen::main();
1954
}

libbindgen/tests/tests.rs

+14-44
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ extern crate libbindgen;
66
extern crate log;
77
extern crate shlex;
88

9-
use std::env;
109
use std::fs;
1110
use std::io::{BufRead, BufReader, Error, ErrorKind, Read};
12-
use std::path::{Path, PathBuf};
11+
use std::path::PathBuf;
1312

1413
#[path="../../src/options.rs"]
1514
mod options;
@@ -93,46 +92,17 @@ fn create_bindgen_builder(header: &PathBuf)
9392
builder_from_flags(args).map(|(builder, _)| builder.no_unstable_rust())
9493
}
9594

96-
#[test]
97-
fn run_bindgen_tests() {
98-
log::set_logger(|max_log_level| {
99-
use env_logger::Logger;
100-
let env_logger = Logger::new();
101-
max_log_level.set(env_logger.filter());
102-
Box::new(env_logger)
103-
})
104-
.expect("Failed to set logger.");
105-
106-
let manifest_env = env::var("CARGO_MANIFEST_DIR")
107-
.expect("CARGO_MANIFEST_DIR not set!");
108-
let manifest_dir = Path::new(&manifest_env);
109-
let headers_dir = manifest_dir.join("tests").join("headers");
110-
111-
let entries = fs::read_dir(&headers_dir)
112-
.expect("Couldn't read headers dir")
113-
.map(|result| result.expect("Couldn't read header file"));
114-
115-
let headers: Vec<_> = entries.filter_map(|entry| {
116-
match entry.path().extension().and_then(|s| s.to_str()) {
117-
Some("h") | Some("hpp") => Some(entry.path()),
118-
_ => None,
119-
}
120-
})
121-
.collect();
122-
123-
let failures: Vec<_> = headers.iter()
124-
.filter_map(|header| {
125-
create_bindgen_builder(header)
126-
.and_then(|builder| compare_generated_header(header, builder))
127-
.err()
128-
})
129-
.collect();
130-
131-
let num_failures = failures.len();
132-
133-
if num_failures > 0 {
134-
panic!("{} test{} failed!",
135-
num_failures,
136-
if num_failures > 1 {"s"} else {""});
137-
}
95+
macro_rules! test_header {
96+
($function:ident, $header:expr) => (
97+
#[test]
98+
fn $function() {
99+
let header = PathBuf::from($header);
100+
let _ = create_bindgen_builder(&header)
101+
.and_then(|builder| compare_generated_header(&header, builder))
102+
.map_err(|err| panic!(format!("{}", err)) );
103+
}
104+
)
138105
}
106+
107+
// This file is generated by build.rs
108+
include!(concat!(env!("OUT_DIR"), "/tests.rs"));

0 commit comments

Comments
 (0)