diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2022-11-28 21:59:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-28 21:59:36 +0100 |
commit | fd51b2e506f3ea3cc49bfb2bcb19bc684f563f60 (patch) | |
tree | 7b8deca6a97e53048293d92cb471d1726e0e3a0f /cli/tests/inspector_tests.rs | |
parent | 9202611e3695c7091f257b261af809697df959ab (diff) |
fix(npm): allow to inspect npm modules with --inspect-brk (#16841)
Diffstat (limited to 'cli/tests/inspector_tests.rs')
-rw-r--r-- | cli/tests/inspector_tests.rs | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/cli/tests/inspector_tests.rs b/cli/tests/inspector_tests.rs index 94ebbb205..407e8f071 100644 --- a/cli/tests/inspector_tests.rs +++ b/cli/tests/inspector_tests.rs @@ -12,6 +12,7 @@ use std::io::BufRead; use std::pin::Pin; use test_util as util; use tokio::net::TcpStream; +use util::http_server; mod inspector { use super::*; @@ -1133,4 +1134,177 @@ mod inspector { child.kill().unwrap(); child.wait().unwrap(); } + + #[tokio::test] + async fn inspector_break_on_first_line_npm_esm() { + let _server = http_server(); + + let mut child = util::deno_cmd() + .arg("run") + .arg("--quiet") + .arg(inspect_flag_with_unique_port("--inspect-brk")) + .arg("npm:@denotest/bin/cli-esm") + .arg("this") + .arg("is") + .arg("a") + .arg("test") + .envs(util::env_vars_for_npm_tests()) + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap(); + + let stderr = child.stderr.as_mut().unwrap(); + let mut stderr_lines = + std::io::BufReader::new(stderr).lines().map(|r| r.unwrap()); + let ws_url = extract_ws_url_from_stderr(&mut stderr_lines); + + let (socket, response) = + tokio_tungstenite::connect_async(ws_url).await.unwrap(); + assert_eq!(response.status(), 101); // Switching protocols. + + let (mut socket_tx, socket_rx) = socket.split(); + let mut socket_rx = socket_rx + .map(|msg| msg.unwrap().to_string()) + .filter(|msg| { + let pass = !msg.starts_with(r#"{"method":"Debugger.scriptParsed","#); + futures::future::ready(pass) + }) + .boxed_local(); + + let stdout = child.stdout.as_mut().unwrap(); + let mut stdout_lines = + std::io::BufReader::new(stdout).lines().map(|r| r.unwrap()); + + assert_stderr_for_inspect_brk(&mut stderr_lines); + + assert_inspector_messages( + &mut socket_tx, + &[ + r#"{"id":1,"method":"Runtime.enable"}"#, + r#"{"id":2,"method":"Debugger.enable"}"#, + ], + &mut socket_rx, + &[ + r#"{"id":1,"result":{}}"#, + r#"{"id":2,"result":{"debuggerId":"#, + ], + &[ + r#"{"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"#, + ], + ) + .await; + + assert_inspector_messages( + &mut socket_tx, + &[r#"{"id":3,"method":"Runtime.runIfWaitingForDebugger"}"#], + &mut socket_rx, + &[r#"{"id":3,"result":{}}"#], + &[r#"{"method":"Debugger.paused","#], + ) + .await; + + assert_inspector_messages( + &mut socket_tx, + &[r#"{"id":4,"method":"Debugger.resume"}"#], + &mut socket_rx, + &[r#"{"id":4,"result":{}}"#], + &[], + ) + .await; + + assert_eq!(&stdout_lines.next().unwrap(), "this"); + assert_eq!(&stdout_lines.next().unwrap(), "is"); + assert_eq!(&stdout_lines.next().unwrap(), "a"); + assert_eq!(&stdout_lines.next().unwrap(), "test"); + + child.kill().unwrap(); + child.wait().unwrap(); + } + + #[tokio::test] + async fn inspector_break_on_first_line_npm_cjs() { + let _server = http_server(); + let mut child = util::deno_cmd() + .arg("run") + .arg("--quiet") + .arg(inspect_flag_with_unique_port("--inspect-brk")) + .arg("npm:@denotest/bin/cli-cjs") + .arg("this") + .arg("is") + .arg("a") + .arg("test") + .envs(util::env_vars_for_npm_tests()) + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap(); + + let stderr = child.stderr.as_mut().unwrap(); + let mut stderr_lines = + std::io::BufReader::new(stderr).lines().map(|r| r.unwrap()); + let ws_url = extract_ws_url_from_stderr(&mut stderr_lines); + + let (socket, response) = + tokio_tungstenite::connect_async(ws_url).await.unwrap(); + assert_eq!(response.status(), 101); // Switching protocols. + + let (mut socket_tx, socket_rx) = socket.split(); + let mut socket_rx = socket_rx + .map(|msg| msg.unwrap().to_string()) + .filter(|msg| { + let pass = !msg.starts_with(r#"{"method":"Debugger.scriptParsed","#); + futures::future::ready(pass) + }) + .boxed_local(); + + let stdout = child.stdout.as_mut().unwrap(); + let mut stdout_lines = + std::io::BufReader::new(stdout).lines().map(|r| r.unwrap()); + + assert_stderr_for_inspect_brk(&mut stderr_lines); + + assert_inspector_messages( + &mut socket_tx, + &[ + r#"{"id":1,"method":"Runtime.enable"}"#, + r#"{"id":2,"method":"Debugger.enable"}"#, + ], + &mut socket_rx, + &[ + r#"{"id":1,"result":{}}"#, + r#"{"id":2,"result":{"debuggerId":"#, + ], + &[ + r#"{"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"#, + ], + ) + .await; + + assert_inspector_messages( + &mut socket_tx, + &[r#"{"id":3,"method":"Runtime.runIfWaitingForDebugger"}"#], + &mut socket_rx, + &[r#"{"id":3,"result":{}}"#], + &[r#"{"method":"Debugger.paused","#], + ) + .await; + + assert_inspector_messages( + &mut socket_tx, + &[r#"{"id":4,"method":"Debugger.resume"}"#], + &mut socket_rx, + &[r#"{"id":4,"result":{}}"#], + &[], + ) + .await; + + assert_eq!(&stdout_lines.next().unwrap(), "this"); + assert_eq!(&stdout_lines.next().unwrap(), "is"); + assert_eq!(&stdout_lines.next().unwrap(), "a"); + assert_eq!(&stdout_lines.next().unwrap(), "test"); + + child.kill().unwrap(); + child.wait().unwrap(); + } } |