1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#![cfg(all(rustc_nightly, feature = "runtime-tokio"))]

use std::thread;

use crate::new_acceptor_dyn_from_der_keys;
use crate::new_acceptor_from_der_keys;
use crate::new_connector_dyn_with_root_ca;
use crate::new_connector_with_root_ca;
use crate::TcpListener;
use crate::TcpStream;
use crate::BIND_HOST;
use test::Bencher;
use tls_api::AsyncSocketBox;
use tls_api::TlsAcceptorType;
use tls_api::TlsConnectorType;
use tokio::io::AsyncReadExt;
use tokio::io::AsyncWriteExt;
use tokio::runtime::Runtime;

pub fn bench_1<C: tls_api::TlsConnector, A: tls_api::TlsAcceptor>(bencher: &mut Bencher) {
    let acceptor = new_acceptor_from_der_keys::<A>();

    let server_rt = Runtime::new().unwrap();

    #[allow(unused_mut)]
    let mut listener = server_rt
        .block_on(TcpListener::bind((crate::BIND_HOST, 0)))
        .unwrap();
    let port = listener.local_addr().expect("local_addr").port();

    let t = thread::spawn(move || {
        Runtime::new().unwrap().block_on(async {
            let socket = listener.accept().await.unwrap().0;
            let mut stream = acceptor.accept(socket).await.unwrap();
            loop {
                let mut buf = [0];
                let read = stream.read(&mut buf).await.unwrap();
                if read == 0 {
                    break;
                }
                assert_eq!(1, read);
                assert_eq!(1, stream.write(&buf).await.unwrap());
            }
        });
    });

    let rt = Runtime::new().unwrap();

    let socket = rt.block_on(TcpStream::connect((BIND_HOST, port))).unwrap();

    let connector: C = new_connector_with_root_ca();
    let mut tls_stream = rt.block_on(connector.connect("localhost", socket)).unwrap();

    bencher.iter(|| {
        rt.block_on(async {
            assert_eq!(1, tls_stream.write(&[10]).await.unwrap());
            let mut buf = [0];
            assert_eq!(1, tls_stream.read(&mut buf).await.unwrap());
            assert_eq!(10, buf[0]);
        })
    });

    drop(tls_stream);

    t.join().unwrap();
}

pub fn bench_1_dyn(
    connector: &'static dyn TlsConnectorType,
    acceptor: &'static dyn TlsAcceptorType,
    bencher: &mut Bencher,
) {
    let acceptor = new_acceptor_dyn_from_der_keys(acceptor);

    let server_rt = Runtime::new().unwrap();

    #[allow(unused_mut)]
    let mut listener = server_rt
        .block_on(TcpListener::bind((crate::BIND_HOST, 0)))
        .unwrap();
    let port = listener.local_addr().expect("local_addr").port();

    let t = thread::spawn(move || {
        Runtime::new().unwrap().block_on(async {
            let socket = listener.accept().await.unwrap().0;
            let mut stream = acceptor.accept(socket).await.unwrap();
            loop {
                let mut buf = [0];
                let read = stream.read(&mut buf).await.unwrap();
                if read == 0 {
                    break;
                }
                assert_eq!(1, read);
                assert_eq!(1, stream.write(&buf).await.unwrap());
            }
        });
    });

    let rt = Runtime::new().unwrap();

    let socket = AsyncSocketBox::new(rt.block_on(TcpStream::connect((BIND_HOST, port))).unwrap());

    let connector = new_connector_dyn_with_root_ca(connector);
    let mut tls_stream = rt.block_on(connector.connect("localhost", socket)).unwrap();

    bencher.iter(|| {
        rt.block_on(async {
            assert_eq!(1, tls_stream.write(&[10]).await.unwrap());
            let mut buf = [0];
            assert_eq!(1, tls_stream.read(&mut buf).await.unwrap());
            assert_eq!(10, buf[0]);
        })
    });

    drop(tls_stream);

    t.join().unwrap();
}