tls_api_test_2/
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                #[cfg(feature = "runtime-tokio")]
56                t!(socket.shutdown().await);
57
58                #[cfg(feature = "runtime-async-std")]
59                t!(socket.close().await);
60            };
61            block_on(future);
62        })
63        .unwrap();
64
65    let socket = t!(TcpStream::connect((BIND_HOST, port)).await);
66
67    let connector = new_connector_builder_dyn_with_root_ca(connector);
68    let connector = connector.build().expect("acceptor build");
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    match socket.read_to_end(&mut buf).await {
74        Ok(_) => {}
75        Err(e) if e.kind() == io::ErrorKind::ConnectionReset => {
76            // rustls on Windows does that
77        }
78        Err(e) => panic!("{}", e),
79    }
80    assert_eq!(buf, b"world");
81
82    j.join().expect("thread join");
83}
84
85pub fn test_client_server_dyn_der(
86    connector: &dyn TlsConnectorType,
87    acceptor: &dyn TlsAcceptorType,
88) {
89    block_on(test_client_server_dyn_impl(
90        connector,
91        acceptor,
92        AcceptorKeyKind::Der,
93    ))
94}
95
96pub fn test_client_server_dyn_pkcs12(
97    connector: &dyn TlsConnectorType,
98    acceptor: &dyn TlsAcceptorType,
99) {
100    block_on(test_client_server_dyn_impl(
101        connector,
102        acceptor,
103        AcceptorKeyKind::Pkcs12,
104    ))
105}