From 2a70fce397215054b9006e1a6fd4329531b741f6 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Tue, 14 Nov 2023 15:26:03 +0300 Subject: [PATCH] Fix tests for casr-js --- .github/workflows/amd64.yml | 4 +- .github/workflows/coverage.yaml | 4 +- casr/tests/casr_tests/js/binding.gyp | 4 +- casr/tests/tests.rs | 204 +++++++++++++++++---------- 4 files changed, 135 insertions(+), 81 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index 2a5cd502..85bcc192 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -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 diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 3e4c2134..d4a164cf 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -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 diff --git a/casr/tests/casr_tests/js/binding.gyp b/casr/tests/casr_tests/js/binding.gyp index ef97f6d0..5b43de77 100644 --- a/casr/tests/casr_tests/js/binding.gyp +++ b/casr/tests/casr_tests/js/binding.gyp @@ -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" : [" 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 = [ @@ -4603,7 +4622,7 @@ fn test_casr_js() { } else { panic!("Couldn't parse json report file."); } - let _ = std::fs::remove_dir_all(&test_dir); + let _ = std::fs::remove_dir_all(test_dir); } #[test] @@ -4670,7 +4689,7 @@ fn test_casr_js_jsfuzz() { } else { panic!("Couldn't parse json report file."); } - let _ = std::fs::remove_dir_all(&test_dir); + let _ = std::fs::remove_dir_all(test_dir); } #[test] @@ -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()) @@ -4738,12 +4757,19 @@ fn test_casr_js_jazzer() { } else { panic!("Couldn't parse json report file."); } - let _ = std::fs::remove_dir_all(&test_dir); + let _ = std::fs::remove_dir_all(test_dir); } #[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"); @@ -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"), ]; @@ -4770,39 +4797,26 @@ 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 @@ -4835,7 +4849,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"); @@ -4864,12 +4878,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"); @@ -4888,6 +4925,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(), ]; @@ -4896,39 +4934,26 @@ 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 @@ -4947,6 +4972,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."); }; @@ -4960,7 +4986,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"); @@ -4989,13 +5015,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"); @@ -5013,47 +5062,35 @@ 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 @@ -5072,6 +5109,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."); }; @@ -5090,7 +5128,7 @@ fn test_casr_js_native_jazzer() { "--", npx_path.to_str().unwrap(), "jazzer", - &paths[1], + &paths[2], ]) .output() .expect("failed to start casr-js"); @@ -5120,5 +5158,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)); }