tls_api_test/
benches.rs

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}