@@ -166,112 +166,34 @@ impl std::fmt::Display for Progress {
166
166
#[ cfg( test) ]
167
167
mod tests {
168
168
use super :: Progress ;
169
- use crate :: digesters:: cache:: {
170
- ImmutableDigesterCacheGetError , ImmutableDigesterCacheProviderError ,
171
- ImmutableDigesterCacheStoreError ,
172
- } ;
173
169
use crate :: {
174
170
digesters:: {
175
171
cache:: {
176
- ImmutableFileDigestCacheProvider , MemoryImmutableFileDigestCacheProvider ,
177
- MockImmutableFileDigestCacheProvider ,
172
+ ImmutableDigesterCacheGetError , ImmutableDigesterCacheProviderError ,
173
+ ImmutableDigesterCacheStoreError , ImmutableFileDigestCacheProvider ,
174
+ MemoryImmutableFileDigestCacheProvider , MockImmutableFileDigestCacheProvider ,
178
175
} ,
179
- CardanoImmutableDigester , ImmutableDigester , ImmutableDigesterError , ImmutableFile ,
176
+ CardanoImmutableDigester , DummyImmutablesDbBuilder , ImmutableDigester ,
177
+ ImmutableDigesterError ,
180
178
} ,
181
179
entities:: { Beacon , ImmutableFileNumber } ,
182
180
} ;
183
181
use sha2:: Sha256 ;
184
182
use slog:: Drain ;
185
- use std:: {
186
- collections:: BTreeMap ,
187
- fs,
188
- fs:: File ,
189
- io,
190
- io:: prelude:: * ,
191
- path:: { Path , PathBuf } ,
192
- sync:: Arc ,
193
- } ;
183
+ use std:: { collections:: BTreeMap , io, sync:: Arc } ;
194
184
use tokio:: time:: Instant ;
195
185
196
- fn get_test_dir ( subdir_name : & str ) -> PathBuf {
197
- let parent_dir = std:: env:: temp_dir ( )
198
- . join ( "mithril_test" )
199
- . join ( "cardano_immutable_digester" )
200
- . join ( subdir_name) ;
201
-
202
- if parent_dir. exists ( ) {
203
- fs:: remove_dir_all ( & parent_dir)
204
- . unwrap_or_else ( |e| panic ! ( "Could not remove dir {:?}: {}" , parent_dir, e) ) ;
205
- }
206
- fs:: create_dir_all ( & parent_dir)
207
- . unwrap_or_else ( |e| panic ! ( "Could not create dir {:?}: {}" , parent_dir, e) ) ;
208
-
209
- parent_dir
210
- }
211
-
212
- fn write_immutable_trio (
213
- parent_dir : & Path ,
214
- immutable : ImmutableFileNumber ,
215
- ) -> Vec < ImmutableFile > {
216
- let mut result = vec ! [ ] ;
217
- for filename in [
218
- format ! ( "{}.chunk" , immutable) ,
219
- format ! ( "{}.primary" , immutable) ,
220
- format ! ( "{}.secondary" , immutable) ,
221
- ] {
222
- let file = write_dummy_file ( parent_dir, & filename) ;
223
- result. push ( ImmutableFile {
224
- number : immutable. to_owned ( ) ,
225
- path : file,
226
- filename : filename. to_string ( ) ,
227
- } ) ;
228
- }
229
- result
230
- }
231
-
232
- /// Create a chunk/primary/secondary trio for each given [ImmutableFileNumber].
233
- ///
234
- /// If `append_uncompleted_trio` is true it will add another trio of file, that won't be included
235
- /// in the returned vec, to simulate the last 3 'uncompleted / wip' files that can be found in
236
- /// a cardano immutable db.
237
- fn create_fake_immutables (
238
- parent_dir : & Path ,
239
- immutable_numbers : & [ ImmutableFileNumber ] ,
240
- append_uncompleted_trio : bool ,
241
- ) -> Vec < ImmutableFile > {
242
- if immutable_numbers. is_empty ( ) {
243
- panic ! ( "At least one immutable numbers must be given" ) ;
244
- }
245
-
246
- let mut immutable_numbers = immutable_numbers. to_vec ( ) ;
247
- immutable_numbers. sort ( ) ;
248
-
249
- if append_uncompleted_trio {
250
- write_immutable_trio ( parent_dir, immutable_numbers. last ( ) . unwrap ( ) + 1 ) ;
251
- }
252
-
253
- immutable_numbers
254
- . into_iter ( )
255
- . flat_map ( |ifn| write_immutable_trio ( parent_dir, ifn) )
256
- . collect :: < Vec < _ > > ( )
257
- }
258
-
259
- /// Create a file with the given name in the given dir, write some text to it, and then
260
- /// return its path.
261
- fn write_dummy_file ( parent_dir : & Path , filename : & str ) -> PathBuf {
262
- let file = parent_dir. join ( Path :: new ( filename) ) ;
263
- let mut source_file = File :: create ( & file) . unwrap ( ) ;
264
- write ! ( source_file, "This is a test file named '{}'" , filename) . unwrap ( ) ;
265
- file
266
- }
267
-
268
186
fn create_logger ( ) -> slog:: Logger {
269
187
let decorator = slog_term:: PlainDecorator :: new ( slog_term:: TestStdoutWriter ) ;
270
188
let drain = slog_term:: CompactFormat :: new ( decorator) . build ( ) . fuse ( ) ;
271
189
let drain = slog_async:: Async :: new ( drain) . build ( ) . fuse ( ) ;
272
190
slog:: Logger :: root ( Arc :: new ( drain) , slog:: o!( ) )
273
191
}
274
192
193
+ fn db_builder ( dir_name : & str ) -> DummyImmutablesDbBuilder {
194
+ DummyImmutablesDbBuilder :: new ( & format ! ( "cardano_immutable_digester/{}" , dir_name) )
195
+ }
196
+
275
197
#[ test]
276
198
fn reports_progress_every_5_percent ( ) {
277
199
let mut progress = Progress {
@@ -300,8 +222,8 @@ mod tests {
300
222
301
223
#[ tokio:: test]
302
224
async fn fail_if_no_file_in_folder ( ) {
303
- let dir = get_test_dir ( "fail_if_no_file_in_folder/immutable" ) ;
304
- let digester = CardanoImmutableDigester :: new ( dir, None , create_logger ( ) ) ;
225
+ let immutable_db = db_builder ( "fail_if_no_file_in_folder" ) . build ( ) ;
226
+ let digester = CardanoImmutableDigester :: new ( immutable_db . dir , None , create_logger ( ) ) ;
305
227
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
306
228
307
229
let result = digester
@@ -323,19 +245,21 @@ mod tests {
323
245
324
246
#[ tokio:: test]
325
247
async fn fail_if_a_invalid_file_is_in_immutable_folder ( ) {
326
- let dir = get_test_dir ( "fail_if_no_immutable_exist/immutable" ) ;
327
- write_dummy_file ( & dir, "not_immutable" ) ;
328
- let digester = CardanoImmutableDigester :: new ( dir, None , create_logger ( ) ) ;
248
+ let immutable_db = db_builder ( "fail_if_no_immutable_exist" )
249
+ . with_non_immutables ( & [ "not_immutable" ] )
250
+ . build ( ) ;
251
+ let digester = CardanoImmutableDigester :: new ( immutable_db. dir , None , create_logger ( ) ) ;
329
252
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
330
253
331
254
assert ! ( digester. compute_digest( & beacon) . await . is_err( ) ) ;
332
255
}
333
256
334
257
#[ tokio:: test]
335
258
async fn fail_if_theres_only_the_uncompleted_immutable_trio ( ) {
336
- let dir = get_test_dir ( "fail_if_theres_only_the_uncompleted_immutable_trio/immutable" ) ;
337
- write_immutable_trio ( & dir, 1 ) ;
338
- let digester = CardanoImmutableDigester :: new ( dir, None , create_logger ( ) ) ;
259
+ let immutable_db = db_builder ( "fail_if_theres_only_the_uncompleted_immutable_trio" )
260
+ . append_immutable_trio ( )
261
+ . build ( ) ;
262
+ let digester = CardanoImmutableDigester :: new ( immutable_db. dir , None , create_logger ( ) ) ;
339
263
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
340
264
341
265
let result = digester
@@ -357,9 +281,11 @@ mod tests {
357
281
358
282
#[ tokio:: test]
359
283
async fn fail_if_less_immutable_than_what_required_in_beacon ( ) {
360
- let dir = get_test_dir ( "fail_if_less_immutable_than_what_required_in_beacon/immutable" ) ;
361
- create_fake_immutables ( & dir, & [ 1 , 2 , 3 , 4 , 5 ] , true ) ;
362
- let digester = CardanoImmutableDigester :: new ( dir, None , create_logger ( ) ) ;
284
+ let immutable_db = db_builder ( "fail_if_less_immutable_than_what_required_in_beacon" )
285
+ . with_immutables ( & [ 1 , 2 , 3 , 4 , 5 ] )
286
+ . append_immutable_trio ( )
287
+ . build ( ) ;
288
+ let digester = CardanoImmutableDigester :: new ( immutable_db. dir , None , create_logger ( ) ) ;
363
289
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 10 ) ;
364
290
365
291
let result = digester
@@ -381,11 +307,13 @@ mod tests {
381
307
382
308
#[ tokio:: test]
383
309
async fn can_compute_hash_of_a_hundred_immutable_file_trio ( ) {
384
- let dir = get_test_dir ( "can_compute_hash_of_a_hundred_immutable_file_trio/immutable" ) ;
385
- create_fake_immutables ( & dir, & ( 1 ..=100 ) . collect :: < Vec < ImmutableFileNumber > > ( ) , true ) ;
310
+ let immutable_db = db_builder ( "can_compute_hash_of_a_hundred_immutable_file_trio" )
311
+ . with_immutables ( & ( 1 ..=100 ) . collect :: < Vec < ImmutableFileNumber > > ( ) )
312
+ . append_immutable_trio ( )
313
+ . build ( ) ;
386
314
let logger = create_logger ( ) ;
387
315
let digester = CardanoImmutableDigester :: new (
388
- dir,
316
+ immutable_db . dir ,
389
317
Some ( Arc :: new ( MemoryImmutableFileDigestCacheProvider :: default ( ) ) ) ,
390
318
logger. clone ( ) ,
391
319
) ;
@@ -397,18 +325,22 @@ mod tests {
397
325
. expect ( "compute_digest must not fail" ) ;
398
326
399
327
assert_eq ! (
400
- "3c91666ce10b79456041d8d031a625c376138203445bec80bbfce4a5098acf54 " . to_string( ) ,
328
+ "a27fd67e495c2c77e4b6b0af9925b2b0bc39656c56adfad4aaab9f20fae49122 " . to_string( ) ,
401
329
result
402
330
)
403
331
}
404
332
405
333
#[ tokio:: test]
406
334
async fn digests_are_stored_into_cache_provider ( ) {
407
- let dir = get_test_dir ( "digests_are_stored_into_cache_provider/immutable" ) ;
408
- let immutables = create_fake_immutables ( & dir, & [ 1 , 2 ] , true ) ;
335
+ let immutable_db = db_builder ( "digests_are_stored_into_cache_provider" )
336
+ . with_immutables ( & [ 1 , 2 ] )
337
+ . append_immutable_trio ( )
338
+ . build ( ) ;
339
+ let immutables = immutable_db. immutables_files ;
409
340
let cache = Arc :: new ( MemoryImmutableFileDigestCacheProvider :: default ( ) ) ;
410
341
let logger = create_logger ( ) ;
411
- let digester = CardanoImmutableDigester :: new ( dir, Some ( cache. clone ( ) ) , logger. clone ( ) ) ;
342
+ let digester =
343
+ CardanoImmutableDigester :: new ( immutable_db. dir , Some ( cache. clone ( ) ) , logger. clone ( ) ) ;
412
344
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 2 ) ;
413
345
414
346
digester
@@ -433,12 +365,17 @@ mod tests {
433
365
434
366
#[ tokio:: test]
435
367
async fn computed_digest_with_cold_or_hot_or_without_any_cache_are_equals ( ) {
436
- let dir = get_test_dir ( "computed_digest_with_or_without_cache_are_equals/immutable" ) ;
437
- create_fake_immutables ( & dir, & [ 1 , 2 , 3 ] , true ) ;
368
+ let immutable_db = DummyImmutablesDbBuilder :: new (
369
+ "computed_digest_with_cold_or_hot_or_without_any_cache_are_equals" ,
370
+ )
371
+ . with_immutables ( & [ 1 , 2 , 3 ] )
372
+ . append_immutable_trio ( )
373
+ . build ( ) ;
438
374
let logger = create_logger ( ) ;
439
- let no_cache_digester = CardanoImmutableDigester :: new ( dir. clone ( ) , None , logger. clone ( ) ) ;
375
+ let no_cache_digester =
376
+ CardanoImmutableDigester :: new ( immutable_db. dir . clone ( ) , None , logger. clone ( ) ) ;
440
377
let cache_digester = CardanoImmutableDigester :: new (
441
- dir,
378
+ immutable_db . dir ,
442
379
Some ( Arc :: new ( MemoryImmutableFileDigestCacheProvider :: default ( ) ) ) ,
443
380
logger. clone ( ) ,
444
381
) ;
@@ -472,11 +409,14 @@ mod tests {
472
409
473
410
#[ tokio:: test]
474
411
async fn hash_computation_is_quicker_with_a_full_cache ( ) {
475
- let dir = get_test_dir ( "hash_computation_is_quicker_with_a_full_cache/immutable" ) ;
476
- create_fake_immutables ( & dir, & ( 1 ..=300 ) . collect :: < Vec < ImmutableFileNumber > > ( ) , true ) ;
412
+ let immutable_db = db_builder ( "hash_computation_is_quicker_with_a_full_cache" )
413
+ . with_immutables ( & ( 1 ..=300 ) . collect :: < Vec < ImmutableFileNumber > > ( ) )
414
+ . append_immutable_trio ( )
415
+ . build ( ) ;
477
416
let cache = MemoryImmutableFileDigestCacheProvider :: default ( ) ;
478
417
let logger = create_logger ( ) ;
479
- let digester = CardanoImmutableDigester :: new ( dir, Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
418
+ let digester =
419
+ CardanoImmutableDigester :: new ( immutable_db. dir , Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
480
420
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 300 ) ;
481
421
482
422
let now = Instant :: now ( ) ;
@@ -504,8 +444,10 @@ mod tests {
504
444
505
445
#[ tokio:: test]
506
446
async fn cache_read_failure_dont_block_computation ( ) {
507
- let dir = get_test_dir ( "cache_read_failure_dont_block_computation/immutable" ) ;
508
- create_fake_immutables ( & dir, & [ 1 , 2 , 3 ] , true ) ;
447
+ let immutable_db = db_builder ( "cache_read_failure_dont_block_computation" )
448
+ . with_immutables ( & [ 1 , 2 , 3 ] )
449
+ . append_immutable_trio ( )
450
+ . build ( ) ;
509
451
let mut cache = MockImmutableFileDigestCacheProvider :: new ( ) ;
510
452
cache. expect_get ( ) . returning ( |_| Ok ( BTreeMap :: new ( ) ) ) ;
511
453
cache. expect_store ( ) . returning ( |_| {
@@ -514,7 +456,8 @@ mod tests {
514
456
) )
515
457
} ) ;
516
458
let logger = create_logger ( ) ;
517
- let digester = CardanoImmutableDigester :: new ( dir, Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
459
+ let digester =
460
+ CardanoImmutableDigester :: new ( immutable_db. dir , Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
518
461
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 3 ) ;
519
462
520
463
digester
@@ -525,8 +468,10 @@ mod tests {
525
468
526
469
#[ tokio:: test]
527
470
async fn cache_write_failure_dont_block_computation ( ) {
528
- let dir = get_test_dir ( "cache_write_failure_dont_block_computation/immutable" ) ;
529
- create_fake_immutables ( & dir, & [ 1 , 2 , 3 ] , true ) ;
471
+ let immutable_db = db_builder ( "cache_write_failure_dont_block_computation" )
472
+ . with_immutables ( & [ 1 , 2 , 3 ] )
473
+ . append_immutable_trio ( )
474
+ . build ( ) ;
530
475
let mut cache = MockImmutableFileDigestCacheProvider :: new ( ) ;
531
476
cache. expect_get ( ) . returning ( |_| {
532
477
Err ( ImmutableDigesterCacheProviderError :: Get (
@@ -535,7 +480,8 @@ mod tests {
535
480
} ) ;
536
481
cache. expect_store ( ) . returning ( |_| Ok ( ( ) ) ) ;
537
482
let logger = create_logger ( ) ;
538
- let digester = CardanoImmutableDigester :: new ( dir, Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
483
+ let digester =
484
+ CardanoImmutableDigester :: new ( immutable_db. dir , Some ( Arc :: new ( cache) ) , logger. clone ( ) ) ;
539
485
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 3 ) ;
540
486
541
487
digester
0 commit comments