tls_api_test/
client_server_dyn.rs

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