@@ -5,9 +5,13 @@ use std::path::PathBuf;
5
5
6
6
use mithril_common:: StdResult ;
7
7
8
+ use crate :: tools:: file_size;
9
+
8
10
/// Define multiple ways to append content to a tar archive.
9
11
pub trait TarAppender {
10
12
fn append < T : Write > ( & self , tar : & mut tar:: Builder < T > ) -> StdResult < ( ) > ;
13
+
14
+ fn compute_uncompressed_data_size ( & self ) -> StdResult < u64 > ;
11
15
}
12
16
13
17
pub struct AppenderDirAll {
@@ -31,6 +35,10 @@ impl TarAppender for AppenderDirAll {
31
35
} ) ?;
32
36
Ok ( ( ) )
33
37
}
38
+
39
+ fn compute_uncompressed_data_size ( & self ) -> StdResult < u64 > {
40
+ file_size:: compute_size_of_path ( & self . target_directory )
41
+ }
34
42
}
35
43
36
44
pub struct AppenderFile {
@@ -80,6 +88,10 @@ impl TarAppender for AppenderFile {
80
88
} ) ?;
81
89
Ok ( ( ) )
82
90
}
91
+
92
+ fn compute_uncompressed_data_size ( & self ) -> StdResult < u64 > {
93
+ file_size:: compute_size_of_path ( & self . target_file )
94
+ }
83
95
}
84
96
85
97
pub struct AppenderEntries {
@@ -132,10 +144,22 @@ impl TarAppender for AppenderEntries {
132
144
}
133
145
Ok ( ( ) )
134
146
}
147
+
148
+ fn compute_uncompressed_data_size ( & self ) -> StdResult < u64 > {
149
+ let full_entries_path = self
150
+ . entries
151
+ . iter ( )
152
+ . map ( |entry| self . base_directory . join ( entry) )
153
+ . collect ( ) ;
154
+ file_size:: compute_size ( full_entries_path)
155
+ }
135
156
}
136
157
137
158
#[ cfg( test) ]
138
159
mod tests {
160
+ use mithril_common:: digesters:: {
161
+ DummyCardanoDbBuilder , IMMUTABLE_DIR , LEDGER_DIR , VOLATILE_DIR ,
162
+ } ;
139
163
use mithril_common:: entities:: CompressionAlgorithm ;
140
164
141
165
use crate :: tools:: file_archiver:: test_tools:: * ;
@@ -278,4 +302,77 @@ mod tests {
278
302
get_test_directory ( "appender_file_should_return_error_if_input_is_not_a_file" ) ;
279
303
assert ! ( AppenderFile :: append_at_archive_root( test_dir) . is_err( ) ) ;
280
304
}
305
+
306
+ #[ test]
307
+ fn appender_dir_all_compute_size ( ) {
308
+ let test_dir = "appender_dir_all_compute_size" ;
309
+
310
+ let immutable_trio_file_size = 777 ;
311
+ let ledger_file_size = 6666 ;
312
+ let volatile_file_size = 99 ;
313
+
314
+ let cardano_db = DummyCardanoDbBuilder :: new ( test_dir)
315
+ . with_immutables ( & [ 1 , 2 ] )
316
+ . set_immutable_trio_file_size ( immutable_trio_file_size)
317
+ . with_ledger_files ( & [ "437" , "537" , "637" ] )
318
+ . set_ledger_file_size ( ledger_file_size)
319
+ . with_volatile_files ( & [ "blocks-0.dat" ] )
320
+ . set_volatile_file_size ( volatile_file_size)
321
+ . build ( ) ;
322
+
323
+ let appender_dir_all = AppenderDirAll :: new ( cardano_db. get_dir ( ) . clone ( ) ) ;
324
+
325
+ let entries_size = appender_dir_all. compute_uncompressed_data_size ( ) . unwrap ( ) ;
326
+ let expected_total_size =
327
+ ( immutable_trio_file_size * 2 ) + ( 3 * ledger_file_size) + volatile_file_size;
328
+ assert_eq ! ( expected_total_size, entries_size) ;
329
+ }
330
+
331
+ #[ test]
332
+ fn appender_file_all_compute_size ( ) {
333
+ let test_dir = get_test_directory ( "appender_file_all_compute_size" ) ;
334
+
335
+ let file_path = test_dir. join ( "file.txt" ) ;
336
+ let file = File :: create ( & file_path) . unwrap ( ) ;
337
+ file. set_len ( 777 ) . unwrap ( ) ;
338
+
339
+ let appender_file = AppenderFile :: append_at_archive_root ( file_path) . unwrap ( ) ;
340
+
341
+ let entries_size = appender_file. compute_uncompressed_data_size ( ) . unwrap ( ) ;
342
+ assert_eq ! ( 777 , entries_size) ;
343
+ }
344
+
345
+ #[ test]
346
+ fn appender_entries_compute_size_of_its_paths ( ) {
347
+ let test_dir = "appender_entries_compute_size_of_its_paths" ;
348
+
349
+ let immutable_trio_file_size = 777 ;
350
+ let ledger_file_size = 6666 ;
351
+ let volatile_file_size = 99 ;
352
+
353
+ let cardano_db = DummyCardanoDbBuilder :: new ( test_dir)
354
+ . with_immutables ( & [ 1 , 2 , 3 ] )
355
+ . set_immutable_trio_file_size ( immutable_trio_file_size)
356
+ . with_ledger_files ( & [ "437" , "537" , "637" , "737" ] )
357
+ . set_ledger_file_size ( ledger_file_size)
358
+ . with_volatile_files ( & [ "blocks-0.dat" , "blocks-1.dat" , "blocks-2.dat" ] )
359
+ . set_volatile_file_size ( volatile_file_size)
360
+ . build ( ) ;
361
+
362
+ let appender_entries = AppenderEntries :: new (
363
+ vec ! [
364
+ PathBuf :: from( IMMUTABLE_DIR ) ,
365
+ PathBuf :: from( LEDGER_DIR ) . join( "437" ) ,
366
+ PathBuf :: from( LEDGER_DIR ) . join( "537" ) ,
367
+ PathBuf :: from( VOLATILE_DIR ) . join( "blocks-0.dat" ) ,
368
+ ] ,
369
+ cardano_db. get_dir ( ) . clone ( ) ,
370
+ )
371
+ . unwrap ( ) ;
372
+
373
+ let entries_size = appender_entries. compute_uncompressed_data_size ( ) . unwrap ( ) ;
374
+ let expected_total_size =
375
+ ( immutable_trio_file_size * 3 ) + ( 2 * ledger_file_size) + volatile_file_size;
376
+ assert_eq ! ( expected_total_size, entries_size) ;
377
+ }
281
378
}
0 commit comments