tests.rs 44 KB

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