fn test_delta_options()

in eden/scm/lib/zstore/src/zstore.rs [710:883]


    fn test_delta_options() {
        let noise = generate_noise(4000);
        // Similar contents. This ensures that delta will be used.
        let contents: Vec<Vec<u8>> = (0..50)
            .map(|i| format!("{}{}{}", noise, i, noise).as_bytes().to_vec())
            .collect();

        // Test that the delta trees effectively limit the max
        // delta chain length.
        //
        // Set n (max_subchain_len) and d (max_depth) to 3. Check:
        // - The chain length is bounded to 9 (n * d).
        // - 39 (see dostring of DeltaOptions) deltas are used before full text
        //   ("Depth" is 1).
        assert_eq!(
            show_tree(&contents[..42], |opts| {
                opts.max_depth = 3;
                opts.max_subchain_len = 3;
            }),
            // Hint: In case this test is broken by zstd version change, run
            // `fbcode/experimental/quark/grep-rs/cargo-test-i.py --lib` from
            // the `src` directory to auto-update the test.
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       2 |     2 |          0 |   d176e3
       3 |     3 |          0 |    480cf2
       4 |     3 |          1 |     7b2274
       5 |     3 |          2 |      9195fa
       3 |     2 |          1 |    68a44f
       4 |     3 |          0 |     049af1
       5 |     3 |          1 |      6be3a2
       6 |     3 |          2 |       0565d7
       4 |     2 |          2 |     fcf8f6
       5 |     3 |          0 |      0a012d
       6 |     3 |          1 |       316785
       7 |     3 |          2 |        7c562e
       2 |     1 |          1 |   5b8328
       3 |     2 |          0 |    8802f4
       4 |     3 |          0 |     35b10a
       5 |     3 |          1 |      565d3f
       6 |     3 |          2 |       c2a84a
       4 |     2 |          1 |     aad27f
       5 |     3 |          0 |      4ad6aa
       6 |     3 |          1 |       dd14d5
       7 |     3 |          2 |        aea69c
       5 |     2 |          2 |      0c4075
       6 |     3 |          0 |       ffa7b4
       7 |     3 |          1 |        3cfff1
       8 |     3 |          2 |         0c98c3
       3 |     1 |          2 |    091e0d
       4 |     2 |          0 |     98715e
       5 |     3 |          0 |      47258d
       6 |     3 |          1 |       7802ae
       7 |     3 |          2 |        cec4d0
       5 |     2 |          1 |      fa80d4
       6 |     3 |          0 |       1ca3c5
       7 |     3 |          1 |        5292f3
       8 |     3 |          2 |         a2ff59
       6 |     2 |          2 |       758c14
       7 |     3 |          0 |        465a4a
       8 |     3 |          1 |         3af16a
       9 |     3 |          2 |          002504
       1 |     1 |          0 |  409bca
       2 |     2 |          0 |   cca7b8
       3 |     3 |          0 |    6972af
"#
        );

        // Test that if n = d = 0, full text will always be used.
        assert_eq!(
            show_tree(&contents[..5], |opts| {
                opts.max_depth = 0;
                opts.max_subchain_len = 0;
            }),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       1 |     1 |          0 |  d176e3
       1 |     1 |          0 |  480cf2
       1 |     1 |          0 |  7b2274
       1 |     1 |          0 |  9195fa
"#
        );

        // Test that if either n or d is a large number, it's similar to a
        // linear chain.
        assert_eq!(
            show_tree(&contents[..5], |opts| {
                opts.max_depth = 1000;
                opts.max_subchain_len = 0;
            }),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       2 |     2 |          0 |   d176e3
       3 |     3 |          0 |    480cf2
       4 |     4 |          0 |     7b2274
       5 |     5 |          0 |      9195fa
"#
        );
        assert_eq!(
            show_tree(&contents[..5], |opts| {
                opts.max_depth = 0;
                opts.max_subchain_len = 1000;
            }),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       2 |     1 |          1 |   d176e3
       3 |     1 |          2 |    480cf2
       4 |     1 |          3 |     7b2274
       5 |     1 |          4 |      9195fa
"#
        );
        assert_eq!(
            show_tree(&contents[..5], |opts| {
                opts.max_depth = 1000;
                opts.max_subchain_len = 1000;
            }),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       2 |     2 |          0 |   d176e3
       3 |     3 |          0 |    480cf2
       4 |     4 |          0 |     7b2274
       5 |     5 |          0 |      9195fa
"#
        );

        // Test that `max_chain_bytes` is effective.
        assert_eq!(
            show_tree(&contents[..10], |opts| {
                opts.max_chain_bytes = 2120;
            }),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  12a9a7
       2 |     2 |          0 |   d176e3
       3 |     3 |          0 |    480cf2
       1 |     1 |          0 |  7b2274
       2 |     2 |          0 |   9195fa
       3 |     3 |          0 |    68a44f
       1 |     1 |          0 |  049af1
       2 |     2 |          0 |   6be3a2
       3 |     3 |          0 |    0565d7
       1 |     1 |          0 |  fcf8f6
"#
        );

        // Test that `max_chain_factor_log` is effective.
        assert_eq!(
            show_tree(
                &[&noise[0..100], &noise[50..150], &noise[100..200]],
                |opts| {
                    // chain bytes should < full text length * 2 (100 * 2).
                    opts.max_chain_factor_log = 1;
                }
            ),
            r#"
Chain Len| Depth |Subchain Len| Chain ID
       0 |     0 |          0 | da39a3
       1 |     1 |          0 |  ed1309
       2 |     2 |          0 |   ab2eea
       1 |     1 |          0 |  f4d55f
"#
        );
    }