1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use crypto::{digest::Digest, sha1::Sha1};
use dirs::corpus_directory_from_record_type;
use serde::{de::DeserializeOwned, Serialize};
use std::{
    env,
    fs::{create_dir_all, write},
    io::Read,
};

pub fn fuzzing() -> bool {
    env::var("TEST_FUZZ").map_or(false, |s| !s.is_empty())
}

pub fn write_record<T: Serialize>(record: &T) {
    let corpus = corpus_directory_from_record_type::<T>();
    create_dir_all(&corpus).unwrap_or_default();

    let data = serde_cbor::to_vec(record).unwrap();
    let hex = {
        let mut hasher = Sha1::new();
        hasher.input(&data);
        hasher.result_str()
    };
    let path = corpus.join(hex);
    write(path, &data).unwrap();
}

pub fn read_record<T: DeserializeOwned, R: Read>(reader: R) -> Option<T> {
    serde_cbor::from_reader(reader).ok()
}