tls_api_test_2/
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 #[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 }
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}