Files
wasmtime/src/tools/tests/verifier.rs
Jakob Stoklund Olesen c3afc1f2be Add a location to verifier error messages.
The verifier reports the 'location' of an error message as a reference
to the entity that has a problem. This uses the 'AnyEntity' type to
refer to instructions/values/ebbs etc.

Also add an err! macro similar to the one used by the parser.
2016-09-16 15:35:37 -07:00

67 lines
2.2 KiB
Rust

extern crate cretonne;
extern crate cton_reader;
extern crate glob;
extern crate regex;
use std::env;
use glob::glob;
use regex::Regex;
use std::fs::File;
use std::io::Read;
use self::cton_reader::parse_functions;
use self::cretonne::verifier::Verifier;
/// Compile a function and run verifier tests based on specially formatted
/// comments in the [function's] source.
fn verifier_tests_from_source(function_source: &str) {
let func_re = Regex::new("^[ \t]*function.*").unwrap();
let err_re = Regex::new(";[ \t]*Err\\((.*)+\\)").unwrap();
// Each entry corresponds to an optional regular expression, where
// the index corresponds to the function offset in our source code.
// If no error is expected for a given function its entry will be
// set to None.
let mut verifier_results = Vec::new();
for line in function_source.lines() {
if func_re.is_match(line) {
match err_re.captures(line) {
Some(caps) => {
verifier_results.push(Some(Regex::new(caps.at(1).unwrap()).unwrap()));
},
None => {
verifier_results.push(None);
},
};
}
}
// Run the verifier against each function and compare the output
// with the expected result (as determined above).
for (i, func) in parse_functions(function_source).unwrap().into_iter().enumerate() {
let result = Verifier::new(&func).run();
match verifier_results[i] {
Some(ref re) => {
assert_eq!(re.is_match(&result.err().unwrap().message), true);
},
None => {
assert_eq!(result, Ok(()));
}
}
}
}
#[test]
fn test_all() {
let testdir = format!("{}/tests/verifier_testdata/*.cton",
env::current_dir().unwrap().display());
for entry in glob(&testdir).unwrap() {
let path = entry.unwrap();
println!("Testing {:?}", path);
let mut file = File::open(&path).unwrap();
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
verifier_tests_from_source(&buffer);
}
}