()
| 991 | |
| 992 | #[tokio::test(flavor = "multi_thread", worker_threads = 2)] |
| 993 | async fn postgres_control_packets_are_handled_safely() -> Result<()> { |
| 994 | let server = PgliteServer::temporary_tcp()?; |
| 995 | let addr = server.tcp_addr().context("server should use TCP")?; |
| 996 | |
| 997 | let ssl_response = tokio::task::spawn_blocking(move || -> Result<u8> { |
| 998 | let mut stream = TcpStream::connect(addr).context("connect raw SSLRequest socket")?; |
| 999 | stream |
| 1000 | .write_all(&startup_control_packet(SSL_REQUEST_CODE, &[])) |
| 1001 | .context("write SSLRequest")?; |
| 1002 | let mut response = [0u8; 1]; |
| 1003 | stream |
| 1004 | .read_exact(&mut response) |
| 1005 | .context("read SSLRequest response")?; |
| 1006 | Ok(response[0]) |
| 1007 | }) |
| 1008 | .await??; |
| 1009 | assert_eq!(ssl_response, b'N'); |
| 1010 | |
| 1011 | let cancel_closed = tokio::task::spawn_blocking(move || -> Result<bool> { |
| 1012 | let mut stream = TcpStream::connect(addr).context("connect raw CancelRequest socket")?; |
| 1013 | stream |
| 1014 | .write_all(&startup_control_packet( |
| 1015 | CANCEL_REQUEST_CODE, |
| 1016 | &[0, 0, 0, 1, 0, 0, 0, 2], |
| 1017 | )) |
| 1018 | .context("write CancelRequest")?; |
| 1019 | let mut response = [0u8; 1]; |
| 1020 | let read = stream |
| 1021 | .read(&mut response) |
| 1022 | .context("read CancelRequest close")?; |
| 1023 | Ok(read == 0) |
| 1024 | }) |
| 1025 | .await??; |
| 1026 | assert!( |
| 1027 | cancel_closed, |
| 1028 | "CancelRequest should close without backend panic" |
| 1029 | ); |
| 1030 | |
| 1031 | server.shutdown()?; |
| 1032 | Ok(()) |
| 1033 | } |
| 1034 | |
| 1035 | #[tokio::test(flavor = "multi_thread", worker_threads = 2)] |
| 1036 | async fn postgres_startup_identity_is_delegated_to_postgres() -> Result<()> { |
nothing calls this directly
no test coverage detected