Skip to content

Commit 6d2ade1

Browse files
committed
Switch to a builder to generate dummy immutables
1 parent 684d8a1 commit 6d2ade1

File tree

3 files changed

+188
-119
lines changed

3 files changed

+188
-119
lines changed

mithril-common/src/digesters/cardano_immutable_digester.rs

Lines changed: 65 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -166,112 +166,34 @@ impl std::fmt::Display for Progress {
166166
#[cfg(test)]
167167
mod tests {
168168
use super::Progress;
169-
use crate::digesters::cache::{
170-
ImmutableDigesterCacheGetError, ImmutableDigesterCacheProviderError,
171-
ImmutableDigesterCacheStoreError,
172-
};
173169
use crate::{
174170
digesters::{
175171
cache::{
176-
ImmutableFileDigestCacheProvider, MemoryImmutableFileDigestCacheProvider,
177-
MockImmutableFileDigestCacheProvider,
172+
ImmutableDigesterCacheGetError, ImmutableDigesterCacheProviderError,
173+
ImmutableDigesterCacheStoreError, ImmutableFileDigestCacheProvider,
174+
MemoryImmutableFileDigestCacheProvider, MockImmutableFileDigestCacheProvider,
178175
},
179-
CardanoImmutableDigester, ImmutableDigester, ImmutableDigesterError, ImmutableFile,
176+
CardanoImmutableDigester, DummyImmutablesDbBuilder, ImmutableDigester,
177+
ImmutableDigesterError,
180178
},
181179
entities::{Beacon, ImmutableFileNumber},
182180
};
183181
use sha2::Sha256;
184182
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};
194184
use tokio::time::Instant;
195185

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-
268186
fn create_logger() -> slog::Logger {
269187
let decorator = slog_term::PlainDecorator::new(slog_term::TestStdoutWriter);
270188
let drain = slog_term::CompactFormat::new(decorator).build().fuse();
271189
let drain = slog_async::Async::new(drain).build().fuse();
272190
slog::Logger::root(Arc::new(drain), slog::o!())
273191
}
274192

193+
fn db_builder(dir_name: &str) -> DummyImmutablesDbBuilder {
194+
DummyImmutablesDbBuilder::new(&format!("cardano_immutable_digester/{}", dir_name))
195+
}
196+
275197
#[test]
276198
fn reports_progress_every_5_percent() {
277199
let mut progress = Progress {
@@ -300,8 +222,8 @@ mod tests {
300222

301223
#[tokio::test]
302224
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());
305227
let beacon = Beacon::new("devnet".to_string(), 1, 1);
306228

307229
let result = digester
@@ -323,19 +245,21 @@ mod tests {
323245

324246
#[tokio::test]
325247
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());
329252
let beacon = Beacon::new("devnet".to_string(), 1, 1);
330253

331254
assert!(digester.compute_digest(&beacon).await.is_err());
332255
}
333256

334257
#[tokio::test]
335258
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());
339263
let beacon = Beacon::new("devnet".to_string(), 1, 1);
340264

341265
let result = digester
@@ -357,9 +281,11 @@ mod tests {
357281

358282
#[tokio::test]
359283
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());
363289
let beacon = Beacon::new("devnet".to_string(), 1, 10);
364290

365291
let result = digester
@@ -381,11 +307,13 @@ mod tests {
381307

382308
#[tokio::test]
383309
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();
386314
let logger = create_logger();
387315
let digester = CardanoImmutableDigester::new(
388-
dir,
316+
immutable_db.dir,
389317
Some(Arc::new(MemoryImmutableFileDigestCacheProvider::default())),
390318
logger.clone(),
391319
);
@@ -397,18 +325,22 @@ mod tests {
397325
.expect("compute_digest must not fail");
398326

399327
assert_eq!(
400-
"3c91666ce10b79456041d8d031a625c376138203445bec80bbfce4a5098acf54".to_string(),
328+
"a27fd67e495c2c77e4b6b0af9925b2b0bc39656c56adfad4aaab9f20fae49122".to_string(),
401329
result
402330
)
403331
}
404332

405333
#[tokio::test]
406334
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;
409340
let cache = Arc::new(MemoryImmutableFileDigestCacheProvider::default());
410341
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());
412344
let beacon = Beacon::new("devnet".to_string(), 1, 2);
413345

414346
digester
@@ -433,12 +365,17 @@ mod tests {
433365

434366
#[tokio::test]
435367
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();
438374
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());
440377
let cache_digester = CardanoImmutableDigester::new(
441-
dir,
378+
immutable_db.dir,
442379
Some(Arc::new(MemoryImmutableFileDigestCacheProvider::default())),
443380
logger.clone(),
444381
);
@@ -472,11 +409,14 @@ mod tests {
472409

473410
#[tokio::test]
474411
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();
477416
let cache = MemoryImmutableFileDigestCacheProvider::default();
478417
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());
480420
let beacon = Beacon::new("devnet".to_string(), 1, 300);
481421

482422
let now = Instant::now();
@@ -504,8 +444,10 @@ mod tests {
504444

505445
#[tokio::test]
506446
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();
509451
let mut cache = MockImmutableFileDigestCacheProvider::new();
510452
cache.expect_get().returning(|_| Ok(BTreeMap::new()));
511453
cache.expect_store().returning(|_| {
@@ -514,7 +456,8 @@ mod tests {
514456
))
515457
});
516458
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());
518461
let beacon = Beacon::new("devnet".to_string(), 1, 3);
519462

520463
digester
@@ -525,8 +468,10 @@ mod tests {
525468

526469
#[tokio::test]
527470
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();
530475
let mut cache = MockImmutableFileDigestCacheProvider::new();
531476
cache.expect_get().returning(|_| {
532477
Err(ImmutableDigesterCacheProviderError::Get(
@@ -535,7 +480,8 @@ mod tests {
535480
});
536481
cache.expect_store().returning(|_| Ok(()));
537482
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());
539485
let beacon = Beacon::new("devnet".to_string(), 1, 3);
540486

541487
digester

0 commit comments

Comments
 (0)