tls_api_test/
client_server_dyn.rs1use 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 }
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}