tests.rs 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. /*! Unit tests that require access to the testing-only function
  2. BridgeLine::random() or private fields */
  3. use super::bridge_table::BridgeLine;
  4. use super::proto::*;
  5. use super::*;
  6. use statistical::{mean, standard_deviation};
  7. use std::time::{Duration, Instant};
  8. struct PerfStat {
  9. // Report performance metrics for each test
  10. req_len: usize,
  11. resp_len: usize,
  12. req_t: Duration,
  13. resp_t: Duration,
  14. resp_handle_t: Duration,
  15. }
  16. struct TestHarness {
  17. bdb: BridgeDb,
  18. pub ba: BridgeAuth,
  19. }
  20. impl TestHarness {
  21. fn new() -> Self {
  22. TestHarness::new_buckets(5, 5)
  23. }
  24. fn new_buckets(num_buckets: u8, hot_spare: u8) -> Self {
  25. // Create a BridegDb
  26. let mut bdb = BridgeDb::new();
  27. // Create a BridgeAuth
  28. let mut ba = BridgeAuth::new(bdb.pubkey);
  29. // Make 3 x num_buckets open invitation bridges, in sets of 3
  30. for _ in 0..num_buckets {
  31. let bucket = [
  32. BridgeLine::random(),
  33. BridgeLine::random(),
  34. BridgeLine::random(),
  35. ];
  36. ba.add_openinv_bridges(bucket, &mut bdb);
  37. }
  38. // Add hot_spare more hot spare buckets
  39. for _ in 0..hot_spare {
  40. let bucket = [
  41. BridgeLine::random(),
  42. BridgeLine::random(),
  43. BridgeLine::random(),
  44. ];
  45. ba.add_spare_bucket(bucket);
  46. }
  47. // Create the encrypted bridge table
  48. ba.enc_bridge_table();
  49. Self { bdb, ba }
  50. }
  51. fn advance_days(&mut self, days: u16) {
  52. self.ba.advance_days(days);
  53. }
  54. fn open_invite(&mut self) -> (PerfStat, (cred::Lox, bridge_table::BridgeLine)) {
  55. // Issue an open invitation
  56. let inv = self.bdb.invite();
  57. let req_start = Instant::now();
  58. // Use it to get a Lox credential
  59. let (req, state) = open_invite::request(&inv);
  60. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  61. let req_t = req_start.elapsed();
  62. let req_len = encoded.len();
  63. let resp_start = Instant::now();
  64. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  65. let resp = self.ba.handle_open_invite(decoded).unwrap();
  66. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  67. let resp_t = resp_start.elapsed();
  68. let resp_len = encoded_resp.len();
  69. let resp_handle_start = Instant::now();
  70. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  71. let (cred, bridgeline) =
  72. open_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  73. let resp_handle_t = resp_handle_start.elapsed();
  74. return (
  75. PerfStat {
  76. req_len,
  77. resp_len,
  78. req_t,
  79. resp_t,
  80. resp_handle_t,
  81. },
  82. (cred, bridgeline),
  83. );
  84. }
  85. fn trust_promotion(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  86. let req_start = Instant::now();
  87. let (promreq, promstate) =
  88. trust_promotion::request(&cred, &self.ba.lox_pub, self.ba.today()).unwrap();
  89. let encoded: Vec<u8> = bincode::serialize(&promreq).unwrap();
  90. let req_t = req_start.elapsed();
  91. let req_len = encoded.len();
  92. let resp_start = Instant::now();
  93. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  94. let promresp = self.ba.handle_trust_promotion(decoded).unwrap();
  95. let encoded_resp: Vec<u8> = bincode::serialize(&promresp).unwrap();
  96. let resp_t = resp_start.elapsed();
  97. let resp_len = encoded_resp.len();
  98. let resp_handle_start = Instant::now();
  99. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  100. let migcred = trust_promotion::handle_response(promstate, decode_resp).unwrap();
  101. let resp_handle_t = resp_handle_start.elapsed();
  102. return (
  103. PerfStat {
  104. req_len,
  105. resp_len,
  106. req_t,
  107. resp_t,
  108. resp_handle_t,
  109. },
  110. migcred,
  111. );
  112. }
  113. fn level0_migration(
  114. &mut self,
  115. loxcred: &cred::Lox,
  116. migcred: &cred::Migration,
  117. ) -> (PerfStat, cred::Lox) {
  118. let req_start = Instant::now();
  119. let (migreq, migstate) =
  120. migration::request(loxcred, migcred, &self.ba.lox_pub, &self.ba.migration_pub).unwrap();
  121. let encoded: Vec<u8> = bincode::serialize(&migreq).unwrap();
  122. let req_t = req_start.elapsed();
  123. let req_len = encoded.len();
  124. let resp_start = Instant::now();
  125. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  126. let migresp = self.ba.handle_migration(decoded).unwrap();
  127. let encoded_resp: Vec<u8> = bincode::serialize(&migresp).unwrap();
  128. let resp_t = resp_start.elapsed();
  129. let resp_len = encoded_resp.len();
  130. let resp_handle_start = Instant::now();
  131. let decode_resp: migration::Response = bincode::deserialize(&encoded_resp[..]).unwrap();
  132. let cred = migration::handle_response(migstate, decode_resp, &self.ba.lox_pub).unwrap();
  133. let resp_handle_t = resp_handle_start.elapsed();
  134. return (
  135. PerfStat {
  136. req_len,
  137. resp_len,
  138. req_t,
  139. resp_t,
  140. resp_handle_t,
  141. },
  142. cred,
  143. );
  144. }
  145. fn level_up(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Lox) {
  146. // Read the bucket in the credential to get today's Bucket
  147. // Reachability credential
  148. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  149. let encbuckets = self.ba.enc_bridge_table();
  150. let bucket =
  151. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  152. let reachcred = bucket.1.unwrap();
  153. // Use the Bucket Reachability credential to advance to the next
  154. // level
  155. let req_start = Instant::now();
  156. let (req, state) = level_up::request(
  157. &cred,
  158. &reachcred,
  159. &self.ba.lox_pub,
  160. &self.ba.reachability_pub,
  161. self.ba.today(),
  162. )
  163. .unwrap();
  164. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  165. let req_t = req_start.elapsed();
  166. let req_len = encoded.len();
  167. let resp_start = Instant::now();
  168. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  169. let resp = self.ba.handle_level_up(decoded).unwrap();
  170. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  171. let resp_t = resp_start.elapsed();
  172. let resp_len = encoded_resp.len();
  173. let resp_handle_start = Instant::now();
  174. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  175. let cred = level_up::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  176. let resp_handle_t = resp_handle_start.elapsed();
  177. return (
  178. PerfStat {
  179. req_len,
  180. resp_len,
  181. req_t,
  182. resp_t,
  183. resp_handle_t,
  184. },
  185. cred,
  186. );
  187. }
  188. fn issue_invite(&mut self, cred: &cred::Lox) -> (PerfStat, (cred::Lox, cred::Invitation)) {
  189. // Read the bucket in the credential to get today's Bucket
  190. // Reachability credential
  191. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  192. let encbuckets = self.ba.enc_bridge_table();
  193. let bucket =
  194. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  195. let reachcred = bucket.1.unwrap();
  196. let req_start = Instant::now();
  197. let (req, state) = issue_invite::request(
  198. &cred,
  199. &reachcred,
  200. &self.ba.lox_pub,
  201. &self.ba.reachability_pub,
  202. self.ba.today(),
  203. )
  204. .unwrap();
  205. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  206. let req_t = req_start.elapsed();
  207. let req_len = encoded.len();
  208. let resp_start = Instant::now();
  209. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  210. let resp = self.ba.handle_issue_invite(decoded).unwrap();
  211. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  212. let resp_t = resp_start.elapsed();
  213. let resp_len = encoded_resp.len();
  214. let resp_handle_start = Instant::now();
  215. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  216. let (cred, invite) = issue_invite::handle_response(
  217. state,
  218. decode_resp,
  219. &self.ba.lox_pub,
  220. &self.ba.invitation_pub,
  221. )
  222. .unwrap();
  223. let resp_handle_t = resp_handle_start.elapsed();
  224. return (
  225. PerfStat {
  226. req_len,
  227. resp_len,
  228. req_t,
  229. resp_t,
  230. resp_handle_t,
  231. },
  232. (cred, invite),
  233. );
  234. }
  235. fn redeem_invite(&mut self, inv: &cred::Invitation) -> (PerfStat, cred::Lox) {
  236. let req_start = Instant::now();
  237. let (req, state) =
  238. redeem_invite::request(&inv, &self.ba.invitation_pub, self.ba.today()).unwrap();
  239. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  240. let req_t = req_start.elapsed();
  241. let req_len = encoded.len();
  242. let resp_start = Instant::now();
  243. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  244. let resp = self.ba.handle_redeem_invite(decoded).unwrap();
  245. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  246. let resp_t = resp_start.elapsed();
  247. let resp_len = encoded_resp.len();
  248. let resp_handle_start = Instant::now();
  249. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  250. let cred = redeem_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  251. let resp_handle_t = resp_handle_start.elapsed();
  252. return (
  253. PerfStat {
  254. req_len,
  255. resp_len,
  256. req_t,
  257. resp_t,
  258. resp_handle_t,
  259. },
  260. cred,
  261. );
  262. }
  263. fn check_blockage(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  264. let req_start = Instant::now();
  265. let (req, state) = check_blockage::request(&cred, &self.ba.lox_pub).unwrap();
  266. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  267. let req_t = req_start.elapsed();
  268. let req_len = encoded.len();
  269. let resp_start = Instant::now();
  270. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  271. let resp = self.ba.handle_check_blockage(decoded).unwrap();
  272. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  273. let resp_t = resp_start.elapsed();
  274. let resp_len = encoded_resp.len();
  275. let resp_handle_start = Instant::now();
  276. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  277. let migcred = check_blockage::handle_response(state, decode_resp).unwrap();
  278. let resp_handle_t = resp_handle_start.elapsed();
  279. return (
  280. PerfStat {
  281. req_len,
  282. resp_len,
  283. req_t,
  284. resp_t,
  285. resp_handle_t,
  286. },
  287. migcred,
  288. );
  289. }
  290. fn blockage_migration(
  291. &mut self,
  292. cred: &cred::Lox,
  293. mig: &cred::Migration,
  294. ) -> (PerfStat, cred::Lox) {
  295. let req_start = Instant::now();
  296. let (req, state) =
  297. blockage_migration::request(&cred, &mig, &self.ba.lox_pub, &self.ba.migration_pub)
  298. .unwrap();
  299. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  300. let req_t = req_start.elapsed();
  301. let req_len = encoded.len();
  302. let resp_start = Instant::now();
  303. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  304. let resp = self.ba.handle_blockage_migration(decoded).unwrap();
  305. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  306. let resp_t = resp_start.elapsed();
  307. let resp_len = encoded_resp.len();
  308. let resp_handle_start = Instant::now();
  309. let decode_resp: blockage_migration::Response =
  310. bincode::deserialize(&encoded_resp[..]).unwrap();
  311. let cred =
  312. blockage_migration::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  313. let resp_handle_t = resp_handle_start.elapsed();
  314. return (
  315. PerfStat {
  316. req_len,
  317. resp_len,
  318. req_t,
  319. resp_t,
  320. resp_handle_t,
  321. },
  322. cred,
  323. );
  324. }
  325. }
  326. #[test]
  327. fn test_open_invite() {
  328. let mut th = TestHarness::new();
  329. // Join an untrusted user
  330. let (perf_stat, (cred, bridgeline)) = th.open_invite();
  331. // Check that we can use the credential to read a bucket
  332. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  333. let encbuckets = th.ba.enc_bridge_table();
  334. let bucket =
  335. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  336. print_test_results(perf_stat);
  337. println!("cred = {:?}", cred);
  338. println!("bucket = {:?}", bucket);
  339. println!("bridgeline = {:?}", bridgeline);
  340. assert!(bucket.1.is_none());
  341. assert!(th.ba.verify_lox(&cred));
  342. assert!(bridgeline == bucket.0[0]);
  343. }
  344. #[test]
  345. fn test_trust_promotion() {
  346. let mut th = TestHarness::new();
  347. let cred = th.open_invite().1 .0;
  348. assert!(th.ba.verify_lox(&cred));
  349. // Time passes
  350. th.advance_days(47);
  351. let (perf_stat, migcred) = th.trust_promotion(&cred);
  352. assert!(th.ba.verify_migration(&migcred));
  353. // Check that we can use the to_bucket in the Migration credenital
  354. // to read a bucket
  355. let (id, key) = bridge_table::from_scalar(migcred.to_bucket).unwrap();
  356. let encbuckets = th.ba.enc_bridge_table();
  357. let bucket =
  358. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  359. print_test_results(perf_stat);
  360. println!("bucket = {:?}", bucket);
  361. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  362. }
  363. #[test]
  364. fn test_level0_migration() {
  365. let mut th = TestHarness::new();
  366. let cred = th.open_invite().1 .0;
  367. assert!(th.ba.verify_lox(&cred));
  368. // Time passes
  369. th.advance_days(47);
  370. let (perf_stat, migcred) = th.trust_promotion(&cred);
  371. assert!(th.ba.verify_migration(&migcred));
  372. println!("--Trust Promotion to 1--\n");
  373. print_test_results(perf_stat);
  374. let (mperf_stat, newloxcred) = th.level0_migration(&cred, &migcred);
  375. println!("--Level 0 migration--\n");
  376. print_test_results(mperf_stat);
  377. assert!(th.ba.verify_lox(&newloxcred));
  378. println!("newloxcred = {:?}", newloxcred);
  379. // Check that we can use the credenital to read a bucket
  380. let (id, key) = bridge_table::from_scalar(newloxcred.bucket).unwrap();
  381. let encbuckets = th.ba.enc_bridge_table();
  382. let bucket =
  383. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  384. println!("bucket = {:?}", bucket);
  385. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  386. }
  387. #[test]
  388. fn test_level_up() {
  389. let mut th = TestHarness::new();
  390. // Join an untrusted user
  391. let cred = th.open_invite().1 .0;
  392. // Time passes
  393. th.advance_days(47);
  394. // Go up to level 1
  395. let (perf_stat, migcred) = th.trust_promotion(&cred);
  396. println!("--Trust Promotion to 1--\n");
  397. print_test_results(perf_stat);
  398. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  399. println!("--New Level 1 Credential--\n");
  400. print_test_results(mperf_stat);
  401. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  402. // Time passes
  403. th.advance_days(20);
  404. let (two_perf_stat, cred2) = th.level_up(&cred1);
  405. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  406. println!("--Upgrade to Level 2--\n");
  407. print_test_results(two_perf_stat);
  408. println!("cred2 = {:?}", cred2);
  409. assert!(th.ba.verify_lox(&cred2));
  410. // Time passes
  411. th.advance_days(30);
  412. let (three_perf_stat, cred3) = th.level_up(&cred2);
  413. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  414. println!("--Upgrade to Level 3--\n");
  415. print_test_results(three_perf_stat);
  416. println!("cred3 = {:?}", cred3);
  417. assert!(th.ba.verify_lox(&cred3));
  418. // Time passes
  419. th.advance_days(60);
  420. let (four_perf_stat, cred4) = th.level_up(&cred3);
  421. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  422. println!("--Upgrade to Level 4--\n");
  423. print_test_results(four_perf_stat);
  424. println!("cred4 = {:?}", cred4);
  425. assert!(th.ba.verify_lox(&cred4));
  426. }
  427. #[test]
  428. fn test_issue_invite() {
  429. let mut th = TestHarness::new();
  430. // Join an untrusted user
  431. let cred = th.open_invite().1 .0;
  432. // Time passes
  433. th.advance_days(47);
  434. // Go up to level 1
  435. let (perf_stat, migcred) = th.trust_promotion(&cred);
  436. println!("--Trust Promotion to 1--\n");
  437. print_test_results(perf_stat);
  438. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  439. println!("--New Level 1 Credential--\n");
  440. print_test_results(mperf_stat);
  441. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  442. // Time passes
  443. th.advance_days(20);
  444. // Go up to level 2
  445. let (two_perf_stat, cred2) = th.level_up(&cred1);
  446. println!("--Upgrade to Level 2--\n");
  447. print_test_results(two_perf_stat);
  448. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  449. println!("cred2 = {:?}", cred2);
  450. assert!(th.ba.verify_lox(&cred2));
  451. // Issue an invitation
  452. let (invite_perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  453. println!("--Issue Invitation--\n");
  454. print_test_results(invite_perf_stat);
  455. assert!(th.ba.verify_lox(&cred2a));
  456. assert!(th.ba.verify_invitation(&invite));
  457. println!("cred2a = {:?}", cred2a);
  458. println!("invite = {:?}", invite);
  459. }
  460. #[test]
  461. fn test_redeem_invite() {
  462. let mut th = TestHarness::new();
  463. // Join an untrusted user
  464. let cred = th.open_invite().1 .0;
  465. // Time passes
  466. th.advance_days(47);
  467. // Go up to level 1
  468. let (perf_stat, migcred) = th.trust_promotion(&cred);
  469. println!("--Trust Promotion to 1--\n");
  470. print_test_results(perf_stat);
  471. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  472. println!("--New Level 1 Credential--\n");
  473. print_test_results(mperf_stat);
  474. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  475. // Time passes
  476. th.advance_days(20);
  477. // Go up to level 2
  478. let (two_perf_stat, cred2) = th.level_up(&cred1);
  479. println!("--Upgrade to Level 2--\n");
  480. print_test_results(two_perf_stat);
  481. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  482. println!("cred2 = {:?}", cred2);
  483. assert!(th.ba.verify_lox(&cred2));
  484. // Issue an invitation to Bob
  485. let (invite_perf_stat, (cred2a, bob_invite)) = th.issue_invite(&cred2);
  486. println!("--Issue Invitation--\n");
  487. print_test_results(invite_perf_stat);
  488. assert!(th.ba.verify_lox(&cred2a));
  489. assert!(th.ba.verify_invitation(&bob_invite));
  490. println!("cred2a = {:?}", cred2a);
  491. println!("bob_invite = {:?}", bob_invite);
  492. // Time passes
  493. th.advance_days(12);
  494. // Bob joins the system
  495. let (bob_perf_stat, bob_cred) = th.redeem_invite(&bob_invite);
  496. println!("--Bob joins the system--\n");
  497. print_test_results(bob_perf_stat);
  498. assert!(th.ba.verify_lox(&bob_cred));
  499. println!("bob_cred = {:?}", bob_cred);
  500. }
  501. #[test]
  502. fn test_mark_unreachable() {
  503. let mut th = TestHarness::new();
  504. println!("spares = {:?}", th.ba.bridge_table.spares);
  505. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  506. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  507. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  508. // Mark a bridge in an untrusted bucket as unreachable
  509. let b6 = th.ba.bridge_table.buckets[6][0];
  510. th.ba.bridge_unreachable(&b6, &mut th.bdb);
  511. println!("spares = {:?}", th.ba.bridge_table.spares);
  512. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  513. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  514. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  515. // Mark another bridge grouped to the same trusted bucket as
  516. // unreachable
  517. let b7 = th.ba.bridge_table.buckets[7][0];
  518. th.ba.bridge_unreachable(&b7, &mut th.bdb);
  519. println!("spares = {:?}", th.ba.bridge_table.spares);
  520. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  521. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  522. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  523. // That will have introduced a blockage migration. Get the target
  524. let target: u32 = *th
  525. .ba
  526. .blockage_migration_table
  527. .table
  528. .iter()
  529. .next()
  530. .unwrap()
  531. .1;
  532. // Block two of the bridges in that target bucket
  533. let bt1 = th.ba.bridge_table.buckets[target as usize][1];
  534. let bt2 = th.ba.bridge_table.buckets[target as usize][2];
  535. th.ba.bridge_unreachable(&bt1, &mut th.bdb);
  536. th.ba.bridge_unreachable(&bt2, &mut th.bdb);
  537. println!("spares = {:?}", th.ba.bridge_table.spares);
  538. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  539. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  540. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  541. }
  542. #[test]
  543. fn test_blockage_migration() {
  544. let mut th = TestHarness::new();
  545. // Join an untrusted user
  546. let cred = th.open_invite().1 .0;
  547. // Time passes
  548. th.advance_days(47);
  549. // Go up to level 1
  550. let (_mperf_stat, migcred) = th.trust_promotion(&cred);
  551. let (_perf_stat, cred1) = th.level0_migration(&cred, &migcred);
  552. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  553. // Time passes
  554. th.advance_days(20);
  555. // Go up to level 2
  556. let (_two_perf_stat, cred2) = th.level_up(&cred1);
  557. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  558. println!("cred2 = {:?}", cred2);
  559. assert!(th.ba.verify_lox(&cred2));
  560. // Time passes
  561. th.advance_days(29);
  562. // Go up to level 3
  563. let (_three_perf_stat, cred3) = th.level_up(&cred2);
  564. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  565. println!("cred3 = {:?}", cred3);
  566. assert!(th.ba.verify_lox(&cred3));
  567. // Get our bridges
  568. let (id, key) = bridge_table::from_scalar(cred3.bucket).unwrap();
  569. let encbuckets = th.ba.enc_bridge_table();
  570. let bucket =
  571. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  572. // We should have a Bridge Reachability credential
  573. assert!(bucket.1.is_some());
  574. // Oh, no! Two of our bridges are blocked!
  575. th.ba.bridge_unreachable(&bucket.0[0], &mut th.bdb);
  576. th.ba.bridge_unreachable(&bucket.0[2], &mut th.bdb);
  577. println!("spares = {:?}", th.ba.bridge_table.spares);
  578. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  579. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  580. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  581. // Time passes
  582. th.advance_days(1);
  583. let encbuckets2 = th.ba.enc_bridge_table();
  584. let bucket2 =
  585. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets2[id as usize]).unwrap();
  586. // We should no longer have a Bridge Reachability credential
  587. assert!(bucket2.1.is_none());
  588. // See about getting a Migration credential for the blockage
  589. let (_block_perf_stat, migration) = th.check_blockage(&cred3);
  590. println!("migration = {:?}", migration);
  591. // Migrate
  592. let (_four_perf_stat, cred4) = th.blockage_migration(&cred3, &migration);
  593. println!("cred4 = {:?}", cred4);
  594. assert!(th.ba.verify_lox(&cred4));
  595. }
  596. #[test]
  597. fn stats_test_open_invite() {
  598. let mut th = TestHarness::new_buckets(10, 10);
  599. println!("\n---------------Open Invitationn-------------------\n");
  600. let mut req_size: Vec<f64> = Vec::new();
  601. let mut resp_size: Vec<f64> = Vec::new();
  602. let mut req_t_size: Vec<f64> = Vec::new();
  603. let mut resp_t_size: Vec<f64> = Vec::new();
  604. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  605. for _ in 0..1000 {
  606. let (perf_stat, _) = th.open_invite();
  607. req_size.push(perf_stat.req_len as f64);
  608. req_t_size.push(perf_stat.req_t.as_secs_f64());
  609. resp_size.push(perf_stat.resp_len as f64);
  610. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  611. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  612. }
  613. print_stats_test_results(
  614. req_size,
  615. req_t_size,
  616. resp_size,
  617. resp_t_size,
  618. resp_handle_t_size,
  619. );
  620. }
  621. #[test]
  622. fn stats_test_trust_promotion() {
  623. let mut th = TestHarness::new_buckets(10, 10);
  624. println!("\n-------Trust Promotion--------\n");
  625. let mut req_size: Vec<f64> = Vec::new();
  626. let mut resp_size: Vec<f64> = Vec::new();
  627. let mut req_t_size: Vec<f64> = Vec::new();
  628. let mut resp_t_size: Vec<f64> = Vec::new();
  629. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  630. for _ in 0..1000 {
  631. let cred = th.open_invite().1 .0;
  632. th.advance_days(47);
  633. let (perf_stat, _) = th.trust_promotion(&cred);
  634. req_size.push(perf_stat.req_len as f64);
  635. req_t_size.push(perf_stat.req_t.as_secs_f64());
  636. resp_size.push(perf_stat.resp_len as f64);
  637. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  638. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  639. }
  640. print_stats_test_results(
  641. req_size,
  642. req_t_size,
  643. resp_size,
  644. resp_t_size,
  645. resp_handle_t_size,
  646. );
  647. }
  648. #[test]
  649. fn stats_test_trust_level0_migration() {
  650. let mut th = TestHarness::new_buckets(10, 10);
  651. println!("\n-------------Trust Level0 Migration----------------\n");
  652. let mut req_size: Vec<f64> = Vec::new();
  653. let mut resp_size: Vec<f64> = Vec::new();
  654. let mut req_t_size: Vec<f64> = Vec::new();
  655. let mut resp_t_size: Vec<f64> = Vec::new();
  656. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  657. let mut tot_req_size: Vec<f64> = Vec::new();
  658. let mut tot_resp_size: Vec<f64> = Vec::new();
  659. let mut tot_req_t_size: Vec<f64> = Vec::new();
  660. let mut tot_resp_t_size: Vec<f64> = Vec::new();
  661. let mut tot_resp_handle_t_size: Vec<f64> = Vec::new();
  662. for _ in 0..1000 {
  663. let cred = th.open_invite().1 .0;
  664. th.advance_days(47);
  665. let (tp_perf_stat, migcred) = th.trust_promotion(&cred);
  666. let (perf_stat, _) = th.level0_migration(&cred, &migcred);
  667. req_size.push(perf_stat.req_len as f64);
  668. req_t_size.push(perf_stat.req_t.as_secs_f64());
  669. resp_size.push(perf_stat.resp_len as f64);
  670. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  671. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  672. tot_req_size.push((perf_stat.req_len + tp_perf_stat.req_len) as f64);
  673. tot_req_t_size.push((perf_stat.req_t + tp_perf_stat.req_t).as_secs_f64());
  674. tot_resp_size.push((perf_stat.resp_len + tp_perf_stat.resp_len) as f64);
  675. tot_resp_t_size.push((perf_stat.resp_t + tp_perf_stat.resp_t).as_secs_f64());
  676. tot_resp_handle_t_size
  677. .push((perf_stat.resp_handle_t + tp_perf_stat.resp_handle_t).as_secs_f64());
  678. }
  679. print_stats_test_results(
  680. req_size,
  681. req_t_size,
  682. resp_size,
  683. resp_t_size,
  684. resp_handle_t_size,
  685. );
  686. println!("\n-------Total Trust Promotion to Level 1-------\n");
  687. print_stats_test_results(
  688. tot_req_size,
  689. tot_req_t_size,
  690. tot_resp_size,
  691. tot_resp_t_size,
  692. tot_resp_handle_t_size,
  693. );
  694. }
  695. #[test]
  696. fn stats_test_trust_level_up() {
  697. let mut th = TestHarness::new_buckets(10, 10);
  698. println!("\n---Trust Promotion + Migration to Level 1: 30 days----\n");
  699. let mut req_size: Vec<f64> = Vec::new();
  700. let mut resp_size: Vec<f64> = Vec::new();
  701. let mut req_t_size: Vec<f64> = Vec::new();
  702. let mut resp_t_size: Vec<f64> = Vec::new();
  703. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  704. let mut sec_req_size: Vec<f64> = Vec::new();
  705. let mut sec_resp_size: Vec<f64> = Vec::new();
  706. let mut sec_req_t_size: Vec<f64> = Vec::new();
  707. let mut sec_resp_t_size: Vec<f64> = Vec::new();
  708. let mut sec_resp_handle_t_size: Vec<f64> = Vec::new();
  709. let mut three_req_size: Vec<f64> = Vec::new();
  710. let mut three_resp_size: Vec<f64> = Vec::new();
  711. let mut three_req_t_size: Vec<f64> = Vec::new();
  712. let mut three_resp_t_size: Vec<f64> = Vec::new();
  713. let mut three_resp_handle_t_size: Vec<f64> = Vec::new();
  714. let mut four_req_size: Vec<f64> = Vec::new();
  715. let mut four_resp_size: Vec<f64> = Vec::new();
  716. let mut four_req_t_size: Vec<f64> = Vec::new();
  717. let mut four_resp_t_size: Vec<f64> = Vec::new();
  718. let mut four_resp_handle_t_size: Vec<f64> = Vec::new();
  719. for _ in 0..1000 {
  720. let cred = th.open_invite().1 .0;
  721. th.advance_days(30);
  722. let (tp_perf_stat, migcred) = th.trust_promotion(&cred);
  723. let (perf_stat, cred1) = th.level0_migration(&cred, &migcred);
  724. th.advance_days(14);
  725. let (sec_perf_stat, cred2) = th.level_up(&cred1);
  726. th.advance_days(28);
  727. let (three_perf_stat, cred3) = th.level_up(&cred2);
  728. th.advance_days(56);
  729. let (four_perf_stat, _) = th.level_up(&cred3);
  730. req_size.push((perf_stat.req_len + tp_perf_stat.req_len) as f64);
  731. req_t_size.push((perf_stat.req_t + tp_perf_stat.req_t).as_secs_f64());
  732. resp_size.push((perf_stat.resp_len + tp_perf_stat.resp_len) as f64);
  733. resp_t_size.push((perf_stat.resp_t + tp_perf_stat.resp_t).as_secs_f64());
  734. resp_handle_t_size.push((perf_stat.resp_handle_t + tp_perf_stat.resp_handle_t).as_secs_f64());
  735. sec_req_size.push(sec_perf_stat.req_len as f64);
  736. sec_req_t_size.push(sec_perf_stat.req_t.as_secs_f64());
  737. sec_resp_size.push(sec_perf_stat.resp_len as f64);
  738. sec_resp_t_size.push(sec_perf_stat.resp_t.as_secs_f64());
  739. sec_resp_handle_t_size.push(sec_perf_stat.resp_handle_t.as_secs_f64());
  740. three_req_size.push(three_perf_stat.req_len as f64);
  741. three_req_t_size.push(three_perf_stat.req_t.as_secs_f64());
  742. three_resp_size.push(three_perf_stat.resp_len as f64);
  743. three_resp_t_size.push(three_perf_stat.resp_t.as_secs_f64());
  744. three_resp_handle_t_size.push(three_perf_stat.resp_handle_t.as_secs_f64());
  745. four_req_size.push(four_perf_stat.req_len as f64);
  746. four_req_t_size.push(four_perf_stat.req_t.as_secs_f64());
  747. four_resp_size.push(four_perf_stat.resp_len as f64);
  748. four_resp_t_size.push(four_perf_stat.resp_t.as_secs_f64());
  749. four_resp_handle_t_size.push(four_perf_stat.resp_handle_t.as_secs_f64());
  750. }
  751. print_stats_test_results(
  752. req_size,
  753. req_t_size,
  754. resp_size,
  755. resp_t_size,
  756. resp_handle_t_size,
  757. );
  758. println!("\n-------Trust Promotion to Level 2: 44 days-------\n");
  759. print_stats_test_results(
  760. sec_req_size,
  761. sec_req_t_size,
  762. sec_resp_size,
  763. sec_resp_t_size,
  764. sec_resp_handle_t_size,
  765. );
  766. println!("\n-------Trust Promotion to Level 3: 72 days------\n");
  767. print_stats_test_results(
  768. three_req_size,
  769. three_req_t_size,
  770. three_resp_size,
  771. three_resp_t_size,
  772. three_resp_handle_t_size,
  773. );
  774. println!("\n-------Trust Promotion to Level 4: 128 days------\n");
  775. print_stats_test_results(
  776. four_req_size,
  777. four_req_t_size,
  778. four_resp_size,
  779. four_resp_t_size,
  780. four_resp_handle_t_size,
  781. );
  782. }
  783. #[test]
  784. fn stats_test_invitations() {
  785. let mut th = TestHarness::new_buckets(10, 10);
  786. println!("\n---------------Issue Invitation----------------\n");
  787. let mut req_size: Vec<f64> = Vec::new();
  788. let mut resp_size: Vec<f64> = Vec::new();
  789. let mut req_t_size: Vec<f64> = Vec::new();
  790. let mut resp_t_size: Vec<f64> = Vec::new();
  791. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  792. let mut red_req_size: Vec<f64> = Vec::new();
  793. let mut red_resp_size: Vec<f64> = Vec::new();
  794. let mut red_req_t_size: Vec<f64> = Vec::new();
  795. let mut red_resp_t_size: Vec<f64> = Vec::new();
  796. let mut red_resp_handle_t_size: Vec<f64> = Vec::new();
  797. for _ in 0..1000 {
  798. let cred = th.open_invite().1 .0;
  799. th.advance_days(30);
  800. let (_, migcred) = th.trust_promotion(&cred);
  801. let (_, cred1) = th.level0_migration(&cred, &migcred);
  802. th.advance_days(14);
  803. let (_, cred2) = th.level_up(&cred1);
  804. th.advance_days(28);
  805. let (perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  806. let (bob_perf_stat, bob_cred) = th.redeem_invite(&invite);
  807. req_size.push(perf_stat.req_len as f64);
  808. req_t_size.push(perf_stat.req_t.as_secs_f64());
  809. resp_size.push(perf_stat.resp_len as f64);
  810. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  811. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  812. red_req_size.push(bob_perf_stat.req_len as f64);
  813. red_req_t_size.push(bob_perf_stat.req_t.as_secs_f64());
  814. red_resp_size.push(bob_perf_stat.resp_len as f64);
  815. red_resp_t_size.push(bob_perf_stat.resp_t.as_secs_f64());
  816. red_resp_handle_t_size.push(bob_perf_stat.resp_handle_t.as_secs_f64());
  817. }
  818. print_stats_test_results(
  819. req_size,
  820. req_t_size,
  821. resp_size,
  822. resp_t_size,
  823. resp_handle_t_size,
  824. );
  825. println!("\n---------------Redeem Invitation----------------\n");
  826. print_stats_test_results(
  827. red_req_size,
  828. red_req_t_size,
  829. red_resp_size,
  830. red_resp_t_size,
  831. red_resp_handle_t_size,
  832. );
  833. }
  834. #[test]
  835. fn stats_test_blockage migration() {
  836. let mut th = TestHarness::new_buckets(10, 10);
  837. println!("\n---------------Blockage Migration----------------\n");
  838. let mut req_size: Vec<f64> = Vec::new();
  839. let mut resp_size: Vec<f64> = Vec::new();
  840. let mut req_t_size: Vec<f64> = Vec::new();
  841. let mut resp_t_size: Vec<f64> = Vec::new();
  842. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  843. let mut red_req_size: Vec<f64> = Vec::new();
  844. let mut red_resp_size: Vec<f64> = Vec::new();
  845. let mut red_req_t_size: Vec<f64> = Vec::new();
  846. let mut red_resp_t_size: Vec<f64> = Vec::new();
  847. let mut red_resp_handle_t_size: Vec<f64> = Vec::new();
  848. for _ in 0..1000 {
  849. let cred = th.open_invite().1 .0;
  850. th.advance_days(30);
  851. let (_, migcred) = th.trust_promotion(&cred);
  852. let (_, cred1) = th.level0_migration(&cred, &migcred);
  853. th.advance_days(14);
  854. let (_, cred2) = th.level_up(&cred1);
  855. th.advance_days(28);
  856. let (perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  857. let (bob_perf_stat, bob_cred) = th.redeem_invite(&invite);
  858. req_size.push(perf_stat.req_len as f64);
  859. req_t_size.push(perf_stat.req_t.as_secs_f64());
  860. resp_size.push(perf_stat.resp_len as f64);
  861. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  862. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  863. red_req_size.push(bob_perf_stat.req_len as f64);
  864. red_req_t_size.push(bob_perf_stat.req_t.as_secs_f64());
  865. red_resp_size.push(bob_perf_stat.resp_len as f64);
  866. red_resp_t_size.push(bob_perf_stat.resp_t.as_secs_f64());
  867. red_resp_handle_t_size.push(bob_perf_stat.resp_handle_t.as_secs_f64());
  868. }
  869. print_stats_test_results(
  870. req_size,
  871. req_t_size,
  872. resp_size,
  873. resp_t_size,
  874. resp_handle_t_size,
  875. );
  876. println!("\n---------------Redeem Invitation----------------\n");
  877. print_stats_test_results(
  878. red_req_size,
  879. red_req_t_size,
  880. red_resp_size,
  881. red_resp_t_size,
  882. red_resp_handle_t_size,
  883. );
  884. }
  885. #[test]
  886. fn stats_test_blocked_bridges() {
  887. let mut th = TestHarness::new_buckets(10, 10);
  888. println!("\n-------Trust Promotion With Blocked Bridges--------\n");
  889. let mut req_size_b: Vec<f64> = Vec::new();
  890. let mut resp_size_b: Vec<f64> = Vec::new();
  891. let mut req_t_size_b: Vec<f64> = Vec::new();
  892. let mut resp_t_size_b: Vec<f64> = Vec::new();
  893. let mut resp_handle_t_size_b: Vec<f64> = Vec::new();
  894. for _ in 0..1000 {
  895. let cred = th.open_invite().1 .0;
  896. th.advance_days(47);
  897. let (perf_stat, migcred) = th.trust_promotion(&cred);
  898. req_size_b.push(perf_stat.req_len as f64);
  899. req_t_size_b.push(perf_stat.req_t.as_secs_f64());
  900. resp_size_b.push(perf_stat.resp_len as f64);
  901. resp_t_size_b.push(perf_stat.resp_t.as_secs_f64());
  902. resp_handle_t_size_b.push(perf_stat.resp_handle_t.as_secs_f64());
  903. }
  904. // Mark 5 bridges in untrusted buckets as unreachable
  905. for i in 0..50 {
  906. if i % 2 == 0 {
  907. let b0 = th.ba.bridge_table.buckets[i][0];
  908. th.ba.bridge_unreachable(&b0, &mut th.bdb);
  909. }
  910. }
  911. print_stats_test_results(
  912. req_size_b,
  913. req_t_size_b,
  914. resp_size_b,
  915. resp_t_size_b,
  916. resp_handle_t_size_b,
  917. );
  918. }
  919. #[test]
  920. fn stats_test_something_else_test() {
  921. let mut th = TestHarness::new_buckets(10, 10);
  922. println!("\n---------------Block Bridges-------------------\n");
  923. let mut req_size2: Vec<f64> = Vec::new();
  924. let mut resp_size2: Vec<f64> = Vec::new();
  925. let mut req_t_size2: Vec<f64> = Vec::new();
  926. let mut resp_t_size2: Vec<f64> = Vec::new();
  927. let mut resp_handle_t_size2: Vec<f64> = Vec::new();
  928. for _ in 0..1000 {
  929. let (perf_stat2, _) = th.open_invite();
  930. req_size2.push(perf_stat2.req_len as f64);
  931. req_t_size2.push(perf_stat2.req_t.as_secs_f64());
  932. resp_size2.push(perf_stat2.resp_len as f64);
  933. resp_t_size2.push(perf_stat2.resp_t.as_secs_f64());
  934. resp_handle_t_size2.push(perf_stat2.resp_handle_t.as_secs_f64());
  935. }
  936. print_stats_test_results(
  937. req_size2,
  938. req_t_size2,
  939. resp_size2,
  940. resp_t_size2,
  941. resp_handle_t_size2,
  942. );
  943. }
  944. fn print_test_results(perf_stat: PerfStat) {
  945. println!("Request size = {:?}", perf_stat.req_len);
  946. println!("Request time = {:?}", perf_stat.req_t);
  947. println!("Response size = {:?}", perf_stat.resp_len);
  948. println!("Response time = {:?}", perf_stat.resp_t);
  949. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  950. }
  951. fn print_stats_test_results(
  952. req_size: Vec<f64>,
  953. req_t_size: Vec<f64>,
  954. resp_size: Vec<f64>,
  955. resp_t_size: Vec<f64>,
  956. resp_handle_t_size: Vec<f64>,
  957. ) {
  958. let mean_req_size = mean(&req_size);
  959. let req_std_dev = standard_deviation(&req_size, Some(mean_req_size));
  960. let mean_req_t_size = mean(&req_t_size);
  961. let req_t_std_dev = standard_deviation(&req_t_size, Some(mean_req_t_size));
  962. let mean_resp_size = mean(&resp_size);
  963. let resp_std_dev = standard_deviation(&resp_size, Some(mean_resp_size));
  964. let mean_resp_t_size = mean(&resp_t_size);
  965. let resp_t_std_dev = standard_deviation(&resp_t_size, Some(mean_resp_t_size));
  966. let mean_resp_handle_t_size = mean(&resp_t_size);
  967. let resp_handle_t_std_dev =
  968. standard_deviation(&resp_handle_t_size, Some(mean_resp_handle_t_size));
  969. println!("Average Request size = {}", mean_req_size);
  970. println!("Request Standard Deviation = {}", req_std_dev);
  971. println!(
  972. "Average Request Time = {:?}",
  973. Duration::from_secs_f64(mean_req_t_size)
  974. );
  975. println!(
  976. "Request time Standard Deviation = {:?}",
  977. Duration::from_secs_f64(req_t_std_dev)
  978. );
  979. println!("Average Response size = {}", mean_resp_size);
  980. println!("Response Standard Deviation = {}", resp_std_dev);
  981. println!(
  982. "Average Response Time = {:?}",
  983. Duration::from_secs_f64(mean_resp_t_size)
  984. );
  985. println!(
  986. "Response Time Standard Deviation = {:?}",
  987. Duration::from_secs_f64(resp_t_std_dev)
  988. );
  989. println!(
  990. "Average Response Handling Time = {:?}",
  991. Duration::from_secs_f64(mean_resp_handle_t_size)
  992. );
  993. println!(
  994. "Response Handling Time Standard Deviation = {:?}",
  995. Duration::from_secs_f64(resp_handle_t_std_dev)
  996. );
  997. }