1mod read;
4mod write;
5
6pub use read::Read;
7pub use write::Write;
8
9#[cfg(test)]
10mod tests {
11 use super::*;
12 use crate::{deterministic, Blob as _, Error, Runner, Storage};
13 use commonware_macros::test_traced;
14
15 #[test_traced]
16 fn test_read_basic() {
17 let executor = deterministic::Runner::default();
18 executor.start(|context| async move {
19 let data = b"Hello, world! This is a test.";
21 let (blob, size) = context.open("partition", b"test").await.unwrap();
22 assert_eq!(size, 0);
23 blob.write_at(data.to_vec(), 0).await.unwrap();
24 let size = data.len() as u64;
25
26 let lookahead = 10;
28 let mut reader = Read::new(blob, size, lookahead);
29
30 let mut buf = [0u8; 5];
32 reader.read_exact(&mut buf, 5).await.unwrap();
33 assert_eq!(&buf, b"Hello");
34
35 let mut buf = [0u8; 14];
37 reader.read_exact(&mut buf, 14).await.unwrap();
38 assert_eq!(&buf, b", world! This ");
39
40 assert_eq!(reader.position(), 19);
42
43 let mut buf = [0u8; 10];
45 reader.read_exact(&mut buf, 7).await.unwrap();
46 assert_eq!(&buf[..7], b"is a te");
47
48 let mut buf = [0u8; 5];
50 let result = reader.read_exact(&mut buf, 5).await;
51 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
52 });
53 }
54
55 #[test_traced]
56 #[should_panic(expected = "buffer size must be greater than zero")]
57 fn test_read_empty() {
58 let executor = deterministic::Runner::default();
59 executor.start(|context| async move {
60 let data = b"Hello, world! This is a test.";
62 let (blob, size) = context.open("partition", b"test").await.unwrap();
63 assert_eq!(size, 0);
64 blob.write_at(data.to_vec(), 0).await.unwrap();
65 let size = data.len() as u64;
66
67 let lookahead = 0;
69 Read::new(blob, size, lookahead);
70 });
71 }
72
73 #[test_traced]
74 fn test_read_cross_boundary() {
75 let executor = deterministic::Runner::default();
76 executor.start(|context| async move {
77 let data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
79 let (blob, size) = context.open("partition", b"test").await.unwrap();
80 assert_eq!(size, 0);
81 blob.write_at(data.to_vec(), 0).await.unwrap();
82 let size = data.len() as u64;
83
84 let buffer_size = 10;
86 let mut reader = Read::new(blob, size, buffer_size);
87
88 let mut buf = [0u8; 15];
90 reader.read_exact(&mut buf, 15).await.unwrap();
91 assert_eq!(&buf, b"ABCDEFGHIJKLMNO");
92
93 assert_eq!(reader.position(), 15);
95
96 let mut buf = [0u8; 11];
98 reader.read_exact(&mut buf, 11).await.unwrap();
99 assert_eq!(&buf, b"PQRSTUVWXYZ");
100
101 assert_eq!(reader.position(), 26);
103 assert_eq!(reader.blob_remaining(), 0);
104 });
105 }
106
107 #[test_traced]
108 fn test_read_with_known_size() {
109 let executor = deterministic::Runner::default();
110 executor.start(|context| async move {
111 let data = b"This is a test with known size limitations.";
113 let (blob, size) = context.open("partition", b"test").await.unwrap();
114 assert_eq!(size, 0);
115 blob.write_at(data.to_vec(), 0).await.unwrap();
116 let size = data.len() as u64;
117
118 let buffer_size = 10;
120 let mut reader = Read::new(blob, size, buffer_size);
121
122 assert_eq!(reader.blob_remaining(), size);
124
125 let mut buf = [0u8; 5];
127 reader.read_exact(&mut buf, 5).await.unwrap();
128 assert_eq!(&buf, b"This ");
129
130 assert_eq!(reader.blob_remaining(), size - 5);
132
133 let mut buf = vec![0u8; (size - 5) as usize];
135 reader
136 .read_exact(&mut buf, (size - 5) as usize)
137 .await
138 .unwrap();
139 assert_eq!(&buf, b"is a test with known size limitations.");
140
141 assert_eq!(reader.blob_remaining(), 0);
143
144 let mut buf = [0u8; 1];
146 let result = reader.read_exact(&mut buf, 1).await;
147 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
148 });
149 }
150
151 #[test_traced]
152 fn test_read_large_data() {
153 let executor = deterministic::Runner::default();
154 executor.start(|context| async move {
155 let data_size = 1024 * 256; let data = vec![0x42; data_size];
158 let (blob, size) = context.open("partition", b"test").await.unwrap();
159 assert_eq!(size, 0);
160 blob.write_at(data.clone(), 0).await.unwrap();
161 let size = data.len() as u64;
162
163 let buffer_size = 64 * 1024; let mut reader = Read::new(blob, size, buffer_size);
166
167 let mut total_read = 0;
169 let chunk_size = 8 * 1024; let mut buf = vec![0u8; chunk_size];
171
172 while total_read < data_size {
173 let to_read = std::cmp::min(chunk_size, data_size - total_read);
174 reader
175 .read_exact(&mut buf[..to_read], to_read)
176 .await
177 .unwrap();
178
179 assert!(
181 buf[..to_read].iter().all(|&b| b == 0x42),
182 "Data at position {} is not correct",
183 total_read
184 );
185
186 total_read += to_read;
187 }
188
189 assert_eq!(total_read, data_size);
191
192 let mut extra_buf = [0u8; 1];
194 let result = reader.read_exact(&mut extra_buf, 1).await;
195 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
196 });
197 }
198
199 #[test_traced]
200 fn test_read_exact_size_reads() {
201 let executor = deterministic::Runner::default();
202 executor.start(|context| async move {
203 let buffer_size = 1024;
205 let data_size = buffer_size * 5 / 2; let data = vec![0x37; data_size];
207
208 let (blob, size) = context.open("partition", b"test").await.unwrap();
209 assert_eq!(size, 0);
210 blob.write_at(data.clone(), 0).await.unwrap();
211 let size = data.len() as u64;
212
213 let mut reader = Read::new(blob, size, buffer_size);
214
215 let mut buf1 = vec![0u8; buffer_size];
217 reader.read_exact(&mut buf1, buffer_size).await.unwrap();
218 assert!(buf1.iter().all(|&b| b == 0x37));
219
220 let mut buf2 = vec![0u8; buffer_size];
222 reader.read_exact(&mut buf2, buffer_size).await.unwrap();
223 assert!(buf2.iter().all(|&b| b == 0x37));
224
225 let half_buffer = buffer_size / 2;
227 let mut buf3 = vec![0u8; half_buffer];
228 reader.read_exact(&mut buf3, half_buffer).await.unwrap();
229 assert!(buf3.iter().all(|&b| b == 0x37));
230
231 assert_eq!(reader.blob_remaining(), 0);
233 assert_eq!(reader.position(), size);
234 });
235 }
236
237 #[test_traced]
238 fn test_read_seek_to() {
239 let executor = deterministic::Runner::default();
240 executor.start(|context| async move {
241 let data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
243 let (blob, size) = context.open("partition", b"test").await.unwrap();
244 assert_eq!(size, 0);
245 blob.write_at(data.to_vec(), 0).await.unwrap();
246 let size = data.len() as u64;
247
248 let buffer_size = 10;
250 let mut reader = Read::new(blob, size, buffer_size);
251
252 let mut buf = [0u8; 5];
254 reader.read_exact(&mut buf, 5).await.unwrap();
255 assert_eq!(&buf, b"ABCDE");
256 assert_eq!(reader.position(), 5);
257
258 reader.seek_to(10).unwrap();
260 assert_eq!(reader.position(), 10);
261
262 let mut buf = [0u8; 5];
264 reader.read_exact(&mut buf, 5).await.unwrap();
265 assert_eq!(&buf, b"KLMNO");
266
267 reader.seek_to(0).unwrap();
269 assert_eq!(reader.position(), 0);
270
271 let mut buf = [0u8; 5];
272 reader.read_exact(&mut buf, 5).await.unwrap();
273 assert_eq!(&buf, b"ABCDE");
274
275 reader.seek_to(size).unwrap();
277 assert_eq!(reader.position(), size);
278
279 let mut buf = [0u8; 1];
281 let result = reader.read_exact(&mut buf, 1).await;
282 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
283
284 let result = reader.seek_to(size + 10);
286 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
287 });
288 }
289
290 #[test_traced]
291 fn test_read_seek_with_refill() {
292 let executor = deterministic::Runner::default();
293 executor.start(|context| async move {
294 let data = vec![0x41; 1000]; let (blob, size) = context.open("partition", b"test").await.unwrap();
297 assert_eq!(size, 0);
298 blob.write_at(data.clone(), 0).await.unwrap();
299 let size = data.len() as u64;
300
301 let buffer_size = 10;
303 let mut reader = Read::new(blob, size, buffer_size);
304
305 let mut buf = [0u8; 5];
307 reader.read_exact(&mut buf, 5).await.unwrap();
308
309 reader.seek_to(500).unwrap();
311
312 let mut buf = [0u8; 5];
314 reader.read_exact(&mut buf, 5).await.unwrap();
315 assert_eq!(&buf, b"AAAAA"); assert_eq!(reader.position(), 505);
317
318 reader.seek_to(100).unwrap();
320
321 let mut buf = [0u8; 5];
323 reader.read_exact(&mut buf, 5).await.unwrap();
324 assert_eq!(reader.position(), 105);
325 });
326 }
327
328 #[test_traced]
329 fn test_read_truncate() {
330 let executor = deterministic::Runner::default();
331 executor.start(|context| async move {
332 let data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
334 let (blob, size) = context.open("partition", b"test").await.unwrap();
335 assert_eq!(size, 0);
336 blob.write_at(data.to_vec(), 0).await.unwrap();
337 let data_len = data.len() as u64;
338
339 let buffer_size = 10;
341 let reader = Read::new(blob.clone(), data_len, buffer_size);
342
343 let truncate_len = data_len / 2;
345 reader.truncate(truncate_len).await.unwrap();
346
347 let (blob, size) = context.open("partition", b"test").await.unwrap();
349 assert_eq!(size, truncate_len, "Blob should be truncated to half size");
350
351 let mut new_reader = Read::new(blob, size, buffer_size);
353
354 let mut buf = vec![0u8; size as usize];
356 new_reader
357 .read_exact(&mut buf, size as usize)
358 .await
359 .unwrap();
360 assert_eq!(&buf, b"ABCDEFGHIJKLM", "Truncated content should match");
361
362 let mut extra_buf = [0u8; 1];
364 let result = new_reader.read_exact(&mut extra_buf, 1).await;
365 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
366 });
367 }
368
369 #[test_traced]
370 fn test_read_truncate_to_zero() {
371 let executor = deterministic::Runner::default();
372 executor.start(|context| async move {
373 let data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
375 let data_len = data.len() as u64;
376 let (blob, size) = context.open("partition", b"test").await.unwrap();
377 assert_eq!(size, 0);
378 blob.write_at(data.to_vec(), 0).await.unwrap();
379
380 let buffer_size = 10;
382 let reader = Read::new(blob.clone(), data_len, buffer_size);
383
384 reader.truncate(0).await.unwrap();
386
387 let (blob, size) = context.open("partition", b"test").await.unwrap();
389 assert_eq!(size, 0, "Blob should be truncated to zero");
390
391 let mut new_reader = Read::new(blob, size, buffer_size);
393
394 let mut buf = [0u8; 1];
396 let result = new_reader.read_exact(&mut buf, 1).await;
397 assert!(matches!(result, Err(Error::BlobInsufficientLength)));
398 });
399 }
400
401 #[test_traced]
402 fn test_write_basic() {
403 let executor = deterministic::Runner::default();
404 executor.start(|context| async move {
405 let (blob, size) = context.open("partition", b"write_basic").await.unwrap();
407 assert_eq!(size, 0);
408
409 let writer = Write::new(blob.clone(), 0, 8);
410 writer.write_at("hello".as_bytes(), 0).await.unwrap();
411 writer.sync().await.unwrap();
412
413 let (blob, size) = context.open("partition", b"write_basic").await.unwrap();
414 assert_eq!(size, 5);
415 let mut reader = Read::new(blob, size, 8);
416 let mut buf = [0u8; 5];
417 reader.read_exact(&mut buf, 5).await.unwrap();
418 assert_eq!(&buf, b"hello");
419 });
420 }
421
422 #[test_traced]
423 fn test_write_multiple_flushes() {
424 let executor = deterministic::Runner::default();
425 executor.start(|context| async move {
426 let (blob, size) = context.open("partition", b"write_multi").await.unwrap();
428 assert_eq!(size, 0);
429
430 let writer = Write::new(blob.clone(), 0, 4);
431 writer.write_at("abc".as_bytes(), 0).await.unwrap();
432 writer.write_at("defg".as_bytes(), 3).await.unwrap();
433 writer.sync().await.unwrap();
434
435 let (blob, size) = context.open("partition", b"write_multi").await.unwrap();
436 assert_eq!(size, 7);
437 let mut reader = Read::new(blob, size, 4);
438 let mut buf = [0u8; 7];
439 reader.read_exact(&mut buf, 7).await.unwrap();
440 assert_eq!(&buf, b"abcdefg");
441 });
442 }
443
444 #[test_traced]
445 fn test_write_large_data() {
446 let executor = deterministic::Runner::default();
447 executor.start(|context| async move {
448 let (blob, size) = context.open("partition", b"write_multi").await.unwrap();
450 assert_eq!(size, 0);
451
452 let writer = Write::new(blob.clone(), 0, 4);
453 writer.write_at("abc".as_bytes(), 0).await.unwrap();
454 writer
455 .write_at("defghijklmnopqrstuvwxyz".as_bytes(), 3)
456 .await
457 .unwrap();
458 writer.sync().await.unwrap();
459
460 let (blob, size) = context.open("partition", b"write_multi").await.unwrap();
461 assert_eq!(size, 26);
462 let mut reader = Read::new(blob, size, 4);
463 let mut buf = [0u8; 26];
464 reader.read_exact(&mut buf, 26).await.unwrap();
465 assert_eq!(&buf, b"abcdefghijklmnopqrstuvwxyz");
466 });
467 }
468
469 #[test_traced]
470 #[should_panic(expected = "buffer capacity must be greater than zero")]
471 fn test_write_empty() {
472 let executor = deterministic::Runner::default();
473 executor.start(|context| async move {
474 let (blob, size) = context.open("partition", b"write_empty").await.unwrap();
476 assert_eq!(size, 0);
477 Write::new(blob, 0, 0);
478 });
479 }
480
481 #[test_traced]
482 fn test_write_append_to_buffer() {
483 let executor = deterministic::Runner::default();
484 executor.start(|context| async move {
485 let (blob, _) = context.open("partition", b"append_buf").await.unwrap();
487 let writer = Write::new(blob.clone(), 0, 10);
488
489 writer.write_at("hello".as_bytes(), 0).await.unwrap();
491 writer.write_at(" world".as_bytes(), 5).await.unwrap();
494 writer.sync().await.unwrap();
495
496 let (blob, size) = context.open("partition", b"append_buf").await.unwrap();
497 assert_eq!(size, 11);
498 let mut reader = Read::new(blob, size, 10);
499 let mut buf = vec![0u8; 11];
500 reader.read_exact(&mut buf, 11).await.unwrap();
501 assert_eq!(&buf, b"hello world");
502 });
503 }
504
505 #[test_traced]
506 fn test_write_into_middle_of_buffer() {
507 let executor = deterministic::Runner::default();
508 executor.start(|context| async move {
509 let (blob, _) = context.open("partition", b"middle_buf").await.unwrap();
511 let writer = Write::new(blob.clone(), 0, 20);
512
513 writer.write_at("abcdefghij".as_bytes(), 0).await.unwrap();
515 writer.write_at("01234".as_bytes(), 2).await.unwrap();
517 writer.sync().await.unwrap();
518
519 let (blob, size) = context.open("partition", b"middle_buf").await.unwrap();
520 assert_eq!(size, 10); let mut reader = Read::new(blob, size, 10);
522 let mut buf = vec![0u8; 10];
523 reader.read_exact(&mut buf, 10).await.unwrap();
524 assert_eq!(&buf, b"ab01234hij");
525
526 writer.write_at("klmnopqrst".as_bytes(), 10).await.unwrap();
528 writer.write_at("wxyz".as_bytes(), 9).await.unwrap();
530 writer.sync().await.unwrap();
531
532 let (blob, size) = context.open("partition", b"middle_buf").await.unwrap();
533 assert_eq!(size, 20);
534 let mut reader = Read::new(blob, size, 20);
535 let mut buf = vec![0u8; 20];
536 reader.read_exact(&mut buf, 20).await.unwrap();
537 assert_eq!(&buf, b"ab01234hiwxyznopqrst");
538 });
539 }
540
541 #[test_traced]
542 fn test_write_before_buffer() {
543 let executor = deterministic::Runner::default();
544 executor.start(|context| async move {
545 let (blob, _) = context.open("partition", b"before_buf").await.unwrap();
547 let writer = Write::new(blob.clone(), 10, 10); writer.write_at("0123456789".as_bytes(), 10).await.unwrap();
551
552 writer.write_at("abcde".as_bytes(), 0).await.unwrap();
556 writer.sync().await.unwrap();
557
558 let (blob, size) = context.open("partition", b"before_buf").await.unwrap();
559 assert_eq!(size, 20);
564 let mut reader = Read::new(blob, size, 20);
565 let mut buf = vec![0u8; 20];
566 reader.read_exact(&mut buf, 20).await.unwrap();
567
568 let mut expected = vec![0u8; 20];
569 expected[0..5].copy_from_slice("abcde".as_bytes());
570 expected[10..20].copy_from_slice("0123456789".as_bytes());
571 assert_eq!(buf, expected);
572
573 writer.write_at("fghij".as_bytes(), 5).await.unwrap();
577 writer.sync().await.unwrap();
578
579 let (blob, size) = context.open("partition", b"before_buf").await.unwrap();
580 assert_eq!(size, 20); let mut reader = Read::new(blob, size, 20);
582 let mut buf = vec![0u8; 20];
583 reader.read_exact(&mut buf, 20).await.unwrap();
584
585 expected[0..10].copy_from_slice("abcdefghij".as_bytes());
586 assert_eq!(buf, expected);
588 });
589 }
590
591 #[test_traced]
592 fn test_write_truncate() {
593 let executor = deterministic::Runner::default();
594 executor.start(|context| async move {
595 let (blob, _) = context.open("partition", b"truncate_write").await.unwrap();
597 let writer = Write::new(blob, 0, 10);
598
599 writer.write_at("hello world".as_bytes(), 0).await.unwrap(); writer.sync().await.unwrap();
601
602 let (blob_check, size_check) =
603 context.open("partition", b"truncate_write").await.unwrap();
604 assert_eq!(size_check, 11);
605 drop(blob_check);
606
607 writer.truncate(5).await.unwrap();
609 writer.sync().await.unwrap();
610
611 let (blob, size) = context.open("partition", b"truncate_write").await.unwrap();
612 assert_eq!(size, 5);
613 let mut reader = Read::new(blob, size, 5);
614 let mut buf = vec![0u8; 5];
615 reader.read_exact(&mut buf, 5).await.unwrap();
616 assert_eq!(&buf, b"hello");
617
618 writer.write_at("X".as_bytes(), 0).await.unwrap();
645 writer.sync().await.unwrap();
646
647 let (blob, size) = context.open("partition", b"truncate_write").await.unwrap();
648 assert_eq!(size, 5); let mut reader = Read::new(blob, size, 5);
650 let mut buf = vec![0u8; 5];
651 reader.read_exact(&mut buf, 5).await.unwrap();
652 assert_eq!(&buf, b"Xello");
653
654 let (blob_zero, _) = context.open("partition", b"truncate_zero").await.unwrap();
656 let writer_zero = Write::new(blob_zero.clone(), 0, 10);
657 writer_zero
658 .write_at("some data".as_bytes(), 0)
659 .await
660 .unwrap();
661 writer_zero.sync().await.unwrap();
662 writer_zero.truncate(0).await.unwrap();
663 writer_zero.sync().await.unwrap();
664
665 let (_, size_z) = context.open("partition", b"truncate_zero").await.unwrap();
666 assert_eq!(size_z, 0);
667 });
668 }
669
670 #[test_traced]
671 fn test_write_read_at_on_writer() {
672 let executor = deterministic::Runner::default();
673 executor.start(|context| async move {
674 let (blob, _) = context.open("partition", b"read_at_writer").await.unwrap();
676 let writer = Write::new(blob.clone(), 0, 10); writer.write_at("buffered".as_bytes(), 0).await.unwrap();
680
681 let mut read_buf_vec = vec![0u8; 4];
683 read_buf_vec = writer.read_at(read_buf_vec, 0).await.unwrap();
684 assert_eq!(&read_buf_vec, b"buff");
685
686 read_buf_vec = writer.read_at(read_buf_vec, 4).await.unwrap();
688 assert_eq!(&read_buf_vec, b"ered");
689
690 let small_buf_vec = vec![0u8; 1];
692 assert!(writer.read_at(small_buf_vec, 8).await.is_err());
693
694 writer.write_at(" and flushed".as_bytes(), 8).await.unwrap();
702 writer.sync().await.unwrap(); let mut read_buf_vec_2 = vec![0u8; 4];
709 read_buf_vec_2 = writer.read_at(read_buf_vec_2, 0).await.unwrap();
710 assert_eq!(&read_buf_vec_2, b"buff");
711
712 let mut read_buf_7_vec = vec![0u8; 7];
714 read_buf_7_vec = writer.read_at(read_buf_7_vec, 13).await.unwrap();
715 assert_eq!(&read_buf_7_vec, b"flushed");
716
717 writer.write_at(" more data".as_bytes(), 20).await.unwrap();
721
722 let mut read_buf_vec_3 = vec![0u8; 5];
724 read_buf_vec_3 = writer.read_at(read_buf_vec_3, 20).await.unwrap();
725 assert_eq!(&read_buf_vec_3, b" more");
726
727 let mut combo_read_buf_vec = vec![0u8; 12];
745 combo_read_buf_vec = writer.read_at(combo_read_buf_vec, 16).await.unwrap();
746 assert_eq!(&combo_read_buf_vec, b"shed more da");
747
748 writer.sync().await.unwrap(); let (final_blob, final_size) =
751 context.open("partition", b"read_at_writer").await.unwrap();
752 assert_eq!(final_size, 30); let mut final_reader = Read::new(final_blob, final_size, 30);
754 let mut full_content = vec![0u8; 30];
755 final_reader
756 .read_exact(&mut full_content, 30)
757 .await
758 .unwrap();
759 assert_eq!(&full_content, b"buffered and flushed more data");
760 });
761 }
762
763 #[test_traced]
764 fn test_write_straddling_non_mergeable() {
765 let executor = deterministic::Runner::default();
766 executor.start(|context| async move {
767 let (blob, _) = context.open("partition", b"write_straddle").await.unwrap();
769 let writer = Write::new(blob.clone(), 0, 10); writer.write_at("0123456789".as_bytes(), 0).await.unwrap();
773 writer.write_at("abc".as_bytes(), 15).await.unwrap();
780 writer.sync().await.unwrap(); let (blob_check, size_check) =
783 context.open("partition", b"write_straddle").await.unwrap();
784 assert_eq!(size_check, 18);
788 let mut reader = Read::new(blob_check, size_check, 20);
789 let mut buf = vec![0u8; 18];
790 reader.read_exact(&mut buf, 18).await.unwrap();
791
792 let mut expected = vec![0u8; 18];
793 expected[0..10].copy_from_slice(b"0123456789");
794 expected[15..18].copy_from_slice(b"abc");
796 assert_eq!(buf, expected);
797
798 let (blob2, _) = context.open("partition", b"write_straddle2").await.unwrap();
800 let writer2 = Write::new(blob2.clone(), 0, 10);
801 writer2.write_at("0123456789".as_bytes(), 0).await.unwrap(); writer2
816 .write_at("ABCDEFGHIJKL".as_bytes(), 5)
817 .await
818 .unwrap();
819 writer2.sync().await.unwrap();
820
821 let (blob_check2, size_check2) =
822 context.open("partition", b"write_straddle2").await.unwrap();
823 assert_eq!(size_check2, 17);
824 let mut reader2 = Read::new(blob_check2, size_check2, 20);
825 let mut buf2 = vec![0u8; 17];
826 reader2.read_exact(&mut buf2, 17).await.unwrap();
827 assert_eq!(&buf2, b"01234ABCDEFGHIJKL");
828 });
829 }
830
831 #[test_traced]
832 fn test_write_close() {
833 let executor = deterministic::Runner::default();
834 executor.start(|context| async move {
835 let (blob_orig, _) = context.open("partition", b"write_close").await.unwrap();
837 let writer = Write::new(blob_orig.clone(), 0, 8);
838 writer.write_at("pending".as_bytes(), 0).await.unwrap(); writer.close().await.unwrap();
843
844 let (blob_check, size_check) = context.open("partition", b"write_close").await.unwrap();
846 assert_eq!(size_check, 7);
847 let mut reader = Read::new(blob_check, size_check, 8);
848 let mut buf = [0u8; 7];
849 reader.read_exact(&mut buf, 7).await.unwrap();
850 assert_eq!(&buf, b"pending");
851 });
852 }
853
854 #[test_traced]
855 fn test_write_direct_due_to_size() {
856 let executor = deterministic::Runner::default();
857 executor.start(|context| async move {
858 let (blob, _) = context
859 .open("partition", b"write_direct_size")
860 .await
861 .unwrap();
862 let writer = Write::new(blob.clone(), 0, 5);
864
865 let data_large = b"0123456789";
867 writer.write_at(data_large.as_slice(), 0).await.unwrap();
868 writer.sync().await.unwrap();
873
874 let (blob_check, size_check) = context
875 .open("partition", b"write_direct_size")
876 .await
877 .unwrap();
878 assert_eq!(size_check, 10);
879 let mut reader = Read::new(blob_check, size_check, 10);
880 let mut buf = vec![0u8; 10];
881 reader.read_exact(&mut buf, 10).await.unwrap();
882 assert_eq!(&buf, data_large.as_slice());
883
884 writer.write_at(b"abc".as_slice(), 10).await.unwrap(); let mut read_small_buf_vec = vec![0u8; 3];
888 read_small_buf_vec = writer.read_at(read_small_buf_vec, 10).await.unwrap();
889 assert_eq!(&read_small_buf_vec, b"abc".as_slice());
890
891 writer.sync().await.unwrap();
892 let (blob_check2, size_check2) = context
893 .open("partition", b"write_direct_size")
894 .await
895 .unwrap();
896 assert_eq!(size_check2, 13);
897 let mut reader2 = Read::new(blob_check2, size_check2, 13);
898 let mut buf2 = vec![0u8; 13];
899 reader2.read_exact(&mut buf2, 13).await.unwrap();
900 assert_eq!(&buf2[10..], b"abc".as_slice());
901 });
902 }
903
904 #[test_traced]
905 fn test_write_overwrite_and_extend_in_buffer() {
906 let executor = deterministic::Runner::default();
907 executor.start(|context| async move {
908 let (blob, _) = context
909 .open("partition", b"overwrite_extend_buf")
910 .await
911 .unwrap();
912 let writer = Write::new(blob.clone(), 0, 15); writer.write_at("0123456789".as_bytes(), 0).await.unwrap();
916 writer.write_at("ABCDEFGHIJ".as_bytes(), 5).await.unwrap();
930
931 let mut read_buf_vec = vec![0u8; 15];
933 read_buf_vec = writer.read_at(read_buf_vec, 0).await.unwrap();
934 assert_eq!(&read_buf_vec, b"01234ABCDEFGHIJ".as_slice());
935
936 writer.sync().await.unwrap();
937
938 let (blob_check, size_check) = context
939 .open("partition", b"overwrite_extend_buf")
940 .await
941 .unwrap();
942 assert_eq!(size_check, 15);
943 let mut reader = Read::new(blob_check, size_check, 15);
944 let mut final_buf = vec![0u8; 15];
945 reader.read_exact(&mut final_buf, 15).await.unwrap();
946 assert_eq!(&final_buf, b"01234ABCDEFGHIJ".as_slice());
947 });
948 }
949}