tls_api_test/
client_server.rs1use 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 block_on(future);
63 })
64 .unwrap();
65
66 let socket = t!(TcpStream::connect((BIND_HOST, port)).await);
67
68 let connector: C = new_connector_with_root_ca();
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 t!(socket.read_to_end(&mut buf).await);
74 assert_eq!(buf, b"world");
75
76 j.join().expect("thread join");
77}
78
79pub fn test_client_server_der<C, A>()
80where
81 C: TlsConnector,
82 A: TlsAcceptor,
83{
84 block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Der))
85}
86
87pub fn test_client_server_pkcs12<C, A>()
88where
89 C: TlsConnector,
90 A: TlsAcceptor,
91{
92 block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Pkcs12))
93}