summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJethro Beekman <jethro@fortanix.com>2021-03-10 22:23:39 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2021-03-22 12:05:11 +0100
commitaf98fd47c7770cc6f71a9cb67e9165e47e47a078 (patch)
treefb19546cbcc505e351692eb6b15bb40e6c6eb3be
parentdedbea5bc0317be4e7fd47a49392a6b080f47ac8 (diff)
Add test infrastructure for ParseCallbacks
-rw-r--r--tests/parse_callbacks/mod.rs7
-rw-r--r--tests/tests.rs60
2 files changed, 55 insertions, 12 deletions
diff --git a/tests/parse_callbacks/mod.rs b/tests/parse_callbacks/mod.rs
new file mode 100644
index 00000000..c60aaa19
--- /dev/null
+++ b/tests/parse_callbacks/mod.rs
@@ -0,0 +1,7 @@
+use bindgen::callbacks::ParseCallbacks;
+
+pub fn lookup(cb: &str) -> Box<dyn ParseCallbacks> {
+ match cb {
+ _ => panic!("Couldn't find name ParseCallbacks: {}", cb),
+ }
+}
diff --git a/tests/tests.rs b/tests/tests.rs
index 4e38c114..80ccc8c9 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -17,6 +17,8 @@ use std::sync::Once;
mod options;
use crate::options::builder_from_flags;
+mod parse_callbacks;
+
// Run `rustfmt` on the given source string and return a tuple of the formatted
// bindings, and rustfmt's stderr.
fn rustfmt(source: String) -> (String, String) {
@@ -115,7 +117,7 @@ The latest `rustfmt` is required to run the `bindgen` test suite. Install
fn compare_generated_header(
header: &PathBuf,
- builder: Builder,
+ builder: BuilderState,
check_roundtrip: bool,
) -> Result<(), Error> {
let file_name = header.file_name().ok_or(Error::new(
@@ -190,13 +192,7 @@ fn compare_generated_header(
),
};
- let flags = if check_roundtrip {
- let mut flags = builder.command_line_flags();
- flags.insert(0, "bindgen".into());
- flags
- } else {
- vec![]
- };
+ let (builder, roundtrip_builder) = builder.into_builder(check_roundtrip)?;
// We skip the generate() error here so we get a full diff below
let (actual, rustfmt_stderr) = match builder.generate() {
@@ -262,8 +258,7 @@ fn compare_generated_header(
return Err(Error::new(ErrorKind::Other, "Header and binding differ! Run with BINDGEN_OVERWRITE_EXPECTED=1 in the environment to automatically overwrite the expectation or with BINDGEN_TESTS_DIFFTOOL=meld to do this manually."));
}
- if check_roundtrip {
- let roundtrip_builder = builder_from_flags(flags.into_iter())?.0;
+ if let Some(roundtrip_builder) = roundtrip_builder {
if let Err(e) =
compare_generated_header(&header, roundtrip_builder, false)
{
@@ -281,7 +276,36 @@ fn builder() -> Builder {
bindgen::builder().disable_header_comment()
}
-fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
+struct BuilderState {
+ builder: Builder,
+ parse_callbacks: Option<String>,
+}
+
+impl BuilderState {
+ fn into_builder(
+ self,
+ with_roundtrip_builder: bool,
+ ) -> Result<(Builder, Option<BuilderState>), Error> {
+ let roundtrip_builder = if with_roundtrip_builder {
+ let mut flags = self.builder.command_line_flags();
+ flags.insert(0, "bindgen".into());
+ let mut builder = builder_from_flags(flags.into_iter())?.0;
+ if let Some(ref parse_cb) = self.parse_callbacks {
+ builder =
+ builder.parse_callbacks(parse_callbacks::lookup(&parse_cb));
+ }
+ Some(BuilderState {
+ builder,
+ parse_callbacks: self.parse_callbacks,
+ })
+ } else {
+ None
+ };
+ Ok((self.builder, roundtrip_builder))
+ }
+}
+
+fn create_bindgen_builder(header: &PathBuf) -> Result<BuilderState, Error> {
#[cfg(feature = "logging")]
let _ = env_logger::try_init();
@@ -290,6 +314,7 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
// Scoop up bindgen-flags from test header
let mut flags = Vec::with_capacity(2);
+ let mut parse_callbacks = None;
for line in reader.lines() {
let line = line?;
@@ -311,6 +336,10 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
.map(ToString::to_string)
.chain(flags)
.collect();
+ } else if line.contains("bindgen-parse-callbacks: ") {
+ let parse_cb =
+ line.split("bindgen-parse-callbacks: ").last().unwrap();
+ parse_callbacks = Some(parse_cb.to_owned());
}
}
@@ -353,7 +382,14 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
.map(ToString::to_string)
.chain(flags.into_iter());
- builder_from_flags(args).map(|(builder, _, _)| builder)
+ let mut builder = builder_from_flags(args)?.0;
+ if let Some(ref parse_cb) = parse_callbacks {
+ builder = builder.parse_callbacks(parse_callbacks::lookup(&parse_cb));
+ }
+ Ok(BuilderState {
+ builder,
+ parse_callbacks,
+ })
}
macro_rules! test_header {