summaryrefslogtreecommitdiff
path: root/cli/tests/integration
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests/integration')
-rw-r--r--cli/tests/integration/js_unit_tests.rs177
-rw-r--r--cli/tests/integration/node_unit_tests.rs150
2 files changed, 299 insertions, 28 deletions
diff --git a/cli/tests/integration/js_unit_tests.rs b/cli/tests/integration/js_unit_tests.rs
index 793f66b1e..4d6ef3675 100644
--- a/cli/tests/integration/js_unit_tests.rs
+++ b/cli/tests/integration/js_unit_tests.rs
@@ -1,27 +1,113 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
+use std::io::BufRead;
+use std::io::BufReader;
+use std::process::Stdio;
+use std::time::Duration;
+use std::time::Instant;
use test_util as util;
-#[test]
-fn js_unit_tests_lint() {
- let status = util::deno_cmd()
- .arg("lint")
- .arg("--unstable")
- .arg(util::tests_path().join("unit"))
- .spawn()
- .unwrap()
- .wait()
- .unwrap();
- assert!(status.success());
-}
+util::unit_test_factory!(
+ js_unit_test,
+ "tests/unit",
+ "*.ts",
+ [
+ abort_controller_test,
+ blob_test,
+ body_test,
+ broadcast_channel_test,
+ buffer_test,
+ build_test,
+ cache_api_test,
+ chmod_test,
+ chown_test,
+ command_test,
+ console_test,
+ copy_file_test,
+ custom_event_test,
+ dir_test,
+ dom_exception_test,
+ error_stack_test,
+ error_test,
+ esnext_test,
+ event_target_test,
+ event_test,
+ fetch_test,
+ ffi_test,
+ file_test,
+ filereader_test,
+ files_test,
+ flock_test,
+ fs_events_test,
+ get_random_values_test,
+ globals_test,
+ headers_test,
+ http_test,
+ internals_test,
+ intl_test,
+ io_test,
+ kv_test,
+ link_test,
+ make_temp_test,
+ message_channel_test,
+ metrics_test,
+ mkdir_test,
+ navigator_test,
+ net_test,
+ network_interfaces_test,
+ opcall_test,
+ os_test,
+ path_from_url_test,
+ performance_test,
+ permissions_test,
+ process_test,
+ progressevent_test,
+ promise_hooks_test,
+ read_dir_test,
+ read_file_test,
+ read_link_test,
+ read_text_file_test,
+ real_path_test,
+ ref_unref_test,
+ remove_test,
+ rename_test,
+ request_test,
+ resources_test,
+ response_test,
+ serve_test,
+ signal_test,
+ stat_test,
+ stdio_test,
+ structured_clone_test,
+ symlink_test,
+ sync_test,
+ test_util,
+ testing_test,
+ text_encoding_test,
+ timers_test,
+ tls_test,
+ truncate_test,
+ tty_color_test,
+ tty_test,
+ umask_test,
+ url_search_params_test,
+ url_test,
+ urlpattern_test,
+ utime_test,
+ version_test,
+ wasm_test,
+ webcrypto_test,
+ websocket_test,
+ webstorage_test,
+ worker_permissions_test,
+ worker_types,
+ write_file_test,
+ write_text_file_test,
+ ]
+);
-#[test]
-fn js_unit_tests() {
+fn js_unit_test(test: String) {
let _g = util::http_server();
- // Note that the unit tests are not safe for concurrency and must be run with a concurrency limit
- // of one because there are some chdir tests in there.
- // TODO(caspervonb) split these tests into two groups: parallel and serial.
let mut deno = util::deno_cmd()
.current_dir(util::root_path())
.arg("test")
@@ -29,11 +115,58 @@ fn js_unit_tests() {
.arg("--location=http://js-unit-tests/foo/bar")
.arg("--no-prompt")
.arg("-A")
- .arg(util::tests_path().join("unit"))
+ .arg(util::tests_path().join("unit").join(format!("{test}.ts")))
+ .stderr(Stdio::piped())
+ .stdout(Stdio::piped())
.spawn()
.expect("failed to spawn script");
- let status = deno.wait().expect("failed to wait for the child process");
+ let now = Instant::now();
+ let stdout = deno.stdout.take().unwrap();
+ let test_name = test.clone();
+ let stdout = std::thread::spawn(move || {
+ let reader = BufReader::new(stdout);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ let now = Instant::now();
+ let stderr = deno.stderr.take().unwrap();
+ let test_name = test.clone();
+ let stderr = std::thread::spawn(move || {
+ let reader = BufReader::new(stderr);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ const PER_TEST_TIMEOUT: Duration = Duration::from_secs(2 * 60);
+
+ let now = Instant::now();
+ let status = loop {
+ if now.elapsed() > PER_TEST_TIMEOUT {
+ // Last-ditch kill
+ _ = deno.kill();
+ panic!("Test {test} failed to complete in time");
+ }
+ if let Some(status) = deno
+ .try_wait()
+ .expect("failed to wait for the child process")
+ {
+ break status;
+ }
+ std::thread::sleep(Duration::from_millis(100));
+ };
+
#[cfg(unix)]
assert_eq!(
std::os::unix::process::ExitStatusExt::signal(&status),
@@ -41,5 +174,9 @@ fn js_unit_tests() {
"Deno should not have died with a signal"
);
assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
+
+ stdout.join().unwrap();
+ stderr.join().unwrap();
+
assert!(status.success());
}
diff --git a/cli/tests/integration/node_unit_tests.rs b/cli/tests/integration/node_unit_tests.rs
index d2a6f6ec8..2cde51552 100644
--- a/cli/tests/integration/node_unit_tests.rs
+++ b/cli/tests/integration/node_unit_tests.rs
@@ -1,12 +1,80 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
+use std::io::BufRead;
+use std::io::BufReader;
+use std::process::Stdio;
+use std::time::Duration;
+use std::time::Instant;
use test_util as util;
-#[test]
-fn node_unit_tests() {
+util::unit_test_factory!(
+ node_unit_test,
+ "tests/unit_node",
+ "**/*_test.ts",
+ [
+ _fs_access_test = _fs / _fs_access_test,
+ _fs_appendFile_test = _fs / _fs_appendFile_test,
+ _fs_chmod_test = _fs / _fs_chmod_test,
+ _fs_chown_test = _fs / _fs_chown_test,
+ _fs_close_test = _fs / _fs_close_test,
+ _fs_copy_test = _fs / _fs_copy_test,
+ _fs_dir_test = _fs / _fs_dir_test,
+ _fs_exists_test = _fs / _fs_exists_test,
+ _fs_fdatasync_test = _fs / _fs_fdatasync_test,
+ _fs_fstat_test = _fs / _fs_fstat_test,
+ _fs_fsync_test = _fs / _fs_fsync_test,
+ _fs_ftruncate_test = _fs / _fs_ftruncate_test,
+ _fs_futimes_test = _fs / _fs_futimes_test,
+ _fs_link_test = _fs / _fs_link_test,
+ _fs_lstat_test = _fs / _fs_lstat_test,
+ _fs_mkdir_test = _fs / _fs_mkdir_test,
+ _fs_mkdtemp_test = _fs / _fs_mkdtemp_test,
+ _fs_opendir_test = _fs / _fs_opendir_test,
+ _fs_readFile_test = _fs / _fs_readFile_test,
+ _fs_readdir_test = _fs / _fs_readdir_test,
+ _fs_readlink_test = _fs / _fs_readlink_test,
+ _fs_realpath_test = _fs / _fs_realpath_test,
+ _fs_rename_test = _fs / _fs_rename_test,
+ _fs_rm_test = _fs / _fs_rm_test,
+ _fs_rmdir_test = _fs / _fs_rmdir_test,
+ _fs_stat_test = _fs / _fs_stat_test,
+ _fs_symlink_test = _fs / _fs_symlink_test,
+ _fs_truncate_test = _fs / _fs_truncate_test,
+ _fs_unlink_test = _fs / _fs_unlink_test,
+ _fs_utimes_test = _fs / _fs_utimes_test,
+ _fs_watch_test = _fs / _fs_watch_test,
+ _fs_write_test = _fs / _fs_write_test,
+ async_hooks_test,
+ child_process_test,
+ crypto_cipher_test = crypto / crypto_cipher_test,
+ crypto_hash_test = crypto / crypto_hash_test,
+ crypto_key_test = crypto / crypto_key_test,
+ crypto_sign_test = crypto / crypto_sign_test,
+ fs_test,
+ http_test,
+ _randomBytes_test = internal / _randomBytes_test,
+ _randomFill_test = internal / _randomFill_test,
+ _randomInt_test = internal / _randomInt_test,
+ pbkdf2_test = internal / pbkdf2_test,
+ scrypt_test = internal / scrypt_test,
+ module_test,
+ process_test,
+ querystring_test,
+ readline_test,
+ string_decoder_test,
+ timers_test,
+ tls_test,
+ tty_test,
+ util_test,
+ v8_test,
+ worker_threads_test
+ ]
+);
+
+fn node_unit_test(test: String) {
let _g = util::http_server();
- let mut deno = util::deno_cmd()
+ let mut deno = util::deno_cmd();
+ let mut deno = deno
.current_dir(util::root_path())
.arg("test")
.arg("--unstable")
@@ -14,12 +82,78 @@ fn node_unit_tests() {
// but this shouldn't be necessary. tls.connect currently doesn't
// pass hostname option correctly and it causes cert errors.
.arg("--unsafely-ignore-certificate-errors")
- .arg("-A")
- .arg(util::tests_path().join("unit_node"))
+ .arg("-A");
+ // Parallel tests for crypto
+ if test.starts_with("crypto/") {
+ deno = deno.arg("--parallel");
+ }
+ let mut deno = deno
+ .arg(
+ util::tests_path()
+ .join("unit_node")
+ .join(format!("{test}.ts")),
+ )
+ .stderr(Stdio::piped())
+ .stdout(Stdio::piped())
.spawn()
.expect("failed to spawn script");
- let status = deno.wait().expect("failed to wait for the child process");
- assert_eq!(Some(0), status.code());
+ let now = Instant::now();
+ let stdout = deno.stdout.take().unwrap();
+ let test_name = test.clone();
+ let stdout = std::thread::spawn(move || {
+ let reader = BufReader::new(stdout);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ let now = Instant::now();
+ let stderr = deno.stderr.take().unwrap();
+ let test_name = test.clone();
+ let stderr = std::thread::spawn(move || {
+ let reader = BufReader::new(stderr);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ const PER_TEST_TIMEOUT: Duration = Duration::from_secs(5 * 60);
+
+ let now = Instant::now();
+ let status = loop {
+ if now.elapsed() > PER_TEST_TIMEOUT {
+ // Last-ditch kill
+ _ = deno.kill();
+ panic!("Test {test} failed to complete in time");
+ }
+ if let Some(status) = deno
+ .try_wait()
+ .expect("failed to wait for the child process")
+ {
+ break status;
+ }
+ std::thread::sleep(Duration::from_millis(100));
+ };
+
+ #[cfg(unix)]
+ assert_eq!(
+ std::os::unix::process::ExitStatusExt::signal(&status),
+ None,
+ "Deno should not have died with a signal"
+ );
+ assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
+
+ stdout.join().unwrap();
+ stderr.join().unwrap();
+
assert!(status.success());
}