diff options
Diffstat (limited to 'cli/tests/integration/run_tests.rs')
-rw-r--r-- | cli/tests/integration/run_tests.rs | 141 |
1 files changed, 104 insertions, 37 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index b5bb04fdd..aba6283d1 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -4088,14 +4088,46 @@ fn websocketstream() { assert!(status.success()); } -#[test] -fn websocketstream_ping() { - use deno_runtime::deno_websocket::tokio_tungstenite::tungstenite; +#[tokio::test(flavor = "multi_thread")] +async fn websocketstream_ping() { let _g = util::http_server(); let script = util::testdata_path().join("run/websocketstream_ping_test.ts"); let root_ca = util::testdata_path().join("tls/RootCA.pem"); - let mut child = util::deno_cmd() + + let srv_fn = hyper::service::service_fn(|mut req| async move { + let (response, upgrade_fut) = + fastwebsockets::upgrade::upgrade(&mut req).unwrap(); + tokio::spawn(async move { + let mut ws = upgrade_fut.await.unwrap(); + + ws.write_frame(fastwebsockets::Frame::text("A".as_bytes().to_vec())) + .await + .unwrap(); + ws.write_frame(fastwebsockets::Frame::new( + true, + fastwebsockets::OpCode::Ping, + None, + vec![], + )) + .await + .unwrap(); + ws.write_frame(fastwebsockets::Frame::text("B".as_bytes().to_vec())) + .await + .unwrap(); + let message = ws.read_frame().await.unwrap(); + assert_eq!(message.opcode, fastwebsockets::OpCode::Pong); + ws.write_frame(fastwebsockets::Frame::text("C".as_bytes().to_vec())) + .await + .unwrap(); + ws.write_frame(fastwebsockets::Frame::close_raw(vec![])) + .await + .unwrap(); + }); + Ok::<_, std::convert::Infallible>(response) + }); + + let child = util::deno_cmd() .arg("test") .arg("--unstable") .arg("--allow-net") @@ -4105,31 +4137,38 @@ fn websocketstream_ping() { .stdout(std::process::Stdio::piped()) .spawn() .unwrap(); - - let server = std::net::TcpListener::bind("127.0.0.1:4513").unwrap(); - let (stream, _) = server.accept().unwrap(); - let mut socket = tungstenite::accept(stream).unwrap(); - socket - .write_message(tungstenite::Message::Text(String::from("A"))) - .unwrap(); - socket - .write_message(tungstenite::Message::Ping(vec![])) - .unwrap(); - socket - .write_message(tungstenite::Message::Text(String::from("B"))) - .unwrap(); - let message = socket.read_message().unwrap(); - assert_eq!(message, tungstenite::Message::Pong(vec![])); - socket - .write_message(tungstenite::Message::Text(String::from("C"))) + let server = tokio::net::TcpListener::bind("127.0.0.1:4513") + .await .unwrap(); - socket.close(None).unwrap(); + tokio::spawn(async move { + let (stream, _) = server.accept().await.unwrap(); + let conn_fut = hyper::server::conn::Http::new() + .serve_connection(stream, srv_fn) + .with_upgrades(); + + if let Err(e) = conn_fut.await { + eprintln!("websocket server error: {e:?}"); + } + }); - assert!(child.wait().unwrap().success()); + let r = child.wait_with_output().unwrap(); + assert!(r.status.success()); } -#[test] -fn websocket_server_multi_field_connection_header() { +struct SpawnExecutor; + +impl<Fut> hyper::rt::Executor<Fut> for SpawnExecutor +where + Fut: std::future::Future + Send + 'static, + Fut::Output: Send + 'static, +{ + fn execute(&self, fut: Fut) { + tokio::task::spawn(fut); + } +} + +#[tokio::test] +async fn websocket_server_multi_field_connection_header() { let script = util::testdata_path() .join("run/websocket_server_multi_field_connection_header_test.ts"); let root_ca = util::testdata_path().join("tls/RootCA.pem"); @@ -4151,25 +4190,41 @@ fn websocket_server_multi_field_connection_header() { let msg = std::str::from_utf8(&buffer).unwrap(); assert_eq!(msg, "READY"); - let req = http::request::Builder::new() + let stream = tokio::net::TcpStream::connect("localhost:4319") + .await + .unwrap(); + let req = hyper::Request::builder() + .header(hyper::header::UPGRADE, "websocket") .header(http::header::CONNECTION, "keep-alive, Upgrade") + .header( + "Sec-WebSocket-Key", + fastwebsockets::handshake::generate_key(), + ) + .header("Sec-WebSocket-Version", "13") .uri("ws://localhost:4319") - .body(()) + .body(hyper::Body::empty()) .unwrap(); + let (mut socket, _) = - deno_runtime::deno_websocket::tokio_tungstenite::tungstenite::connect(req) + fastwebsockets::handshake::client(&SpawnExecutor, req, stream) + .await .unwrap(); - let message = socket.read_message().unwrap(); - assert_eq!(message, deno_runtime::deno_websocket::tokio_tungstenite::tungstenite::Message::Close(None)); - socket.close(None).unwrap(); + + let message = socket.read_frame().await.unwrap(); + assert_eq!(message.opcode, fastwebsockets::OpCode::Close); + assert!(message.payload.is_empty()); + socket + .write_frame(fastwebsockets::Frame::close_raw(vec![])) + .await + .unwrap(); assert!(child.wait().unwrap().success()); } // TODO(bartlomieju): this should use `deno run`, not `deno test`; but the // test hangs then. https://github.com/denoland/deno/issues/14283 -#[test] +#[tokio::test] #[ignore] -fn websocket_server_idletimeout() { +async fn websocket_server_idletimeout() { let script = util::testdata_path().join("run/websocket_server_idletimeout.ts"); let root_ca = util::testdata_path().join("tls/RootCA.pem"); @@ -4191,12 +4246,24 @@ fn websocket_server_idletimeout() { let msg = std::str::from_utf8(&buffer).unwrap(); assert_eq!(msg, "READY"); - let req = http::request::Builder::new() + let stream = tokio::net::TcpStream::connect("localhost:4509") + .await + .unwrap(); + let req = hyper::Request::builder() + .header(hyper::header::UPGRADE, "websocket") + .header(http::header::CONNECTION, "keep-alive, Upgrade") + .header( + "Sec-WebSocket-Key", + fastwebsockets::handshake::generate_key(), + ) + .header("Sec-WebSocket-Version", "13") .uri("ws://localhost:4509") - .body(()) + .body(hyper::Body::empty()) .unwrap(); - let (_ws, _request) = - deno_runtime::deno_websocket::tokio_tungstenite::tungstenite::connect(req) + + let (_socket, _) = + fastwebsockets::handshake::client(&SpawnExecutor, req, stream) + .await .unwrap(); assert!(child.wait().unwrap().success()); |