mirror of
https://github.com/fluencelabs/wasmer
synced 2025-03-16 00:00:49 +00:00
Update emtests to glob for c/cpp files, use ignores.txt to exclude tests, disable cc out by default
This commit is contained in:
parent
71a0315171
commit
8921385fbb
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -888,6 +888,7 @@ dependencies = [
|
||||
"docopt 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.44 (git+https://github.com/rust-lang/libc)",
|
||||
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -52,6 +52,7 @@ console = "0.7.1"
|
||||
|
||||
[build-dependencies]
|
||||
wabt = "0.7.2"
|
||||
glob = "0.2.11"
|
||||
# [dev-dependencies]
|
||||
# libffi = "0.6.4"
|
||||
# maplit = "1.0.1"
|
||||
|
122
build/emtests.rs
122
build/emtests.rs
@ -4,36 +4,43 @@
|
||||
//! - Compile using emcc and get the .wasm from it (wasm)
|
||||
//! - Generate the test that will compare the output of running the .wasm file
|
||||
//! with wasmer with the expected output
|
||||
use glob::glob;
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::io::BufReader;
|
||||
|
||||
static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs).
|
||||
// Please do NOT modify it by hand, as it will be reseted on next build.\n";
|
||||
|
||||
const TESTS: [&str; 3] = ["emtests/env.c", "emtests/puts.c", "emtests/printf.c"];
|
||||
const EXTENSIONS: [&str; 2] = ["c", "cpp"];
|
||||
const EXCLUDES: [&str; 1] = ["localtime.c"];
|
||||
|
||||
pub fn compile(file: &str) -> String {
|
||||
pub fn compile(file: &str, ignores: &Vec<String>) -> Option<String> {
|
||||
let mut output_path = PathBuf::from(file);
|
||||
output_path.set_extension("out");
|
||||
let output_str = output_path.to_str().unwrap();
|
||||
// let output_str = output_path.to_str().unwrap();
|
||||
|
||||
// Compile to .out
|
||||
Command::new("cc")
|
||||
.arg(file)
|
||||
.arg("-o")
|
||||
.arg(output_str)
|
||||
.output()
|
||||
.expect("failed to execute process");
|
||||
// Command::new("cc")
|
||||
// .arg(file)
|
||||
// .arg("-o")
|
||||
// .arg(output_str)
|
||||
// .output()
|
||||
// .expect("failed to execute process");
|
||||
|
||||
// Get the result of .out
|
||||
let output = Command::new(output_str)
|
||||
.arg(output_str)
|
||||
.output()
|
||||
.expect("failed to execute process");
|
||||
// let output = Command::new(output_str)
|
||||
// .arg(output_str)
|
||||
// .output()
|
||||
// .expect("failed to execute process");
|
||||
|
||||
// Remove executable
|
||||
fs::remove_file(output_str).unwrap();
|
||||
// fs::remove_file(output_str).unwrap();
|
||||
|
||||
let mut output_path = PathBuf::from(file);
|
||||
output_path.set_extension("js");
|
||||
@ -54,7 +61,12 @@ pub fn compile(file: &str) -> String {
|
||||
// panic!("{}", output.stderr);
|
||||
// }
|
||||
// Remove js file
|
||||
fs::remove_file(output_str).unwrap();
|
||||
|
||||
if Path::new(output_str).is_file() {
|
||||
fs::remove_file(output_str).unwrap();
|
||||
} else {
|
||||
println!("Output JS not found: {}", output_str);
|
||||
}
|
||||
|
||||
let mut output_path = PathBuf::from(file);
|
||||
output_path.set_extension("output");
|
||||
@ -65,26 +77,58 @@ pub fn compile(file: &str) -> String {
|
||||
.unwrap()
|
||||
.to_owned();
|
||||
|
||||
let output_str = output_path.to_str().unwrap();
|
||||
//
|
||||
// let output_str = output_path.to_str().unwrap();
|
||||
|
||||
// Write the output to file
|
||||
fs::write(output_str, output.stdout).expect("Unable to write file");
|
||||
// fs::write(output_str, output.stdout).expect("Unable to write file");
|
||||
|
||||
let rs_module_name = module_name.to_lowercase();
|
||||
let rust_test_filepath = format!(
|
||||
concat!(env!("CARGO_MANIFEST_DIR"), "/src/emtests/{}.rs"),
|
||||
module_name.as_str()
|
||||
rs_module_name.as_str()
|
||||
);
|
||||
|
||||
let contents = format!("#[test]
|
||||
fn test_{module_name}() {{
|
||||
assert_emscripten_output!(\"../../emtests/{module_name}.wasm\", \"{module_name}\", vec![], \"../../emtests/{module_name}.output\");
|
||||
let output_extension = if file.ends_with("c") || module_name.starts_with("test_") {
|
||||
"out"
|
||||
} else {
|
||||
"txt"
|
||||
};
|
||||
|
||||
let ignored = if ignores
|
||||
.iter()
|
||||
.any(|i| &i.to_lowercase() == &module_name.to_lowercase())
|
||||
{
|
||||
"\n#[ignore]"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
let module_path = format!("emtests/{}.wasm", module_name);
|
||||
let test_output_path = format!("emtests/{}.{}", module_name, output_extension);
|
||||
if !Path::new(&module_path).is_file() {
|
||||
println!("Path not found to test module: {}", module_path);
|
||||
None
|
||||
} else if !Path::new(&test_output_path).is_file() {
|
||||
println!("Path not found to test output: {}", module_path);
|
||||
None
|
||||
} else {
|
||||
let contents = format!(
|
||||
"#[test]{ignore}
|
||||
fn test_{rs_module_name}() {{
|
||||
assert_emscripten_output!(\"../../{module_path}\", \"{rs_module_name}\", vec![], \"../../{test_output_path}\");
|
||||
}}
|
||||
", module_name=module_name);
|
||||
",
|
||||
ignore = ignored,
|
||||
module_path = module_path,
|
||||
rs_module_name = rs_module_name,
|
||||
test_output_path = test_output_path
|
||||
);
|
||||
|
||||
fs::write(&rust_test_filepath, contents.as_bytes()).unwrap();
|
||||
|
||||
module_name
|
||||
fs::write(&rust_test_filepath, contents.as_bytes()).unwrap();
|
||||
|
||||
Some(rs_module_name)
|
||||
}
|
||||
// panic!("OUTPUT: {:?}", output);
|
||||
}
|
||||
|
||||
@ -93,10 +137,26 @@ pub fn build() {
|
||||
|
||||
let mut modules: Vec<String> = Vec::new();
|
||||
// modules.reserve_exact(TESTS.len());
|
||||
for test in TESTS.iter() {
|
||||
let moudle_name = compile(test);
|
||||
modules.push(format!("mod {};", moudle_name));
|
||||
|
||||
let ignores = read_ignore_list();
|
||||
|
||||
for ext in EXTENSIONS.iter() {
|
||||
for entry in glob(&format!("emtests/*.{}", ext)).unwrap() {
|
||||
match entry {
|
||||
Ok(path) => {
|
||||
let test = path.to_str().unwrap();
|
||||
if !EXCLUDES.iter().any(|e| test.ends_with(e)) {
|
||||
if let Some(module_name) = compile(test, &ignores) {
|
||||
modules.push(format!("mod {};", module_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => println!("{:?}", e),
|
||||
}
|
||||
}
|
||||
}
|
||||
assert!(modules.len() > 0, "Expected > 0 modules found");
|
||||
|
||||
modules.insert(0, BANNER.to_string());
|
||||
modules.insert(1, "// The _common module is not autogenerated, as it provides common macros for the emtests\n#[macro_use]\nmod _common;".to_string());
|
||||
// We add an empty line
|
||||
@ -109,3 +169,9 @@ pub fn build() {
|
||||
fs::write(&rust_test_modpath, modfile.as_bytes()).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn read_ignore_list() -> Vec<String> {
|
||||
let f = File::open("emtests/ignores.txt").unwrap();
|
||||
let f = BufReader::new(f);
|
||||
f.lines().filter_map(Result::ok).collect()
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
extern crate glob;
|
||||
extern crate wabt;
|
||||
|
||||
use std::env;
|
||||
|
@ -1,21 +1,24 @@
|
||||
This directory contains tests for unit testing each of the functions/syscalls that Emscripten will be doing.
|
||||
|
||||
If you want to generate the wasm files, you will just need to:
|
||||
If you want to generate the wasm files, you will just need:
|
||||
|
||||
Have EMCC (version 1.38.21) installed
|
||||
|
||||
Then run:
|
||||
|
||||
```
|
||||
make emtests
|
||||
```
|
||||
|
||||
**Ignored Tests**
|
||||
Test names included in `emtests/ignores.txt` will be annotated with `#[ignore]` during test generation.
|
||||
|
||||
This process will do something similar to:
|
||||
|
||||
```
|
||||
cc localtime.c -o localtime.out
|
||||
# Execute the out file and save its output
|
||||
./localtime.out > ./localtime.output
|
||||
rm localtime.out
|
||||
|
||||
# Generate the .wasm file
|
||||
emcc localtime.c -o localtime.js
|
||||
# Delte the js file, as we don't need it
|
||||
rm localtime.js
|
||||
```
|
||||
|
||||
|
BIN
emtests/env.wasm
BIN
emtests/env.wasm
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -28,6 +28,11 @@ macro_rules! assert_emscripten_output {
|
||||
.unwrap();
|
||||
let output = capturer.end().unwrap().0;
|
||||
let expected_output = include_str!($expected);
|
||||
assert_eq!(output, expected_output);
|
||||
assert!(
|
||||
output.contains(expected_output),
|
||||
"Output: `{}` does not contain expected output: `{}`",
|
||||
output,
|
||||
expected_output
|
||||
);
|
||||
}};
|
||||
}
|
||||
|
@ -4,6 +4,6 @@ fn test_env() {
|
||||
"../../emtests/env.wasm",
|
||||
"env",
|
||||
vec![],
|
||||
"../../emtests/env.output"
|
||||
"../../emtests/env.out"
|
||||
);
|
||||
}
|
||||
|
@ -1,9 +1,4 @@
|
||||
#[test]
|
||||
fn test_printf() {
|
||||
assert_emscripten_output!(
|
||||
"../../emtests/printf.wasm",
|
||||
"printf",
|
||||
vec![],
|
||||
"../../emtests/printf.output"
|
||||
);
|
||||
assert_emscripten_output!("../../emtests/printf.wasm", "printf", vec![], "../../emtests/printf.out");
|
||||
}
|
||||
|
@ -1,9 +1,4 @@
|
||||
#[test]
|
||||
fn test_puts() {
|
||||
assert_emscripten_output!(
|
||||
"../../emtests/puts.wasm",
|
||||
"puts",
|
||||
vec![],
|
||||
"../../emtests/puts.output"
|
||||
);
|
||||
assert_emscripten_output!("../../emtests/puts.wasm", "puts", vec![], "../../emtests/puts.out");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user