tests.rs 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727
  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 chrono::{Utc, DateTime, NaiveTime, Timelike};
  7. use rand::Rng;
  8. use statistical::{mean, standard_deviation};
  9. use std::collections::HashSet;
  10. use std::thread;
  11. use std::time::{Duration, Instant};
  12. #[cfg(feature = "fast")]
  13. const USERS: usize = 100;
  14. #[cfg(not(feature = "fast"))]
  15. const USERS: usize = 10000;
  16. struct PerfStat {
  17. // Report performance metrics for each test
  18. req_len: usize,
  19. resp_len: usize,
  20. req_t: Duration,
  21. resp_t: Duration,
  22. resp_handle_t: Duration,
  23. }
  24. struct TestHarness {
  25. bdb: BridgeDb,
  26. pub ba: BridgeAuth,
  27. }
  28. impl TestHarness {
  29. fn new() -> Self {
  30. TestHarness::new_buckets(5, 5)
  31. }
  32. fn new_buckets(num_buckets: u16, hot_spare: u16) -> Self {
  33. // Create a BridegDb
  34. let mut bdb = BridgeDb::new();
  35. // Create a BridgeAuth
  36. let mut ba = BridgeAuth::new(bdb.pubkey);
  37. // Make 3 x num_buckets open invitation bridges, in sets of 3
  38. for _ in 0..num_buckets {
  39. let bucket = [
  40. BridgeLine::random(),
  41. BridgeLine::random(),
  42. BridgeLine::random(),
  43. ];
  44. ba.add_openinv_bridges(bucket, &mut bdb);
  45. }
  46. // Add hot_spare more hot spare buckets
  47. for _ in 0..hot_spare {
  48. let bucket = [
  49. BridgeLine::random(),
  50. BridgeLine::random(),
  51. BridgeLine::random(),
  52. ];
  53. ba.add_spare_bucket(bucket);
  54. }
  55. // Create the encrypted bridge table
  56. ba.enc_bridge_table();
  57. Self { bdb, ba }
  58. }
  59. fn advance_days(&mut self, days: u16) {
  60. self.ba.advance_days(days);
  61. }
  62. fn open_invite(&mut self) -> (PerfStat, (cred::Lox, bridge_table::BridgeLine)) {
  63. // Issue an open invitation
  64. let inv = self.bdb.invite();
  65. let req_start = Instant::now();
  66. // Use it to get a Lox credential
  67. let (req, state) = open_invite::request(&inv);
  68. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  69. let req_t = req_start.elapsed();
  70. let req_len = encoded.len();
  71. let resp_start = Instant::now();
  72. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  73. let resp = self.ba.handle_open_invite(decoded).unwrap();
  74. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  75. let resp_t = resp_start.elapsed();
  76. let resp_len = encoded_resp.len();
  77. let resp_handle_start = Instant::now();
  78. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  79. let (cred, bridgeline) =
  80. open_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  81. let resp_handle_t = resp_handle_start.elapsed();
  82. (
  83. PerfStat {
  84. req_len,
  85. resp_len,
  86. req_t,
  87. resp_t,
  88. resp_handle_t,
  89. },
  90. (cred, bridgeline),
  91. )
  92. }
  93. fn trust_promotion(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  94. let req_start = Instant::now();
  95. let (promreq, promstate) =
  96. trust_promotion::request(cred, &self.ba.lox_pub, self.ba.today()).unwrap();
  97. let encoded: Vec<u8> = bincode::serialize(&promreq).unwrap();
  98. let req_t = req_start.elapsed();
  99. let req_len = encoded.len();
  100. let resp_start = Instant::now();
  101. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  102. let promresp = self.ba.handle_trust_promotion(decoded).unwrap();
  103. let encoded_resp: Vec<u8> = bincode::serialize(&promresp).unwrap();
  104. let resp_t = resp_start.elapsed();
  105. let resp_len = encoded_resp.len();
  106. let resp_handle_start = Instant::now();
  107. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  108. let migcred = trust_promotion::handle_response(promstate, decode_resp).unwrap();
  109. let resp_handle_t = resp_handle_start.elapsed();
  110. (
  111. PerfStat {
  112. req_len,
  113. resp_len,
  114. req_t,
  115. resp_t,
  116. resp_handle_t,
  117. },
  118. migcred,
  119. )
  120. }
  121. fn level0_migration(
  122. &mut self,
  123. loxcred: &cred::Lox,
  124. migcred: &cred::Migration,
  125. ) -> (PerfStat, cred::Lox) {
  126. let req_start = Instant::now();
  127. let (migreq, migstate) =
  128. migration::request(loxcred, migcred, &self.ba.lox_pub, &self.ba.migration_pub).unwrap();
  129. let encoded: Vec<u8> = bincode::serialize(&migreq).unwrap();
  130. let req_t = req_start.elapsed();
  131. let req_len = encoded.len();
  132. let resp_start = Instant::now();
  133. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  134. let migresp = self.ba.handle_migration(decoded).unwrap();
  135. let encoded_resp: Vec<u8> = bincode::serialize(&migresp).unwrap();
  136. let resp_t = resp_start.elapsed();
  137. let resp_len = encoded_resp.len();
  138. let resp_handle_start = Instant::now();
  139. let decode_resp: migration::Response = bincode::deserialize(&encoded_resp[..]).unwrap();
  140. let cred = migration::handle_response(migstate, decode_resp, &self.ba.lox_pub).unwrap();
  141. let resp_handle_t = resp_handle_start.elapsed();
  142. (
  143. PerfStat {
  144. req_len,
  145. resp_len,
  146. req_t,
  147. resp_t,
  148. resp_handle_t,
  149. },
  150. cred,
  151. )
  152. }
  153. fn level_up(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Lox) {
  154. // Read the bucket in the credential to get today's Bucket
  155. // Reachability credential
  156. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  157. let encbuckets = self.ba.enc_bridge_table();
  158. let bucket =
  159. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  160. let reachcred = bucket.1.unwrap();
  161. // Use the Bucket Reachability credential to advance to the next
  162. // level
  163. let req_start = Instant::now();
  164. let (req, state) = level_up::request(
  165. cred,
  166. &reachcred,
  167. &self.ba.lox_pub,
  168. &self.ba.reachability_pub,
  169. self.ba.today(),
  170. )
  171. .unwrap();
  172. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  173. let req_t = req_start.elapsed();
  174. let req_len = encoded.len();
  175. let resp_start = Instant::now();
  176. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  177. let resp = self.ba.handle_level_up(decoded).unwrap();
  178. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  179. let resp_t = resp_start.elapsed();
  180. let resp_len = encoded_resp.len();
  181. let resp_handle_start = Instant::now();
  182. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  183. let cred = level_up::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  184. let resp_handle_t = resp_handle_start.elapsed();
  185. (
  186. PerfStat {
  187. req_len,
  188. resp_len,
  189. req_t,
  190. resp_t,
  191. resp_handle_t,
  192. },
  193. cred,
  194. )
  195. }
  196. fn issue_invite(&mut self, cred: &cred::Lox) -> (PerfStat, (cred::Lox, cred::Invitation)) {
  197. // Read the bucket in the credential to get today's Bucket
  198. // Reachability credential
  199. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  200. let encbuckets = self.ba.enc_bridge_table();
  201. let bucket =
  202. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  203. let reachcred = bucket.1.unwrap();
  204. let req_start = Instant::now();
  205. let (req, state) = issue_invite::request(
  206. cred,
  207. &reachcred,
  208. &self.ba.lox_pub,
  209. &self.ba.reachability_pub,
  210. self.ba.today(),
  211. )
  212. .unwrap();
  213. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  214. let req_t = req_start.elapsed();
  215. let req_len = encoded.len();
  216. let resp_start = Instant::now();
  217. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  218. let resp = self.ba.handle_issue_invite(decoded).unwrap();
  219. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  220. let resp_t = resp_start.elapsed();
  221. let resp_len = encoded_resp.len();
  222. let resp_handle_start = Instant::now();
  223. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  224. let (cred, invite) = issue_invite::handle_response(
  225. state,
  226. decode_resp,
  227. &self.ba.lox_pub,
  228. &self.ba.invitation_pub,
  229. )
  230. .unwrap();
  231. let resp_handle_t = resp_handle_start.elapsed();
  232. (
  233. PerfStat {
  234. req_len,
  235. resp_len,
  236. req_t,
  237. resp_t,
  238. resp_handle_t,
  239. },
  240. (cred, invite),
  241. )
  242. }
  243. fn redeem_invite(&mut self, inv: &cred::Invitation) -> (PerfStat, cred::Lox) {
  244. let req_start = Instant::now();
  245. let (req, state) =
  246. redeem_invite::request(inv, &self.ba.invitation_pub, self.ba.today()).unwrap();
  247. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  248. let req_t = req_start.elapsed();
  249. let req_len = encoded.len();
  250. let resp_start = Instant::now();
  251. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  252. let resp = self.ba.handle_redeem_invite(decoded).unwrap();
  253. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  254. let resp_t = resp_start.elapsed();
  255. let resp_len = encoded_resp.len();
  256. let resp_handle_start = Instant::now();
  257. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  258. let cred = redeem_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  259. let resp_handle_t = resp_handle_start.elapsed();
  260. (
  261. PerfStat {
  262. req_len,
  263. resp_len,
  264. req_t,
  265. resp_t,
  266. resp_handle_t,
  267. },
  268. cred,
  269. )
  270. }
  271. fn check_blockage(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  272. let req_start = Instant::now();
  273. let (req, state) = check_blockage::request(cred, &self.ba.lox_pub).unwrap();
  274. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  275. let req_t = req_start.elapsed();
  276. let req_len = encoded.len();
  277. let resp_start = Instant::now();
  278. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  279. let resp = self.ba.handle_check_blockage(decoded).unwrap();
  280. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  281. let resp_t = resp_start.elapsed();
  282. let resp_len = encoded_resp.len();
  283. let resp_handle_start = Instant::now();
  284. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  285. let migcred = check_blockage::handle_response(state, decode_resp).unwrap();
  286. let resp_handle_t = resp_handle_start.elapsed();
  287. (
  288. PerfStat {
  289. req_len,
  290. resp_len,
  291. req_t,
  292. resp_t,
  293. resp_handle_t,
  294. },
  295. migcred,
  296. )
  297. }
  298. fn blockage_migration(
  299. &mut self,
  300. cred: &cred::Lox,
  301. mig: &cred::Migration,
  302. ) -> (PerfStat, cred::Lox) {
  303. let req_start = Instant::now();
  304. let (req, state) =
  305. blockage_migration::request(cred, mig, &self.ba.lox_pub, &self.ba.migration_pub)
  306. .unwrap();
  307. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  308. let req_t = req_start.elapsed();
  309. let req_len = encoded.len();
  310. let resp_start = Instant::now();
  311. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  312. let resp = self.ba.handle_blockage_migration(decoded).unwrap();
  313. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  314. let resp_t = resp_start.elapsed();
  315. let resp_len = encoded_resp.len();
  316. let resp_handle_start = Instant::now();
  317. let decode_resp: blockage_migration::Response =
  318. bincode::deserialize(&encoded_resp[..]).unwrap();
  319. let cred =
  320. blockage_migration::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  321. let resp_handle_t = resp_handle_start.elapsed();
  322. (
  323. PerfStat {
  324. req_len,
  325. resp_len,
  326. req_t,
  327. resp_t,
  328. resp_handle_t,
  329. },
  330. cred,
  331. )
  332. }
  333. }
  334. #[test]
  335. fn test_open_invite() {
  336. let mut th = TestHarness::new();
  337. // Join an untrusted user
  338. let (perf_stat, (cred, bridgeline)) = th.open_invite();
  339. // Check that we can use the credential to read a bucket
  340. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  341. let encbuckets = th.ba.enc_bridge_table();
  342. let bucket =
  343. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  344. print_test_results(perf_stat);
  345. println!("cred = {:?}", cred);
  346. println!("bucket = {:?}", bucket);
  347. println!("bridgeline = {:?}", bridgeline);
  348. assert!(bucket.1.is_none());
  349. assert!(th.ba.verify_lox(&cred));
  350. assert!(bridgeline == bucket.0[0]);
  351. }
  352. #[test]
  353. fn test_trust_promotion() {
  354. let mut th = TestHarness::new();
  355. let cred = th.open_invite().1 .0;
  356. assert!(th.ba.verify_lox(&cred));
  357. // Time passes
  358. th.advance_days(47);
  359. let (perf_stat, migcred) = th.trust_promotion(&cred);
  360. assert!(th.ba.verify_migration(&migcred));
  361. // Check that we can use the to_bucket in the Migration credenital
  362. // to read a bucket
  363. let (id, key) = bridge_table::from_scalar(migcred.to_bucket).unwrap();
  364. let encbuckets = th.ba.enc_bridge_table();
  365. let bucket =
  366. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  367. print_test_results(perf_stat);
  368. println!("bucket = {:?}", bucket);
  369. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  370. }
  371. #[test]
  372. fn test_level0_migration() {
  373. let mut th = TestHarness::new();
  374. let cred = th.open_invite().1 .0;
  375. assert!(th.ba.verify_lox(&cred));
  376. // Time passes
  377. th.advance_days(47);
  378. let (perf_stat, migcred) = th.trust_promotion(&cred);
  379. assert!(th.ba.verify_migration(&migcred));
  380. println!("--Trust Promotion to 1--\n");
  381. print_test_results(perf_stat);
  382. let (mperf_stat, newloxcred) = th.level0_migration(&cred, &migcred);
  383. println!("--Level 0 migration--\n");
  384. print_test_results(mperf_stat);
  385. assert!(th.ba.verify_lox(&newloxcred));
  386. println!("newloxcred = {:?}", newloxcred);
  387. // Check that we can use the credenital to read a bucket
  388. let (id, key) = bridge_table::from_scalar(newloxcred.bucket).unwrap();
  389. let encbuckets = th.ba.enc_bridge_table();
  390. let bucket =
  391. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  392. println!("bucket = {:?}", bucket);
  393. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  394. }
  395. #[test]
  396. fn test_level_up() {
  397. let mut th = TestHarness::new();
  398. // Join an untrusted user
  399. let cred = th.open_invite().1 .0;
  400. // Time passes
  401. th.advance_days(47);
  402. // Go up to level 1
  403. let (perf_stat, migcred) = th.trust_promotion(&cred);
  404. println!("--Trust Promotion to 1--\n");
  405. print_test_results(perf_stat);
  406. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  407. println!("--New Level 1 Credential--\n");
  408. print_test_results(mperf_stat);
  409. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  410. // Time passes
  411. th.advance_days(20);
  412. let (two_perf_stat, cred2) = th.level_up(&cred1);
  413. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  414. println!("--Upgrade to Level 2--\n");
  415. print_test_results(two_perf_stat);
  416. println!("cred2 = {:?}", cred2);
  417. assert!(th.ba.verify_lox(&cred2));
  418. // Time passes
  419. th.advance_days(30);
  420. let (three_perf_stat, cred3) = th.level_up(&cred2);
  421. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  422. println!("--Upgrade to Level 3--\n");
  423. print_test_results(three_perf_stat);
  424. println!("cred3 = {:?}", cred3);
  425. assert!(th.ba.verify_lox(&cred3));
  426. // Time passes
  427. th.advance_days(60);
  428. let (four_perf_stat, cred4) = th.level_up(&cred3);
  429. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  430. println!("--Upgrade to Level 4--\n");
  431. print_test_results(four_perf_stat);
  432. println!("cred4 = {:?}", cred4);
  433. assert!(th.ba.verify_lox(&cred4));
  434. }
  435. #[test]
  436. fn test_issue_invite() {
  437. let mut th = TestHarness::new();
  438. // Join an untrusted user
  439. let cred = th.open_invite().1 .0;
  440. // Time passes
  441. th.advance_days(47);
  442. // Go up to level 1
  443. let (perf_stat, migcred) = th.trust_promotion(&cred);
  444. println!("--Trust Promotion to 1--\n");
  445. print_test_results(perf_stat);
  446. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  447. println!("--New Level 1 Credential--\n");
  448. print_test_results(mperf_stat);
  449. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  450. // Time passes
  451. th.advance_days(20);
  452. // Go up to level 2
  453. let (two_perf_stat, cred2) = th.level_up(&cred1);
  454. println!("--Upgrade to Level 2--\n");
  455. print_test_results(two_perf_stat);
  456. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  457. println!("cred2 = {:?}", cred2);
  458. assert!(th.ba.verify_lox(&cred2));
  459. // Issue an invitation
  460. let (invite_perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  461. println!("--Issue Invitation--\n");
  462. print_test_results(invite_perf_stat);
  463. assert!(th.ba.verify_lox(&cred2a));
  464. assert!(th.ba.verify_invitation(&invite));
  465. println!("cred2a = {:?}", cred2a);
  466. println!("invite = {:?}", invite);
  467. }
  468. #[test]
  469. fn test_redeem_invite() {
  470. let mut th = TestHarness::new();
  471. // Join an untrusted user
  472. let cred = th.open_invite().1 .0;
  473. // Time passes
  474. th.advance_days(47);
  475. // Go up to level 1
  476. let (perf_stat, migcred) = th.trust_promotion(&cred);
  477. println!("--Trust Promotion to 1--\n");
  478. print_test_results(perf_stat);
  479. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  480. println!("--New Level 1 Credential--\n");
  481. print_test_results(mperf_stat);
  482. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  483. // Time passes
  484. th.advance_days(20);
  485. // Go up to level 2
  486. let (two_perf_stat, cred2) = th.level_up(&cred1);
  487. println!("--Upgrade to Level 2--\n");
  488. print_test_results(two_perf_stat);
  489. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  490. println!("cred2 = {:?}", cred2);
  491. assert!(th.ba.verify_lox(&cred2));
  492. // Issue an invitation to Bob
  493. let (invite_perf_stat, (cred2a, bob_invite)) = th.issue_invite(&cred2);
  494. println!("--Issue Invitation--\n");
  495. print_test_results(invite_perf_stat);
  496. assert!(th.ba.verify_lox(&cred2a));
  497. assert!(th.ba.verify_invitation(&bob_invite));
  498. println!("cred2a = {:?}", cred2a);
  499. println!("bob_invite = {:?}", bob_invite);
  500. // Time passes
  501. th.advance_days(12);
  502. // Bob joins the system
  503. let (bob_perf_stat, bob_cred) = th.redeem_invite(&bob_invite);
  504. println!("--Bob joins the system--\n");
  505. print_test_results(bob_perf_stat);
  506. assert!(th.ba.verify_lox(&bob_cred));
  507. println!("bob_cred = {:?}", bob_cred);
  508. }
  509. #[test]
  510. fn test_mark_unreachable() {
  511. let mut th = TestHarness::new();
  512. println!("spares = {:?}", th.ba.bridge_table.spares);
  513. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  514. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  515. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  516. // Mark a bridge in an untrusted bucket as unreachable
  517. let b6 = th.ba.bridge_table.buckets[6][0];
  518. th.ba.bridge_unreachable(&b6, &mut th.bdb);
  519. println!("spares = {:?}", th.ba.bridge_table.spares);
  520. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  521. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  522. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  523. // Mark another bridge grouped to the same trusted bucket as
  524. // unreachable
  525. let b7 = th.ba.bridge_table.buckets[7][0];
  526. th.ba.bridge_unreachable(&b7, &mut th.bdb);
  527. println!("spares = {:?}", th.ba.bridge_table.spares);
  528. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  529. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  530. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  531. // That will have introduced a blockage migration. Get the target
  532. let target: u32 = *th
  533. .ba
  534. .blockage_migration_table
  535. .table
  536. .iter()
  537. .next()
  538. .unwrap()
  539. .1;
  540. // Block two of the bridges in that target bucket
  541. let bt1 = th.ba.bridge_table.buckets[target as usize][1];
  542. let bt2 = th.ba.bridge_table.buckets[target as usize][2];
  543. th.ba.bridge_unreachable(&bt1, &mut th.bdb);
  544. th.ba.bridge_unreachable(&bt2, &mut th.bdb);
  545. println!("spares = {:?}", th.ba.bridge_table.spares);
  546. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  547. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  548. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  549. }
  550. #[test]
  551. fn test_blockage_migration() {
  552. let mut th = TestHarness::new();
  553. // Join an untrusted user
  554. let cred = th.open_invite().1 .0;
  555. // Time passes
  556. th.advance_days(47);
  557. // Go up to level 1
  558. let (_mperf_stat, migcred) = th.trust_promotion(&cred);
  559. let (_perf_stat, cred1) = th.level0_migration(&cred, &migcred);
  560. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  561. // Time passes
  562. th.advance_days(20);
  563. // Go up to level 2
  564. let (_two_perf_stat, cred2) = th.level_up(&cred1);
  565. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  566. println!("cred2 = {:?}", cred2);
  567. assert!(th.ba.verify_lox(&cred2));
  568. // Time passes
  569. th.advance_days(29);
  570. // Go up to level 3
  571. let (_three_perf_stat, cred3) = th.level_up(&cred2);
  572. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  573. println!("cred3 = {:?}", cred3);
  574. assert!(th.ba.verify_lox(&cred3));
  575. // Get our bridges
  576. let (id, key) = bridge_table::from_scalar(cred3.bucket).unwrap();
  577. let encbuckets = th.ba.enc_bridge_table();
  578. let bucket =
  579. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  580. // We should have a Bridge Reachability credential
  581. assert!(bucket.1.is_some());
  582. // Oh, no! Two of our bridges are blocked!
  583. th.ba.bridge_unreachable(&bucket.0[0], &mut th.bdb);
  584. th.ba.bridge_unreachable(&bucket.0[2], &mut th.bdb);
  585. println!("spares = {:?}", th.ba.bridge_table.spares);
  586. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  587. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  588. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  589. // Time passes
  590. th.advance_days(1);
  591. let encbuckets2 = th.ba.enc_bridge_table();
  592. let bucket2 =
  593. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets2[id as usize]).unwrap();
  594. // We should no longer have a Bridge Reachability credential
  595. assert!(bucket2.1.is_none());
  596. // See about getting a Migration credential for the blockage
  597. let (_block_perf_stat, migration) = th.check_blockage(&cred3);
  598. println!("migration = {:?}", migration);
  599. // Migrate
  600. let (_four_perf_stat, cred4) = th.blockage_migration(&cred3, &migration);
  601. println!("cred4 = {:?}", cred4);
  602. assert!(th.ba.verify_lox(&cred4));
  603. }
  604. #[test]
  605. fn stats_test_trust_levels() {
  606. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  607. for x in buckets {
  608. let mut th = TestHarness::new_buckets(x, x);
  609. let mut promo_req_size: Vec<f64> = Vec::new();
  610. let mut promo_resp_size: Vec<f64> = Vec::new();
  611. let mut promo_req_time: Vec<f64> = Vec::new();
  612. let mut promo_resp_time: Vec<f64> = Vec::new();
  613. let mut promo_resp_handle_time: Vec<f64> = Vec::new();
  614. let mut mig_req_size: Vec<f64> = Vec::new();
  615. let mut mig_resp_size: Vec<f64> = Vec::new();
  616. let mut mig_req_time: Vec<f64> = Vec::new();
  617. let mut mig_resp_time: Vec<f64> = Vec::new();
  618. let mut mig_resp_handle_time: Vec<f64> = Vec::new();
  619. let mut sec_req_size: Vec<f64> = Vec::new();
  620. let mut sec_resp_size: Vec<f64> = Vec::new();
  621. let mut sec_req_time: Vec<f64> = Vec::new();
  622. let mut sec_resp_time: Vec<f64> = Vec::new();
  623. let mut sec_resp_handle_time: Vec<f64> = Vec::new();
  624. let mut three_req_size: Vec<f64> = Vec::new();
  625. let mut three_resp_size: Vec<f64> = Vec::new();
  626. let mut three_req_time: Vec<f64> = Vec::new();
  627. let mut three_resp_time: Vec<f64> = Vec::new();
  628. let mut three_resp_handle_time: Vec<f64> = Vec::new();
  629. let mut four_req_size: Vec<f64> = Vec::new();
  630. let mut four_resp_size: Vec<f64> = Vec::new();
  631. let mut four_req_time: Vec<f64> = Vec::new();
  632. let mut four_resp_time: Vec<f64> = Vec::new();
  633. let mut four_resp_handle_time: Vec<f64> = Vec::new();
  634. let mut open_req_size: Vec<f64> = Vec::new();
  635. let mut open_resp_size: Vec<f64> = Vec::new();
  636. let mut open_req_time: Vec<f64> = Vec::new();
  637. let mut open_resp_time: Vec<f64> = Vec::new();
  638. let mut open_resp_handle_time: Vec<f64> = Vec::new();
  639. for _ in 0..USERS {
  640. let h: NaiveTime = DateTime::time(&Utc::now());
  641. if h.hour() == 23 && h.minute() == 59 {
  642. println!("Wait for UTC 00:00");
  643. thread::sleep(Duration::new(60,0));
  644. println!("Ready to work again");
  645. }
  646. let (open_perf_stat, cred) = th.open_invite();
  647. th.advance_days(30);
  648. let (tp_perf_stat, migcred) = th.trust_promotion(&cred.0);
  649. let (mig_perf_stat, cred1) = th.level0_migration(&cred.0, &migcred);
  650. th.advance_days(14);
  651. let (sec_perf_stat, cred2) = th.level_up(&cred1);
  652. th.advance_days(28);
  653. let (three_perf_stat, cred3) = th.level_up(&cred2);
  654. th.advance_days(56);
  655. let (four_perf_stat, _) = th.level_up(&cred3);
  656. open_req_size.push(open_perf_stat.req_len as f64);
  657. open_req_time.push(open_perf_stat.req_t.as_secs_f64());
  658. open_resp_size.push(open_perf_stat.resp_len as f64);
  659. open_resp_time.push(open_perf_stat.resp_t.as_secs_f64());
  660. open_resp_handle_time.push(open_perf_stat.resp_handle_t.as_secs_f64());
  661. promo_req_size.push(tp_perf_stat.req_len as f64);
  662. promo_req_time.push(tp_perf_stat.req_t.as_secs_f64());
  663. promo_resp_size.push(tp_perf_stat.resp_len as f64);
  664. promo_resp_time.push(tp_perf_stat.resp_t.as_secs_f64());
  665. promo_resp_handle_time.push(tp_perf_stat.resp_handle_t.as_secs_f64());
  666. mig_req_size.push(mig_perf_stat.req_len as f64);
  667. mig_req_time.push(mig_perf_stat.req_t.as_secs_f64());
  668. mig_resp_size.push(mig_perf_stat.resp_len as f64);
  669. mig_resp_time.push(mig_perf_stat.resp_t.as_secs_f64());
  670. mig_resp_handle_time.push(mig_perf_stat.resp_handle_t.as_secs_f64());
  671. sec_req_size.push(sec_perf_stat.req_len as f64);
  672. sec_req_time.push(sec_perf_stat.req_t.as_secs_f64());
  673. sec_resp_size.push(sec_perf_stat.resp_len as f64);
  674. sec_resp_time.push(sec_perf_stat.resp_t.as_secs_f64());
  675. sec_resp_handle_time.push(sec_perf_stat.resp_handle_t.as_secs_f64());
  676. three_req_size.push(three_perf_stat.req_len as f64);
  677. three_req_time.push(three_perf_stat.req_t.as_secs_f64());
  678. three_resp_size.push(three_perf_stat.resp_len as f64);
  679. three_resp_time.push(three_perf_stat.resp_t.as_secs_f64());
  680. three_resp_handle_time.push(three_perf_stat.resp_handle_t.as_secs_f64());
  681. four_req_size.push(four_perf_stat.req_len as f64);
  682. four_req_time.push(four_perf_stat.req_t.as_secs_f64());
  683. four_resp_size.push(four_perf_stat.resp_len as f64);
  684. four_resp_time.push(four_perf_stat.resp_t.as_secs_f64());
  685. four_resp_handle_time.push(four_perf_stat.resp_handle_t.as_secs_f64());
  686. }
  687. println!("\n***START: {}*3*2 BUCKETS LEVELS***\n", x);
  688. println!("\n----OPEN-INVITATION-{}---\n", x);
  689. print_stats_test_results(
  690. open_req_size,
  691. open_req_time,
  692. open_resp_size,
  693. open_resp_time,
  694. open_resp_handle_time,
  695. );
  696. println!("\n----TRUST-PROMOTION-1: 30 days-{}---\n", x);
  697. print_stats_test_results(
  698. promo_req_size,
  699. promo_req_time,
  700. promo_resp_size,
  701. promo_resp_time,
  702. promo_resp_handle_time,
  703. );
  704. println!("\n----TRUST-MIGRATION-0: 30 days-{}---\n", x);
  705. print_stats_test_results(
  706. mig_req_size,
  707. mig_req_time,
  708. mig_resp_size,
  709. mig_resp_time,
  710. mig_resp_handle_time,
  711. );
  712. println!("\n----LEVEL-UP-2: 44 days-{}---\n", x);
  713. print_stats_test_results(
  714. sec_req_size,
  715. sec_req_time,
  716. sec_resp_size,
  717. sec_resp_time,
  718. sec_resp_handle_time,
  719. );
  720. println!("\n----LEVEL-UP-3: 72 days---{}---\n", x);
  721. print_stats_test_results(
  722. three_req_size,
  723. three_req_time,
  724. three_resp_size,
  725. three_resp_time,
  726. three_resp_handle_time,
  727. );
  728. println!("\n----LEVEL-UP-4: 128 days---{}---\n", x);
  729. print_stats_test_results(
  730. four_req_size,
  731. four_req_time,
  732. four_resp_size,
  733. four_resp_time,
  734. four_resp_handle_time,
  735. );
  736. }
  737. }
  738. #[test]
  739. fn stats_test_invitations() {
  740. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  741. for x in buckets {
  742. let mut th = TestHarness::new_buckets(x, x);
  743. let mut req_size: Vec<f64> = Vec::new();
  744. let mut resp_size: Vec<f64> = Vec::new();
  745. let mut req_time: Vec<f64> = Vec::new();
  746. let mut resp_time: Vec<f64> = Vec::new();
  747. let mut resp_handle_time: Vec<f64> = Vec::new();
  748. let mut red_req_size: Vec<f64> = Vec::new();
  749. let mut red_resp_size: Vec<f64> = Vec::new();
  750. let mut red_req_time: Vec<f64> = Vec::new();
  751. let mut red_resp_time: Vec<f64> = Vec::new();
  752. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  753. for _ in 0..USERS {
  754. let h: NaiveTime = DateTime::time(&Utc::now());
  755. if h.hour() == 23 && h.minute() == 59 {
  756. println!("Wait for UTC 00:00");
  757. thread::sleep(Duration::new(60,0));
  758. println!("Ready to work again");
  759. }
  760. let cred = th.open_invite().1 .0;
  761. th.advance_days(30);
  762. let (_, migcred) = th.trust_promotion(&cred);
  763. let (_, cred1) = th.level0_migration(&cred, &migcred);
  764. th.advance_days(14);
  765. let (_, cred2) = th.level_up(&cred1);
  766. th.advance_days(28);
  767. let (perf_stat, (_, invite)) = th.issue_invite(&cred2);
  768. let (bob_perf_stat, _) = th.redeem_invite(&invite);
  769. req_size.push(perf_stat.req_len as f64);
  770. req_time.push(perf_stat.req_t.as_secs_f64());
  771. resp_size.push(perf_stat.resp_len as f64);
  772. resp_time.push(perf_stat.resp_t.as_secs_f64());
  773. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  774. red_req_size.push(bob_perf_stat.req_len as f64);
  775. red_req_time.push(bob_perf_stat.req_t.as_secs_f64());
  776. red_resp_size.push(bob_perf_stat.resp_len as f64);
  777. red_resp_time.push(bob_perf_stat.resp_t.as_secs_f64());
  778. red_resp_handle_time.push(bob_perf_stat.resp_handle_t.as_secs_f64());
  779. }
  780. println!("\n***START: {}*3*2 BUCKETS INVITATIONS***\n", x);
  781. println!("\n----ISSUE-INVITATION-{}---\n", x);
  782. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  783. println!("\n----REDEEM-INVITATION-{}---\n", x);
  784. print_stats_test_results(
  785. red_req_size,
  786. red_req_time,
  787. red_resp_size,
  788. red_resp_time,
  789. red_resp_handle_time,
  790. );
  791. }
  792. }
  793. #[test]
  794. fn stats_test_percent_blockage_migration_05() {
  795. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  796. for x in buckets {
  797. let mut th = TestHarness::new_buckets(x, x);
  798. let mut credentials: Vec<cred::Lox> = Vec::new();
  799. for _ in 0..USERS {
  800. let h: NaiveTime = DateTime::time(&Utc::now());
  801. if h.hour() == 23 && h.minute() == 59 {
  802. println!("Wait for UTC 00:00");
  803. thread::sleep(Duration::new(60,0));
  804. println!("Ready to work again");
  805. }
  806. let cred = th.open_invite().1 .0;
  807. th.advance_days(30);
  808. let (_, migcred) = th.trust_promotion(&cred);
  809. let (_, cred1) = th.level0_migration(&cred, &migcred);
  810. th.advance_days(14);
  811. let (_, cred2) = th.level_up(&cred1);
  812. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  813. let (_, bob_cred) = th.redeem_invite(&invite);
  814. th.advance_days(28);
  815. let (_, _) = th.level_up(&bob_cred);
  816. let (_, cred3) = th.level_up(&cred2a);
  817. credentials.push(cred3);
  818. }
  819. println!("\n***START: {}*3*2 BUCKETS 5***\n", x);
  820. block_bridges(&mut th, 5, credentials);
  821. }
  822. }
  823. #[test]
  824. fn stats_test_percent_blockage_migration_010() {
  825. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  826. for x in buckets {
  827. let mut th = TestHarness::new_buckets(x, x);
  828. let mut credentials: Vec<cred::Lox> = Vec::new();
  829. for _ in 0..USERS {
  830. let h: NaiveTime = DateTime::time(&Utc::now());
  831. if h.hour() == 23 && h.minute() == 59 {
  832. println!("Wait for UTC 00:00");
  833. thread::sleep(Duration::new(60,0));
  834. println!("Ready to work again");
  835. }
  836. let cred = th.open_invite().1 .0;
  837. th.advance_days(30);
  838. let (_, migcred) = th.trust_promotion(&cred);
  839. let (_, cred1) = th.level0_migration(&cred, &migcred);
  840. th.advance_days(14);
  841. let (_, cred2) = th.level_up(&cred1);
  842. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  843. let (_, bob_cred) = th.redeem_invite(&invite);
  844. th.advance_days(28);
  845. let (_, _) = th.level_up(&bob_cred);
  846. let (_, cred3) = th.level_up(&cred2a);
  847. credentials.push(cred3);
  848. }
  849. println!("\n***START: {}*3*2 BUCKETS 10***\n", x);
  850. block_bridges(&mut th, 10, credentials);
  851. }
  852. }
  853. #[test]
  854. fn stats_test_percent_blockage_migration_15() {
  855. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  856. for x in buckets {
  857. let mut th = TestHarness::new_buckets(x, x);
  858. let mut credentials: Vec<cred::Lox> = Vec::new();
  859. for _ in 0..USERS {
  860. let h: NaiveTime = DateTime::time(&Utc::now());
  861. if h.hour() == 23 && h.minute() == 59 {
  862. println!("Wait for UTC 00:00");
  863. thread::sleep(Duration::new(60,0));
  864. println!("Ready to work again");
  865. }
  866. let cred = th.open_invite().1 .0;
  867. th.advance_days(30);
  868. let (_, migcred) = th.trust_promotion(&cred);
  869. let (_, cred1) = th.level0_migration(&cred, &migcred);
  870. th.advance_days(14);
  871. let (_, cred2) = th.level_up(&cred1);
  872. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  873. let (_, bob_cred) = th.redeem_invite(&invite);
  874. th.advance_days(28);
  875. let (_, _) = th.level_up(&bob_cred);
  876. let (_, cred3) = th.level_up(&cred2a);
  877. credentials.push(cred3);
  878. }
  879. println!("\n***START: {}*3*2 BUCKETS 15***\n", x);
  880. block_bridges(&mut th, 15, credentials);
  881. }
  882. }
  883. #[test]
  884. fn stats_test_percent_blockage_migration_20() {
  885. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  886. for x in buckets {
  887. let mut th = TestHarness::new_buckets(x, x);
  888. let mut credentials: Vec<cred::Lox> = Vec::new();
  889. for _ in 0..USERS {
  890. let h: NaiveTime = DateTime::time(&Utc::now());
  891. if h.hour() == 23 && h.minute() == 59 {
  892. println!("Wait for UTC 00:00");
  893. thread::sleep(Duration::new(60,0));
  894. println!("Ready to work again");
  895. }
  896. let cred = th.open_invite().1 .0;
  897. th.advance_days(30);
  898. let (_, migcred) = th.trust_promotion(&cred);
  899. let (_, cred1) = th.level0_migration(&cred, &migcred);
  900. th.advance_days(14);
  901. let (_, cred2) = th.level_up(&cred1);
  902. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  903. let (_, bob_cred) = th.redeem_invite(&invite);
  904. th.advance_days(28);
  905. let (_, _) = th.level_up(&bob_cred);
  906. let (_, cred3) = th.level_up(&cred2a);
  907. credentials.push(cred3);
  908. }
  909. println!("\n***START: {}*3*2 BUCKETS 20***\n", x);
  910. block_bridges(&mut th, 20, credentials);
  911. }
  912. }
  913. #[test]
  914. fn stats_test_percent_blockage_migration_25() {
  915. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  916. for x in buckets {
  917. let mut th = TestHarness::new_buckets(x, x);
  918. let mut credentials: Vec<cred::Lox> = Vec::new();
  919. for _ in 0..USERS {
  920. let h: NaiveTime = DateTime::time(&Utc::now());
  921. if h.hour() == 23 && h.minute() == 59 {
  922. println!("Wait for UTC 00:00");
  923. thread::sleep(Duration::new(60,0));
  924. println!("Ready to work again");
  925. }
  926. let cred = th.open_invite().1 .0;
  927. th.advance_days(30);
  928. let (_, migcred) = th.trust_promotion(&cred);
  929. let (_, cred1) = th.level0_migration(&cred, &migcred);
  930. th.advance_days(14);
  931. let (_, cred2) = th.level_up(&cred1);
  932. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  933. let (_, bob_cred) = th.redeem_invite(&invite);
  934. th.advance_days(28);
  935. let (_, _) = th.level_up(&bob_cred);
  936. let (_, cred3) = th.level_up(&cred2a);
  937. credentials.push(cred3);
  938. }
  939. println!("\n***START: {}*3*2 BUCKETS 25***\n", x);
  940. block_bridges(&mut th, 25, credentials);
  941. }
  942. }
  943. #[test]
  944. fn stats_test_percent_blockage_migration_30() {
  945. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  946. for x in buckets {
  947. let mut th = TestHarness::new_buckets(x, x);
  948. let mut credentials: Vec<cred::Lox> = Vec::new();
  949. for _ in 0..USERS {
  950. let h: NaiveTime = DateTime::time(&Utc::now());
  951. if h.hour() == 23 && h.minute() == 59 {
  952. println!("Wait for UTC 00:00");
  953. thread::sleep(Duration::new(60,0));
  954. println!("Ready to work again");
  955. }
  956. let cred = th.open_invite().1 .0;
  957. th.advance_days(30);
  958. let (_, migcred) = th.trust_promotion(&cred);
  959. let (_, cred1) = th.level0_migration(&cred, &migcred);
  960. th.advance_days(14);
  961. let (_, cred2) = th.level_up(&cred1);
  962. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  963. let (_, bob_cred) = th.redeem_invite(&invite);
  964. th.advance_days(28);
  965. let (_, _) = th.level_up(&bob_cred);
  966. let (_, cred3) = th.level_up(&cred2a);
  967. credentials.push(cred3);
  968. }
  969. println!("\n***START: {}*3*2 BUCKETS 30***\n", x);
  970. block_bridges(&mut th, 30, credentials);
  971. }
  972. }
  973. #[test]
  974. fn stats_test_percent_blockage_migration_35() {
  975. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  976. for x in buckets {
  977. let mut th = TestHarness::new_buckets(x, x);
  978. let mut credentials: Vec<cred::Lox> = Vec::new();
  979. for _ in 0..USERS {
  980. let h: NaiveTime = DateTime::time(&Utc::now());
  981. if h.hour() == 23 && h.minute() == 59 {
  982. println!("Wait for UTC 00:00");
  983. thread::sleep(Duration::new(60,0));
  984. println!("Ready to work again");
  985. }
  986. let cred = th.open_invite().1 .0;
  987. th.advance_days(30);
  988. let (_, migcred) = th.trust_promotion(&cred);
  989. let (_, cred1) = th.level0_migration(&cred, &migcred);
  990. th.advance_days(14);
  991. let (_, cred2) = th.level_up(&cred1);
  992. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  993. let (_, bob_cred) = th.redeem_invite(&invite);
  994. th.advance_days(28);
  995. let (_, _) = th.level_up(&bob_cred);
  996. let (_, cred3) = th.level_up(&cred2a);
  997. credentials.push(cred3);
  998. }
  999. println!("\n***START: {}*3*2 BUCKETS 35***\n", x);
  1000. block_bridges(&mut th, 35, credentials);
  1001. }
  1002. }
  1003. #[test]
  1004. fn stats_test_percent_blockage_migration_40() {
  1005. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1006. for x in buckets {
  1007. let mut th = TestHarness::new_buckets(x, x);
  1008. let mut credentials: Vec<cred::Lox> = Vec::new();
  1009. for _ in 0..USERS {
  1010. let h: NaiveTime = DateTime::time(&Utc::now());
  1011. if h.hour() == 23 && h.minute() == 59 {
  1012. println!("Wait for UTC 00:00");
  1013. thread::sleep(Duration::new(60,0));
  1014. println!("Ready to work again");
  1015. }
  1016. let cred = th.open_invite().1 .0;
  1017. th.advance_days(30);
  1018. let (_, migcred) = th.trust_promotion(&cred);
  1019. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1020. th.advance_days(14);
  1021. let (_, cred2) = th.level_up(&cred1);
  1022. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1023. let (_, bob_cred) = th.redeem_invite(&invite);
  1024. th.advance_days(28);
  1025. let (_, _) = th.level_up(&bob_cred);
  1026. let (_, cred3) = th.level_up(&cred2a);
  1027. credentials.push(cred3);
  1028. }
  1029. println!("\n***START: {}*3*2 BUCKETS 40***\n", x);
  1030. block_bridges(&mut th, 40, credentials);
  1031. }
  1032. }
  1033. #[test]
  1034. fn stats_test_percent_blockage_migration_45() {
  1035. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1036. for x in buckets {
  1037. let mut th = TestHarness::new_buckets(x, x);
  1038. let mut credentials: Vec<cred::Lox> = Vec::new();
  1039. for _ in 0..USERS {
  1040. let h: NaiveTime = DateTime::time(&Utc::now());
  1041. if h.hour() == 23 && h.minute() == 59 {
  1042. println!("Wait for UTC 00:00");
  1043. thread::sleep(Duration::new(60,0));
  1044. println!("Ready to work again");
  1045. }
  1046. let cred = th.open_invite().1 .0;
  1047. th.advance_days(30);
  1048. let (_, migcred) = th.trust_promotion(&cred);
  1049. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1050. th.advance_days(14);
  1051. let (_, cred2) = th.level_up(&cred1);
  1052. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1053. let (_, bob_cred) = th.redeem_invite(&invite);
  1054. th.advance_days(28);
  1055. let (_, _) = th.level_up(&bob_cred);
  1056. let (_, cred3) = th.level_up(&cred2a);
  1057. credentials.push(cred3);
  1058. }
  1059. println!("\n***START: {}*3*2 BUCKETS 45***\n", x);
  1060. block_bridges(&mut th, 45, credentials);
  1061. }
  1062. }
  1063. #[test]
  1064. fn stats_test_percent_blockage_migration_50() {
  1065. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1066. for x in buckets {
  1067. let mut th = TestHarness::new_buckets(x, x);
  1068. let mut credentials: Vec<cred::Lox> = Vec::new();
  1069. for _ in 0..USERS {
  1070. let h: NaiveTime = DateTime::time(&Utc::now());
  1071. if h.hour() == 23 && h.minute() == 59 {
  1072. println!("Wait for UTC 00:00");
  1073. thread::sleep(Duration::new(60,0));
  1074. println!("Ready to work again");
  1075. }
  1076. let cred = th.open_invite().1 .0;
  1077. th.advance_days(30);
  1078. let (_, migcred) = th.trust_promotion(&cred);
  1079. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1080. th.advance_days(14);
  1081. let (_, cred2) = th.level_up(&cred1);
  1082. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1083. let (_, bob_cred) = th.redeem_invite(&invite);
  1084. th.advance_days(28);
  1085. let (_, _) = th.level_up(&bob_cred);
  1086. let (_, cred3) = th.level_up(&cred2a);
  1087. credentials.push(cred3);
  1088. }
  1089. println!("\n***START: {}*3*2 BUCKETS 50***\n", x);
  1090. block_bridges(&mut th, 50, credentials);
  1091. }
  1092. }
  1093. #[test]
  1094. fn stats_test_percent_blockage_migration_55() {
  1095. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1096. for x in buckets {
  1097. let mut th = TestHarness::new_buckets(x, x);
  1098. let mut credentials: Vec<cred::Lox> = Vec::new();
  1099. for _ in 0..USERS {
  1100. let h: NaiveTime = DateTime::time(&Utc::now());
  1101. if h.hour() == 23 && h.minute() == 59 {
  1102. println!("Wait for UTC 00:00");
  1103. thread::sleep(Duration::new(60,0));
  1104. println!("Ready to work again");
  1105. }
  1106. let cred = th.open_invite().1 .0;
  1107. th.advance_days(30);
  1108. let (_, migcred) = th.trust_promotion(&cred);
  1109. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1110. th.advance_days(14);
  1111. let (_, cred2) = th.level_up(&cred1);
  1112. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1113. let (_, bob_cred) = th.redeem_invite(&invite);
  1114. th.advance_days(28);
  1115. let (_, _) = th.level_up(&bob_cred);
  1116. let (_, cred3) = th.level_up(&cred2a);
  1117. credentials.push(cred3);
  1118. }
  1119. println!("\n***START: {}*3*2 BUCKETS 55***\n", x);
  1120. block_bridges(&mut th, 55, credentials);
  1121. }
  1122. }
  1123. #[test]
  1124. fn stats_test_percent_blockage_migration_60() {
  1125. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1126. for x in buckets {
  1127. let mut th = TestHarness::new_buckets(x, x);
  1128. let mut credentials: Vec<cred::Lox> = Vec::new();
  1129. for _ in 0..USERS {
  1130. let h: NaiveTime = DateTime::time(&Utc::now());
  1131. if h.hour() == 23 && h.minute() == 59 {
  1132. println!("Wait for UTC 00:00");
  1133. thread::sleep(Duration::new(60,0));
  1134. println!("Ready to work again");
  1135. }
  1136. let cred = th.open_invite().1 .0;
  1137. th.advance_days(30);
  1138. let (_, migcred) = th.trust_promotion(&cred);
  1139. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1140. th.advance_days(14);
  1141. let (_, cred2) = th.level_up(&cred1);
  1142. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1143. let (_, bob_cred) = th.redeem_invite(&invite);
  1144. th.advance_days(28);
  1145. let (_, _) = th.level_up(&bob_cred);
  1146. let (_, cred3) = th.level_up(&cred2a);
  1147. credentials.push(cred3);
  1148. }
  1149. println!("\n***START: {}*3*2 BUCKETS 60***\n", x);
  1150. block_bridges(&mut th, 60, credentials);
  1151. }
  1152. }
  1153. #[test]
  1154. fn stats_test_percent_blockage_migration_65() {
  1155. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1156. for x in buckets {
  1157. let mut th = TestHarness::new_buckets(x, x);
  1158. let mut credentials: Vec<cred::Lox> = Vec::new();
  1159. for _ in 0..USERS {
  1160. let h: NaiveTime = DateTime::time(&Utc::now());
  1161. if h.hour() == 23 && h.minute() == 59 {
  1162. println!("Wait for UTC 00:00");
  1163. thread::sleep(Duration::new(60,0));
  1164. println!("Ready to work again");
  1165. }
  1166. let cred = th.open_invite().1 .0;
  1167. th.advance_days(30);
  1168. let (_, migcred) = th.trust_promotion(&cred);
  1169. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1170. th.advance_days(14);
  1171. let (_, cred2) = th.level_up(&cred1);
  1172. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1173. let (_, bob_cred) = th.redeem_invite(&invite);
  1174. th.advance_days(28);
  1175. let (_, _) = th.level_up(&bob_cred);
  1176. let (_, cred3) = th.level_up(&cred2a);
  1177. credentials.push(cred3);
  1178. }
  1179. println!("\n***START: {}*3*2 BUCKETS 65***\n", x);
  1180. block_bridges(&mut th, 65, credentials);
  1181. }
  1182. }
  1183. #[test]
  1184. fn stats_test_percent_blockage_migration_70() {
  1185. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1186. for x in buckets {
  1187. let mut th = TestHarness::new_buckets(x, x);
  1188. let mut credentials: Vec<cred::Lox> = Vec::new();
  1189. for _ in 0..USERS {
  1190. let h: NaiveTime = DateTime::time(&Utc::now());
  1191. if h.hour() == 23 && h.minute() == 59 {
  1192. println!("Wait for UTC 00:00");
  1193. thread::sleep(Duration::new(60,0));
  1194. println!("Ready to work again");
  1195. }
  1196. let cred = th.open_invite().1 .0;
  1197. th.advance_days(30);
  1198. let (_, migcred) = th.trust_promotion(&cred);
  1199. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1200. th.advance_days(14);
  1201. let (_, cred2) = th.level_up(&cred1);
  1202. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1203. let (_, bob_cred) = th.redeem_invite(&invite);
  1204. th.advance_days(28);
  1205. let (_, _) = th.level_up(&bob_cred);
  1206. let (_, cred3) = th.level_up(&cred2a);
  1207. credentials.push(cred3);
  1208. }
  1209. println!("\n***START: {}*3*2 BUCKETS 70***\n", x);
  1210. block_bridges(&mut th, 70, credentials);
  1211. }
  1212. }
  1213. #[test]
  1214. fn stats_test_percent_blockage_migration_75() {
  1215. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1216. for x in buckets {
  1217. let mut th = TestHarness::new_buckets(x, x);
  1218. let mut credentials: Vec<cred::Lox> = Vec::new();
  1219. for _ in 0..USERS {
  1220. let h: NaiveTime = DateTime::time(&Utc::now());
  1221. if h.hour() == 23 && h.minute() == 59 {
  1222. println!("Wait for UTC 00:00");
  1223. thread::sleep(Duration::new(60,0));
  1224. println!("Ready to work again");
  1225. }
  1226. let cred = th.open_invite().1 .0;
  1227. th.advance_days(30);
  1228. let (_, migcred) = th.trust_promotion(&cred);
  1229. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1230. th.advance_days(14);
  1231. let (_, cred2) = th.level_up(&cred1);
  1232. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1233. let (_, bob_cred) = th.redeem_invite(&invite);
  1234. th.advance_days(28);
  1235. let (_, _) = th.level_up(&bob_cred);
  1236. let (_, cred3) = th.level_up(&cred2a);
  1237. credentials.push(cred3);
  1238. }
  1239. println!("\n***START: {}*3*2 BUCKETS 75***\n", x);
  1240. block_bridges(&mut th, 75, credentials);
  1241. }
  1242. }
  1243. #[test]
  1244. fn stats_test_percent_blockage_migration_80() {
  1245. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1246. for x in buckets {
  1247. let mut th = TestHarness::new_buckets(x, x);
  1248. let mut credentials: Vec<cred::Lox> = Vec::new();
  1249. for _ in 0..USERS {
  1250. let h: NaiveTime = DateTime::time(&Utc::now());
  1251. if h.hour() == 23 && h.minute() == 59 {
  1252. println!("Wait for UTC 00:00");
  1253. thread::sleep(Duration::new(60,0));
  1254. println!("Ready to work again");
  1255. }
  1256. let cred = th.open_invite().1 .0;
  1257. th.advance_days(30);
  1258. let (_, migcred) = th.trust_promotion(&cred);
  1259. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1260. th.advance_days(14);
  1261. let (_, cred2) = th.level_up(&cred1);
  1262. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1263. let (_, bob_cred) = th.redeem_invite(&invite);
  1264. th.advance_days(28);
  1265. let (_, _) = th.level_up(&bob_cred);
  1266. let (_, cred3) = th.level_up(&cred2a);
  1267. credentials.push(cred3);
  1268. }
  1269. println!("\n***START: {}*3*2 BUCKETS 80***\n", x);
  1270. block_bridges(&mut th, 80, credentials);
  1271. }
  1272. }
  1273. #[test]
  1274. fn stats_test_percent_blockage_migration_85() {
  1275. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1276. for x in buckets {
  1277. let mut th = TestHarness::new_buckets(x, x);
  1278. let mut credentials: Vec<cred::Lox> = Vec::new();
  1279. for _ in 0..USERS {
  1280. let h: NaiveTime = DateTime::time(&Utc::now());
  1281. if h.hour() == 23 && h.minute() == 59 {
  1282. println!("Wait for UTC 00:00");
  1283. thread::sleep(Duration::new(60,0));
  1284. println!("Ready to work again");
  1285. }
  1286. let cred = th.open_invite().1 .0;
  1287. th.advance_days(30);
  1288. let (_, migcred) = th.trust_promotion(&cred);
  1289. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1290. th.advance_days(14);
  1291. let (_, cred2) = th.level_up(&cred1);
  1292. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1293. let (_, bob_cred) = th.redeem_invite(&invite);
  1294. th.advance_days(28);
  1295. let (_, _) = th.level_up(&bob_cred);
  1296. let (_, cred3) = th.level_up(&cred2a);
  1297. credentials.push(cred3);
  1298. }
  1299. println!("\n***START: {}*3*2 BUCKETS 85***\n", x);
  1300. block_bridges(&mut th, 85, credentials);
  1301. }
  1302. }
  1303. #[test]
  1304. fn stats_test_percent_blockage_migration_90() {
  1305. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1306. for x in buckets {
  1307. let mut th = TestHarness::new_buckets(x, x);
  1308. let mut credentials: Vec<cred::Lox> = Vec::new();
  1309. for _ in 0..USERS {
  1310. let h: NaiveTime = DateTime::time(&Utc::now());
  1311. if h.hour() == 23 && h.minute() == 59 {
  1312. println!("Wait for UTC 00:00");
  1313. thread::sleep(Duration::new(60,0));
  1314. println!("Ready to work again");
  1315. }
  1316. let cred = th.open_invite().1 .0;
  1317. th.advance_days(30);
  1318. let (_, migcred) = th.trust_promotion(&cred);
  1319. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1320. th.advance_days(14);
  1321. let (_, cred2) = th.level_up(&cred1);
  1322. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1323. let (_, bob_cred) = th.redeem_invite(&invite);
  1324. th.advance_days(28);
  1325. let (_, _) = th.level_up(&bob_cred);
  1326. let (_, cred3) = th.level_up(&cred2a);
  1327. credentials.push(cred3);
  1328. }
  1329. println!("\n***START: {}*3*2 BUCKETS 90***\n", x);
  1330. block_bridges(&mut th, 90, credentials);
  1331. }
  1332. }
  1333. #[test]
  1334. fn stats_test_percent_blockage_migration_95() {
  1335. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1336. for x in buckets {
  1337. let mut th = TestHarness::new_buckets(x, x);
  1338. let mut credentials: Vec<cred::Lox> = Vec::new();
  1339. for _ in 0..USERS {
  1340. let h: NaiveTime = DateTime::time(&Utc::now());
  1341. if h.hour() == 23 && h.minute() == 59 {
  1342. println!("Wait for UTC 00:00");
  1343. thread::sleep(Duration::new(60,0));
  1344. println!("Ready to work again");
  1345. }
  1346. let cred = th.open_invite().1 .0;
  1347. th.advance_days(30);
  1348. let (_, migcred) = th.trust_promotion(&cred);
  1349. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1350. th.advance_days(14);
  1351. let (_, cred2) = th.level_up(&cred1);
  1352. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1353. let (_, bob_cred) = th.redeem_invite(&invite);
  1354. th.advance_days(28);
  1355. let (_, _) = th.level_up(&bob_cred);
  1356. let (_, cred3) = th.level_up(&cred2a);
  1357. credentials.push(cred3);
  1358. }
  1359. println!("\n***START: {}*3*2 BUCKETS 95***\n", x);
  1360. block_bridges(&mut th, 95, credentials);
  1361. }
  1362. }
  1363. #[test]
  1364. fn stats_test_percent_blockage_migration_100() {
  1365. let buckets: Vec<u16> = vec![150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500];
  1366. for x in buckets {
  1367. let mut th = TestHarness::new_buckets(x, x);
  1368. let mut credentials: Vec<cred::Lox> = Vec::new();
  1369. for _ in 0..USERS {
  1370. let h: NaiveTime = DateTime::time(&Utc::now());
  1371. if h.hour() == 23 && h.minute() == 59 {
  1372. println!("Wait for UTC 00:00");
  1373. thread::sleep(Duration::new(60,0));
  1374. println!("Ready to work again");
  1375. }
  1376. let cred = th.open_invite().1 .0;
  1377. th.advance_days(30);
  1378. let (_, migcred) = th.trust_promotion(&cred);
  1379. let (_, cred1) = th.level0_migration(&cred, &migcred);
  1380. th.advance_days(14);
  1381. let (_, cred2) = th.level_up(&cred1);
  1382. let (_, (cred2a, invite)) = th.issue_invite(&cred2);
  1383. let (_, bob_cred) = th.redeem_invite(&invite);
  1384. th.advance_days(28);
  1385. let (_, _) = th.level_up(&bob_cred);
  1386. let (_, cred3) = th.level_up(&cred2a);
  1387. credentials.push(cred3);
  1388. }
  1389. println!("\n***START: {}*3*2 BUCKETS 100***\n", x);
  1390. block_bridges(&mut th, 100, credentials);
  1391. }
  1392. }
  1393. /// Blocks a percentage of the bridges for the passed Test Harness
  1394. /// excluding the hot spare buckets as they will not have been handed out.
  1395. /// The logic assumes hot spare buckets are appended to the end of the bridge_table
  1396. /// bucket list.
  1397. fn block_bridges(th: &mut TestHarness, percentage: usize, credentials: Vec<cred::Lox>) {
  1398. let blockable_num = th.ba.bridge_table.buckets.len()
  1399. - th.ba.bridge_table.spares.len()
  1400. - th.bdb.openinv_buckets.len();
  1401. let blockable_range = th.ba.bridge_table.buckets.len() - th.ba.bridge_table.spares.len();
  1402. let to_block: usize = blockable_num * percentage / 100;
  1403. let mut block_index: HashSet<usize> = HashSet::new();
  1404. let mut rng = rand::thread_rng();
  1405. while block_index.len() < to_block {
  1406. let rand_num = rng.gen_range(0, blockable_range);
  1407. if !th.bdb.openinv_buckets.contains(&(rand_num as u32)) {
  1408. block_index.insert(rand_num);
  1409. }
  1410. }
  1411. for index in block_index {
  1412. let b0 = th.ba.bridge_table.buckets[index][0];
  1413. let b1 = th.ba.bridge_table.buckets[index][1];
  1414. let b2 = th.ba.bridge_table.buckets[index][2];
  1415. th.ba.bridge_unreachable(&b0, &mut th.bdb);
  1416. th.ba.bridge_unreachable(&b1, &mut th.bdb);
  1417. th.ba.bridge_unreachable(&b2, &mut th.bdb);
  1418. }
  1419. let mut req_size: Vec<f64> = Vec::new();
  1420. let mut resp_size: Vec<f64> = Vec::new();
  1421. let mut req_time: Vec<f64> = Vec::new();
  1422. let mut resp_time: Vec<f64> = Vec::new();
  1423. let mut resp_handle_time: Vec<f64> = Vec::new();
  1424. let mut red_req_size: Vec<f64> = Vec::new();
  1425. let mut red_resp_size: Vec<f64> = Vec::new();
  1426. let mut red_req_time: Vec<f64> = Vec::new();
  1427. let mut red_resp_time: Vec<f64> = Vec::new();
  1428. let mut red_resp_handle_time: Vec<f64> = Vec::new();
  1429. for cred in credentials {
  1430. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  1431. let encbuckets = th.ba.enc_bridge_table();
  1432. let bucket =
  1433. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  1434. let mut count = 0;
  1435. for bridge_line in &bucket.0 {
  1436. if th.ba.bridge_table.reachable.contains_key(bridge_line) {
  1437. count += 1;
  1438. }
  1439. }
  1440. if count < 2 {
  1441. let (perf_stat, migration) = th.check_blockage(&cred);
  1442. let (block_perf_stat, _) = th.blockage_migration(&cred, &migration);
  1443. req_size.push(perf_stat.req_len as f64);
  1444. req_time.push(perf_stat.req_t.as_secs_f64());
  1445. resp_size.push(perf_stat.resp_len as f64);
  1446. resp_time.push(perf_stat.resp_t.as_secs_f64());
  1447. resp_handle_time.push(perf_stat.resp_handle_t.as_secs_f64());
  1448. red_req_size.push(block_perf_stat.req_len as f64);
  1449. red_req_time.push(block_perf_stat.req_t.as_secs_f64());
  1450. red_resp_size.push(block_perf_stat.resp_len as f64);
  1451. red_resp_time.push(block_perf_stat.resp_t.as_secs_f64());
  1452. red_resp_handle_time.push(block_perf_stat.resp_handle_t.as_secs_f64());
  1453. }
  1454. }
  1455. println!("\n----CHECK-BLOCKAGE-{}----\n", percentage);
  1456. print_stats_test_results(req_size, req_time, resp_size, resp_time, resp_handle_time);
  1457. println!("\n----BLOCKAGE-MIGRATION-{}----\n", percentage);
  1458. print_stats_test_results(
  1459. red_req_size,
  1460. red_req_time,
  1461. red_resp_size,
  1462. red_resp_time,
  1463. red_resp_handle_time,
  1464. );
  1465. }
  1466. fn print_test_results(perf_stat: PerfStat) {
  1467. println!("Request size = {:?} bytes", perf_stat.req_len);
  1468. println!("Request time = {:?}", perf_stat.req_t);
  1469. println!("Response size = {:?} bytes", perf_stat.resp_len);
  1470. println!("Response time = {:?}", perf_stat.resp_t);
  1471. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1472. }
  1473. //fn print_time_test_results(perf_stat: PerfStat) {
  1474. // println!("Request time = {:?}", perf_stat.req_t);
  1475. // println!("Response time = {:?}", perf_stat.resp_t);
  1476. // println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  1477. //}
  1478. fn print_stats_test_results(
  1479. req_size: Vec<f64>,
  1480. req_time: Vec<f64>,
  1481. resp_size: Vec<f64>,
  1482. resp_time: Vec<f64>,
  1483. resp_handle_time: Vec<f64>,
  1484. ) {
  1485. let mean_req_size = mean(&req_size);
  1486. let req_std_dev = if &req_size.len() > &1 {standard_deviation(&req_size, Some(mean_req_size))} else {0.0};
  1487. let mean_req_time = mean(&req_time);
  1488. let req_time_std_dev = if &req_time.len() > &1 {standard_deviation(&req_time, Some(mean_req_time))} else {0.0};
  1489. let mean_resp_size = mean(&resp_size);
  1490. let resp_std_dev = if &resp_size.len() > &1 {standard_deviation(&resp_size, Some(mean_resp_size))} else {0.0};
  1491. let mean_resp_time = mean(&resp_time);
  1492. let resp_time_std_dev = if &resp_time.len() > &1 {standard_deviation(&resp_time, Some(mean_resp_time))} else {0.0};
  1493. let mean_resp_handle_time = mean(&resp_handle_time);
  1494. let resp_handle_time_std_dev = if &resp_handle_time.len() > &1 {standard_deviation(&resp_handle_time, Some(mean_resp_handle_time))} else {0.0};
  1495. println!("Average request size = {} bytes", mean_req_size);
  1496. println!("Request size standard deviation = {} bytes", req_std_dev);
  1497. println!(
  1498. "Average request time = {:?}",
  1499. Duration::from_secs_f64(mean_req_time)
  1500. );
  1501. println!(
  1502. "Request time standard deviation = {:?}",
  1503. Duration::from_secs_f64(req_time_std_dev)
  1504. );
  1505. println!("Average response size = {} bytes", mean_resp_size);
  1506. println!("Response standard deviation = {} bytes", resp_std_dev);
  1507. println!(
  1508. "Average response time = {:?}",
  1509. Duration::from_secs_f64(mean_resp_time)
  1510. );
  1511. println!(
  1512. "Response time standard deviation = {:?}",
  1513. Duration::from_secs_f64(resp_time_std_dev)
  1514. );
  1515. println!(
  1516. "Average response handling time = {:?}",
  1517. Duration::from_secs_f64(mean_resp_handle_time)
  1518. );
  1519. println!(
  1520. "Response handling time standard deviation = {:?}",
  1521. Duration::from_secs_f64(resp_handle_time_std_dev)
  1522. );
  1523. }