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
"#
);
}