Skip to content

Commit

Permalink
Fix tests for casr-js
Browse files Browse the repository at this point in the history
  • Loading branch information
PaDarochek committed Nov 14, 2023
1 parent a8e6633 commit d1da184
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 78 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/amd64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ jobs:
export NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt update && sudo apt install -y nodejs
npm install -g jsfuzz
npm install --save-dev @jazzer.js/core
sudo npm install -g jsfuzz
sudo npm install --save-dev @jazzer.js/core
curl https://sh.rustup.rs -o rustup.sh && chmod +x rustup.sh && \
./rustup.sh -y && rm rustup.sh
rustup install nightly
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ jobs:
export NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt update && sudo apt install -y nodejs
npm install -g jsfuzz
npm install --save-dev @jazzer.js/core
sudo npm install -g jsfuzz
sudo npm install --save-dev @jazzer.js/core
curl https://sh.rustup.rs -o rustup.sh && chmod +x rustup.sh && \
./rustup.sh -y && rm rustup.sh
rustup install nightly
Expand Down
4 changes: 2 additions & 2 deletions casr/tests/casr_tests/js/binding.gyp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"targets": [
{
"cflags": [ "-fexceptions -fsanitize=address,fuzzer-no-link -O0 -g -fPIC -I/usr/lib/llvm-10/lib/clang/10.0.0/lib/linux/ -lclang_rt.fuzzer-x86_64" ],
"cflags_cc": [ "-fexceptions -fsanitize=address,fuzzer-no-link -O0 -g -fPIC -I/usr/lib/llvm-10/lib/clang/10.0.0/lib/linux/ -lclang_rt.fuzzer-x86_64" ],
"cflags": [ "-fexceptions -fsanitize=address,fuzzer-no-link -O0 -g -fPIC" ],
"cflags_cc": [ "-fexceptions -fsanitize=address,fuzzer-no-link -O0 -g -fPIC" ],
"include_dirs" : ["<!@(node -p \"require('node-addon-api').include\")"],
"target_name": "native",
"sources": [ "native.cpp" ],
Expand Down
189 changes: 117 additions & 72 deletions casr/tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ extern crate serde_json;

use regex::Regex;
use serde_json::Value;
use std::env;
use std::fs;

use std::io::Write;
Expand Down Expand Up @@ -40,6 +41,24 @@ fn abs_path(rpath: &str) -> String {
path.as_os_str().to_str().unwrap().to_string()
}

fn npm_init(npm_path: &PathBuf, path: &str) {
let mut npm = Command::new(&npm_path)
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.current_dir(path)
.arg("init")
.arg("-y")
.spawn()
.expect("failed to run npm init");

let mut stdin = npm.stdin.take().expect("failed to open stdin");
stdin
.write_all("\n\n\n\n\n\n\n\n".as_bytes())
.expect("failed to write to stdin");

npm.wait().expect("failed to run npm init");
}

#[test]
fn test_segfault_on_pc() {
let paths = [
Expand Down Expand Up @@ -4698,7 +4717,7 @@ fn test_casr_js_jazzer() {
);
let _ = fs::copy(
abs_path("tests/casr_tests/js/crash"),
"tests/tmp_tests_casr/test_casr_js_jazzer/corpus/crash",
abs_path("tests/tmp_tests_casr/test_casr_js_jazzer/corpus/crash"),
);

let output = Command::new(*EXE_CASR_JS.read().unwrap())
Expand Down Expand Up @@ -4744,6 +4763,13 @@ fn test_casr_js_jazzer() {
#[test]
#[cfg(target_arch = "x86_64")]
fn test_casr_js_native() {
let old_cc = env::var("CC").unwrap_or("".to_string());
let old_cxx = env::var("CXX").unwrap_or("".to_string());
env::set_var("CC", "clang");
env::set_var("CXX", "clang++");
assert_eq!(env::var("CC"), Ok("clang".to_string()));
assert_eq!(env::var("CXX"), Ok("clang++".to_string()));

// JS C extension test
// Copy files to tmp dir
let work_dir = abs_path("tests/casr_tests/js");
Expand All @@ -4762,6 +4788,7 @@ fn test_casr_js_native() {
);

let paths = [
abs_path("tests"),
abs_path("tests/tmp_tests_casr/test_casr_js_native"),
abs_path("tests/tmp_tests_casr/test_casr_js_native/test_casr_js_native.js"),
];
Expand All @@ -4770,39 +4797,23 @@ fn test_casr_js_native() {
panic!("No npm is found.");
};

let mut npm = Command::new("bash")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.arg("-c")
.arg(format!("{} init -w {}", npm_path.display(), &paths[0]))
.spawn()
.expect("failed to run npm init");

let mut stdin = npm.stdin.take().expect("failed to open stdin");
std::thread::spawn(move || {
stdin
.write_all("\n\n\n\n\n\n\n\n".as_bytes())
.expect("failed to write to stdin");
});

npm.wait().expect("failed to run npm init");
npm_init(&npm_path, "..");
npm_init(&npm_path, ".");
npm_init(&npm_path, &paths[0]);
npm_init(&npm_path, &paths[1]);

let npm = Command::new("bash")
.arg("-c")
.arg(format!("{} i node-addon-api bindings", npm_path.display()))
.arg(format!("{} install node-addon-api bindings", &npm_path.display()))
.status()
.expect("failed to add node-addon-api bindings");

assert!(npm.success());

let npm = Command::new("bash")
.env("CC", "clang")
.env("CXX", "clang++")
.arg("-c")
.arg(format!("{} install {}", npm_path.display(), &paths[0]))
.arg(format!("{} install {}", &npm_path.display(), &paths[1]))
.status()
.expect("failed to run npm install");

assert!(npm.success());

// Get path of asan lib
Expand Down Expand Up @@ -4835,7 +4846,7 @@ fn test_casr_js_native() {
.parent()
.unwrap_or(Path::new("")),
)
.args(["--stdout", "--", node_path.to_str().unwrap(), &paths[1]])
.args(["--stdout", "--", node_path.to_str().unwrap(), &paths[2]])
.output()
.expect("failed to start casr-js");

Expand Down Expand Up @@ -4864,12 +4875,35 @@ fn test_casr_js_native() {
} else {
panic!("Couldn't parse json report file.");
}

let _ = std::fs::remove_dir_all(&test_dir);
let json_paths = [
abs_path("../package.json"),
abs_path("package.json"),
abs_path("tests/package.json"),
abs_path("package-lock.json"),
];
let _ = std::fs::remove_file(&json_paths[0]);
let _ = std::fs::remove_file(&json_paths[1]);
let _ = std::fs::remove_file(&json_paths[2]);
let _ = std::fs::remove_file(&json_paths[3]);

env::set_var("CC", &old_cc);
env::set_var("CXX", &old_cxx);
assert_eq!(env::var("CC"), Ok(old_cc));
assert_eq!(env::var("CXX"), Ok(old_cxx));
}

#[test]
#[cfg(target_arch = "x86_64")]
fn test_casr_js_native_jsfuzz() {
let old_cc = env::var("CC").unwrap_or("".to_string());
let old_cxx = env::var("CXX").unwrap_or("".to_string());
env::set_var("CC", "clang");
env::set_var("CXX", "clang++");
assert_eq!(env::var("CC"), Ok("clang".to_string()));
assert_eq!(env::var("CXX"), Ok("clang++".to_string()));

// JS jsfuzz C extension test
// Copy files to tmp dir
let work_dir = abs_path("tests/casr_tests/js");
Expand All @@ -4888,6 +4922,7 @@ fn test_casr_js_native_jsfuzz() {
);

let paths = [
abs_path("tests"),
abs_path("tests/tmp_tests_casr/test_casr_js_native_jsfuzz"),
"tests/tmp_tests_casr/test_casr_js_native_jsfuzz/test_casr_js_native_jsfuzz.js".to_string(),
];
Expand All @@ -4896,39 +4931,23 @@ fn test_casr_js_native_jsfuzz() {
panic!("No npm is found.");
};

let mut npm = Command::new("bash")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.arg("-c")
.arg(format!("{} init -w {}", npm_path.display(), &paths[0]))
.spawn()
.expect("failed to run npm init");

let mut stdin = npm.stdin.take().expect("failed to open stdin");
std::thread::spawn(move || {
stdin
.write_all("\n\n\n\n\n\n\n\n".as_bytes())
.expect("failed to write to stdin");
});

npm.wait().expect("failed to run npm init");
npm_init(&npm_path, "..");
npm_init(&npm_path, ".");
npm_init(&npm_path, &paths[0]);
npm_init(&npm_path, &paths[1]);

let npm = Command::new("bash")
.arg("-c")
.arg(format!("{} i node-addon-api bindings", npm_path.display()))
.arg(format!("{} install node-addon-api bindings", &npm_path.display()))
.status()
.expect("failed to add node-addon-api bindings");

assert!(npm.success());

let npm = Command::new("bash")
.env("CC", "clang")
.env("CXX", "clang++")
.arg("-c")
.arg(format!("{} install {}", npm_path.display(), &paths[0]))
.arg(format!("{} install {}", &npm_path.display(), &paths[1]))
.status()
.expect("failed to run npm install");

assert!(npm.success());

// Get path of asan lib
Expand All @@ -4947,6 +4966,7 @@ fn test_casr_js_native_jsfuzz() {

let clang_rt = String::from_utf8_lossy(&output.stdout);
assert!(Path::new(&clang_rt.trim().to_string()).exists());

let Ok(jsfuzz_path) = which::which("jsfuzz") else {
panic!("No jsfuzz is found.");
};
Expand All @@ -4960,7 +4980,7 @@ fn test_casr_js_native_jsfuzz() {
.parent()
.unwrap_or(Path::new("")),
)
.args(["--stdout", "--", jsfuzz_path.to_str().unwrap(), &paths[1]])
.args(["--stdout", "--", jsfuzz_path.to_str().unwrap(), &paths[2]])
.output()
.expect("failed to start casr-js");

Expand Down Expand Up @@ -4989,13 +5009,36 @@ fn test_casr_js_native_jsfuzz() {
} else {
panic!("Couldn't parse json report file.");
}

let _ = std::fs::remove_dir_all(&test_dir);
let json_paths = [
abs_path("../package.json"),
abs_path("package.json"),
abs_path("tests/package.json"),
abs_path("package-lock.json"),
];
let _ = std::fs::remove_file(&json_paths[0]);
let _ = std::fs::remove_file(&json_paths[1]);
let _ = std::fs::remove_file(&json_paths[2]);
let _ = std::fs::remove_file(&json_paths[3]);

env::set_var("CC", &old_cc);
env::set_var("CXX", &old_cxx);
assert_eq!(env::var("CC"), Ok(old_cc));
assert_eq!(env::var("CXX"), Ok(old_cxx));
}

#[test]
#[cfg(target_arch = "x86_64")]
fn test_casr_js_native_jazzer() {
// JS Jazzer.js C extension test
let old_cc = env::var("CC").unwrap_or("".to_string());
let old_cxx = env::var("CXX").unwrap_or("".to_string());
env::set_var("CC", "clang");
env::set_var("CXX", "clang++");
assert_eq!(env::var("CC"), Ok("clang".to_string()));
assert_eq!(env::var("CXX"), Ok("clang++".to_string()));

// JS jsfuzz C extension test
// Copy files to tmp dir
let work_dir = abs_path("tests/casr_tests/js");
let test_dir = abs_path("tests/tmp_tests_casr/test_casr_js_native_jazzer");
Expand All @@ -5013,47 +5056,32 @@ fn test_casr_js_native_jazzer() {
);

let paths = [
abs_path("tests"),
abs_path("tests/tmp_tests_casr/test_casr_js_native_jazzer"),
"tests/tmp_tests_casr/test_casr_js_native_jazzer/test_casr_js_native_jazzer.js".to_string(),
abs_path("tests/tmp_tests_casr/test_casr_js_native_jazzer/test_casr_js_native_jazzer.js"),
];

let Ok(npm_path) = which::which("npm") else {
panic!("No npm is found.");
};

let mut npm = Command::new("bash")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.arg("-c")
.arg(format!("{} init -w {}", npm_path.display(), &paths[0]))
.spawn()
.expect("failed to run npm init");

let mut stdin = npm.stdin.take().expect("failed to open stdin");
std::thread::spawn(move || {
stdin
.write_all("\n\n\n\n\n\n\n\n".as_bytes())
.expect("failed to write to stdin");
});

npm.wait().expect("failed to run npm init");
npm_init(&npm_path, "..");
npm_init(&npm_path, ".");
npm_init(&npm_path, &paths[0]);
npm_init(&npm_path, &paths[1]);

let npm = Command::new("bash")
.arg("-c")
.arg(format!("{} i node-addon-api bindings", npm_path.display()))
.arg(format!("{} install node-addon-api bindings", &npm_path.display()))
.status()
.expect("failed to add node-addon-api bindings");

assert!(npm.success());

let npm = Command::new("bash")
.env("CC", "clang")
.env("CXX", "clang++")
.arg("-c")
.arg(format!("{} install {}", npm_path.display(), &paths[0]))
.arg(format!("{} install {}", &npm_path.display(), &paths[1]))
.status()
.expect("failed to run npm install");

assert!(npm.success());

// Get path of asan lib
Expand All @@ -5072,6 +5100,7 @@ fn test_casr_js_native_jazzer() {

let clang_rt = String::from_utf8_lossy(&output.stdout);
assert!(Path::new(&clang_rt.trim().to_string()).exists());

let Ok(npx_path) = which::which("npx") else {
panic!("No npx is found.");
};
Expand All @@ -5090,7 +5119,7 @@ fn test_casr_js_native_jazzer() {
"--",
npx_path.to_str().unwrap(),
"jazzer",
&paths[1],
&paths[2],
])
.output()
.expect("failed to start casr-js");
Expand Down Expand Up @@ -5120,5 +5149,21 @@ fn test_casr_js_native_jazzer() {
} else {
panic!("Couldn't parse json report file.");
}

let _ = std::fs::remove_dir_all(&test_dir);
let json_paths = [
abs_path("../package.json"),
abs_path("package.json"),
abs_path("tests/package.json"),
abs_path("package-lock.json"),
];
let _ = std::fs::remove_file(&json_paths[0]);
let _ = std::fs::remove_file(&json_paths[1]);
let _ = std::fs::remove_file(&json_paths[2]);
let _ = std::fs::remove_file(&json_paths[3]);

env::set_var("CC", &old_cc);
env::set_var("CXX", &old_cxx);
assert_eq!(env::var("CC"), Ok(old_cc));
assert_eq!(env::var("CXX"), Ok(old_cxx));
}

0 comments on commit d1da184

Please sign in to comment.