stats_tests.rs 69 KB

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