@@ -13,10 +13,15 @@ fn write_op_works() {
13
13
} ;
14
14
let result = test. execute ( ) ;
15
15
16
+ // Every write must be the correct size
16
17
for w in & result. requested_writes {
17
18
assert_eq ! ( w. len( ) , test. buf_size) ;
18
19
}
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
20
25
assert_eq ! (
21
26
& result. events,
22
27
& [
@@ -46,10 +51,8 @@ fn write_op_works() {
46
51
47
52
#[ rstest]
48
53
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 ,
53
56
) {
54
57
let test = WriteTest {
55
58
buf_size,
@@ -66,48 +69,109 @@ fn write_misaligned_file_works(
66
69
assert_eq ! ( & result. disk[ ..test. file_size] , & result. file) ;
67
70
}
68
71
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
+ }
75
102
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 ,
78
115
} ;
116
+ let result = test. execute ( ) ;
79
117
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) ;
86
126
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 ( ( ) ) ) ;
88
137
}
89
138
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] ;
94
151
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 ,
97
158
} ;
159
+ let result = test. execute ( ) ;
98
160
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 ) ) ;
101
162
}
102
- */
163
+
103
164
/// Helpers for these tests. These go in their own little module to enforce
104
165
/// visibility.
105
166
mod helpers {
106
- use std:: io:: * ;
167
+ use std:: io:: { self , Cursor , Read , Write } ;
107
168
108
169
use rand:: RngCore ;
109
170
110
- use super :: { ipc:: StatusMessage , CompressionFormat , WriteOp } ;
171
+ use super :: {
172
+ ipc:: { ErrorType , StatusMessage } ,
173
+ CompressionFormat , VerifyOp , WriteOp ,
174
+ } ;
111
175
112
176
/// Wraps an in-memory buffer and logs every single chunk of data written to it.
113
177
struct MockWrite < ' a > {
@@ -127,7 +191,7 @@ mod helpers {
127
191
}
128
192
129
193
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 > {
131
195
assert ! (
132
196
buf. len( ) % self . enforced_block_size == 0 ,
133
197
"Received a write (size {}) that was not aligned to block (size {})!" ,
@@ -138,7 +202,7 @@ mod helpers {
138
202
self . cursor . write ( buf)
139
203
}
140
204
141
- fn flush ( & mut self ) -> Result < ( ) > {
205
+ fn flush ( & mut self ) -> io :: Result < ( ) > {
142
206
self . cursor . flush ( )
143
207
}
144
208
}
@@ -161,7 +225,7 @@ mod helpers {
161
225
}
162
226
163
227
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 > {
165
229
if let Some ( bs) = & self . enforced_block_size {
166
230
assert ! (
167
231
buf. len( ) % bs == 0 ,
@@ -208,7 +272,7 @@ mod helpers {
208
272
disk_block_size : 8 ,
209
273
checkpoint_period : 16 ,
210
274
}
211
- . write ( |e| events. push ( e) )
275
+ . execute ( |e| events. push ( e) )
212
276
. unwrap ( ) ;
213
277
214
278
WriteTestResult {
@@ -221,7 +285,48 @@ mod helpers {
221
285
}
222
286
}
223
287
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 > {
225
330
let mut rng = rand:: thread_rng ( ) ;
226
331
let mut dest = vec ! [ 0 ; n] ;
227
332
rng. fill_bytes ( & mut dest) ;
0 commit comments