tests.rs 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716
  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: u16, hot_spare: u16) -> 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_trust_levels(buckets: u16) {
  600. let mut th = TestHarness::new_buckets(buckets, buckets);
  601. let mut promo_req_size: Vec<f64> = Vec::new();
  602. let mut promo_resp_size: Vec<f64> = Vec::new();
  603. let mut promo_req_time: Vec<f64> = Vec::new();
  604. let mut promo_resp_time: Vec<f64> = Vec::new();
  605. let mut promo_resp_handle_time: Vec<f64> = Vec::new();
  606. let mut mig_req_size: Vec<f64> = Vec::new();
  607. let mut mig_resp_size: Vec<f64> = Vec::new();
  608. let mut mig_req_time: Vec<f64> = Vec::new();
  609. let mut mig_resp_time: Vec<f64> = Vec::new();
  610. let mut mig_resp_handle_time: Vec<f64> = Vec::new();
  611. let mut sec_req_size: Vec<f64> = Vec::new();
  612. let mut sec_resp_size: Vec<f64> = Vec::new();
  613. let mut sec_req_time: Vec<f64> = Vec::new();
  614. let mut sec_resp_time: Vec<f64> = Vec::new();
  615. let mut sec_resp_handle_time: Vec<f64> = Vec::new();
  616. let mut three_req_size: Vec<f64> = Vec::new();
  617. let mut three_resp_size: Vec<f64> = Vec::new();
  618. let mut three_req_time: Vec<f64> = Vec::new();
  619. let mut three_resp_time: Vec<f64> = Vec::new();
  620. let mut three_resp_handle_time: Vec<f64> = Vec::new();
  621. let mut four_req_size: Vec<f64> = Vec::new();
  622. let mut four_resp_size: Vec<f64> = Vec::new();
  623. let mut four_req_time: Vec<f64> = Vec::new();
  624. let mut four_resp_time: Vec<f64> = Vec::new();
  625. let mut four_resp_handle_time: Vec<f64> = Vec::new();
  626. let mut open_req_size: Vec<f64> = Vec::new();
  627. let mut open_resp_size: Vec<f64> = Vec::new();
  628. let mut open_req_time: Vec<f64> = Vec::new();
  629. let mut open_resp_time: Vec<f64> = Vec::new();
  630. let mut open_resp_handle_time: Vec<f64> = Vec::new();
  631. for _ in 0..10000 {
  632. let (open_perf_stat, cred) = th.open_invite();
  633. th.advance_days(30);
  634. let (tp_perf_stat, migcred) = th.trust_promotion(&cred.0);
  635. let (mig_perf_stat, cred1) = th.level0_migration(&cred.0, &migcred);
  636. th.advance_days(14);
  637. let (sec_perf_stat, cred2) = th.level_up(&cred1);
  638. th.advance_days(28);
  639. let (three_perf_stat, cred3) = th.level_up(&cred2);
  640. th.advance_days(56);
  641. let (four_perf_stat, _) = th.level_up(&cred3);
  642. open_req_size.push(open_perf_stat.req_len as f64);
  643. open_req_time.push(open_perf_stat.req_t.as_secs_f64());
  644. open_resp_size.push(open_perf_stat.resp_len as f64);
  645. open_resp_time.push(open_perf_stat.resp_t.as_secs_f64());
  646. open_resp_handle_time.push(open_perf_stat.resp_handle_t.as_secs_f64());
  647. promo_req_size.push(tp_perf_stat.req_len as f64);
  648. promo_req_time.push(tp_perf_stat.req_t.as_secs_f64());
  649. promo_resp_size.push(tp_perf_stat.resp_len as f64);
  650. promo_resp_time.push(tp_perf_stat.resp_t.as_secs_f64());
  651. promo_resp_handle_time.push(tp_perf_stat.resp_handle_t.as_secs_f64());
  652. mig_req_size.push(mig_perf_stat.req_len as f64);
  653. mig_req_time.push(mig_perf_stat.req_t.as_secs_f64());
  654. mig_resp_size.push(mig_perf_stat.resp_len as f64);
  655. mig_resp_time.push(mig_perf_stat.resp_t.as_secs_f64());
  656. mig_resp_handle_time.push(mig_perf_stat.resp_handle_t.as_secs_f64());
  657. sec_req_size.push(sec_perf_stat.req_len as f64);
  658. sec_req_time.push(sec_perf_stat.req_t.as_secs_f64());
  659. sec_resp_size.push(sec_perf_stat.resp_len as f64);
  660. sec_resp_time.push(sec_perf_stat.resp_t.as_secs_f64());
  661. sec_resp_handle_time.push(sec_perf_stat.resp_handle_t.as_secs_f64());
  662. three_req_size.push(three_perf_stat.req_len as f64);
  663. three_req_time.push(three_perf_stat.req_t.as_secs_f64());
  664. three_resp_size.push(three_perf_stat.resp_len as f64);
  665. three_resp_time.push(three_perf_stat.resp_t.as_secs_f64());
  666. three_resp_handle_time.push(three_perf_stat.resp_handle_t.as_secs_f64());
  667. four_req_size.push(four_perf_stat.req_len as f64);
  668. four_req_time.push(four_perf_stat.req_t.as_secs_f64());
  669. four_resp_size.push(four_perf_stat.resp_len as f64);
  670. four_resp_time.push(four_perf_stat.resp_t.as_secs_f64());
  671. four_resp_handle_time.push(four_perf_stat.resp_handle_t.as_secs_f64());
  672. // println!("OPEN_INVITE");
  673. // print_time_test_results(open_perf_stat);
  674. // println!("TRUST_PROMOTION");
  675. // print_time_test_results(tp_perf_stat);
  676. // println!("LEVEL_1_MIGRATION");
  677. // print_time_test_results(mig_perf_stat);
  678. // println!("LEVEL_2_UP");
  679. // print_time_test_results(sec_perf_stat);
  680. // println!("LEVEL_3_UP");
  681. // print_time_test_results(three_perf_stat);
  682. // println!("LEVEL_4_UP");
  683. // print_time_test_results(four_perf_stat);
  684. }
  685. println!("\n----OPEN-INVITATION----\n");
  686. print_stats_test_results(
  687. open_req_size,
  688. open_req_time,
  689. open_resp_size,
  690. open_resp_time,
  691. open_resp_handle_time,
  692. );
  693. println!("\n----TRUST-PROMOTION-1: 30 days----\n");
  694. print_stats_test_results(
  695. promo_req_size,
  696. promo_req_time,
  697. promo_resp_size,
  698. promo_resp_time,
  699. promo_resp_handle_time,
  700. );
  701. println!("\n----TRUST-MIGRATION-0: 30 days------------\n");
  702. print_stats_test_results(
  703. mig_req_size,
  704. mig_req_time,
  705. mig_resp_size,
  706. mig_resp_time,
  707. mig_resp_handle_time,
  708. );
  709. println!("\n----LEVEL-UP-2: 44 days----\n");
  710. print_stats_test_results(
  711. sec_req_size,
  712. sec_req_time,
  713. sec_resp_size,
  714. sec_resp_time,
  715. sec_resp_handle_time,
  716. );
  717. println!("\n----LEVEL-UP-3: 72 days------\n");
  718. print_stats_test_results(
  719. three_req_size,
  720. three_req_time,
  721. three_resp_size,
  722. three_resp_time,
  723. three_resp_handle_time,
  724. );
  725. println!("\n----LEVEL-UP-4: 128 days------\n");
  726. print_stats_test_results(
  727. four_req_size,
  728. four_req_time,
  729. four_resp_size,
  730. four_resp_time,
  731. four_resp_handle_time,
  732. );
  733. }
  734. //#[test]
  735. fn stats_test_invitations(buckets: u16) {
  736. let mut th = TestHarness::new_buckets(buckets, buckets);
  737. let mut req_size: Vec<f64> = Vec::new();
  738. let mut resp_size: Vec<f64> = Vec::new();
  739. let mut req_time: Vec<f64> = Vec::new();
  740. let mut resp_time: Vec<f64> = Vec::new();
  741. let mut resp_handle_time: Vec<f64> = Vec::new();
  742. let mut red_req_size: Vec<f64> = Vec::new();
  743. let mut red_resp_size: Vec<f64> = Vec::new();
  744. let mut red_req_time: Vec<f64> = Vec::new();
  745. let mut red_resp_time: Vec<f64> = Vec::new();
  746. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  747. for _ in 0..10000 {
  748. let cred = th.open_invite().1 .0;
  749. th.advance_days(30);
  750. let (_, migcred) = th.trust_promotion(&cred);
  751. let (_, cred1) = th.level0_migration(&cred, &migcred);
  752. th.advance_days(14);
  753. let (_, cred2) = th.level_up(&cred1);
  754. th.advance_days(28);
  755. let (perf_stat, (_, invite)) = th.issue_invite(&cred2);
  756. let (bob_perf_stat, _) = th.redeem_invite(&invite);
  757. req_size.push(perf_stat.req_len as f64);
  758. req_time.push(perf_stat.req_t.as_secs_f64());
  759. resp_size.push(perf_stat.resp_len as f64);
  760. resp_time.push(perf_stat.resp_t.as_secs_f64());
  761. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  762. red_req_size.push(bob_perf_stat.req_len as f64);
  763. red_req_time.push(bob_perf_stat.req_t.as_secs_f64());
  764. red_resp_size.push(bob_perf_stat.resp_len as f64);
  765. red_resp_time.push(bob_perf_stat.resp_t.as_secs_f64());
  766. red_resp_handle_time.push(bob_perf_stat.resp_handle_t.as_secs_f64());
  767. }
  768. println!("\n----ISSUE-INVITATION----\n");
  769. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  770. println!("\n----REDEEM-INVITATION----\n");
  771. print_stats_test_results(
  772. red_req_size,
  773. red_req_time,
  774. red_resp_size,
  775. red_resp_time,
  776. red_resp_handle_time,
  777. );
  778. }
  779. //#[test]
  780. fn stats_test_blockage_migration_5(buckets: u16) {
  781. let mut th = TestHarness::new_buckets(buckets, buckets);
  782. let mut credentials: Vec<cred::Lox> = Vec::new();
  783. for _ in 0..1000 {
  784. let cred = th.open_invite().1 .0;
  785. th.advance_days(30);
  786. let (_, migcred) = th.trust_promotion(&cred);
  787. let (_, cred1) = th.level0_migration(&cred, &migcred);
  788. th.advance_days(14);
  789. let (_, cred2) = th.level_up(&cred1);
  790. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  791. let (_, bob_cred) = th.redeem_invite(&invite);
  792. th.advance_days(28);
  793. let (_, _) = th.level_up(&bob_cred);
  794. let (_, cred3) = th.level_up(&cred2a);
  795. credentials.push(cred3);
  796. }
  797. block_bridges(&mut th, 5, credentials);
  798. }
  799. //#[test]
  800. fn stats_test_blockage_migration_10(buckets: u16) {
  801. let mut th = TestHarness::new_buckets(buckets, buckets);
  802. let mut credentials: Vec<cred::Lox> = Vec::new();
  803. for _ in 0..1000 {
  804. let cred = th.open_invite().1 .0;
  805. th.advance_days(30);
  806. let (_, migcred) = th.trust_promotion(&cred);
  807. let (_, cred1) = th.level0_migration(&cred, &migcred);
  808. th.advance_days(14);
  809. let (_, cred2) = th.level_up(&cred1);
  810. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  811. let (_, bob_cred) = th.redeem_invite(&invite);
  812. th.advance_days(28);
  813. let (_, _) = th.level_up(&bob_cred);
  814. let (_, cred3) = th.level_up(&cred2a);
  815. credentials.push(cred3);
  816. }
  817. block_bridges(&mut th, 10, credentials);
  818. }
  819. //#[test]
  820. fn stats_test_blockage_migration_15(buckets: u16) {
  821. let mut th = TestHarness::new_buckets(buckets, buckets);
  822. let mut credentials: Vec<cred::Lox> = Vec::new();
  823. for _ in 0..10000 {
  824. let cred = th.open_invite().1 .0;
  825. th.advance_days(30);
  826. let (_, migcred) = th.trust_promotion(&cred);
  827. let (_, cred1) = th.level0_migration(&cred, &migcred);
  828. th.advance_days(14);
  829. let (_, cred2) = th.level_up(&cred1);
  830. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  831. let (_, bob_cred) = th.redeem_invite(&invite);
  832. th.advance_days(28);
  833. let (_, _) = th.level_up(&bob_cred);
  834. let (_, cred3) = th.level_up(&cred2a);
  835. credentials.push(cred3);
  836. }
  837. block_bridges(&mut th, 15, credentials);
  838. }
  839. //#[test]
  840. fn stats_test_blockage_migration_20(buckets: u16) {
  841. let mut th = TestHarness::new_buckets(buckets, buckets);
  842. let mut credentials: Vec<cred::Lox> = Vec::new();
  843. for _ in 0..10000 {
  844. let cred = th.open_invite().1 .0;
  845. th.advance_days(30);
  846. let (_, migcred) = th.trust_promotion(&cred);
  847. let (_, cred1) = th.level0_migration(&cred, &migcred);
  848. th.advance_days(14);
  849. let (_, cred2) = th.level_up(&cred1);
  850. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  851. let (_, bob_cred) = th.redeem_invite(&invite);
  852. th.advance_days(28);
  853. let (_, _) = th.level_up(&bob_cred);
  854. let (_, cred3) = th.level_up(&cred2a);
  855. credentials.push(cred3);
  856. }
  857. block_bridges(&mut th, 20, credentials);
  858. }
  859. //#[test]
  860. fn stats_test_blockage_migration_25(buckets: u16) {
  861. let mut th = TestHarness::new_buckets(buckets, buckets);
  862. let mut credentials: Vec<cred::Lox> = Vec::new();
  863. for _ in 0..10000 {
  864. let cred = th.open_invite().1 .0;
  865. th.advance_days(30);
  866. let (_, migcred) = th.trust_promotion(&cred);
  867. let (_, cred1) = th.level0_migration(&cred, &migcred);
  868. th.advance_days(14);
  869. let (_, cred2) = th.level_up(&cred1);
  870. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  871. let (_, bob_cred) = th.redeem_invite(&invite);
  872. th.advance_days(28);
  873. let (_, _) = th.level_up(&bob_cred);
  874. let (_, cred3) = th.level_up(&cred2a);
  875. credentials.push(cred3);
  876. }
  877. block_bridges(&mut th, 25, credentials);
  878. }
  879. //#[test]
  880. fn stats_test_blockage_migration_30(buckets: u16) {
  881. let mut th = TestHarness::new_buckets(buckets, buckets);
  882. let mut credentials: Vec<cred::Lox> = Vec::new();
  883. for _ in 0..10000 {
  884. let cred = th.open_invite().1 .0;
  885. th.advance_days(30);
  886. let (_, migcred) = th.trust_promotion(&cred);
  887. let (_, cred1) = th.level0_migration(&cred, &migcred);
  888. th.advance_days(14);
  889. let (_, cred2) = th.level_up(&cred1);
  890. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  891. let (_, bob_cred) = th.redeem_invite(&invite);
  892. th.advance_days(28);
  893. let (_, _) = th.level_up(&bob_cred);
  894. let (_, cred3) = th.level_up(&cred2a);
  895. credentials.push(cred3);
  896. }
  897. block_bridges(&mut th, 30, credentials);
  898. }
  899. //#[test]
  900. fn stats_test_blockage_migration_35(buckets: u16) {
  901. let mut th = TestHarness::new_buckets(buckets, buckets);
  902. let mut credentials: Vec<cred::Lox> = Vec::new();
  903. for _ in 0..10000 {
  904. let cred = th.open_invite().1 .0;
  905. th.advance_days(30);
  906. let (_, migcred) = th.trust_promotion(&cred);
  907. let (_, cred1) = th.level0_migration(&cred, &migcred);
  908. th.advance_days(14);
  909. let (_, cred2) = th.level_up(&cred1);
  910. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  911. let (_, bob_cred) = th.redeem_invite(&invite);
  912. th.advance_days(28);
  913. let (_, _) = th.level_up(&bob_cred);
  914. let (_, cred3) = th.level_up(&cred2a);
  915. credentials.push(cred3);
  916. }
  917. block_bridges(&mut th, 35, credentials);
  918. }
  919. //#[test]
  920. fn stats_test_blockage_migration_40(buckets: u16) {
  921. let mut th = TestHarness::new_buckets(buckets, buckets);
  922. let mut credentials: Vec<cred::Lox> = Vec::new();
  923. for _ in 0..10000 {
  924. let cred = th.open_invite().1 .0;
  925. th.advance_days(30);
  926. let (_, migcred) = th.trust_promotion(&cred);
  927. let (_, cred1) = th.level0_migration(&cred, &migcred);
  928. th.advance_days(14);
  929. let (_, cred2) = th.level_up(&cred1);
  930. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  931. let (_, bob_cred) = th.redeem_invite(&invite);
  932. th.advance_days(28);
  933. let (_, _) = th.level_up(&bob_cred);
  934. let (_, cred3) = th.level_up(&cred2a);
  935. credentials.push(cred3);
  936. }
  937. block_bridges(&mut th, 40, credentials);
  938. }
  939. //#[test]
  940. fn stats_test_blockage_migration_45(buckets: u16) {
  941. let mut th = TestHarness::new_buckets(buckets, buckets);
  942. let mut credentials: Vec<cred::Lox> = Vec::new();
  943. for _ in 0..10000 {
  944. let cred = th.open_invite().1 .0;
  945. th.advance_days(30);
  946. let (_, migcred) = th.trust_promotion(&cred);
  947. let (_, cred1) = th.level0_migration(&cred, &migcred);
  948. th.advance_days(14);
  949. let (_, cred2) = th.level_up(&cred1);
  950. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  951. let (_, bob_cred) = th.redeem_invite(&invite);
  952. th.advance_days(28);
  953. let (_, _) = th.level_up(&bob_cred);
  954. let (_, cred3) = th.level_up(&cred2a);
  955. credentials.push(cred3);
  956. }
  957. block_bridges(&mut th, 45, credentials);
  958. }
  959. //#[test]
  960. fn stats_test_blockage_migration_50(buckets: u16) {
  961. let mut th = TestHarness::new_buckets(buckets, buckets);
  962. let mut credentials: Vec<cred::Lox> = Vec::new();
  963. for _ in 0..10000 {
  964. let cred = th.open_invite().1 .0;
  965. th.advance_days(30);
  966. let (_, migcred) = th.trust_promotion(&cred);
  967. let (_, cred1) = th.level0_migration(&cred, &migcred);
  968. th.advance_days(14);
  969. let (_, cred2) = th.level_up(&cred1);
  970. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  971. let (_, bob_cred) = th.redeem_invite(&invite);
  972. th.advance_days(28);
  973. let (_, _) = th.level_up(&bob_cred);
  974. let (_, cred3) = th.level_up(&cred2a);
  975. credentials.push(cred3);
  976. }
  977. block_bridges(&mut th, 50, credentials);
  978. }
  979. //#[test]
  980. fn stats_test_blockage_migration_55(buckets: u16) {
  981. let mut th = TestHarness::new_buckets(buckets, buckets);
  982. let mut credentials: Vec<cred::Lox> = Vec::new();
  983. for _ in 0..10000 {
  984. let cred = th.open_invite().1 .0;
  985. th.advance_days(30);
  986. let (_, migcred) = th.trust_promotion(&cred);
  987. let (_, cred1) = th.level0_migration(&cred, &migcred);
  988. th.advance_days(14);
  989. let (_, cred2) = th.level_up(&cred1);
  990. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  991. let (_, bob_cred) = th.redeem_invite(&invite);
  992. th.advance_days(28);
  993. let (_, _) = th.level_up(&bob_cred);
  994. let (_, cred3) = th.level_up(&cred2a);
  995. credentials.push(cred3);
  996. }
  997. block_bridges(&mut th, 55, credentials);
  998. }
  999. //#[test]
  1000. fn stats_test_blockage_migration_60(buckets: u16) {
  1001. let mut th = TestHarness::new_buckets(buckets, buckets);
  1002. let mut credentials: Vec<cred::Lox> = Vec::new();
  1003. for _ in 0..10000 {
  1004. let cred = th.open_invite().1 .0;
  1005. th.advance_days(30);
  1006. let (_, migcred) = th.trust_promotion(&cred);
  1007. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1008. th.advance_days(14);
  1009. let (_, cred2) = th.level_up(&cred1);
  1010. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1011. let (_, bob_cred) = th.redeem_invite(&invite);
  1012. th.advance_days(28);
  1013. let (_, _) = th.level_up(&bob_cred);
  1014. let (_, cred3) = th.level_up(&cred2a);
  1015. credentials.push(cred3);
  1016. }
  1017. block_bridges(&mut th, 60, credentials);
  1018. }
  1019. //#[test]
  1020. fn stats_test_blockage_migration_65(buckets: u16) {
  1021. let mut th = TestHarness::new_buckets(buckets, buckets);
  1022. let mut credentials: Vec<cred::Lox> = Vec::new();
  1023. for _ in 0..10000 {
  1024. let cred = th.open_invite().1 .0;
  1025. th.advance_days(30);
  1026. let (_, migcred) = th.trust_promotion(&cred);
  1027. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1028. th.advance_days(14);
  1029. let (_, cred2) = th.level_up(&cred1);
  1030. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1031. let (_, bob_cred) = th.redeem_invite(&invite);
  1032. th.advance_days(28);
  1033. let (_, _) = th.level_up(&bob_cred);
  1034. let (_, cred3) = th.level_up(&cred2a);
  1035. credentials.push(cred3);
  1036. }
  1037. block_bridges(&mut th, 65, credentials);
  1038. }
  1039. //#[test]
  1040. fn stats_test_blockage_migration_70(buckets: u16) {
  1041. let mut th = TestHarness::new_buckets(buckets, buckets);
  1042. let mut credentials: Vec<cred::Lox> = Vec::new();
  1043. for _ in 0..10000 {
  1044. let cred = th.open_invite().1 .0;
  1045. th.advance_days(30);
  1046. let (_, migcred) = th.trust_promotion(&cred);
  1047. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1048. th.advance_days(14);
  1049. let (_, cred2) = th.level_up(&cred1);
  1050. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1051. let (_, bob_cred) = th.redeem_invite(&invite);
  1052. th.advance_days(28);
  1053. let (_, _) = th.level_up(&bob_cred);
  1054. let (_, cred3) = th.level_up(&cred2a);
  1055. credentials.push(cred3);
  1056. }
  1057. block_bridges(&mut th, 70, credentials);
  1058. }
  1059. //#[test]
  1060. fn stats_test_blockage_migration_75(buckets: u16) {
  1061. let mut th = TestHarness::new_buckets(buckets, buckets);
  1062. let mut credentials: Vec<cred::Lox> = Vec::new();
  1063. for _ in 0..10000 {
  1064. let cred = th.open_invite().1 .0;
  1065. th.advance_days(30);
  1066. let (_, migcred) = th.trust_promotion(&cred);
  1067. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1068. th.advance_days(14);
  1069. let (_, cred2) = th.level_up(&cred1);
  1070. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1071. let (_, bob_cred) = th.redeem_invite(&invite);
  1072. th.advance_days(28);
  1073. let (_, _) = th.level_up(&bob_cred);
  1074. let (_, cred3) = th.level_up(&cred2a);
  1075. credentials.push(cred3);
  1076. }
  1077. block_bridges(&mut th, 75, credentials);
  1078. }
  1079. //#[test]
  1080. fn stats_test_blockage_migration_80(buckets: u16) {
  1081. let mut th = TestHarness::new_buckets(buckets, buckets);
  1082. let mut credentials: Vec<cred::Lox> = Vec::new();
  1083. for _ in 0..10000 {
  1084. let cred = th.open_invite().1 .0;
  1085. th.advance_days(30);
  1086. let (_, migcred) = th.trust_promotion(&cred);
  1087. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1088. th.advance_days(14);
  1089. let (_, cred2) = th.level_up(&cred1);
  1090. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1091. let (_, bob_cred) = th.redeem_invite(&invite);
  1092. th.advance_days(28);
  1093. let (_, _) = th.level_up(&bob_cred);
  1094. let (_, cred3) = th.level_up(&cred2a);
  1095. credentials.push(cred3);
  1096. }
  1097. block_bridges(&mut th, 80, credentials);
  1098. }
  1099. //#[test]
  1100. fn stats_test_blockage_migration_85(buckets: u16) {
  1101. let mut th = TestHarness::new_buckets(buckets, buckets);
  1102. let mut credentials: Vec<cred::Lox> = Vec::new();
  1103. for _ in 0..10000 {
  1104. let cred = th.open_invite().1 .0;
  1105. th.advance_days(30);
  1106. let (_, migcred) = th.trust_promotion(&cred);
  1107. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1108. th.advance_days(14);
  1109. let (_, cred2) = th.level_up(&cred1);
  1110. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1111. let (_, bob_cred) = th.redeem_invite(&invite);
  1112. th.advance_days(28);
  1113. let (_, _) = th.level_up(&bob_cred);
  1114. let (_, cred3) = th.level_up(&cred2a);
  1115. credentials.push(cred3);
  1116. }
  1117. block_bridges(&mut th, 85, credentials);
  1118. }
  1119. //#[test]
  1120. fn stats_test_blockage_migration_90(bucket: u16) {
  1121. let mut th = TestHarness::new_buckets(bucket, bucket);
  1122. let mut credentials: Vec<cred::Lox> = Vec::new();
  1123. for _ in 0..10000 {
  1124. let cred = th.open_invite().1 .0;
  1125. th.advance_days(30);
  1126. let (_, migcred) = th.trust_promotion(&cred);
  1127. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1128. th.advance_days(14);
  1129. let (_, cred2) = th.level_up(&cred1);
  1130. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1131. let (_, bob_cred) = th.redeem_invite(&invite);
  1132. th.advance_days(28);
  1133. let (_, _) = th.level_up(&bob_cred);
  1134. let (_, cred3) = th.level_up(&cred2a);
  1135. credentials.push(cred3);
  1136. }
  1137. block_bridges(&mut th, 90, credentials);
  1138. }
  1139. //#[test]
  1140. fn stats_test_blockage_migration_95(bucket: u16) {
  1141. let mut th = TestHarness::new_buckets(bucket, bucket);
  1142. let mut credentials: Vec<cred::Lox> = Vec::new();
  1143. for _ in 0..10000 {
  1144. let cred = th.open_invite().1 .0;
  1145. th.advance_days(30);
  1146. let (_, migcred) = th.trust_promotion(&cred);
  1147. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1148. th.advance_days(14);
  1149. let (_, cred2) = th.level_up(&cred1);
  1150. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1151. let (_, bob_cred) = th.redeem_invite(&invite);
  1152. th.advance_days(28);
  1153. let (_, _) = th.level_up(&bob_cred);
  1154. let (_, cred3) = th.level_up(&cred2a);
  1155. credentials.push(cred3);
  1156. }
  1157. block_bridges(&mut th, 95, credentials);
  1158. }
  1159. //#[test]
  1160. fn stats_test_blockage_migration_100(bucket: u16) {
  1161. let mut th = TestHarness::new_buckets(bucket, bucket);
  1162. let mut credentials: Vec<cred::Lox> = Vec::new();
  1163. for _ in 0..10000 {
  1164. let cred = th.open_invite().1 .0;
  1165. th.advance_days(30);
  1166. let (_, migcred) = th.trust_promotion(&cred);
  1167. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1168. th.advance_days(14);
  1169. let (_, cred2) = th.level_up(&cred1);
  1170. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1171. let (_, bob_cred) = th.redeem_invite(&invite);
  1172. th.advance_days(28);
  1173. let (_, _) = th.level_up(&bob_cred);
  1174. let (_, cred3) = th.level_up(&cred2a);
  1175. credentials.push(cred3);
  1176. }
  1177. block_bridges(&mut th, 100, credentials);
  1178. }
  1179. //#[test] Check if times/sizes change after blocking
  1180. fn stats_test_blockage_migration_incremental_and_levels(buckets: u16) {
  1181. println!("\n----WEIRD-TEST----\n");
  1182. let mut th = TestHarness::new_buckets(buckets, buckets);
  1183. for _ in 0..15{
  1184. let mut req_size: Vec<f64> = Vec::new();
  1185. let mut resp_size: Vec<f64> = Vec::new();
  1186. let mut req_time: Vec<f64> = Vec::new();
  1187. let mut resp_time: Vec<f64> = Vec::new();
  1188. let mut resp_handle_time: Vec<f64> = Vec::new();
  1189. let mut red_req_size: Vec<f64> = Vec::new();
  1190. let mut red_resp_size: Vec<f64> = Vec::new();
  1191. let mut red_req_time: Vec<f64> = Vec::new();
  1192. let mut red_resp_time: Vec<f64> = Vec::new();
  1193. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  1194. let mut promo_req_size: Vec<f64> = Vec::new();
  1195. let mut promo_resp_size: Vec<f64> = Vec::new();
  1196. let mut promo_req_time: Vec<f64> = Vec::new();
  1197. let mut promo_resp_time: Vec<f64> = Vec::new();
  1198. let mut promo_resp_handle_time: Vec<f64> = Vec::new();
  1199. let mut mig_req_size: Vec<f64> = Vec::new();
  1200. let mut mig_resp_size: Vec<f64> = Vec::new();
  1201. let mut mig_req_time: Vec<f64> = Vec::new();
  1202. let mut mig_resp_time: Vec<f64> = Vec::new();
  1203. let mut mig_resp_handle_time: Vec<f64> = Vec::new();
  1204. let mut sec_req_size: Vec<f64> = Vec::new();
  1205. let mut sec_resp_size: Vec<f64> = Vec::new();
  1206. let mut sec_req_time: Vec<f64> = Vec::new();
  1207. let mut sec_resp_time: Vec<f64> = Vec::new();
  1208. let mut sec_resp_handle_time: Vec<f64> = Vec::new();
  1209. let mut three_req_size: Vec<f64> = Vec::new();
  1210. let mut three_resp_size: Vec<f64> = Vec::new();
  1211. let mut three_req_time: Vec<f64> = Vec::new();
  1212. let mut three_resp_time: Vec<f64> = Vec::new();
  1213. let mut three_resp_handle_time: Vec<f64> = Vec::new();
  1214. let mut four_req_size: Vec<f64> = Vec::new();
  1215. let mut four_resp_size: Vec<f64> = Vec::new();
  1216. let mut four_req_time: Vec<f64> = Vec::new();
  1217. let mut four_resp_time: Vec<f64> = Vec::new();
  1218. let mut four_resp_handle_time: Vec<f64> = Vec::new();
  1219. let mut open_req_size: Vec<f64> = Vec::new();
  1220. let mut open_resp_size: Vec<f64> = Vec::new();
  1221. let mut open_req_time: Vec<f64> = Vec::new();
  1222. let mut open_resp_time: Vec<f64> = Vec::new();
  1223. let mut open_resp_handle_time: Vec<f64> = Vec::new();
  1224. let mut credentials: Vec<cred::Lox> = Vec::new();
  1225. for _ in 0..10000 {
  1226. let (open_perf_stat, cred) = th.open_invite();
  1227. th.advance_days(30);
  1228. let (tp_perf_stat, migcred) = th.trust_promotion(&cred.0);
  1229. let (mig_perf_stat, cred1) = th.level0_migration(&cred.0, &migcred);
  1230. th.advance_days(14);
  1231. let (sec_perf_stat, cred2) = th.level_up(&cred1);
  1232. let (perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  1233. let (bob_perf_stat, _) = th.redeem_invite(&invite);
  1234. th.advance_days(28);
  1235. let (three_perf_stat, cred3) = th.level_up(&cred2a);
  1236. th.advance_days(56);
  1237. let (four_perf_stat, cred4) = th.level_up(&cred3);
  1238. credentials.push(cred4);
  1239. open_req_size.push(open_perf_stat.req_len as f64);
  1240. open_req_time.push(open_perf_stat.req_t.as_secs_f64());
  1241. open_resp_size.push(open_perf_stat.resp_len as f64);
  1242. open_resp_time.push(open_perf_stat.resp_t.as_secs_f64());
  1243. open_resp_handle_time.push(open_perf_stat.resp_handle_t.as_secs_f64());
  1244. promo_req_size.push(tp_perf_stat.req_len as f64);
  1245. promo_req_time.push(tp_perf_stat.req_t.as_secs_f64());
  1246. promo_resp_size.push(tp_perf_stat.resp_len as f64);
  1247. promo_resp_time.push(tp_perf_stat.resp_t.as_secs_f64());
  1248. promo_resp_handle_time.push(tp_perf_stat.resp_handle_t.as_secs_f64());
  1249. mig_req_size.push(mig_perf_stat.req_len as f64);
  1250. mig_req_time.push(mig_perf_stat.req_t.as_secs_f64());
  1251. mig_resp_size.push(mig_perf_stat.resp_len as f64);
  1252. mig_resp_time.push(mig_perf_stat.resp_t.as_secs_f64());
  1253. mig_resp_handle_time.push(mig_perf_stat.resp_handle_t.as_secs_f64());
  1254. sec_req_size.push(sec_perf_stat.req_len as f64);
  1255. sec_req_time.push(sec_perf_stat.req_t.as_secs_f64());
  1256. sec_resp_size.push(sec_perf_stat.resp_len as f64);
  1257. sec_resp_time.push(sec_perf_stat.resp_t.as_secs_f64());
  1258. sec_resp_handle_time.push(sec_perf_stat.resp_handle_t.as_secs_f64());
  1259. three_req_size.push(three_perf_stat.req_len as f64);
  1260. three_req_time.push(three_perf_stat.req_t.as_secs_f64());
  1261. three_resp_size.push(three_perf_stat.resp_len as f64);
  1262. three_resp_time.push(three_perf_stat.resp_t.as_secs_f64());
  1263. three_resp_handle_time.push(three_perf_stat.resp_handle_t.as_secs_f64());
  1264. four_req_size.push(four_perf_stat.req_len as f64);
  1265. four_req_time.push(four_perf_stat.req_t.as_secs_f64());
  1266. four_resp_size.push(four_perf_stat.resp_len as f64);
  1267. four_resp_time.push(four_perf_stat.resp_t.as_secs_f64());
  1268. four_resp_handle_time.push(four_perf_stat.resp_handle_t.as_secs_f64());
  1269. req_size.push(perf_stat.req_len as f64);
  1270. req_time.push(perf_stat.req_t.as_secs_f64());
  1271. resp_size.push(perf_stat.resp_len as f64);
  1272. resp_time.push(perf_stat.resp_t.as_secs_f64());
  1273. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  1274. red_req_size.push(bob_perf_stat.req_len as f64);
  1275. red_req_time.push(bob_perf_stat.req_t.as_secs_f64());
  1276. red_resp_size.push(bob_perf_stat.resp_len as f64);
  1277. red_resp_time.push(bob_perf_stat.resp_t.as_secs_f64());
  1278. red_resp_handle_time.push(bob_perf_stat.resp_handle_t.as_secs_f64());
  1279. }
  1280. println!("\n----WEIRD-OPEN-INVITATION----\n");
  1281. print_stats_test_results(
  1282. open_req_size,
  1283. open_req_time,
  1284. open_resp_size,
  1285. open_resp_time,
  1286. open_resp_handle_time,
  1287. );
  1288. println!("\n----WEIRD-TRUST-PROMOTION-1: 30 days----\n");
  1289. print_stats_test_results(
  1290. promo_req_size,
  1291. promo_req_time,
  1292. promo_resp_size,
  1293. promo_resp_time,
  1294. promo_resp_handle_time,
  1295. );
  1296. println!("\n----WEIRD-TRUST-MIGRATION-0: 30 days------------\n");
  1297. print_stats_test_results(
  1298. mig_req_size,
  1299. mig_req_time,
  1300. mig_resp_size,
  1301. mig_resp_time,
  1302. mig_resp_handle_time,
  1303. );
  1304. println!("\n----WEIRD-LEVEL-UP-2: 44 days----\n");
  1305. print_stats_test_results(
  1306. sec_req_size,
  1307. sec_req_time,
  1308. sec_resp_size,
  1309. sec_resp_time,
  1310. sec_resp_handle_time,
  1311. );
  1312. println!("\n----WEIRD-LEVEL-UP-3: 72 days------\n");
  1313. print_stats_test_results(
  1314. three_req_size,
  1315. three_req_time,
  1316. three_resp_size,
  1317. three_resp_time,
  1318. three_resp_handle_time,
  1319. );
  1320. println!("\n----WEIRD-LEVEL-UP-4: 128 days------\n");
  1321. print_stats_test_results(
  1322. four_req_size,
  1323. four_req_time,
  1324. four_resp_size,
  1325. four_resp_time,
  1326. four_resp_handle_time,
  1327. );
  1328. println!("\n----ISSUE-INVITATION----\n");
  1329. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  1330. println!("\n----REDEEM-INVITATION----\n");
  1331. print_stats_test_results(
  1332. red_req_size,
  1333. red_req_time,
  1334. red_resp_size,
  1335. red_resp_time,
  1336. red_resp_handle_time,
  1337. );
  1338. block_bridges(&mut th, 10, credentials);
  1339. }
  1340. }
  1341. #[test]
  1342. fn test_all(){
  1343. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1344. for x in buckets {
  1345. println!("\n***START: {}*3*2 BUCKETS***\n", x);
  1346. stats_test_trust_levels(x);
  1347. stats_test_invitations(x);
  1348. stats_test_blockage_migration_5(x);
  1349. stats_test_blockage_migration_10(x);
  1350. stats_test_blockage_migration_15(x);
  1351. stats_test_blockage_migration_20(x);
  1352. stats_test_blockage_migration_25(x);
  1353. stats_test_blockage_migration_30(x);
  1354. stats_test_blockage_migration_35(x);
  1355. stats_test_blockage_migration_40(x);
  1356. stats_test_blockage_migration_45(x);
  1357. stats_test_blockage_migration_50(x);
  1358. stats_test_blockage_migration_55(x);
  1359. stats_test_blockage_migration_60(x);
  1360. stats_test_blockage_migration_65(x);
  1361. stats_test_blockage_migration_70(x);
  1362. stats_test_blockage_migration_75(x);
  1363. stats_test_blockage_migration_80(x);
  1364. stats_test_blockage_migration_85(x);
  1365. stats_test_blockage_migration_90(x);
  1366. stats_test_blockage_migration_95(x);
  1367. stats_test_blockage_migration_100(x);
  1368. }
  1369. let buckets2: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1370. for x in buckets2 {
  1371. println!("\n***START: {}*3*2 BUCKETS FOR WEIRD TEST***\n", x);
  1372. stats_test_blockage_migration_incremental_and_levels(x);
  1373. }
  1374. println!("\nAll done!\n");
  1375. }
  1376. /// Blocks a percentage of the bridges for the passed Test Harness
  1377. /// excluding the hot spare buckets as they will not have been handed out.
  1378. /// The logic assumes hot spare buckets are appended to the end of the bridge_table
  1379. /// bucket list.
  1380. fn block_bridges(th: &mut TestHarness, percentage: usize, credentials: Vec<cred::Lox>) {
  1381. let blockable_num = th.ba.bridge_table.buckets.len()
  1382. - th.ba.bridge_table.spares.len()
  1383. - th.bdb.openinv_buckets.len();
  1384. let blockable_range = th.ba.bridge_table.buckets.len() - th.ba.bridge_table.spares.len();
  1385. let to_block: usize = (blockable_num * percentage / 100).into();
  1386. let mut block_index: HashSet<usize> = HashSet::new();
  1387. let mut rng = rand::thread_rng();
  1388. while block_index.len() <= to_block - 1 {
  1389. let rand_num = rng.gen_range(0, blockable_range);
  1390. if !th.bdb.openinv_buckets.contains(&(rand_num as u32)) {
  1391. block_index.insert(rand_num);
  1392. }
  1393. }
  1394. for index in block_index {
  1395. let b0 = th.ba.bridge_table.buckets[index][0];
  1396. let b1 = th.ba.bridge_table.buckets[index][1];
  1397. let b2 = th.ba.bridge_table.buckets[index][2];
  1398. th.ba.bridge_unreachable(&b0, &mut th.bdb);
  1399. th.ba.bridge_unreachable(&b1, &mut th.bdb);
  1400. th.ba.bridge_unreachable(&b2, &mut th.bdb);
  1401. }
  1402. let mut req_size: Vec<f64> = Vec::new();
  1403. let mut resp_size: Vec<f64> = Vec::new();
  1404. let mut req_time: Vec<f64> = Vec::new();
  1405. let mut resp_time: Vec<f64> = Vec::new();
  1406. let mut resp_handle_time: Vec<f64> = Vec::new();
  1407. let mut red_req_size: Vec<f64> = Vec::new();
  1408. let mut red_resp_size: Vec<f64> = Vec::new();
  1409. let mut red_req_time: Vec<f64> = Vec::new();
  1410. let mut red_resp_time: Vec<f64> = Vec::new();
  1411. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  1412. for cred in credentials {
  1413. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  1414. let encbuckets = th.ba.enc_bridge_table();
  1415. let bucket =
  1416. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  1417. let mut count = 0;
  1418. for bridge_line in &bucket.0 {
  1419. if th.ba.bridge_table.reachable.contains_key(bridge_line) {
  1420. count = count + 1;
  1421. }
  1422. }
  1423. if count < 2 {
  1424. let (perf_stat, migration) = th.check_blockage(&cred);
  1425. let (block_perf_stat, _) = th.blockage_migration(&cred, &migration);
  1426. req_size.push(perf_stat.req_len as f64);
  1427. req_time.push(perf_stat.req_t.as_secs_f64());
  1428. resp_size.push(perf_stat.resp_len as f64);
  1429. resp_time.push(perf_stat.resp_t.as_secs_f64());
  1430. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  1431. red_req_size.push(block_perf_stat.req_len as f64);
  1432. red_req_time.push(block_perf_stat.req_t.as_secs_f64());
  1433. red_resp_size.push(block_perf_stat.resp_len as f64);
  1434. red_resp_time.push(block_perf_stat.resp_t.as_secs_f64());
  1435. red_resp_handle_time.push(block_perf_stat.resp_handle_t.as_secs_f64());
  1436. // println!("CHECK_BLOCKAGE_{}", percentage);
  1437. // print_time_test_results(perf_stat);
  1438. // println!("BLOCKAGE_MIGRATION_{}", percentage);
  1439. // print_time_test_results(block_perf_stat);
  1440. }
  1441. }
  1442. println!(
  1443. "\n----CHECK-BLOCKAGE-{}----\n",
  1444. percentage
  1445. );
  1446. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  1447. println!(
  1448. "\n----BLOCKAGE-MIGRATION-{}----\n",
  1449. percentage
  1450. );
  1451. print_stats_test_results(
  1452. red_req_size,
  1453. red_req_time,
  1454. red_resp_size,
  1455. red_resp_time,
  1456. red_resp_handle_time,
  1457. );
  1458. }
  1459. fn print_test_results(perf_stat: PerfStat) {
  1460. println!("Request size = {:?} bytes", perf_stat.req_len);
  1461. println!("Request time = {:?}", perf_stat.req_t);
  1462. println!("Response size = {:?} bytes", perf_stat.resp_len);
  1463. println!("Response time = {:?}", perf_stat.resp_t);
  1464. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1465. }
  1466. fn print_time_test_results(perf_stat: PerfStat) {
  1467. println!("Request time = {:?}", perf_stat.req_t);
  1468. println!("Response time = {:?}", perf_stat.resp_t);
  1469. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1470. }
  1471. fn print_stats_test_results(
  1472. req_size: Vec<f64>,
  1473. req_time: Vec<f64>,
  1474. resp_size: Vec<f64>,
  1475. resp_time: Vec<f64>,
  1476. resp_handle_time: Vec<f64>,
  1477. ) {
  1478. let mean_req_size = mean(&req_size);
  1479. let req_std_dev = standard_deviation(&req_size, Some(mean_req_size));
  1480. let mean_req_time = mean(&req_time);
  1481. let req_time_std_dev = standard_deviation(&req_time, Some(mean_req_time));
  1482. let mean_resp_size = mean(&resp_size);
  1483. let resp_std_dev = standard_deviation(&resp_size, Some(mean_resp_size));
  1484. let mean_resp_time = mean(&resp_time);
  1485. let resp_time_std_dev = standard_deviation(&resp_time, Some(mean_resp_time));
  1486. let mean_resp_handle_time = mean(&resp_handle_time);
  1487. let resp_handle_time_std_dev =
  1488. standard_deviation(&resp_handle_time, Some(mean_resp_handle_time));
  1489. println!("Average request size = {} bytes", mean_req_size);
  1490. println!("Request size standard deviation = {} bytes", req_std_dev);
  1491. println!(
  1492. "Average request time = {:?}",
  1493. Duration::from_secs_f64(mean_req_time)
  1494. );
  1495. println!(
  1496. "Request time standard deviation = {:?}",
  1497. Duration::from_secs_f64(req_time_std_dev)
  1498. );
  1499. println!("Average response size = {} bytes", mean_resp_size);
  1500. println!("Response standard deviation = {} bytes", resp_std_dev);
  1501. println!(
  1502. "Average response time = {:?}",
  1503. Duration::from_secs_f64(mean_resp_time)
  1504. );
  1505. println!(
  1506. "Response time standard deviation = {:?}",
  1507. Duration::from_secs_f64(resp_time_std_dev)
  1508. );
  1509. println!(
  1510. "Average response handling time = {:?}",
  1511. Duration::from_secs_f64(mean_resp_handle_time)
  1512. );
  1513. println!(
  1514. "Response handling time standard deviation = {:?}",
  1515. Duration::from_secs_f64(resp_handle_time_std_dev)
  1516. );
  1517. }