/ abzu-transport / tests / websocket_pfs_test.rs
websocket_pfs_test.rs
 1  use tokio::net::TcpListener;
 2  use tokio::task;
 3  use abzu_transport::transports::websocket::WsStream;
 4  use abzu_transport::AbzuInterface;
 5  
 6  #[tokio::test]
 7  async fn test_pfs_handshake_roundtrip() {
 8      // 1. Setup a standard TCP listener
 9      let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
10      let addr_socket = listener.local_addr().unwrap();
11      let addr_str = addr_socket.to_string();
12  
13      // 2. Spawn the listener task (Server)
14      let server_task = task::spawn(async move {
15          // Accept the raw TCP connection
16          let (stream, _) = listener.accept().await.unwrap();
17          
18          // Accept and perform the PFS handshake
19          match WsStream::accept_pfs(stream).await {
20              Ok(handshake) => {
21                  let stream = handshake.stream;
22                  let peer_pubkey = handshake.peer_pubkey;
23                  
24                  // Echo the peer's public key back to prove we have it
25                  let peer_key_vec = peer_pubkey.to_vec();
26                  stream.send(&peer_key_vec).await.unwrap();
27                  
28                  // Also receive a message (echo test)
29                  let msg = stream.recv().await.unwrap();
30                  assert_eq!(msg, b"client_secret_payload");
31                  
32                  // Return server's success status
33                  true
34              },
35              Err(e) => {
36                  println!("Server handshake failed: {}", e);
37                  false
38              }
39          }
40      });
41  
42      // 3. Spawn the client task
43      let addr_for_client = addr_str.clone();
44      let client_task = task::spawn(async move {
45          // Connect and perform PFS handshake
46          match WsStream::connect_pfs(&addr_for_client).await {
47              Ok(handshake) => {
48                  let stream = handshake.stream;
49                  
50                  // Send a secret payload
51                  stream.send(b"client_secret_payload").await.unwrap();
52                  
53                  // Receive the server's echo of our public key (not really standard, just for this test)
54                  let msg = stream.recv().await.unwrap();
55                  
56                  // We don't easily know our own ephemeral key here to verify, but we can check format
57                  assert_eq!(msg.len(), 32);
58                  
59                  true
60              },
61              Err(e) => {
62                  println!("Client handshake failed: {}", e);
63                  false
64              }
65          }
66      });
67  
68      // 4. Wait for both to complete
69      let server_result = server_task.await.unwrap();
70      let client_result = client_task.await.unwrap();
71  
72      assert!(server_result, "Server failed");
73      assert!(client_result, "Client failed");
74  }