Skip to content

Commit e3bd5e9

Browse files
committed
awawawawawa
1 parent 86007a0 commit e3bd5e9

File tree

2 files changed

+148
-43
lines changed

2 files changed

+148
-43
lines changed

src/writer_process/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ fn run(mut tx: impl FnMut(StatusMessage), args: &WriterProcessConfig) -> Result<
8383
disk_block_size: 512,
8484
checkpoint_period: 32,
8585
}
86-
.write(&mut tx)?;
86+
.execute(&mut tx)?;
8787

8888
tx(StatusMessage::FinishedWriting {
8989
verifying: args.verify,
@@ -102,9 +102,9 @@ fn run(mut tx: impl FnMut(StatusMessage), args: &WriterProcessConfig) -> Result<
102102
cf: args.compression,
103103
buf_size,
104104
disk_block_size: 512,
105-
checkpoint_blocks: 32,
105+
checkpoint_period: 32,
106106
}
107-
.verify(tx)?;
107+
.execute(tx)?;
108108

109109
Ok(())
110110
}
@@ -123,7 +123,7 @@ struct WriteOp<F: Read, D: Write> {
123123
}
124124

125125
impl<S: Read, D: Write> WriteOp<S, D> {
126-
fn write(&mut self, mut tx: impl FnMut(StatusMessage)) -> Result<(), ErrorType> {
126+
fn execute(&mut self, mut tx: impl FnMut(StatusMessage)) -> Result<(), ErrorType> {
127127
let mut file = decompress(self.cf, BufReader::new(CountRead::new(&mut self.file))).unwrap();
128128
let mut disk = CountWrite::new(&mut self.disk);
129129
let mut buf = vec![0u8; self.buf_size];
@@ -164,11 +164,11 @@ struct VerifyOp<F: Read, D: Read> {
164164
cf: CompressionFormat,
165165
buf_size: usize,
166166
disk_block_size: usize,
167-
checkpoint_blocks: usize,
167+
checkpoint_period: usize,
168168
}
169169

170170
impl<F: Read, D: Read> VerifyOp<F, D> {
171-
fn verify(&mut self, mut tx: impl FnMut(StatusMessage)) -> Result<(), ErrorType> {
171+
fn execute(&mut self, mut tx: impl FnMut(StatusMessage)) -> Result<(), ErrorType> {
172172
let mut file = decompress(self.cf, BufReader::new(CountRead::new(&mut self.file))).unwrap();
173173
let mut disk = CountRead::new(&mut self.disk);
174174

@@ -185,7 +185,7 @@ impl<F: Read, D: Read> VerifyOp<F, D> {
185185
}
186186

187187
loop {
188-
for _ in 0..self.checkpoint_blocks {
188+
for _ in 0..self.checkpoint_period {
189189
let read_bytes = file.read(&mut file_buf)?;
190190
if read_bytes == 0 {
191191
checkpoint!();

src/writer_process/tests.rs

Lines changed: 141 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ fn write_op_works() {
1313
};
1414
let result = test.execute();
1515

16+
// Every write must be the correct size
1617
for w in &result.requested_writes {
1718
assert_eq!(w.len(), test.buf_size);
1819
}
19-
assert_eq!(&result.disk[..1024], &result.file);
20+
21+
// The result of the write must be correct
22+
assert_eq!(&result.disk[..result.file.len()], &result.file);
23+
24+
// Correct events must be emitted
2025
assert_eq!(
2126
&result.events,
2227
&[
@@ -46,10 +51,8 @@ fn write_op_works() {
4651

4752
#[rstest]
4853
fn write_misaligned_file_works(
49-
#[values(0, 1, 33, 382, 438, 993)]
50-
file_size: usize,
51-
#[values(16, 32, 48, 64, 128)]
52-
buf_size: usize,
54+
#[values(0, 1, 33, 382, 438, 993)] file_size: usize,
55+
#[values(16, 32, 48, 64, 128)] buf_size: usize,
5356
) {
5457
let test = WriteTest {
5558
buf_size,
@@ -66,48 +69,109 @@ fn write_misaligned_file_works(
6669
assert_eq!(&result.disk[..test.file_size], &result.file);
6770
}
6871

69-
/*
70-
#[test]
71-
fn verify_sink_multiple_blocks_incorrect() {
72-
let src = make_random(1000);
73-
let mut file = src.clone();
74-
file[593] = 5;
72+
#[rstest]
73+
fn write_file_larger_than_disk(#[values(1001, 1032, 2000, 6000, 7000)] file_size: usize) {
74+
let test = WriteTest {
75+
file_size,
76+
buf_size: 500,
77+
disk_size: 1000,
78+
disk_block_size: 10,
79+
checkpoint_period: 16,
80+
};
81+
let result = test.execute();
82+
83+
assert_eq!(&result.disk, &result.file[..test.disk_size]);
84+
}
85+
86+
#[rstest]
87+
fn verify_happy_case_works() {
88+
let file = make_random(4096);
89+
let disk = file.clone();
90+
91+
let test = VerifyTest {
92+
buf_size: 128,
93+
file,
94+
disk,
95+
disk_block_size: 128,
96+
checkpoint_period: 32,
97+
};
98+
let result = test.execute();
99+
100+
assert_eq!(result.return_val, Ok(()));
101+
}
75102

76-
let mut sink = VerifySink {
77-
file: Cursor::new(file),
103+
#[rstest]
104+
fn verify_sad_case_works() {
105+
let file = make_random(4096);
106+
let mut disk = file.clone();
107+
disk[10] = !disk[10];
108+
109+
let test = VerifyTest {
110+
buf_size: 128,
111+
file,
112+
disk,
113+
disk_block_size: 128,
114+
checkpoint_period: 32,
78115
};
116+
let result = test.execute();
79117

80-
sink.on_block(&src[..250], &mut make_random(250)).unwrap();
81-
sink.on_block(&src[250..500], &mut make_random(250))
82-
.unwrap();
83-
let r2 = sink
84-
.on_block(&src[500..750], &mut make_random(250))
85-
.unwrap_err();
118+
assert_eq!(result.return_val, Err(ErrorType::VerificationFailed));
119+
}
120+
121+
#[rstest]
122+
fn verify_misaligned_case_happy_path_works(#[values(101, 103, 4348, 8337)] file_size: usize) {
123+
let file = make_random(file_size);
124+
let mut disk = make_random(16384);
125+
disk[..file_size].copy_from_slice(&file);
86126

87-
assert_eq!(r2, ErrorType::VerificationFailed);
127+
let test = VerifyTest {
128+
buf_size: 128,
129+
file,
130+
disk,
131+
disk_block_size: 128,
132+
checkpoint_period: 32,
133+
};
134+
let result = test.execute();
135+
136+
assert_eq!(result.return_val, Ok(()));
88137
}
89138

90-
#[test]
91-
fn verify_sink_multiple_blocks_correct() {
92-
let src = make_random(1000);
93-
let file = src.clone();
139+
#[rstest]
140+
#[case(4231, 0)]
141+
#[case(4231, 1)]
142+
#[case(4231, 834)]
143+
#[case(4231, 4210)]
144+
#[case(4231, 4213)]
145+
#[case(4232, 4231)]
146+
fn verify_misaligned_case_sad_path_works(#[case] file_size: usize, #[case] flip_offset: usize) {
147+
let file = make_random(file_size);
148+
let mut disk = make_random(16000);
149+
disk[..file_size].copy_from_slice(&file);
150+
disk[flip_offset] = !disk[flip_offset];
94151

95-
let mut sink = VerifySink {
96-
file: Cursor::new(file),
152+
let test = VerifyTest {
153+
buf_size: 100,
154+
file,
155+
disk,
156+
disk_block_size: 100,
157+
checkpoint_period: 25,
97158
};
159+
let result = test.execute();
98160

99-
sink.on_block(&src[..500], &mut make_random(500)).unwrap();
100-
sink.on_block(&src[500..], &mut make_random(500)).unwrap();
161+
assert_eq!(result.return_val, Err(ErrorType::VerificationFailed));
101162
}
102-
*/
163+
103164
/// Helpers for these tests. These go in their own little module to enforce
104165
/// visibility.
105166
mod helpers {
106-
use std::io::*;
167+
use std::io::{self, Cursor, Read, Write};
107168

108169
use rand::RngCore;
109170

110-
use super::{ipc::StatusMessage, CompressionFormat, WriteOp};
171+
use super::{
172+
ipc::{ErrorType, StatusMessage},
173+
CompressionFormat, VerifyOp, WriteOp,
174+
};
111175

112176
/// Wraps an in-memory buffer and logs every single chunk of data written to it.
113177
struct MockWrite<'a> {
@@ -127,7 +191,7 @@ mod helpers {
127191
}
128192

129193
impl<'a> Write for MockWrite<'a> {
130-
fn write(&mut self, buf: &[u8]) -> Result<usize> {
194+
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
131195
assert!(
132196
buf.len() % self.enforced_block_size == 0,
133197
"Received a write (size {}) that was not aligned to block (size {})!",
@@ -138,7 +202,7 @@ mod helpers {
138202
self.cursor.write(buf)
139203
}
140204

141-
fn flush(&mut self) -> Result<()> {
205+
fn flush(&mut self) -> io::Result<()> {
142206
self.cursor.flush()
143207
}
144208
}
@@ -161,7 +225,7 @@ mod helpers {
161225
}
162226

163227
impl<'a> Read for MockRead<'a> {
164-
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
228+
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
165229
if let Some(bs) = &self.enforced_block_size {
166230
assert!(
167231
buf.len() % bs == 0,
@@ -208,7 +272,7 @@ mod helpers {
208272
disk_block_size: 8,
209273
checkpoint_period: 16,
210274
}
211-
.write(|e| events.push(e))
275+
.execute(|e| events.push(e))
212276
.unwrap();
213277

214278
WriteTestResult {
@@ -221,7 +285,48 @@ mod helpers {
221285
}
222286
}
223287

224-
fn make_random(n: usize) -> Vec<u8> {
288+
pub struct VerifyTest {
289+
pub buf_size: usize,
290+
pub file: Vec<u8>,
291+
pub disk: Vec<u8>,
292+
pub disk_block_size: usize,
293+
pub checkpoint_period: usize,
294+
}
295+
296+
pub struct VerifyTestResult {
297+
pub requested_file_reads: Vec<usize>,
298+
pub requested_disk_reads: Vec<usize>,
299+
pub events: Vec<StatusMessage>,
300+
pub return_val: Result<(), ErrorType>,
301+
}
302+
303+
impl VerifyTest {
304+
pub fn execute(&self) -> VerifyTestResult {
305+
let mut events = vec![];
306+
307+
let mut file = MockRead::new(&self.file, None);
308+
let mut disk = MockRead::new(&self.disk, Some(self.disk_block_size));
309+
310+
let verification_result = VerifyOp {
311+
file: &mut file,
312+
disk: &mut disk,
313+
cf: CompressionFormat::Identity,
314+
buf_size: self.buf_size,
315+
disk_block_size: self.disk_block_size,
316+
checkpoint_period: self.checkpoint_period,
317+
}
318+
.execute(|e| events.push(e));
319+
320+
VerifyTestResult {
321+
requested_file_reads: file.requested_reads,
322+
requested_disk_reads: disk.requested_reads,
323+
events,
324+
return_val: verification_result,
325+
}
326+
}
327+
}
328+
329+
pub fn make_random(n: usize) -> Vec<u8> {
225330
let mut rng = rand::thread_rng();
226331
let mut dest = vec![0; n];
227332
rng.fill_bytes(&mut dest);

0 commit comments

Comments
 (0)