tls_api_test_2/
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                #[cfg(feature = "runtime-tokio")]
63                t!(socket.shutdown().await);
64
65                #[cfg(feature = "runtime-async-std")]
66                t!(socket.close().await);
67            };
68            block_on(future);
69        })
70        .unwrap();
71
72    let socket = t!(TcpStream::connect((BIND_HOST, port)).await);
73
74    let connector: C = new_connector_with_root_ca();
75    let mut socket = t!(connector.connect("localhost", socket).await);
76
77    t!(socket.write_all(b"hello").await);
78    let mut buf = vec![];
79    t!(socket.read_to_end(&mut buf).await);
80    assert_eq!(buf, b"world");
81
82    j.join().expect("thread join");
83}
84
85pub fn test_client_server_der<C, A>()
86where
87    C: TlsConnector,
88    A: TlsAcceptor,
89{
90    block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Der))
91}
92
93pub fn test_client_server_pkcs12<C, A>()
94where
95    C: TlsConnector,
96    A: TlsAcceptor,
97{
98    block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Pkcs12))
99}