tests.rs 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505
  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_trust_levels() {
  600. let mut th = TestHarness::new_buckets(150, 150);
  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 Invitationn-------------------\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 to Level 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 Level 0 Migration: 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-------Trust Promotion to Level 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-------Trust Promotion to Level 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-------Trust Promotion to Level 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() {
  736. let mut th = TestHarness::new_buckets(150, 150);
  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. println!("ISSUE_INVITE");
  768. print_time_test_results(perf_stat);
  769. println!("REDEEM_INVITE");
  770. print_time_test_results(bob_perf_stat);
  771. }
  772. println!("\n---------------Issue Invitation----------------\n");
  773. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  774. println!("\n---------------Redeem Invitation----------------\n");
  775. print_stats_test_results(
  776. red_req_size,
  777. red_req_time,
  778. red_resp_size,
  779. red_resp_time,
  780. red_resp_handle_time,
  781. );
  782. }
  783. #[test]
  784. fn stats_test_blockage_migration_5() {
  785. let mut th = TestHarness::new_buckets(150, 150);
  786. let mut credentials: Vec<cred::Lox> = Vec::new();
  787. for _ in 0..1000 {
  788. let cred = th.open_invite().1 .0;
  789. th.advance_days(30);
  790. let (_, migcred) = th.trust_promotion(&cred);
  791. let (_, cred1) = th.level0_migration(&cred, &migcred);
  792. th.advance_days(14);
  793. let (_, cred2) = th.level_up(&cred1);
  794. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  795. let (_, bob_cred) = th.redeem_invite(&invite);
  796. th.advance_days(28);
  797. let (_, _) = th.level_up(&bob_cred);
  798. let (_, cred3) = th.level_up(&cred2a);
  799. credentials.push(cred3);
  800. }
  801. block_bridges(&mut th, 5, credentials);
  802. }
  803. #[test]
  804. fn stats_test_blockage_migration_10() {
  805. let mut th = TestHarness::new_buckets(150, 150);
  806. let mut credentials: Vec<cred::Lox> = Vec::new();
  807. for _ in 0..1000 {
  808. let cred = th.open_invite().1 .0;
  809. th.advance_days(30);
  810. let (_, migcred) = th.trust_promotion(&cred);
  811. let (_, cred1) = th.level0_migration(&cred, &migcred);
  812. th.advance_days(14);
  813. let (_, cred2) = th.level_up(&cred1);
  814. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  815. let (_, bob_cred) = th.redeem_invite(&invite);
  816. th.advance_days(28);
  817. let (_, _) = th.level_up(&bob_cred);
  818. let (_, cred3) = th.level_up(&cred2a);
  819. credentials.push(cred3);
  820. }
  821. block_bridges(&mut th, 10, credentials);
  822. }
  823. #[test]
  824. fn stats_test_blockage_migration_15() {
  825. let mut th = TestHarness::new_buckets(150, 150);
  826. let mut credentials: Vec<cred::Lox> = Vec::new();
  827. for _ in 0..10000 {
  828. let cred = th.open_invite().1 .0;
  829. th.advance_days(30);
  830. let (_, migcred) = th.trust_promotion(&cred);
  831. let (_, cred1) = th.level0_migration(&cred, &migcred);
  832. th.advance_days(14);
  833. let (_, cred2) = th.level_up(&cred1);
  834. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  835. let (_, bob_cred) = th.redeem_invite(&invite);
  836. th.advance_days(28);
  837. let (_, _) = th.level_up(&bob_cred);
  838. let (_, cred3) = th.level_up(&cred2a);
  839. credentials.push(cred3);
  840. }
  841. block_bridges(&mut th, 15, credentials);
  842. }
  843. #[test]
  844. fn stats_test_blockage_migration_20() {
  845. let mut th = TestHarness::new_buckets(150, 150);
  846. let mut credentials: Vec<cred::Lox> = Vec::new();
  847. for _ in 0..10000 {
  848. let cred = th.open_invite().1 .0;
  849. th.advance_days(30);
  850. let (_, migcred) = th.trust_promotion(&cred);
  851. let (_, cred1) = th.level0_migration(&cred, &migcred);
  852. th.advance_days(14);
  853. let (_, cred2) = th.level_up(&cred1);
  854. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  855. let (_, bob_cred) = th.redeem_invite(&invite);
  856. th.advance_days(28);
  857. let (_, _) = th.level_up(&bob_cred);
  858. let (_, cred3) = th.level_up(&cred2a);
  859. credentials.push(cred3);
  860. }
  861. block_bridges(&mut th, 20, credentials);
  862. }
  863. #[test]
  864. fn stats_test_blockage_migration_25() {
  865. let mut th = TestHarness::new_buckets(150, 150);
  866. let mut credentials: Vec<cred::Lox> = Vec::new();
  867. for _ in 0..10000 {
  868. let cred = th.open_invite().1 .0;
  869. th.advance_days(30);
  870. let (_, migcred) = th.trust_promotion(&cred);
  871. let (_, cred1) = th.level0_migration(&cred, &migcred);
  872. th.advance_days(14);
  873. let (_, cred2) = th.level_up(&cred1);
  874. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  875. let (_, bob_cred) = th.redeem_invite(&invite);
  876. th.advance_days(28);
  877. let (_, _) = th.level_up(&bob_cred);
  878. let (_, cred3) = th.level_up(&cred2a);
  879. credentials.push(cred3);
  880. }
  881. block_bridges(&mut th, 25, credentials);
  882. }
  883. #[test]
  884. fn stats_test_blockage_migration_30() {
  885. let mut th = TestHarness::new_buckets(150, 150);
  886. let mut credentials: Vec<cred::Lox> = Vec::new();
  887. for _ in 0..10000 {
  888. let cred = th.open_invite().1 .0;
  889. th.advance_days(30);
  890. let (_, migcred) = th.trust_promotion(&cred);
  891. let (_, cred1) = th.level0_migration(&cred, &migcred);
  892. th.advance_days(14);
  893. let (_, cred2) = th.level_up(&cred1);
  894. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  895. let (_, bob_cred) = th.redeem_invite(&invite);
  896. th.advance_days(28);
  897. let (_, _) = th.level_up(&bob_cred);
  898. let (_, cred3) = th.level_up(&cred2a);
  899. credentials.push(cred3);
  900. }
  901. block_bridges(&mut th, 30, credentials);
  902. }
  903. #[test]
  904. fn stats_test_blockage_migration_35() {
  905. let mut th = TestHarness::new_buckets(150, 150);
  906. let mut credentials: Vec<cred::Lox> = Vec::new();
  907. for _ in 0..10000 {
  908. let cred = th.open_invite().1 .0;
  909. th.advance_days(30);
  910. let (_, migcred) = th.trust_promotion(&cred);
  911. let (_, cred1) = th.level0_migration(&cred, &migcred);
  912. th.advance_days(14);
  913. let (_, cred2) = th.level_up(&cred1);
  914. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  915. let (_, bob_cred) = th.redeem_invite(&invite);
  916. th.advance_days(28);
  917. let (_, _) = th.level_up(&bob_cred);
  918. let (_, cred3) = th.level_up(&cred2a);
  919. credentials.push(cred3);
  920. }
  921. block_bridges(&mut th, 35, credentials);
  922. }
  923. #[test]
  924. fn stats_test_blockage_migration_40() {
  925. let mut th = TestHarness::new_buckets(150, 150);
  926. let mut credentials: Vec<cred::Lox> = Vec::new();
  927. for _ in 0..10000 {
  928. let cred = th.open_invite().1 .0;
  929. th.advance_days(30);
  930. let (_, migcred) = th.trust_promotion(&cred);
  931. let (_, cred1) = th.level0_migration(&cred, &migcred);
  932. th.advance_days(14);
  933. let (_, cred2) = th.level_up(&cred1);
  934. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  935. let (_, bob_cred) = th.redeem_invite(&invite);
  936. th.advance_days(28);
  937. let (_, _) = th.level_up(&bob_cred);
  938. let (_, cred3) = th.level_up(&cred2a);
  939. credentials.push(cred3);
  940. }
  941. block_bridges(&mut th, 40, credentials);
  942. }
  943. #[test]
  944. fn stats_test_blockage_migration_45() {
  945. let mut th = TestHarness::new_buckets(150, 150);
  946. let mut credentials: Vec<cred::Lox> = Vec::new();
  947. for _ in 0..10000 {
  948. let cred = th.open_invite().1 .0;
  949. th.advance_days(30);
  950. let (_, migcred) = th.trust_promotion(&cred);
  951. let (_, cred1) = th.level0_migration(&cred, &migcred);
  952. th.advance_days(14);
  953. let (_, cred2) = th.level_up(&cred1);
  954. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  955. let (_, bob_cred) = th.redeem_invite(&invite);
  956. th.advance_days(28);
  957. let (_, _) = th.level_up(&bob_cred);
  958. let (_, cred3) = th.level_up(&cred2a);
  959. credentials.push(cred3);
  960. }
  961. block_bridges(&mut th, 45, credentials);
  962. }
  963. #[test]
  964. fn stats_test_blockage_migration_50() {
  965. let mut th = TestHarness::new_buckets(150, 150);
  966. let mut credentials: Vec<cred::Lox> = Vec::new();
  967. for _ in 0..10000 {
  968. let cred = th.open_invite().1 .0;
  969. th.advance_days(30);
  970. let (_, migcred) = th.trust_promotion(&cred);
  971. let (_, cred1) = th.level0_migration(&cred, &migcred);
  972. th.advance_days(14);
  973. let (_, cred2) = th.level_up(&cred1);
  974. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  975. let (_, bob_cred) = th.redeem_invite(&invite);
  976. th.advance_days(28);
  977. let (_, _) = th.level_up(&bob_cred);
  978. let (_, cred3) = th.level_up(&cred2a);
  979. credentials.push(cred3);
  980. }
  981. block_bridges(&mut th, 50, credentials);
  982. }
  983. #[test]
  984. fn stats_test_blockage_migration_55() {
  985. let mut th = TestHarness::new_buckets(150, 150);
  986. let mut credentials: Vec<cred::Lox> = Vec::new();
  987. for _ in 0..10000 {
  988. let cred = th.open_invite().1 .0;
  989. th.advance_days(30);
  990. let (_, migcred) = th.trust_promotion(&cred);
  991. let (_, cred1) = th.level0_migration(&cred, &migcred);
  992. th.advance_days(14);
  993. let (_, cred2) = th.level_up(&cred1);
  994. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  995. let (_, bob_cred) = th.redeem_invite(&invite);
  996. th.advance_days(28);
  997. let (_, _) = th.level_up(&bob_cred);
  998. let (_, cred3) = th.level_up(&cred2a);
  999. credentials.push(cred3);
  1000. }
  1001. block_bridges(&mut th, 55, credentials);
  1002. }
  1003. #[test]
  1004. fn stats_test_blockage_migration_60() {
  1005. let mut th = TestHarness::new_buckets(150, 150);
  1006. let mut credentials: Vec<cred::Lox> = Vec::new();
  1007. for _ in 0..10000 {
  1008. let cred = th.open_invite().1 .0;
  1009. th.advance_days(30);
  1010. let (_, migcred) = th.trust_promotion(&cred);
  1011. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1012. th.advance_days(14);
  1013. let (_, cred2) = th.level_up(&cred1);
  1014. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1015. let (_, bob_cred) = th.redeem_invite(&invite);
  1016. th.advance_days(28);
  1017. let (_, _) = th.level_up(&bob_cred);
  1018. let (_, cred3) = th.level_up(&cred2a);
  1019. credentials.push(cred3);
  1020. }
  1021. block_bridges(&mut th, 60, credentials);
  1022. }
  1023. #[test]
  1024. fn stats_test_blockage_migration_65() {
  1025. let mut th = TestHarness::new_buckets(150, 150);
  1026. let mut credentials: Vec<cred::Lox> = Vec::new();
  1027. for _ in 0..10000 {
  1028. let cred = th.open_invite().1 .0;
  1029. th.advance_days(30);
  1030. let (_, migcred) = th.trust_promotion(&cred);
  1031. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1032. th.advance_days(14);
  1033. let (_, cred2) = th.level_up(&cred1);
  1034. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1035. let (_, bob_cred) = th.redeem_invite(&invite);
  1036. th.advance_days(28);
  1037. let (_, _) = th.level_up(&bob_cred);
  1038. let (_, cred3) = th.level_up(&cred2a);
  1039. credentials.push(cred3);
  1040. }
  1041. block_bridges(&mut th, 65, credentials);
  1042. }
  1043. #[test]
  1044. fn stats_test_blockage_migration_70() {
  1045. let mut th = TestHarness::new_buckets(150, 150);
  1046. let mut credentials: Vec<cred::Lox> = Vec::new();
  1047. for _ in 0..10000 {
  1048. let cred = th.open_invite().1 .0;
  1049. th.advance_days(30);
  1050. let (_, migcred) = th.trust_promotion(&cred);
  1051. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1052. th.advance_days(14);
  1053. let (_, cred2) = th.level_up(&cred1);
  1054. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1055. let (_, bob_cred) = th.redeem_invite(&invite);
  1056. th.advance_days(28);
  1057. let (_, _) = th.level_up(&bob_cred);
  1058. let (_, cred3) = th.level_up(&cred2a);
  1059. credentials.push(cred3);
  1060. }
  1061. block_bridges(&mut th, 70, credentials);
  1062. }
  1063. #[test]
  1064. fn stats_test_blockage_migration_75() {
  1065. let mut th = TestHarness::new_buckets(150, 150);
  1066. let mut credentials: Vec<cred::Lox> = Vec::new();
  1067. for _ in 0..10000 {
  1068. let cred = th.open_invite().1 .0;
  1069. th.advance_days(30);
  1070. let (_, migcred) = th.trust_promotion(&cred);
  1071. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1072. th.advance_days(14);
  1073. let (_, cred2) = th.level_up(&cred1);
  1074. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1075. let (_, bob_cred) = th.redeem_invite(&invite);
  1076. th.advance_days(28);
  1077. let (_, _) = th.level_up(&bob_cred);
  1078. let (_, cred3) = th.level_up(&cred2a);
  1079. credentials.push(cred3);
  1080. }
  1081. block_bridges(&mut th, 75, credentials);
  1082. }
  1083. #[test]
  1084. fn stats_test_blockage_migration_80() {
  1085. let mut th = TestHarness::new_buckets(150, 150);
  1086. let mut credentials: Vec<cred::Lox> = Vec::new();
  1087. for _ in 0..10000 {
  1088. let cred = th.open_invite().1 .0;
  1089. th.advance_days(30);
  1090. let (_, migcred) = th.trust_promotion(&cred);
  1091. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1092. th.advance_days(14);
  1093. let (_, cred2) = th.level_up(&cred1);
  1094. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1095. let (_, bob_cred) = th.redeem_invite(&invite);
  1096. th.advance_days(28);
  1097. let (_, _) = th.level_up(&bob_cred);
  1098. let (_, cred3) = th.level_up(&cred2a);
  1099. credentials.push(cred3);
  1100. }
  1101. block_bridges(&mut th, 80, credentials);
  1102. }
  1103. #[test]
  1104. fn stats_test_blockage_migration_85() {
  1105. let mut th = TestHarness::new_buckets(150, 150);
  1106. let mut credentials: Vec<cred::Lox> = Vec::new();
  1107. for _ in 0..10000 {
  1108. let cred = th.open_invite().1 .0;
  1109. th.advance_days(30);
  1110. let (_, migcred) = th.trust_promotion(&cred);
  1111. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1112. th.advance_days(14);
  1113. let (_, cred2) = th.level_up(&cred1);
  1114. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1115. let (_, bob_cred) = th.redeem_invite(&invite);
  1116. th.advance_days(28);
  1117. let (_, _) = th.level_up(&bob_cred);
  1118. let (_, cred3) = th.level_up(&cred2a);
  1119. credentials.push(cred3);
  1120. }
  1121. block_bridges(&mut th, 85, credentials);
  1122. }
  1123. #[test]
  1124. fn stats_test_blockage_migration_90() {
  1125. let mut th = TestHarness::new_buckets(150, 150);
  1126. let mut credentials: Vec<cred::Lox> = Vec::new();
  1127. for _ in 0..10000 {
  1128. let cred = th.open_invite().1 .0;
  1129. th.advance_days(30);
  1130. let (_, migcred) = th.trust_promotion(&cred);
  1131. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1132. th.advance_days(14);
  1133. let (_, cred2) = th.level_up(&cred1);
  1134. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1135. let (_, bob_cred) = th.redeem_invite(&invite);
  1136. th.advance_days(28);
  1137. let (_, _) = th.level_up(&bob_cred);
  1138. let (_, cred3) = th.level_up(&cred2a);
  1139. credentials.push(cred3);
  1140. }
  1141. block_bridges(&mut th, 90, credentials);
  1142. }
  1143. #[test]
  1144. fn stats_test_blockage_migration_95() {
  1145. let mut th = TestHarness::new_buckets(150, 150);
  1146. let mut credentials: Vec<cred::Lox> = Vec::new();
  1147. for _ in 0..10000 {
  1148. let cred = th.open_invite().1 .0;
  1149. th.advance_days(30);
  1150. let (_, migcred) = th.trust_promotion(&cred);
  1151. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1152. th.advance_days(14);
  1153. let (_, cred2) = th.level_up(&cred1);
  1154. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1155. let (_, bob_cred) = th.redeem_invite(&invite);
  1156. th.advance_days(28);
  1157. let (_, _) = th.level_up(&bob_cred);
  1158. let (_, cred3) = th.level_up(&cred2a);
  1159. credentials.push(cred3);
  1160. }
  1161. block_bridges(&mut th, 95, credentials);
  1162. }
  1163. #[test]
  1164. fn stats_test_blockage_migration_100() {
  1165. let mut th = TestHarness::new_buckets(150, 150);
  1166. let mut credentials: Vec<cred::Lox> = Vec::new();
  1167. for _ in 0..10000 {
  1168. let cred = th.open_invite().1 .0;
  1169. th.advance_days(30);
  1170. let (_, migcred) = th.trust_promotion(&cred);
  1171. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1172. th.advance_days(14);
  1173. let (_, cred2) = th.level_up(&cred1);
  1174. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1175. let (_, bob_cred) = th.redeem_invite(&invite);
  1176. th.advance_days(28);
  1177. let (_, _) = th.level_up(&bob_cred);
  1178. let (_, cred3) = th.level_up(&cred2a);
  1179. credentials.push(cred3);
  1180. }
  1181. block_bridges(&mut th, 100, credentials);
  1182. }
  1183. /// Blocks a percentage of the bridges for the passed Test Harness
  1184. /// excluding the hot spare buckets as they will not have been handed out.
  1185. /// The logic assumes hot spare buckets are appended to the end of the bridge_table
  1186. /// bucket list.
  1187. fn block_bridges(th: &mut TestHarness, percentage: usize, credentials: Vec<cred::Lox>) {
  1188. let blockable_num = th.ba.bridge_table.buckets.len()
  1189. - th.ba.bridge_table.spares.len()
  1190. - th.bdb.openinv_buckets.len();
  1191. let blockable_range = th.ba.bridge_table.buckets.len() - th.ba.bridge_table.spares.len();
  1192. let to_block: usize = (blockable_num * percentage / 100).into();
  1193. let mut block_index: HashSet<usize> = HashSet::new();
  1194. let mut rng = rand::thread_rng();
  1195. while block_index.len() <= to_block - 1 {
  1196. let rand_num = rng.gen_range(0, blockable_range);
  1197. if !th.bdb.openinv_buckets.contains(&(rand_num as u32)) {
  1198. block_index.insert(rand_num);
  1199. }
  1200. }
  1201. for index in block_index {
  1202. let b0 = th.ba.bridge_table.buckets[index][0];
  1203. let b1 = th.ba.bridge_table.buckets[index][1];
  1204. let b2 = th.ba.bridge_table.buckets[index][2];
  1205. th.ba.bridge_unreachable(&b0, &mut th.bdb);
  1206. th.ba.bridge_unreachable(&b1, &mut th.bdb);
  1207. th.ba.bridge_unreachable(&b2, &mut th.bdb);
  1208. }
  1209. let mut req_size: Vec<f64> = Vec::new();
  1210. let mut resp_size: Vec<f64> = Vec::new();
  1211. let mut req_time: Vec<f64> = Vec::new();
  1212. let mut resp_time: Vec<f64> = Vec::new();
  1213. let mut resp_handle_time: Vec<f64> = Vec::new();
  1214. let mut red_req_size: Vec<f64> = Vec::new();
  1215. let mut red_resp_size: Vec<f64> = Vec::new();
  1216. let mut red_req_time: Vec<f64> = Vec::new();
  1217. let mut red_resp_time: Vec<f64> = Vec::new();
  1218. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  1219. for cred in credentials {
  1220. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  1221. let encbuckets = th.ba.enc_bridge_table();
  1222. let bucket =
  1223. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  1224. let mut count = 0;
  1225. for bridge_line in &bucket.0 {
  1226. if th.ba.bridge_table.reachable.contains_key(bridge_line) {
  1227. count = count + 1;
  1228. }
  1229. }
  1230. if count < 2 {
  1231. let (perf_stat, migration) = th.check_blockage(&cred);
  1232. let (block_perf_stat, _) = th.blockage_migration(&cred, &migration);
  1233. req_size.push(perf_stat.req_len as f64);
  1234. req_time.push(perf_stat.req_t.as_secs_f64());
  1235. resp_size.push(perf_stat.resp_len as f64);
  1236. resp_time.push(perf_stat.resp_t.as_secs_f64());
  1237. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  1238. red_req_size.push(block_perf_stat.req_len as f64);
  1239. red_req_time.push(block_perf_stat.req_t.as_secs_f64());
  1240. red_resp_size.push(block_perf_stat.resp_len as f64);
  1241. red_resp_time.push(block_perf_stat.resp_t.as_secs_f64());
  1242. red_resp_handle_time.push(block_perf_stat.resp_handle_t.as_secs_f64());
  1243. println!("CHECK_BLOCKAGE_{}", percentage);
  1244. print_time_test_results(perf_stat);
  1245. println!("BLOCKAGE_MIGRATION_{}", percentage);
  1246. print_time_test_results(block_perf_stat);
  1247. }
  1248. }
  1249. println!(
  1250. "\n---------------Check Blockage {}---------------\n",
  1251. percentage
  1252. );
  1253. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  1254. println!(
  1255. "\n---------------Blockage Migration {}---------------\n",
  1256. percentage
  1257. );
  1258. print_stats_test_results(
  1259. red_req_size,
  1260. red_req_time,
  1261. red_resp_size,
  1262. red_resp_time,
  1263. red_resp_handle_time,
  1264. );
  1265. }
  1266. fn print_test_results(perf_stat: PerfStat) {
  1267. println!("Request size = {:?} bytes", perf_stat.req_len);
  1268. println!("Request time = {:?}", perf_stat.req_t);
  1269. println!("Response size = {:?} bytes", perf_stat.resp_len);
  1270. println!("Response time = {:?}", perf_stat.resp_t);
  1271. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1272. }
  1273. fn print_time_test_results(perf_stat: PerfStat) {
  1274. println!("Request time = {:?}", perf_stat.req_t);
  1275. println!("Response time = {:?}", perf_stat.resp_t);
  1276. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1277. }
  1278. fn print_stats_test_results(
  1279. req_size: Vec<f64>,
  1280. req_time: Vec<f64>,
  1281. resp_size: Vec<f64>,
  1282. resp_time: Vec<f64>,
  1283. resp_handle_time: Vec<f64>,
  1284. ) {
  1285. let mean_req_size = mean(&req_size);
  1286. let req_std_dev = standard_deviation(&req_size, Some(mean_req_size));
  1287. let mean_req_time = mean(&req_time);
  1288. let req_time_std_dev = standard_deviation(&req_time, Some(mean_req_time));
  1289. let mean_resp_size = mean(&resp_size);
  1290. let resp_std_dev = standard_deviation(&resp_size, Some(mean_resp_size));
  1291. let mean_resp_time = mean(&resp_time);
  1292. let resp_time_std_dev = standard_deviation(&resp_time, Some(mean_resp_time));
  1293. let mean_resp_handle_time = mean(&resp_handle_time);
  1294. let resp_handle_time_std_dev =
  1295. standard_deviation(&resp_handle_time, Some(mean_resp_handle_time));
  1296. println!("Average request size = {} bytes", mean_req_size);
  1297. println!("Request size standard deviation = {} bytes", req_std_dev);
  1298. println!(
  1299. "Average request time = {:?}",
  1300. Duration::from_secs_f64(mean_req_time)
  1301. );
  1302. println!(
  1303. "Request time standard deviation = {:?}",
  1304. Duration::from_secs_f64(req_time_std_dev)
  1305. );
  1306. println!("Average response size = {} bytes", mean_resp_size);
  1307. println!("Response standard deviation = {} bytes", resp_std_dev);
  1308. println!(
  1309. "Average response time = {:?}",
  1310. Duration::from_secs_f64(mean_resp_time)
  1311. );
  1312. println!(
  1313. "Response time standard deviation = {:?}",
  1314. Duration::from_secs_f64(resp_time_std_dev)
  1315. );
  1316. println!(
  1317. "Average response handling time = {:?}",
  1318. Duration::from_secs_f64(mean_resp_handle_time)
  1319. );
  1320. println!(
  1321. "Response handling time standard deviation = {:?}",
  1322. Duration::from_secs_f64(resp_handle_time_std_dev)
  1323. );
  1324. }