1#![cfg(all(rustc_nightly, feature = "runtime-tokio"))]
2
3use std::thread;
4
5use crate::new_acceptor_dyn_from_der_keys;
6use crate::new_acceptor_from_der_keys;
7use crate::new_connector_dyn_with_root_ca;
8use crate::new_connector_with_root_ca;
9use crate::TcpListener;
10use crate::TcpStream;
11use crate::BIND_HOST;
12use test::Bencher;
13use tls_api::AsyncSocketBox;
14use tls_api::TlsAcceptorType;
15use tls_api::TlsConnectorType;
16use tokio::io::AsyncReadExt;
17use tokio::io::AsyncWriteExt;
18use tokio::runtime::Runtime;
19
20pub fn bench_1<C: tls_api::TlsConnector, A: tls_api::TlsAcceptor>(bencher: &mut Bencher) {
21 let acceptor = new_acceptor_from_der_keys::<A>();
22
23 let server_rt = Runtime::new().unwrap();
24
25 #[allow(unused_mut)]
26 let mut listener = server_rt
27 .block_on(TcpListener::bind((crate::BIND_HOST, 0)))
28 .unwrap();
29 let port = listener.local_addr().expect("local_addr").port();
30
31 let t = thread::spawn(move || {
32 Runtime::new().unwrap().block_on(async {
33 let socket = listener.accept().await.unwrap().0;
34 let mut stream = acceptor.accept(socket).await.unwrap();
35 loop {
36 let mut buf = [0];
37 let read = stream.read(&mut buf).await.unwrap();
38 if read == 0 {
39 break;
40 }
41 assert_eq!(1, read);
42 assert_eq!(1, stream.write(&buf).await.unwrap());
43 }
44 });
45 });
46
47 let rt = Runtime::new().unwrap();
48
49 let socket = rt.block_on(TcpStream::connect((BIND_HOST, port))).unwrap();
50
51 let connector: C = new_connector_with_root_ca();
52 let mut tls_stream = rt.block_on(connector.connect("localhost", socket)).unwrap();
53
54 bencher.iter(|| {
55 rt.block_on(async {
56 assert_eq!(1, tls_stream.write(&[10]).await.unwrap());
57 let mut buf = [0];
58 assert_eq!(1, tls_stream.read(&mut buf).await.unwrap());
59 assert_eq!(10, buf[0]);
60 })
61 });
62
63 drop(tls_stream);
64
65 t.join().unwrap();
66}
67
68pub fn bench_1_dyn(
69 connector: &'static dyn TlsConnectorType,
70 acceptor: &'static dyn TlsAcceptorType,
71 bencher: &mut Bencher,
72) {
73 let acceptor = new_acceptor_dyn_from_der_keys(acceptor);
74
75 let server_rt = Runtime::new().unwrap();
76
77 #[allow(unused_mut)]
78 let mut listener = server_rt
79 .block_on(TcpListener::bind((crate::BIND_HOST, 0)))
80 .unwrap();
81 let port = listener.local_addr().expect("local_addr").port();
82
83 let t = thread::spawn(move || {
84 Runtime::new().unwrap().block_on(async {
85 let socket = listener.accept().await.unwrap().0;
86 let mut stream = acceptor.accept(socket).await.unwrap();
87 loop {
88 let mut buf = [0];
89 let read = stream.read(&mut buf).await.unwrap();
90 if read == 0 {
91 break;
92 }
93 assert_eq!(1, read);
94 assert_eq!(1, stream.write(&buf).await.unwrap());
95 }
96 });
97 });
98
99 let rt = Runtime::new().unwrap();
100
101 let socket = AsyncSocketBox::new(rt.block_on(TcpStream::connect((BIND_HOST, port))).unwrap());
102
103 let connector = new_connector_dyn_with_root_ca(connector);
104 let mut tls_stream = rt.block_on(connector.connect("localhost", socket)).unwrap();
105
106 bencher.iter(|| {
107 rt.block_on(async {
108 assert_eq!(1, tls_stream.write(&[10]).await.unwrap());
109 let mut buf = [0];
110 assert_eq!(1, tls_stream.read(&mut buf).await.unwrap());
111 assert_eq!(10, buf[0]);
112 })
113 });
114
115 drop(tls_stream);
116
117 t.join().unwrap();
118}