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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use bytes::Bytes;
use std::sync::LazyLock;

use crate::{B3Digest, Directory, Node};

pub const HELLOWORLD_BLOB_CONTENTS: &[u8] = b"Hello World!";
pub const EMPTY_BLOB_CONTENTS: &[u8] = b"";

pub static DUMMY_DIGEST: LazyLock<B3Digest> = LazyLock::new(|| (&[0u8; 32]).into());
pub static DUMMY_DIGEST_2: LazyLock<B3Digest> = LazyLock::new(|| {
    let mut u = [0u8; 32];
    u[0] = 0x10;
    (&u).into()
});
pub static DUMMY_DATA_1: LazyLock<Bytes> = LazyLock::new(|| vec![0x01, 0x02, 0x03].into());
pub static DUMMY_DATA_2: LazyLock<Bytes> = LazyLock::new(|| vec![0x04, 0x05].into());

pub static HELLOWORLD_BLOB_DIGEST: LazyLock<B3Digest> =
    LazyLock::new(|| blake3::hash(HELLOWORLD_BLOB_CONTENTS).as_bytes().into());
pub static EMPTY_BLOB_DIGEST: LazyLock<B3Digest> =
    LazyLock::new(|| blake3::hash(EMPTY_BLOB_CONTENTS).as_bytes().into());

// 2 bytes
pub static BLOB_A: LazyLock<Bytes> = LazyLock::new(|| vec![0x00, 0x01].into());
pub static BLOB_A_DIGEST: LazyLock<B3Digest> =
    LazyLock::new(|| blake3::hash(&BLOB_A).as_bytes().into());

// 1MB
pub static BLOB_B: LazyLock<Bytes> =
    LazyLock::new(|| (0..255).collect::<Vec<u8>>().repeat(4 * 1024).into());
pub static BLOB_B_DIGEST: LazyLock<B3Digest> =
    LazyLock::new(|| blake3::hash(&BLOB_B).as_bytes().into());

// Directories
pub static DIRECTORY_WITH_KEEP: LazyLock<Directory> = LazyLock::new(|| {
    Directory::try_from_iter([(
        ".keep".try_into().unwrap(),
        Node::File {
            digest: EMPTY_BLOB_DIGEST.clone(),
            size: 0,
            executable: false,
        },
    )])
    .unwrap()
});
pub static DIRECTORY_COMPLICATED: LazyLock<Directory> = LazyLock::new(|| {
    Directory::try_from_iter([
        (
            "keep".try_into().unwrap(),
            Node::Directory {
                digest: DIRECTORY_WITH_KEEP.digest(),
                size: DIRECTORY_WITH_KEEP.size(),
            },
        ),
        (
            ".keep".try_into().unwrap(),
            Node::File {
                digest: EMPTY_BLOB_DIGEST.clone(),
                size: 0,
                executable: false,
            },
        ),
        (
            "aa".try_into().unwrap(),
            Node::Symlink {
                target: "/nix/store/somewhereelse".try_into().unwrap(),
            },
        ),
    ])
    .unwrap()
});
pub static DIRECTORY_A: LazyLock<Directory> = LazyLock::new(Directory::new);
pub static DIRECTORY_B: LazyLock<Directory> = LazyLock::new(|| {
    Directory::try_from_iter([(
        "a".try_into().unwrap(),
        Node::Directory {
            digest: DIRECTORY_A.digest(),
            size: DIRECTORY_A.size(),
        },
    )])
    .unwrap()
});
pub static DIRECTORY_C: LazyLock<Directory> = LazyLock::new(|| {
    Directory::try_from_iter([
        (
            "a".try_into().unwrap(),
            Node::Directory {
                digest: DIRECTORY_A.digest(),
                size: DIRECTORY_A.size(),
            },
        ),
        (
            "a'".try_into().unwrap(),
            Node::Directory {
                digest: DIRECTORY_A.digest(),
                size: DIRECTORY_A.size(),
            },
        ),
    ])
    .unwrap()
});
pub static DIRECTORY_D: LazyLock<Directory> = LazyLock::new(|| {
    Directory::try_from_iter([
        (
            "a".try_into().unwrap(),
            Node::Directory {
                digest: DIRECTORY_A.digest(),
                size: DIRECTORY_A.size(),
            },
        ),
        (
            "b".try_into().unwrap(),
            Node::Directory {
                digest: DIRECTORY_B.digest(),
                size: DIRECTORY_B.size(),
            },
        ),
    ])
    .unwrap()
});