tls_api_test_2/
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 #[cfg(feature = "runtime-tokio")]
63 t!(socket.shutdown().await);
64
65 #[cfg(feature = "runtime-async-std")]
66 t!(socket.close().await);
67 };
68 block_on(future);
69 })
70 .unwrap();
71
72 let socket = t!(TcpStream::connect((BIND_HOST, port)).await);
73
74 let connector: C = new_connector_with_root_ca();
75 let mut socket = t!(connector.connect("localhost", socket).await);
76
77 t!(socket.write_all(b"hello").await);
78 let mut buf = vec![];
79 t!(socket.read_to_end(&mut buf).await);
80 assert_eq!(buf, b"world");
81
82 j.join().expect("thread join");
83}
84
85pub fn test_client_server_der<C, A>()
86where
87 C: TlsConnector,
88 A: TlsAcceptor,
89{
90 block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Der))
91}
92
93pub fn test_client_server_pkcs12<C, A>()
94where
95 C: TlsConnector,
96 A: TlsAcceptor,
97{
98 block_on(test_client_server_impl::<C, A>(AcceptorKeyKind::Pkcs12))
99}