summary history branches tags files
commit:900b3e96c059a46726c759c43a65d0b70cb4f299
author:Trevor Bentley
committer:Trevor Bentley
date:Thu May 23 18:16:27 2019 +0200
parents:9d6ab603686f0dae139edf49b7fa91e41b10755c
Benchmark test for handshakes
diff --git a/benches/basic.rs b/benches/basic.rs
line changes: +8/-0
index 3626615..b600b6e
--- a/benches/basic.rs
+++ b/benches/basic.rs
@@ -1,3 +1,11 @@
+// basic.rs
+//
+// Benchmark test for Ossuary data throughput
+//
+// Benchmarks the time to transmit and receive large quantities of data over
+// an established Ossuary connection.  Data is transmitted over real TCP
+// sockets.
+//
 #![feature(test)]
 extern crate test;
 use test::Bencher;

diff --git a/benches/handshake.rs b/benches/handshake.rs
line changes: +84/-0
index 0000000..4222035
--- /dev/null
+++ b/benches/handshake.rs
@@ -0,0 +1,84 @@
+// handshake.rs
+//
+// Benchmark test for Ossuary handshakes
+//
+// Benchmarks the time to perform the handshake dance until both sides are
+// connected successfully.  Data transferred in local buffers, no network.
+//
+#![feature(test)]
+extern crate test;
+use test::Bencher;
+
+use ossuary::{OssuaryConnection, ConnectionType};
+use ossuary::OssuaryError;
+
+#[derive(Debug)]
+enum LoopConn {
+    LoopClient,
+    LoopServer,
+}
+
+#[bench]
+fn bench_handshake(b: &mut Bencher) {
+    let server_secret_key = &[
+        0x50, 0x29, 0x04, 0x97, 0x62, 0xbd, 0xa6, 0x07,
+        0x71, 0xca, 0x29, 0x14, 0xe3, 0x83, 0x19, 0x0e,
+        0xa0, 0x9e, 0xd4, 0xb7, 0x1a, 0xf9, 0xc9, 0x59,
+        0x3e, 0xa3, 0x1c, 0x85, 0x0f, 0xc4, 0xfa, 0xa2,
+    ];
+    let server_public_key = &[
+        0x20, 0x88, 0x55, 0x8e, 0xbd, 0x9b, 0x46, 0x1d,
+        0xd0, 0x9d, 0xf0, 0x00, 0xda, 0xf4, 0x0f, 0x87,
+        0xf7, 0x38, 0x40, 0xc5, 0x54, 0x18, 0x57, 0x60,
+        0x74, 0x39, 0x3b, 0xb9, 0x70, 0xe1, 0x46, 0x98,
+    ];
+    let mut loop_conn = LoopConn::LoopClient;
+    let mut client_buf: Vec<u8> = vec!();
+    let mut server_buf: Vec<u8> = vec!();
+
+    let mut iters: usize = 0;
+    let start = std::time::SystemTime::now();
+    b.iter(|| {
+        let mut server_conn = OssuaryConnection::new(ConnectionType::UnauthenticatedServer, Some(&server_secret_key.clone())).unwrap();
+        let mut client_conn = OssuaryConnection::new(ConnectionType::Client, None).unwrap();
+        let key_slice: &[u8] = server_public_key;
+        let _ = client_conn.add_authorized_key(key_slice).unwrap();
+        loop {
+            let mut done = 0;
+            let (send_conn, recv_conn, mut send_buf, recv_buf) = match loop_conn {
+                LoopConn::LoopClient => (&mut client_conn, &mut server_conn, &mut client_buf, &mut server_buf),
+                _ => (&mut server_conn, &mut client_conn, &mut server_buf, &mut client_buf),
+            };
+            match send_conn.handshake_done() {
+                Ok(true) => done += 1,
+                Ok(false) => {},
+                Err(e) => panic!("handshake failed: {:?}", e),
+            }
+            match recv_conn.handshake_done() {
+                Ok(true) => done += 1,
+                Ok(false) => {},
+                Err(e) => panic!("handshake failed: {:?}", e),
+            }
+            if done == 2 {
+                iters += 1;
+                break;
+            }
+            send_conn.send_handshake(&mut send_buf).unwrap();
+            match send_conn.recv_handshake(&mut recv_buf.as_slice()) {
+                Ok(b) => { recv_buf.drain(0..b); },
+                Err(OssuaryError::WouldBlock(b)) => { recv_buf.drain(0..b); },
+                _ => panic!("handshake failed"),
+            }
+            loop_conn = match loop_conn {
+                LoopConn::LoopClient => LoopConn::LoopServer,
+                _ => LoopConn::LoopClient,
+            };
+        }
+    });
+    if let Ok(dur) = start.elapsed() {
+        let t = dur.as_secs() as f64
+            + dur.subsec_nanos() as f64 * 1e-9;
+        println!("Benchmark done: {} handshakes in {:.2} s", iters, t);
+        println!("{:.2} shakes/s", iters as f64 / t);
+    }
+}