tls_api_test/
client_server.rs

1use std::any;
2use std::thread;
3
4use tls_api::runtime::AsyncReadExt;
5use tls_api::runtime::AsyncWriteExt;
6use tls_api::TlsAcceptor;
7use tls_api::TlsAcceptorBuilder;
8use tls_api::TlsConnector;
9
10use crate::block_on;
11use crate::new_acceptor;
12use crate::new_connector_with_root_ca;
13use crate::AcceptorKeyKind;
14use crate::TcpListener;
15use crate::TcpStream;
16use crate::BIND_HOST;
17
18async fn test_client_server_impl<C, A>(key: AcceptorKeyKind)
19where
20    C: TlsConnector,
21    A: TlsAcceptor,
22{
23    drop(env_logger::try_init());
24
25    if !C::IMPLEMENTED {
26        eprintln!(
27            "connector {} is not implemented; skipping",
28            any::type_name::<C>()
29        );
30        return;
31    }
32
33    if !A::IMPLEMENTED {
34        eprintln!(
35            "acceptor {} is not implemented; skipping",
36            any::type_name::<A>()
37        );
38        return;
39    }
40
41    let acceptor = new_acceptor::<A>(Some(key));
42
43    let acceptor: A = acceptor.build().expect("acceptor build");
44    #[allow(unused_mut)]
45    let mut listener = t!(TcpListener::bind((BIND_HOST, 0)).await);
46    let port = listener.local_addr().expect("local_addr").port();
47
48    let server_thread_name = format!("{}-server", thread::current().name().unwrap_or("test"));
49    let j = thread::Builder::new()
50        .name(server_thread_name)
51        .spawn(move || {
52            let future = async {
53                let socket = t!(listener.accept().await).0;
54                let mut socket = t!(acceptor.accept(socket).await);
55
56                let mut buf = [0; 5];
57                t!(socket.read_exact(&mut buf).await);
58                assert_eq!(&buf, b"hello");
59
60                t!(socket.write_all(b"world").await);
61            };
62            block_on(future);
63        })
64        .unwrap();
65
66    let socket = t!(TcpStream::connect((BIND_HOST, port)).await);
67
68    let connector: C = new_connector_with_root_ca();
69    let mut socket = t!(connector.connect("localhost", socket).await);
70
71    t!(socket.write_all(b"hello").await);
72    let mut buf = vec![];
73    t!(socket.read_to_end(&mut buf).await);
74    assert_eq!(buf, b"world");
75
76    j.join().expect("thread join");
77}
78
79pub fn test_client_server_der<C, A>()
80where
81    C: TlsConnector,
82    A: TlsAcceptor,
83{
84    block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Der))
85}
86
87pub fn test_client_server_pkcs12<C, A>()
88where
89    C: TlsConnector,
90    A: TlsAcceptor,
91{
92    block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Pkcs12))
93}