1use crate::error::{Layer, UnexpectedEndOfSliceError, VerboseDecodeError};
2
3use super::{ArrayDimensions, RawF128, RawF16, Scaling};
4
5pub(crate) struct FieldSlicer<'a> {
7 rest: &'a [u8],
9
10 offset: usize,
12}
13
14impl<'a> FieldSlicer<'a> {
15 #[inline]
16 pub fn new(data: &'a [u8], offset: usize) -> FieldSlicer<'a> {
17 FieldSlicer { rest: data, offset }
18 }
19
20 #[inline]
21 pub fn rest(&self) -> &'a [u8] {
22 self.rest
23 }
24
25 pub fn read_u8(&mut self) -> Result<u8, VerboseDecodeError> {
26 use VerboseDecodeError::*;
27
28 if self.rest.is_empty() {
30 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
31 layer: Layer::VerboseValue,
32 minimum_size: self.offset + 1,
33 actual_size: self.offset + self.rest.len(),
34 }));
35 }
36
37 let result = unsafe { *self.rest.get_unchecked(0) };
39
40 self.rest =
43 unsafe { core::slice::from_raw_parts(self.rest.as_ptr().add(1), self.rest.len() - 1) };
44 self.offset += 1;
45
46 Ok(result)
47 }
48
49 pub fn read_i8(&mut self) -> Result<i8, VerboseDecodeError> {
50 Ok(i8::from_ne_bytes([self.read_u8()?]))
51 }
52
53 pub fn read_2bytes(&mut self) -> Result<[u8; 2], VerboseDecodeError> {
54 use VerboseDecodeError::*;
55
56 if self.rest.len() < 2 {
58 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
59 layer: Layer::VerboseValue,
60 minimum_size: self.offset + 2,
61 actual_size: self.offset + self.rest.len(),
62 }));
63 }
64
65 let result = unsafe { [*self.rest.get_unchecked(0), *self.rest.get_unchecked(1)] };
68
69 self.rest =
72 unsafe { core::slice::from_raw_parts(self.rest.as_ptr().add(2), self.rest.len() - 2) };
73 self.offset += 2;
74
75 Ok(result)
76 }
77
78 pub fn read_4bytes(&mut self) -> Result<[u8; 4], VerboseDecodeError> {
79 use VerboseDecodeError::*;
80
81 if self.rest.len() < 4 {
83 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
84 layer: Layer::VerboseValue,
85 minimum_size: self.offset + 4,
86 actual_size: self.offset + self.rest.len(),
87 }));
88 }
89
90 let result = unsafe {
93 [
94 *self.rest.get_unchecked(0),
95 *self.rest.get_unchecked(1),
96 *self.rest.get_unchecked(2),
97 *self.rest.get_unchecked(3),
98 ]
99 };
100
101 self.rest =
104 unsafe { core::slice::from_raw_parts(self.rest.as_ptr().add(4), self.rest.len() - 4) };
105 self.offset += 4;
106
107 Ok(result)
108 }
109
110 pub fn read_8bytes(&mut self) -> Result<[u8; 8], VerboseDecodeError> {
111 use VerboseDecodeError::*;
112
113 if self.rest.len() < 8 {
115 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
116 layer: Layer::VerboseValue,
117 minimum_size: self.offset + 8,
118 actual_size: self.offset + self.rest.len(),
119 }));
120 }
121
122 let result = unsafe {
125 [
126 *self.rest.get_unchecked(0),
127 *self.rest.get_unchecked(1),
128 *self.rest.get_unchecked(2),
129 *self.rest.get_unchecked(3),
130 *self.rest.get_unchecked(4),
131 *self.rest.get_unchecked(5),
132 *self.rest.get_unchecked(6),
133 *self.rest.get_unchecked(7),
134 ]
135 };
136
137 self.rest =
140 unsafe { core::slice::from_raw_parts(self.rest.as_ptr().add(8), self.rest.len() - 8) };
141 self.offset += 8;
142
143 Ok(result)
144 }
145
146 pub fn read_16bytes(&mut self) -> Result<[u8; 16], VerboseDecodeError> {
147 use VerboseDecodeError::*;
148
149 if self.rest.len() < 16 {
151 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
152 layer: Layer::VerboseValue,
153 minimum_size: self.offset + 16,
154 actual_size: self.offset + self.rest.len(),
155 }));
156 }
157
158 let result = unsafe {
161 [
162 *self.rest.get_unchecked(0),
163 *self.rest.get_unchecked(1),
164 *self.rest.get_unchecked(2),
165 *self.rest.get_unchecked(3),
166 *self.rest.get_unchecked(4),
167 *self.rest.get_unchecked(5),
168 *self.rest.get_unchecked(6),
169 *self.rest.get_unchecked(7),
170 *self.rest.get_unchecked(8),
171 *self.rest.get_unchecked(9),
172 *self.rest.get_unchecked(10),
173 *self.rest.get_unchecked(11),
174 *self.rest.get_unchecked(12),
175 *self.rest.get_unchecked(13),
176 *self.rest.get_unchecked(14),
177 *self.rest.get_unchecked(15),
178 ]
179 };
180
181 self.rest = unsafe {
184 core::slice::from_raw_parts(self.rest.as_ptr().add(16), self.rest.len() - 16)
185 };
186 self.offset += 16;
187
188 Ok(result)
189 }
190
191 pub fn read_u16(&mut self, is_big_endian: bool) -> Result<u16, VerboseDecodeError> {
192 self.read_2bytes().map(|bytes| {
193 if is_big_endian {
194 u16::from_be_bytes(bytes)
195 } else {
196 u16::from_le_bytes(bytes)
197 }
198 })
199 }
200
201 pub fn read_i16(&mut self, is_big_endian: bool) -> Result<i16, VerboseDecodeError> {
202 self.read_2bytes().map(|bytes| {
203 if is_big_endian {
204 i16::from_be_bytes(bytes)
205 } else {
206 i16::from_le_bytes(bytes)
207 }
208 })
209 }
210
211 pub fn read_u32(&mut self, is_big_endian: bool) -> Result<u32, VerboseDecodeError> {
212 self.read_4bytes().map(|bytes| {
213 if is_big_endian {
214 u32::from_be_bytes(bytes)
215 } else {
216 u32::from_le_bytes(bytes)
217 }
218 })
219 }
220
221 pub fn read_i32(&mut self, is_big_endian: bool) -> Result<i32, VerboseDecodeError> {
222 self.read_4bytes().map(|bytes| {
223 if is_big_endian {
224 i32::from_be_bytes(bytes)
225 } else {
226 i32::from_le_bytes(bytes)
227 }
228 })
229 }
230
231 pub fn read_u64(&mut self, is_big_endian: bool) -> Result<u64, VerboseDecodeError> {
232 self.read_8bytes().map(|bytes| {
233 if is_big_endian {
234 u64::from_be_bytes(bytes)
235 } else {
236 u64::from_le_bytes(bytes)
237 }
238 })
239 }
240
241 pub fn read_i64(&mut self, is_big_endian: bool) -> Result<i64, VerboseDecodeError> {
242 self.read_8bytes().map(|bytes| {
243 if is_big_endian {
244 i64::from_be_bytes(bytes)
245 } else {
246 i64::from_le_bytes(bytes)
247 }
248 })
249 }
250
251 pub fn read_u128(&mut self, is_big_endian: bool) -> Result<u128, VerboseDecodeError> {
252 self.read_16bytes().map(|bytes| {
253 if is_big_endian {
254 u128::from_be_bytes(bytes)
255 } else {
256 u128::from_le_bytes(bytes)
257 }
258 })
259 }
260
261 pub fn read_i128(&mut self, is_big_endian: bool) -> Result<i128, VerboseDecodeError> {
262 self.read_16bytes().map(|bytes| {
263 if is_big_endian {
264 i128::from_be_bytes(bytes)
265 } else {
266 i128::from_le_bytes(bytes)
267 }
268 })
269 }
270
271 pub fn read_f16(&mut self, is_big_endian: bool) -> Result<RawF16, VerboseDecodeError> {
272 self.read_u16(is_big_endian).map(RawF16::from_bits)
273 }
274
275 pub fn read_f128(&mut self, is_big_endian: bool) -> Result<RawF128, VerboseDecodeError> {
276 self.read_u128(is_big_endian).map(RawF128::from_bits)
277 }
278
279 pub fn read_f32(&mut self, is_big_endian: bool) -> Result<f32, VerboseDecodeError> {
280 self.read_4bytes().map(|bytes| {
281 if is_big_endian {
282 f32::from_be_bytes(bytes)
283 } else {
284 f32::from_le_bytes(bytes)
285 }
286 })
287 }
288
289 pub fn read_f64(&mut self, is_big_endian: bool) -> Result<f64, VerboseDecodeError> {
290 self.read_8bytes().map(|bytes| {
291 if is_big_endian {
292 f64::from_be_bytes(bytes)
293 } else {
294 f64::from_le_bytes(bytes)
295 }
296 })
297 }
298
299 pub fn read_var_name(&mut self, is_big_endian: bool) -> Result<&'a str, VerboseDecodeError> {
300 use VerboseDecodeError::*;
301
302 if self.rest.len() < 2 {
304 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
305 layer: Layer::VerboseValue,
306 minimum_size: self.offset + 2,
307 actual_size: self.offset + self.rest.len(),
308 }));
309 }
310
311 let name_length = {
313 let bytes = unsafe { [*self.rest.get_unchecked(0), *self.rest.get_unchecked(1)] };
315 if is_big_endian {
316 u16::from_be_bytes(bytes) as usize
317 } else {
318 u16::from_le_bytes(bytes) as usize
319 }
320 };
321
322 let total_size = 2 + name_length;
324 if self.rest.len() < total_size {
325 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
326 layer: Layer::VerboseValue,
327 minimum_size: self.offset + total_size,
328 actual_size: self.offset + self.rest.len(),
329 }));
330 }
331
332 let name = if name_length > 0 {
334 let name_raw = unsafe {
337 core::slice::from_raw_parts(
338 self.rest.as_ptr().add(2),
339 name_length - 1,
341 )
342 };
343 let last = unsafe { *self.rest.as_ptr().add(2 + name_length - 1) };
346
347 if last != 0 {
349 return Err(VariableNameStringMissingNullTermination);
350 }
351
352 core::str::from_utf8(name_raw)?
353 } else {
354 ""
355 };
356
357 self.rest = unsafe {
360 core::slice::from_raw_parts(
361 self.rest.as_ptr().add(total_size),
362 self.rest.len() - total_size,
363 )
364 };
365 self.offset += total_size;
366
367 Ok(name)
368 }
369
370 pub fn read_var_name_and_unit(
371 &mut self,
372 is_big_endian: bool,
373 ) -> Result<(&'a str, &'a str), VerboseDecodeError> {
374 use VerboseDecodeError::*;
375
376 if self.rest.len() < 4 {
378 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
379 layer: Layer::VerboseValue,
380 minimum_size: self.offset + 4,
381 actual_size: self.offset + self.rest.len(),
382 }));
383 }
384
385 let name_length = {
387 let bytes = unsafe { [*self.rest.get_unchecked(0), *self.rest.get_unchecked(1)] };
389 if is_big_endian {
390 u16::from_be_bytes(bytes) as usize
391 } else {
392 u16::from_le_bytes(bytes) as usize
393 }
394 };
395 let unit_length = {
396 let bytes = unsafe { [*self.rest.get_unchecked(2), *self.rest.get_unchecked(3)] };
398 if is_big_endian {
399 u16::from_be_bytes(bytes) as usize
400 } else {
401 u16::from_le_bytes(bytes) as usize
402 }
403 };
404
405 let total_size = 4 + name_length + unit_length;
407 if self.rest.len() < total_size {
408 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
409 layer: Layer::VerboseValue,
410 minimum_size: self.offset + total_size,
411 actual_size: self.offset + self.rest.len(),
412 }));
413 }
414
415 let name = if name_length > 0 {
417 let name_raw = unsafe {
420 core::slice::from_raw_parts(
421 self.rest.as_ptr().add(4),
422 name_length - 1,
424 )
425 };
426 let last = unsafe { *self.rest.as_ptr().add(4 + name_length - 1) };
429
430 if last != 0 {
432 return Err(VariableNameStringMissingNullTermination);
433 }
434
435 core::str::from_utf8(name_raw)?
436 } else {
437 ""
438 };
439
440 let unit = if unit_length > 0 {
442 let unit_raw = unsafe {
445 core::slice::from_raw_parts(
446 self.rest.as_ptr().add(4 + name_length),
447 unit_length - 1,
449 )
450 };
451 let last = unsafe { *self.rest.as_ptr().add(4 + name_length + unit_length - 1) };
454
455 if last != 0 {
457 return Err(VariableUnitStringMissingNullTermination);
458 }
459
460 core::str::from_utf8(unit_raw)?
461 } else {
462 ""
463 };
464
465 self.rest = unsafe {
468 core::slice::from_raw_parts(
469 self.rest.as_ptr().add(total_size),
470 self.rest.len() - total_size,
471 )
472 };
473 self.offset += total_size;
474
475 Ok((name, unit))
477 }
478
479 pub fn read_raw(&mut self, len: usize) -> Result<&'a [u8], VerboseDecodeError> {
480 use VerboseDecodeError::*;
481
482 if self.rest.len() < len {
484 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
485 layer: Layer::VerboseValue,
486 minimum_size: self.offset + len,
487 actual_size: self.offset + self.rest.len(),
488 }));
489 }
490
491 let result = unsafe { core::slice::from_raw_parts(self.rest.as_ptr(), len) };
493
494 self.rest = unsafe {
496 core::slice::from_raw_parts(self.rest.as_ptr().add(len), self.rest.len() - len)
497 };
498 self.offset += len;
499
500 Ok(result)
501 }
502
503 const FIXED_POINT_FLAG_1: u8 = 0b0001_0000;
504
505 pub fn read_i32_scaling(
506 &mut self,
507 is_big_endian: bool,
508 type_info: [u8; 4],
509 ) -> Result<Option<Scaling<i32>>, VerboseDecodeError> {
510 if 0 != type_info[1] & Self::FIXED_POINT_FLAG_1 {
511 Ok(Some(Scaling {
512 quantization: self.read_f32(is_big_endian)?,
513 offset: self.read_i32(is_big_endian)?,
514 }))
515 } else {
516 Ok(None)
517 }
518 }
519
520 pub fn read_i64_scaling(
521 &mut self,
522 is_big_endian: bool,
523 type_info: [u8; 4],
524 ) -> Result<Option<Scaling<i64>>, VerboseDecodeError> {
525 if 0 != type_info[1] & Self::FIXED_POINT_FLAG_1 {
526 Ok(Some(Scaling {
527 quantization: self.read_f32(is_big_endian)?,
528 offset: self.read_i64(is_big_endian)?,
529 }))
530 } else {
531 Ok(None)
532 }
533 }
534
535 pub fn read_i128_scaling(
536 &mut self,
537 is_big_endian: bool,
538 type_info: [u8; 4],
539 ) -> Result<Option<Scaling<i128>>, VerboseDecodeError> {
540 if 0 != type_info[1] & Self::FIXED_POINT_FLAG_1 {
541 Ok(Some(Scaling {
542 quantization: self.read_f32(is_big_endian)?,
543 offset: self.read_i128(is_big_endian)?,
544 }))
545 } else {
546 Ok(None)
547 }
548 }
549
550 pub fn read_array_dimesions(
551 &mut self,
552 is_big_endian: bool,
553 ) -> Result<ArrayDimensions<'a>, VerboseDecodeError> {
554 use VerboseDecodeError::*;
555
556 let num_dims = self.read_u16(is_big_endian)?;
558
559 let len = usize::from(num_dims) * 2;
561 if self.rest.len() < len {
562 return Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError {
563 layer: Layer::VerboseTypeInfo,
564 minimum_size: self.offset + len,
565 actual_size: self.offset + self.rest.len(),
566 }));
567 }
568
569 let result = ArrayDimensions {
571 is_big_endian,
572 dimensions: unsafe { core::slice::from_raw_parts(self.rest.as_ptr(), len) },
573 };
574
575 self.rest = unsafe {
577 core::slice::from_raw_parts(self.rest.as_ptr().add(len), self.rest.len() - len)
578 };
579 self.offset += len;
580
581 Ok(result)
582 }
583}
584
585#[cfg(test)]
586mod test_field_slicer {
587 use super::*;
588 use alloc::vec::Vec;
589 use proptest::collection::vec;
590 use proptest::prelude::*;
591 use std::format;
592
593 proptest! {
594 #[test]
595 fn new(
596 data in prop::collection::vec(any::<u8>(), 0..10),
597 offset in any::<usize>()
598 ) {
599 let s = FieldSlicer::new(
600 &data,
601 offset
602 );
603 prop_assert_eq!(s.rest(), &data);
604 prop_assert_eq!(s.offset, offset);
605 }
606 }
607
608 proptest! {
609 #[test]
610 fn read_2bytes(
611 value in any::<[u8;2]>(),
612 slice_len in 2usize..4,
613 offset in 0usize..usize::MAX-1,
614 bad_len in 0usize..2,
615 ) {
616 {
618 let data = [value[0], value[1], 1, 2];
619 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
620 prop_assert_eq!(
621 slicer.read_2bytes(),
622 Ok(value)
623 );
624 prop_assert_eq!(slicer.offset, offset + 2);
625 prop_assert_eq!(slicer.rest, &[1,2][..slice_len - 2]);
626 }
627
628 {
630 let mut slicer = FieldSlicer::new(&value[..bad_len], offset);
631 prop_assert_eq!(
632 slicer.read_2bytes(),
633 Err(VerboseDecodeError::UnexpectedEndOfSlice(
634 UnexpectedEndOfSliceError{
635 layer: Layer::VerboseValue,
636 actual_size: offset + bad_len,
637 minimum_size: offset + 2,
638 }
639 ))
640 );
641 prop_assert_eq!(slicer.offset, offset);
642 prop_assert_eq!(slicer.rest, &value[..bad_len]);
643 }
644 }
645 }
646
647 proptest! {
648 #[test]
649 fn read_4bytes(
650 value in any::<[u8;4]>(),
651 slice_len in 4usize..8,
652 offset in 0usize..usize::MAX-3,
653 bad_len in 0usize..4,
654 ) {
655 {
657 let data = [value[0], value[1], value[2], value[3], 1, 2, 3, 4];
658 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
659 prop_assert_eq!(
660 slicer.read_4bytes(),
661 Ok(value)
662 );
663 prop_assert_eq!(slicer.offset, offset + 4);
664 prop_assert_eq!(slicer.rest, &[1,2,3,4][..slice_len - 4]);
665 }
666
667 {
669 let mut slicer = FieldSlicer::new(&value[..bad_len], offset);
670 prop_assert_eq!(
671 slicer.read_4bytes(),
672 Err(VerboseDecodeError::UnexpectedEndOfSlice(
673 UnexpectedEndOfSliceError{
674 layer: Layer::VerboseValue,
675 actual_size: offset + bad_len,
676 minimum_size: offset + 4,
677 }
678 ))
679 );
680 prop_assert_eq!(slicer.offset, offset);
681 prop_assert_eq!(slicer.rest, &value[..bad_len]);
682 }
683 }
684 }
685
686 proptest! {
687 #[test]
688 fn read_8bytes(
689 value in any::<[u8;8]>(),
690 slice_len in 8usize..16,
691 offset in 0usize..usize::MAX-7,
692 bad_len in 0usize..8,
693 ) {
694 {
696 let data = [value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], 1, 2, 3, 4, 5, 6, 7, 8];
697 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
698 prop_assert_eq!(
699 slicer.read_8bytes(),
700 Ok(value)
701 );
702 prop_assert_eq!(slicer.offset, offset + 8);
703 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8][..slice_len - 8]);
704 }
705
706 {
708 let mut slicer = FieldSlicer::new(&value[..bad_len], offset);
709 prop_assert_eq!(
710 slicer.read_8bytes(),
711 Err(VerboseDecodeError::UnexpectedEndOfSlice(
712 UnexpectedEndOfSliceError{
713 layer: Layer::VerboseValue,
714 actual_size: offset + bad_len,
715 minimum_size: offset + 8,
716 }
717 ))
718 );
719 prop_assert_eq!(slicer.offset, offset);
720 prop_assert_eq!(slicer.rest, &value[..bad_len]);
721 }
722 }
723 }
724
725 proptest! {
726 #[test]
727 fn read_16bytes(
728 value in any::<[u8;16]>(),
729 slice_len in 16usize..32,
730 offset in 0usize..usize::MAX-15,
731 bad_len in 0usize..16,
732 ) {
733 {
735 let data = [value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8], value[9], value[10], value[11], value[12], value[13], value[14], value[15], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
736 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
737 prop_assert_eq!(
738 slicer.read_16bytes(),
739 Ok(value)
740 );
741 prop_assert_eq!(slicer.offset, offset + 16);
742 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16][..slice_len - 16]);
743 }
744
745 {
747 let mut slicer = FieldSlicer::new(&value[..bad_len], offset);
748 prop_assert_eq!(
749 slicer.read_16bytes(),
750 Err(VerboseDecodeError::UnexpectedEndOfSlice(
751 UnexpectedEndOfSliceError{
752 layer: Layer::VerboseValue,
753 actual_size: offset + bad_len,
754 minimum_size: offset + 16,
755 }
756 ))
757 );
758 prop_assert_eq!(slicer.offset, offset);
759 prop_assert_eq!(slicer.rest, &value[..bad_len]);
760 }
761 }
762 }
763
764 proptest! {
765 #[test]
766 fn read_u8(
767 value in any::<u8>(),
768 slice_len in 1usize..3,
769 offset in 0usize..usize::MAX,
770 ) {
771 {
773 let data = [value, 123, 234];
774 let mut slicer = FieldSlicer{
775 rest: &data[..slice_len],
776 offset,
777 };
778 prop_assert_eq!(
779 slicer.read_u8(),
780 Ok(value)
781 );
782 prop_assert_eq!(slicer.rest, &data[1..slice_len]);
783 prop_assert_eq!(slicer.offset, offset + 1);
784 }
785 {
787 let mut slicer = FieldSlicer{
788 rest: &[],
789 offset,
790 };
791 prop_assert_eq!(
792 slicer.read_u8(),
793 Err(VerboseDecodeError::UnexpectedEndOfSlice(
794 UnexpectedEndOfSliceError{
795 layer: Layer::VerboseValue,
796 actual_size: offset,
797 minimum_size: offset + 1,
798 }
799 ))
800 );
801 }
802 }
803 }
804
805 proptest! {
806 #[test]
807 fn read_i8(
808 value in any::<i8>(),
809 slice_len in 1usize..3,
810 offset in 0usize..usize::MAX,
811 ) {
812 {
814 let data = [value as u8, i8::MIN as u8, i8::MAX as u8];
815 let mut slicer = FieldSlicer{
816 rest: &data[..slice_len],
817 offset,
818 };
819 prop_assert_eq!(
820 slicer.read_i8(),
821 Ok(value)
822 );
823 prop_assert_eq!(slicer.rest, &data[1..slice_len]);
824 prop_assert_eq!(slicer.offset, offset + 1);
825 }
826 {
828 let mut slicer = FieldSlicer{
829 rest: &[],
830 offset,
831 };
832 prop_assert_eq!(
833 slicer.read_i8(),
834 Err(VerboseDecodeError::UnexpectedEndOfSlice(
835 UnexpectedEndOfSliceError{
836 layer: Layer::VerboseValue,
837 actual_size: offset,
838 minimum_size: offset + 1,
839 }
840 ))
841 );
842 }
843 }
844 }
845
846 proptest! {
847 #[test]
848 fn read_u16(
849 value in any::<u16>(),
850 slice_len in 2usize..4,
851 offset in 0usize..usize::MAX-1,
852 bad_len in 0usize..2
853 ) {
854
855 {
857 let value_be = value.to_be_bytes();
858 let data = [value_be[0], value_be[1], 1, 2,];
859 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
860 prop_assert_eq!(
861 slicer.read_u16(true),
862 Ok(value)
863 );
864 prop_assert_eq!(slicer.offset, offset + 2);
865 prop_assert_eq!(slicer.rest, &[1,2][..slice_len - 2]);
866 }
867 {
869 let value_le = value.to_le_bytes();
870 let data = [
871 value_le[0], value_le[1], 1, 2,
872 ];
873 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
874 prop_assert_eq!(
875 slicer.read_u16(false),
876 Ok(value)
877 );
878 prop_assert_eq!(slicer.offset, offset + 2);
879 prop_assert_eq!(slicer.rest, &[1,2][..slice_len - 2]);
880 }
881
882 {
884 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
885 UnexpectedEndOfSliceError{
886 layer: Layer::VerboseValue,
887 actual_size: offset + bad_len,
888 minimum_size: offset + 2,
889 }
890 ));
891 let data = value.to_le_bytes();
892 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
893
894 prop_assert_eq!(slicer.read_u16(false), expected.clone());
896 prop_assert_eq!(slicer.offset, offset);
897 prop_assert_eq!(slicer.rest, &data[..bad_len]);
898
899 prop_assert_eq!(slicer.read_u16(true), expected);
901 prop_assert_eq!(slicer.offset, offset);
902 prop_assert_eq!(slicer.rest, &data[..bad_len]);
903 }
904 }
905 }
906
907 proptest! {
908 #[test]
909 fn read_i16(
910 value in any::<i16>(),
911 slice_len in 2usize..4,
912 offset in 0usize..usize::MAX-1,
913 bad_len in 0usize..2
914 ) {
915
916 {
918 let value_be = value.to_be_bytes();
919 let data = [value_be[0], value_be[1], 1, 2];
920 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
921 prop_assert_eq!(
922 slicer.read_i16(true),
923 Ok(value)
924 );
925 prop_assert_eq!(slicer.offset, offset + 2);
926 prop_assert_eq!(slicer.rest, &[1,2][..slice_len - 2]);
927 }
928 {
930 let value_le = value.to_le_bytes();
931 let data = [
932 value_le[0], value_le[1], 1, 2,
933 ];
934 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
935 prop_assert_eq!(
936 slicer.read_i16(false),
937 Ok(value)
938 );
939 prop_assert_eq!(slicer.offset, offset + 2);
940 prop_assert_eq!(slicer.rest, &[1,2][..slice_len - 2]);
941 }
942
943 {
945 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
946 UnexpectedEndOfSliceError{
947 layer: Layer::VerboseValue,
948 actual_size: offset + bad_len,
949 minimum_size: offset + 2,
950 }
951 ));
952 let data = value.to_le_bytes();
953 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
954
955 prop_assert_eq!(slicer.read_i16(false), expected.clone());
957 prop_assert_eq!(slicer.offset, offset);
958 prop_assert_eq!(slicer.rest, &data[..bad_len]);
959
960 prop_assert_eq!(slicer.read_i16(true), expected);
962 prop_assert_eq!(slicer.offset, offset);
963 prop_assert_eq!(slicer.rest, &data[..bad_len]);
964 }
965 }
966 }
967
968 proptest! {
969 #[test]
970 fn read_u32(
971 value in any::<u32>(),
972 slice_len in 4usize..8,
973 offset in 0usize..usize::MAX-3,
974 bad_len in 0usize..4
975 ) {
976
977 {
979 let value_be = value.to_be_bytes();
980 let data = [value_be[0], value_be[1], value_be[2], value_be[3], 1, 2, 3, 4];
981 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
982 prop_assert_eq!(
983 slicer.read_u32(true),
984 Ok(value)
985 );
986 prop_assert_eq!(slicer.offset, offset + 4);
987 prop_assert_eq!(slicer.rest, &[1,2,3,4][..slice_len - 4]);
988 }
989 {
991 let value_le = value.to_le_bytes();
992 let data = [
993 value_le[0], value_le[1], value_le[2], value_le[3], 1, 2, 3, 4
994 ];
995 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
996 prop_assert_eq!(
997 slicer.read_u32(false),
998 Ok(value)
999 );
1000 prop_assert_eq!(slicer.offset, offset + 4);
1001 prop_assert_eq!(slicer.rest, &[1,2,3,4][..slice_len - 4]);
1002 }
1003
1004 {
1006 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1007 UnexpectedEndOfSliceError{
1008 layer: Layer::VerboseValue,
1009 actual_size: offset + bad_len,
1010 minimum_size: offset + 4,
1011 }
1012 ));
1013 let data = value.to_le_bytes();
1014 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1015
1016 prop_assert_eq!(slicer.read_u32(false), expected.clone());
1018 prop_assert_eq!(slicer.offset, offset);
1019 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1020
1021 prop_assert_eq!(slicer.read_u32(true), expected);
1023 prop_assert_eq!(slicer.offset, offset);
1024 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1025 }
1026 }
1027 }
1028
1029 proptest! {
1030 #[test]
1031 fn read_i32(
1032 value in any::<i32>(),
1033 slice_len in 4usize..8,
1034 offset in 0usize..usize::MAX-3,
1035 bad_len in 0usize..4
1036 ) {
1037
1038 {
1040 let value_be = value.to_be_bytes();
1041 let data = [value_be[0], value_be[1], value_be[2], value_be[3], 1, 2, 3, 4];
1042 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1043 prop_assert_eq!(
1044 slicer.read_i32(true),
1045 Ok(value)
1046 );
1047 prop_assert_eq!(slicer.offset, offset + 4);
1048 prop_assert_eq!(slicer.rest, &[1,2,3,4][..slice_len - 4]);
1049 }
1050 {
1052 let value_le = value.to_le_bytes();
1053 let data = [
1054 value_le[0], value_le[1], value_le[2], value_le[3], 1, 2, 3, 4
1055 ];
1056 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1057 prop_assert_eq!(
1058 slicer.read_i32(false),
1059 Ok(value)
1060 );
1061 prop_assert_eq!(slicer.offset, offset + 4);
1062 prop_assert_eq!(slicer.rest, &[1,2,3,4][..slice_len - 4]);
1063 }
1064
1065 {
1067 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1068 UnexpectedEndOfSliceError{
1069 layer: Layer::VerboseValue,
1070 actual_size: offset + bad_len,
1071 minimum_size: offset + 4,
1072 }
1073 ));
1074 let data = value.to_le_bytes();
1075 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1076
1077 prop_assert_eq!(slicer.read_i32(false), expected.clone());
1079 prop_assert_eq!(slicer.offset, offset);
1080 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1081
1082 prop_assert_eq!(slicer.read_i32(true), expected);
1084 prop_assert_eq!(slicer.offset, offset);
1085 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1086 }
1087 }
1088 }
1089
1090 proptest! {
1091 #[test]
1092 fn read_u64(
1093 value in any::<u64>(),
1094 slice_len in 8usize..16,
1095 offset in 0usize..usize::MAX-7,
1096 bad_len in 0usize..8
1097 ) {
1098
1099 {
1101 let value_be = value.to_be_bytes();
1102 let data = [value_be[0], value_be[1], value_be[2], value_be[3], value_be[4], value_be[5], value_be[6], value_be[7], 1, 2, 3, 4, 5, 6, 7, 8];
1103 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1104 prop_assert_eq!(
1105 slicer.read_u64(true),
1106 Ok(value)
1107 );
1108 prop_assert_eq!(slicer.offset, offset + 8);
1109 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8][..slice_len - 8]);
1110 }
1111 {
1113 let value_le = value.to_le_bytes();
1114 let data = [
1115 value_le[0], value_le[1], value_le[2], value_le[3], value_le[4], value_le[5], value_le[6], value_le[7], 1, 2, 3, 4, 5, 6, 7, 8
1116 ];
1117 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1118 prop_assert_eq!(
1119 slicer.read_u64(false),
1120 Ok(value)
1121 );
1122 prop_assert_eq!(slicer.offset, offset + 8);
1123 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8][..slice_len - 8]);
1124 }
1125
1126 {
1128 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1129 UnexpectedEndOfSliceError{
1130 layer: Layer::VerboseValue,
1131 actual_size: offset + bad_len,
1132 minimum_size: offset + 8,
1133 }
1134 ));
1135 let data = value.to_le_bytes();
1136 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1137
1138 prop_assert_eq!(slicer.read_u64(false), expected.clone());
1140 prop_assert_eq!(slicer.offset, offset);
1141 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1142
1143 prop_assert_eq!(slicer.read_u64(true), expected);
1145 prop_assert_eq!(slicer.offset, offset);
1146 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1147 }
1148 }
1149 }
1150
1151 proptest! {
1152 #[test]
1153 fn read_i64(
1154 value in any::<i64>(),
1155 slice_len in 8usize..16,
1156 offset in 0usize..usize::MAX-7,
1157 bad_len in 0usize..8
1158 ) {
1159
1160 {
1162 let value_be = value.to_be_bytes();
1163 let data = [value_be[0], value_be[1], value_be[2], value_be[3], value_be[4], value_be[5], value_be[6], value_be[7], 1, 2, 3, 4, 5, 6, 7, 8];
1164 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1165 prop_assert_eq!(
1166 slicer.read_i64(true),
1167 Ok(value)
1168 );
1169 prop_assert_eq!(slicer.offset, offset + 8);
1170 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8][..slice_len - 8]);
1171 }
1172 {
1174 let value_le = value.to_le_bytes();
1175 let data = [
1176 value_le[0], value_le[1], value_le[2], value_le[3], value_le[4], value_le[5], value_le[6], value_le[7], 1, 2, 3, 4, 5, 6, 7, 8
1177 ];
1178 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1179 prop_assert_eq!(
1180 slicer.read_i64(false),
1181 Ok(value)
1182 );
1183 prop_assert_eq!(slicer.offset, offset + 8);
1184 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8][..slice_len - 8]);
1185 }
1186
1187 {
1189 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1190 UnexpectedEndOfSliceError{
1191 layer: Layer::VerboseValue,
1192 actual_size: offset + bad_len,
1193 minimum_size: offset + 8,
1194 }
1195 ));
1196 let data = value.to_le_bytes();
1197 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1198
1199 prop_assert_eq!(slicer.read_i64(false), expected.clone());
1201 prop_assert_eq!(slicer.offset, offset);
1202 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1203
1204 prop_assert_eq!(slicer.read_i64(true), expected);
1206 prop_assert_eq!(slicer.offset, offset);
1207 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1208 }
1209 }
1210 }
1211
1212 proptest! {
1213 #[test]
1214 fn read_u128(
1215 value in any::<u128>(),
1216 slice_len in 16usize..32,
1217 offset in 0usize..usize::MAX-15,
1218 bad_len in 0usize..16
1219 ) {
1220
1221 {
1223 let value_be = value.to_be_bytes();
1224 let data = [value_be[0], value_be[1], value_be[2], value_be[3], value_be[4], value_be[5], value_be[6], value_be[7], value_be[8], value_be[9], value_be[10], value_be[11], value_be[12], value_be[13], value_be[14], value_be[15], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1225 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1226 prop_assert_eq!(
1227 slicer.read_u128(true),
1228 Ok(value)
1229 );
1230 prop_assert_eq!(slicer.offset, offset + 16);
1231 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15][..slice_len - 16]);
1232 }
1233 {
1235 let value_le = value.to_le_bytes();
1236 let data = [
1237 value_le[0], value_le[1], value_le[2], value_le[3], value_le[4], value_le[5], value_le[6], value_le[7], value_le[8], value_le[9], value_le[10], value_le[11], value_le[12], value_le[13], value_le[14], value_le[15], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
1238 ];
1239 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1240 prop_assert_eq!(
1241 slicer.read_u128(false),
1242 Ok(value)
1243 );
1244 prop_assert_eq!(slicer.offset, offset + 16);
1245 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15][..slice_len - 16]);
1246 }
1247
1248 {
1250 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1251 UnexpectedEndOfSliceError{
1252 layer: Layer::VerboseValue,
1253 actual_size: offset + bad_len,
1254 minimum_size: offset + 16,
1255 }
1256 ));
1257 let data = value.to_le_bytes();
1258 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1259
1260 prop_assert_eq!(slicer.read_u128(false), expected.clone());
1262 prop_assert_eq!(slicer.offset, offset);
1263 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1264
1265 prop_assert_eq!(slicer.read_u128(true), expected);
1267 prop_assert_eq!(slicer.offset, offset);
1268 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1269 }
1270 }
1271 }
1272
1273 proptest! {
1274 #[test]
1275 fn read_i128(
1276 value in any::<i128>(),
1277 slice_len in 16usize..32,
1278 offset in 0usize..usize::MAX-15,
1279 bad_len in 0usize..16
1280 ) {
1281
1282 {
1284 let value_be = value.to_be_bytes();
1285 let data = [value_be[0], value_be[1], value_be[2], value_be[3], value_be[4], value_be[5], value_be[6], value_be[7], value_be[8], value_be[9], value_be[10], value_be[11], value_be[12], value_be[13], value_be[14], value_be[15], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1286 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1287 prop_assert_eq!(
1288 slicer.read_i128(true),
1289 Ok(value)
1290 );
1291 prop_assert_eq!(slicer.offset, offset + 16);
1292 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15][..slice_len - 16]);
1293 }
1294 {
1296 let value_le = value.to_le_bytes();
1297 let data = [
1298 value_le[0], value_le[1], value_le[2], value_le[3], value_le[4], value_le[5], value_le[6], value_le[7], value_le[8], value_le[9], value_le[10], value_le[11], value_le[12], value_le[13], value_le[14], value_le[15], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
1299 ];
1300 let mut slicer = FieldSlicer::new(&data[..slice_len], offset);
1301 prop_assert_eq!(
1302 slicer.read_i128(false),
1303 Ok(value)
1304 );
1305 prop_assert_eq!(slicer.offset, offset + 16);
1306 prop_assert_eq!(slicer.rest, &[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15][..slice_len - 16]);
1307 }
1308
1309 {
1311 let expected = Err(VerboseDecodeError::UnexpectedEndOfSlice(
1312 UnexpectedEndOfSliceError{
1313 layer: Layer::VerboseValue,
1314 actual_size: offset + bad_len,
1315 minimum_size: offset + 16,
1316 }
1317 ));
1318 let data = value.to_le_bytes();
1319 let mut slicer = FieldSlicer::new(&data[..bad_len], offset);
1320
1321 prop_assert_eq!(slicer.read_i128(false), expected.clone());
1323 prop_assert_eq!(slicer.offset, offset);
1324 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1325
1326 prop_assert_eq!(slicer.read_i128(true), expected);
1328 prop_assert_eq!(slicer.offset, offset);
1329 prop_assert_eq!(slicer.rest, &data[..bad_len]);
1330 }
1331 }
1332 }
1333
1334 proptest! {
1335 #[test]
1336 fn read_var_name(
1337 ref value in "\\PC*",
1338 offset in 0usize..1024,
1339 bad_len in 0usize..1024,
1340 rest in vec(any::<u8>(), 0..4)
1341 ) {
1342 use VerboseDecodeError::*;
1343 {
1345 let mut buffer = Vec::with_capacity(2 + value.len() + 1);
1346 buffer.extend_from_slice(&((value.len() + 1) as u16).to_be_bytes());
1347 buffer.extend_from_slice(value.as_bytes());
1348 buffer.push(0);
1349 buffer.extend_from_slice(&rest);
1350
1351 let mut slicer = FieldSlicer::new(&buffer, offset);
1352 prop_assert_eq!(slicer.read_var_name(true), Ok(value.as_str()));
1353 prop_assert_eq!(slicer.offset, offset + 2 + value.len() + 1);
1354 prop_assert_eq!(slicer.rest, &rest);
1355 }
1356
1357 {
1359 let mut buffer = Vec::with_capacity(2 + value.len() + 1);
1360 buffer.extend_from_slice(&((value.len() + 1) as u16).to_le_bytes());
1361 buffer.extend_from_slice(value.as_bytes());
1362 buffer.push(0);
1363 buffer.extend_from_slice(&rest);
1364
1365 let mut slicer = FieldSlicer::new(&buffer, offset);
1366 prop_assert_eq!(slicer.read_var_name(false), Ok(value.as_str()));
1367 prop_assert_eq!(slicer.offset, offset + 2 + value.len() + 1);
1368 prop_assert_eq!(slicer.rest, &rest);
1369 }
1370
1371 for len in 0..2 {
1373 let expected = Err(UnexpectedEndOfSlice(
1374 UnexpectedEndOfSliceError{
1375 layer: Layer::VerboseValue,
1376 actual_size: offset + len,
1377 minimum_size: offset + 2,
1378 }
1379 ));
1380 {
1381 let data = 2u16.to_le_bytes();
1382 let mut slicer = FieldSlicer::new(&data[..len], offset);
1383 prop_assert_eq!(slicer.read_var_name(false), expected.clone());
1384 prop_assert_eq!(slicer.offset, offset);
1385 prop_assert_eq!(slicer.rest, &data[..len]);
1386 }
1387 {
1388 let data = 2u16.to_be_bytes();
1389 let mut slicer = FieldSlicer::new(&data[..len], offset);
1390 prop_assert_eq!(slicer.read_var_name(true), expected);
1391 prop_assert_eq!(slicer.offset, offset);
1392 prop_assert_eq!(slicer.rest, &data[..len]);
1393 }
1394 }
1395
1396 if value.len() > 0 {
1398
1399 let bad_len = if bad_len >= value.len() {
1401 value.len() - 1
1402 } else {
1403 bad_len
1404 };
1405
1406 let expected = Err(UnexpectedEndOfSlice(
1407 UnexpectedEndOfSliceError{
1408 layer: Layer::VerboseValue,
1409 actual_size: offset + 2 + bad_len,
1410 minimum_size: offset + 2 + value.len(),
1411 }
1412 ));
1413
1414 {
1416 let mut buffer = Vec::with_capacity(2 + value.len());
1417 buffer.extend_from_slice(&(value.len() as u16).to_le_bytes());
1418 buffer.extend_from_slice(&value.as_bytes()[..bad_len]);
1419
1420 let mut slicer = FieldSlicer::new(&buffer, offset);
1421 prop_assert_eq!(slicer.read_var_name(false), expected.clone());
1422 prop_assert_eq!(slicer.offset, offset);
1423 prop_assert_eq!(slicer.rest, &buffer[..]);
1424 }
1425 {
1427 let mut buffer = Vec::with_capacity(2 + value.len());
1428 buffer.extend_from_slice(&(value.len() as u16).to_be_bytes());
1429 buffer.extend_from_slice(&value.as_bytes()[..bad_len]);
1430
1431 let mut slicer = FieldSlicer::new(&buffer, offset);
1432 prop_assert_eq!(slicer.read_var_name(true), expected);
1433 prop_assert_eq!(slicer.offset, offset);
1434 prop_assert_eq!(slicer.rest, &buffer[..]);
1435 }
1436 }
1437
1438 if value.len() > 0 {
1440 let mut buffer = Vec::with_capacity(2 + value.len() + rest.len());
1441 buffer.extend_from_slice(&((value.len()) as u16).to_be_bytes());
1442 buffer.extend_from_slice(value.as_bytes());
1443
1444 let mut slicer = FieldSlicer::new(&buffer, offset);
1445 prop_assert_eq!(slicer.read_var_name(true), Err(VariableNameStringMissingNullTermination));
1446
1447 prop_assert_eq!(slicer.offset, offset);
1448 prop_assert_eq!(slicer.rest, &buffer);
1449 } else {
1450 let mut buffer = Vec::with_capacity(2 + value.len() + rest.len());
1451 buffer.extend_from_slice(&0u16.to_be_bytes());
1452 buffer.extend_from_slice(&rest);
1453
1454 let mut slicer = FieldSlicer::new(&buffer, offset);
1455 prop_assert_eq!(slicer.read_var_name(true), Ok(""));
1456
1457 prop_assert_eq!(slicer.offset, offset + 2);
1458 prop_assert_eq!(slicer.rest, &rest);
1459 }
1460
1461 {
1463 let mut buffer = Vec::with_capacity(2 + value.len() + 4 + 1 + rest.len());
1464 buffer.extend_from_slice(&((value.len() + 4 + 1) as u16).to_be_bytes());
1465 buffer.extend_from_slice(value.as_bytes());
1466 buffer.extend_from_slice(&[0, 159, 146, 150]);
1468 buffer.push(0);
1469 let mut slicer = FieldSlicer::new(&buffer, offset);
1470 prop_assert_eq!(
1471 slicer.read_var_name(true),
1472 Err(Utf8(core::str::from_utf8(&buffer[2..(2 + value.len() + 4)]).unwrap_err()))
1473 );
1474 }
1475 }
1476 }
1477
1478 proptest! {
1479 #[test]
1480 fn read_var_name_and_unit(
1481 ref name in "\\PC*",
1482 ref unit in "\\PC*",
1483 offset in 0usize..1024,
1484 bad_len in 0usize..1024,
1485 rest in vec(any::<u8>(), 0..4)
1486 ) {
1487 use VerboseDecodeError::*;
1488
1489 {
1491 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len() + 2);
1492 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1493 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1494 buffer.extend_from_slice(name.as_bytes());
1495 buffer.push(0);
1496 buffer.extend_from_slice(unit.as_bytes());
1497 buffer.push(0);
1498 buffer.extend_from_slice(&rest);
1499
1500 let mut slicer = FieldSlicer::new(&buffer, offset);
1501 prop_assert_eq!(
1502 slicer.read_var_name_and_unit(true),
1503 Ok((name.as_str(), unit.as_str()))
1504 );
1505 prop_assert_eq!(slicer.offset, offset + 4 + name.len() + unit.len() + 2);
1506 prop_assert_eq!(slicer.rest, &rest);
1507 }
1508
1509 {
1511 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len() + 2);
1512 buffer.extend_from_slice(&((name.len() + 1) as u16).to_le_bytes());
1513 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_le_bytes());
1514 buffer.extend_from_slice(name.as_bytes());
1515 buffer.push(0);
1516 buffer.extend_from_slice(unit.as_bytes());
1517 buffer.push(0);
1518 buffer.extend_from_slice(&rest);
1519
1520 let mut slicer = FieldSlicer::new(&buffer, offset);
1521 prop_assert_eq!(
1522 slicer.read_var_name_and_unit(false),
1523 Ok((name.as_str(), unit.as_str()))
1524 );
1525 prop_assert_eq!(slicer.offset, offset + 4 + name.len() + unit.len() + 2);
1526 prop_assert_eq!(slicer.rest, &rest);
1527 }
1528
1529 for len in 0..4 {
1531 let expected = Err(UnexpectedEndOfSlice(
1532 UnexpectedEndOfSliceError{
1533 layer: Layer::VerboseValue,
1534 actual_size: offset + len,
1535 minimum_size: offset + 4,
1536 }
1537 ));
1538 {
1539 let data = [0, 0, 0, 0];
1540 let mut slicer = FieldSlicer::new(&data[..len], offset);
1541 prop_assert_eq!(slicer.read_var_name_and_unit(false), expected.clone());
1542 prop_assert_eq!(slicer.offset, offset);
1543 prop_assert_eq!(slicer.rest, &data[..len]);
1544 }
1545 {
1546 let data = [0, 0, 0, 0];
1547 let mut slicer = FieldSlicer::new(&data[..len], offset);
1548 prop_assert_eq!(slicer.read_var_name_and_unit(true), expected);
1549 prop_assert_eq!(slicer.offset, offset);
1550 prop_assert_eq!(slicer.rest, &data[..len]);
1551 }
1552 }
1553
1554 {
1556 let bad_len = if bad_len > name.len() {
1558 name.len()
1559 } else {
1560 bad_len
1561 };
1562
1563 let expected = Err(UnexpectedEndOfSlice(
1564 UnexpectedEndOfSliceError{
1565 layer: Layer::VerboseValue,
1566 actual_size: offset + 4 + bad_len,
1567 minimum_size: offset + 4 + name.len() + 1 + unit.len() + 1,
1568 }
1569 ));
1570
1571 {
1573 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len());
1574 buffer.extend_from_slice(&((name.len() + 1) as u16).to_le_bytes());
1575 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_le_bytes());
1576 buffer.extend_from_slice(&name.as_bytes()[..bad_len]);
1577
1578 let mut slicer = FieldSlicer::new(&buffer, offset);
1579 prop_assert_eq!(slicer.read_var_name_and_unit(false), expected.clone());
1580 prop_assert_eq!(slicer.offset, offset);
1581 prop_assert_eq!(slicer.rest, &buffer[..]);
1582 }
1583 {
1585 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len());
1586 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1587 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1588 buffer.extend_from_slice(&name.as_bytes()[..bad_len]);
1589
1590 let mut slicer = FieldSlicer::new(&buffer, offset);
1591 prop_assert_eq!(slicer.read_var_name_and_unit(true), expected);
1592 prop_assert_eq!(slicer.offset, offset);
1593 prop_assert_eq!(slicer.rest, &buffer[..]);
1594 }
1595 }
1596
1597 {
1599 let bad_len = if bad_len > unit.len() {
1601 unit.len()
1602 } else {
1603 bad_len
1604 };
1605
1606 let expected = Err(UnexpectedEndOfSlice(
1607 UnexpectedEndOfSliceError{
1608 layer: Layer::VerboseValue,
1609 actual_size: offset + 4 + name.len() + 1 + bad_len,
1610 minimum_size: offset + 4 + name.len() + 1 + unit.len() + 1,
1611 }
1612 ));
1613
1614 {
1616 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len());
1617 buffer.extend_from_slice(&((name.len() + 1) as u16).to_le_bytes());
1618 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_le_bytes());
1619 buffer.extend_from_slice(&name.as_bytes());
1620 buffer.push(0);
1621 buffer.extend_from_slice(&unit.as_bytes()[..bad_len]);
1622
1623 let mut slicer = FieldSlicer::new(&buffer, offset);
1624 prop_assert_eq!(slicer.read_var_name_and_unit(false), expected.clone());
1625 prop_assert_eq!(slicer.offset, offset);
1626 prop_assert_eq!(slicer.rest, &buffer[..]);
1627 }
1628 {
1630 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len());
1631 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1632 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1633 buffer.extend_from_slice(&name.as_bytes());
1634 buffer.push(0);
1635 buffer.extend_from_slice(&unit.as_bytes()[..bad_len]);
1636
1637 let mut slicer = FieldSlicer::new(&buffer, offset);
1638 prop_assert_eq!(slicer.read_var_name_and_unit(true), expected);
1639 prop_assert_eq!(slicer.offset, offset);
1640 prop_assert_eq!(slicer.rest, &buffer[..]);
1641 }
1642 }
1643
1644 if name.len() > 0 {
1646 let mut buffer = Vec::with_capacity(4 + name.len() + unit.len() + 1 + rest.len());
1647 buffer.extend_from_slice(&(name.len() as u16).to_be_bytes());
1648 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1649 buffer.extend_from_slice(name.as_bytes());
1650 buffer.extend_from_slice(unit.as_bytes());
1652 buffer.push(0);
1653
1654 let mut slicer = FieldSlicer::new(&buffer, offset);
1655 prop_assert_eq!(slicer.read_var_name_and_unit(true), Err(VariableNameStringMissingNullTermination));
1656
1657 prop_assert_eq!(slicer.offset, offset);
1658 prop_assert_eq!(slicer.rest, &buffer);
1659 } else {
1660 let mut buffer = Vec::with_capacity(4 + unit.len() + 0 + rest.len());
1662 buffer.extend_from_slice(&(0 as u16).to_be_bytes());
1663 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1664 buffer.extend_from_slice(unit.as_bytes());
1666 buffer.push(0);
1667 buffer.extend_from_slice(&rest);
1668
1669 let mut slicer = FieldSlicer::new(&buffer, offset);
1670 prop_assert_eq!(slicer.read_var_name_and_unit(true), Ok(("", unit.as_str())));
1671
1672 prop_assert_eq!(slicer.offset, offset + 4 + unit.len() + 1);
1673 prop_assert_eq!(slicer.rest, &rest);
1674 }
1675
1676 if unit.len() > 0 {
1678 let mut buffer = Vec::with_capacity(4 + name.len() + 1 + unit.len() + rest.len());
1679 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1680 buffer.extend_from_slice(&(unit.len() as u16).to_be_bytes());
1681 buffer.extend_from_slice(name.as_bytes());
1682 buffer.push(0);
1683 buffer.extend_from_slice(unit.as_bytes());
1684 let mut slicer = FieldSlicer::new(&buffer, offset);
1687 prop_assert_eq!(slicer.read_var_name_and_unit(true), Err(VariableUnitStringMissingNullTermination));
1688
1689 prop_assert_eq!(slicer.offset, offset);
1690 prop_assert_eq!(slicer.rest, &buffer);
1691 } else {
1692 let mut buffer = Vec::with_capacity(4 + name.len() + 1 + rest.len());
1694 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1695 buffer.extend_from_slice(&(0 as u16).to_be_bytes());
1696 buffer.extend_from_slice(name.as_bytes());
1697 buffer.push(0);
1698 buffer.extend_from_slice(&rest);
1700
1701 let mut slicer = FieldSlicer::new(&buffer, offset);
1702 prop_assert_eq!(slicer.read_var_name_and_unit(true), Ok((name.as_str(), "")));
1703
1704 prop_assert_eq!(slicer.offset, offset + 4 + name.len() + 1);
1705 prop_assert_eq!(slicer.rest, &rest);
1706 }
1707
1708 {
1710 let mut buffer = Vec::with_capacity(4 + name.len() + 4 + 1 + unit.len() + 1 + rest.len());
1711 buffer.extend_from_slice(&((name.len() + 4 + 1) as u16).to_be_bytes());
1712 buffer.extend_from_slice(&((unit.len() + 1) as u16).to_be_bytes());
1713 buffer.extend_from_slice(name.as_bytes());
1714 buffer.extend_from_slice(&[0, 159, 146, 150]);
1716 buffer.push(0);
1717 buffer.extend_from_slice(unit.as_bytes());
1718 buffer.push(0);
1719 let mut slicer = FieldSlicer::new(&buffer, offset);
1720 prop_assert_eq!(
1721 slicer.read_var_name_and_unit(true),
1722 Err(Utf8(core::str::from_utf8(&buffer[4..(4 + name.len() + 4)]).unwrap_err()))
1723 );
1724 }
1725
1726 {
1728 let mut buffer = Vec::with_capacity(4 + name.len() + 1 + unit.len() + 4 + 1 + rest.len());
1729 buffer.extend_from_slice(&((name.len() + 1) as u16).to_be_bytes());
1730 buffer.extend_from_slice(&((unit.len() + 4 + 1) as u16).to_be_bytes());
1731 buffer.extend_from_slice(name.as_bytes());
1732 buffer.push(0);
1733 buffer.extend_from_slice(unit.as_bytes());
1734 buffer.extend_from_slice(&[0, 159, 146, 150]);
1736 buffer.push(0);
1737 let mut slicer = FieldSlicer::new(&buffer, offset);
1738 prop_assert_eq!(
1739 slicer.read_var_name_and_unit(true),
1740 Err(Utf8(core::str::from_utf8(&buffer[(4 + name.len() + 1)..(4 + name.len() + 1 + unit.len() + 4)]).unwrap_err()))
1741 );
1742 }
1743 }
1744 }
1745
1746 proptest! {
1747 #[test]
1748 fn read_raw(
1749 data in prop::collection::vec(any::<u8>(), 0..1024),
1750 offset in 0usize..1024,
1751 rest in prop::collection::vec(any::<u8>(), 0..10),
1752 bad_len in 0usize..1024,
1753 ) {
1754 {
1756 let mut buffer = Vec::with_capacity(data.len() + rest.len());
1757 buffer.extend_from_slice(&data);
1758 buffer.extend_from_slice(&rest);
1759
1760 let mut slicer = FieldSlicer::new(&buffer, offset);
1761 prop_assert_eq!(slicer.read_raw(data.len()), Ok(&data[..]));
1762 prop_assert_eq!(slicer.offset, offset + data.len());
1763 prop_assert_eq!(slicer.rest, &rest);
1764 }
1765
1766 if data.len() > 0 {
1768
1769 let bad_len = if bad_len >= data.len() {
1771 data.len() - 1
1772 } else {
1773 bad_len
1774 };
1775
1776 let mut buffer = Vec::with_capacity(data.len());
1777 buffer.extend_from_slice(&data[..bad_len]);
1778
1779 let mut slicer = FieldSlicer::new(&buffer, offset);
1780 prop_assert_eq!(
1781 slicer.read_raw(data.len()),
1782 Err(VerboseDecodeError::UnexpectedEndOfSlice(UnexpectedEndOfSliceError{
1783 layer: Layer::VerboseValue,
1784 actual_size: offset + bad_len,
1785 minimum_size: offset + data.len(),
1786 }))
1787 );
1788 prop_assert_eq!(slicer.offset, offset);
1789 prop_assert_eq!(slicer.rest, &buffer[..]);
1790 }
1791 }
1792 }
1793}