in cas_client/src/remote_client.rs [1050:1123]
fn test_reconstruct_file_skip_front_bytes() -> Result<()> {
// Arrange server
let server = MockServer::start();
let xorb_hash: MerkleHash = MerkleHash::default();
let (cas_object, chunks_serialized, raw_data, _raw_data_chunk_hash_and_boundaries) =
build_cas_object(NUM_CHUNKS, ChunkSize::Fixed(CHUNK_SIZE), CompressionScheme::ByteGrouping4LZ4);
// Workaround to make this variable const. Change this accordingly if
// real value of the two static variables below change.
const FIRST_SEGMENT_SIZE: u64 = 16 * 64 * 1024 * 1024;
assert_eq!(FIRST_SEGMENT_SIZE, *NUM_RANGE_IN_SEGMENT_BASE as u64 * *MAX_XORB_BYTES as u64);
// Test case: skip first 100 bytes
const SKIP_BYTES: u64 = 100;
const FIRST_SEGMENT_FILE_RANGE: FileRange = FileRange {
start: SKIP_BYTES,
end: SKIP_BYTES + FIRST_SEGMENT_SIZE,
_marker: std::marker::PhantomData,
};
let test_case = TestCase {
file_hash: MerkleHash::from_hex(&format!("{:0>64}", "1"))?, // "0....1"
reconstruction_response: QueryReconstructionResponse {
offset_into_first_range: SKIP_BYTES,
terms: vec![CASReconstructionTerm {
hash: xorb_hash.into(),
range: ChunkRange::new(0, NUM_CHUNKS),
unpacked_length: raw_data.len() as u32,
}],
fetch_info: HashMap::from([(
xorb_hash.into(),
vec![CASReconstructionFetchInfo {
range: ChunkRange::new(0, NUM_CHUNKS),
url: server.url(format!("/get_xorb/{xorb_hash}/")),
url_range: {
let (start, end) = cas_object.get_byte_offset(0, NUM_CHUNKS)?;
HttpRange::from(FileRange::new(start as u64, end as u64))
},
}],
)]),
},
file_range: FileRange::new(SKIP_BYTES, u64::MAX),
expected_data: raw_data[SKIP_BYTES as usize..].to_vec(),
expect_error: false,
};
// Arrange server mocks
let _mock_fi_416 = server.mock(|when, then| {
when.method(GET)
.path(format!("/reconstruction/{}", test_case.file_hash))
.matches(mock_no_match_range_header!(HttpRange::from(FIRST_SEGMENT_FILE_RANGE)));
then.status(416);
});
let _mock_fi_200 = server.mock(|when, then| {
let w = when.method(GET).path(format!("/reconstruction/{}", test_case.file_hash));
w.header(RANGE.as_str(), HttpRange::from(FIRST_SEGMENT_FILE_RANGE).range_header());
then.status(200).json_body_obj(&test_case.reconstruction_response);
});
for (k, v) in &test_case.reconstruction_response.fetch_info {
for term in v {
let data = FileRange::from(term.url_range);
let data = chunks_serialized[data.start as usize..data.end as usize].to_vec();
let _mock_data = server.mock(|when, then| {
when.method(GET)
.path(format!("/get_xorb/{k}/"))
.header(RANGE.as_str(), term.url_range.range_header());
then.status(200).body(&data);
});
}
}
test_reconstruct_file(test_case, &server.base_url())
}