1#![warn(missing_docs)]
274#![deny(
275 unsafe_code,
276 trivial_casts,
277 trivial_numeric_casts,
278 unused_import_braces,
279 unused_qualifications
280)]
281#![cfg_attr(not(feature = "std"), no_std)]
282
283#[cfg(not(feature = "std"))]
284extern crate alloc;
285
286pub mod error;
288pub use error::Error;
289
290pub mod enc_into;
292pub use enc_into::EncodeInto;
293
294pub mod enc_into_buffer;
296pub use enc_into_buffer::EncodeIntoBuffer;
297
298pub mod enc_into_array;
300pub use enc_into_array::EncodeIntoArray;
301
302pub mod null;
304pub use null::{Null, TryNull};
305
306pub mod try_decode_from;
308pub use try_decode_from::TryDecodeFrom;
309
310pub mod encoded_bytes;
312pub use encoded_bytes::EncodedBytes;
313
314pub mod prelude {
316 pub use super::{
317 enc_into::*, enc_into_array::*, enc_into_buffer::*, encoded_bytes::*, null::*,
318 try_decode_from::*,
319 };
320}
321
322#[cfg(test)]
323mod test {
324 #![allow(
325 clippy::cast_possible_truncation,
326 clippy::cast_sign_loss,
327 clippy::items_after_statements,
328 clippy::significant_drop_tightening,
329 clippy::needless_collect
330 )]
331 use super::prelude::*;
332
333 #[test]
334 fn test_bool() {
335 let tbuf = true.encode_into();
336 let (tval, _) = bool::try_decode_from(&tbuf).unwrap();
337 assert!(tval);
338 let fbuf = false.encode_into();
339 let (fval, _) = bool::try_decode_from(&fbuf).unwrap();
340 assert!(!fval);
341 }
342
343 #[test]
344 fn test_u8() {
345 let buf = 0xff_u8.encode_into();
346 let (num, _) = u8::try_decode_from(&buf).unwrap();
347 assert_eq!(0xff_u8, num);
348 }
349
350 #[test]
351 fn test_u16() {
352 let buf = 0xffee_u16.encode_into();
353 let (num, _) = u16::try_decode_from(&buf).unwrap();
354 assert_eq!(0xffee_u16, num);
355 }
356
357 #[test]
358 fn test_u32() {
359 let buf = 0xffee_ddcc_u32.encode_into();
360 let (num, _) = u32::try_decode_from(&buf).unwrap();
361 assert_eq!(0xffee_ddcc_u32, num);
362 }
363
364 #[test]
365 fn test_u64() {
366 let buf = 0xffee_ddcc_bbaa_9988_u64.encode_into();
367 let (num, _) = u64::try_decode_from(&buf).unwrap();
368 assert_eq!(0xffee_ddcc_bbaa_9988_u64, num);
369 }
370
371 #[test]
372 fn test_u128() {
373 let buf = 0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128.encode_into();
374 let (num, _) = u128::try_decode_from(&buf).unwrap();
375 assert_eq!(0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128, num);
376 }
377
378 #[cfg(target_pointer_width = "64")]
379 #[test]
380 fn test_usize() {
381 let buf = 0xffee_ddcc_bbaa_9988_usize.encode_into();
382 let (num, _) = usize::try_decode_from(&buf).unwrap();
383 assert_eq!(0xffee_ddcc_bbaa_9988_usize, num);
384 }
385
386 #[cfg(target_pointer_width = "32")]
387 #[test]
388 fn test_usize() {
389 let buf = 0xffeeddcc_usize.encode_into();
390 let (num, _) = usize::try_decode_from(&buf).unwrap();
391 assert_eq!(0xffeeddcc_usize, num);
392 }
393
394 struct Foo(usize);
395
396 impl Null for Foo {
397 fn null() -> Self {
398 Self(0)
399 }
400 fn is_null(&self) -> bool {
401 self.0 == 0
402 }
403 }
404
405 impl TryNull for Foo {
406 type Error = &'static str;
407
408 fn try_null() -> Result<Self, Self::Error> {
409 Ok(Self(0))
410 }
411 fn is_null(&self) -> bool {
412 self.0 == 0
413 }
414 }
415
416 #[test]
417 fn test_null_value() {
418 let f = Foo::null();
419 assert!(Null::is_null(&f));
420 }
421
422 #[test]
423 fn test_try_null_value() {
424 let f = Foo::try_null().unwrap();
425 assert!(TryNull::is_null(&f));
426 }
427
428 #[test]
433 fn test_decode_empty_slice_u8() {
434 let empty: &[u8] = &[];
435 let result = u8::try_decode_from(empty);
436 assert!(result.is_err(), "Should fail to decode from empty slice");
437 }
438
439 #[test]
440 fn test_decode_empty_slice_u16() {
441 let empty: &[u8] = &[];
442 let result = u16::try_decode_from(empty);
443 assert!(result.is_err(), "Should fail to decode from empty slice");
444 }
445
446 #[test]
447 fn test_decode_empty_slice_u32() {
448 let empty: &[u8] = &[];
449 let result = u32::try_decode_from(empty);
450 assert!(result.is_err(), "Should fail to decode from empty slice");
451 }
452
453 #[test]
454 fn test_decode_empty_slice_u64() {
455 let empty: &[u8] = &[];
456 let result = u64::try_decode_from(empty);
457 assert!(result.is_err(), "Should fail to decode from empty slice");
458 }
459
460 #[test]
461 fn test_decode_empty_slice_u128() {
462 let empty: &[u8] = &[];
463 let result = u128::try_decode_from(empty);
464 assert!(result.is_err(), "Should fail to decode from empty slice");
465 }
466
467 #[test]
468 fn test_decode_empty_slice_bool() {
469 let empty: &[u8] = &[];
470 let result = bool::try_decode_from(empty);
471 assert!(result.is_err(), "Should fail to decode from empty slice");
472 }
473
474 #[test]
475 fn test_decode_truncated_varint() {
476 let truncated = vec![0x80]; let result = u16::try_decode_from(&truncated);
479 assert!(result.is_err(), "Should fail on truncated varint");
480 }
481
482 #[test]
483 fn test_decode_truncated_large_varint() {
484 let truncated = vec![0xFF, 0xFF]; let result = u32::try_decode_from(&truncated);
487 assert!(result.is_err(), "Should fail on truncated large varint");
488 }
489
490 #[test]
495 fn test_encode_decode_zero_values() {
496 assert_eq!(0u8.encode_into(), vec![0]);
498 assert_eq!(0u16.encode_into(), vec![0]);
499 assert_eq!(0u32.encode_into(), vec![0]);
500 assert_eq!(0u64.encode_into(), vec![0]);
501 assert_eq!(0u128.encode_into(), vec![0]);
502 assert_eq!(0usize.encode_into(), vec![0]);
503
504 let (val, rest) = u8::try_decode_from(&[0]).unwrap();
506 assert_eq!(val, 0);
507 assert!(rest.is_empty());
508 }
509
510 #[test]
511 fn test_encode_decode_max_u8() {
512 let max = u8::MAX;
513 let encoded = max.encode_into();
514 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
515 assert_eq!(decoded, max);
516 assert!(remaining.is_empty());
517 }
518
519 #[test]
520 fn test_encode_decode_max_u16() {
521 let max = u16::MAX;
522 let encoded = max.encode_into();
523 let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
524 assert_eq!(decoded, max);
525 assert!(remaining.is_empty());
526 }
527
528 #[test]
529 fn test_encode_decode_max_u32() {
530 let max = u32::MAX;
531 let encoded = max.encode_into();
532 let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
533 assert_eq!(decoded, max);
534 assert!(remaining.is_empty());
535 }
536
537 #[test]
538 fn test_encode_decode_max_u64() {
539 let max = u64::MAX;
540 let encoded = max.encode_into();
541 let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
542 assert_eq!(decoded, max);
543 assert!(remaining.is_empty());
544 }
545
546 #[test]
547 fn test_encode_decode_max_u128() {
548 let max = u128::MAX;
549 let encoded = max.encode_into();
550 let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
551 assert_eq!(decoded, max);
552 assert!(remaining.is_empty());
553 }
554
555 #[test]
556 fn test_varint_boundary_127() {
557 let val = 127u8;
559 let encoded = val.encode_into();
560 assert_eq!(encoded.len(), 1);
561 let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
562 assert_eq!(decoded, val);
563 }
564
565 #[test]
566 fn test_varint_boundary_128() {
567 let val = 128u8;
569 let encoded = val.encode_into();
570 assert_eq!(encoded.len(), 2);
571 let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
572 assert_eq!(decoded, val);
573 }
574
575 #[test]
576 fn test_bool_nonzero_as_true() {
577 let bytes = vec![42];
579 let (val, _) = bool::try_decode_from(&bytes).unwrap();
580 assert!(val);
581 }
582
583 #[test]
588 fn test_roundtrip_u8_range() {
589 for value in [0, 1, 127, 128, 255] {
591 let encoded = value.encode_into();
592 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
593 assert_eq!(decoded, value, "Round-trip failed for u8 value {value}");
594 assert!(remaining.is_empty());
595 }
596 }
597
598 #[test]
599 fn test_roundtrip_u16_range() {
600 for value in [0, 1, 127, 128, 255, 256, 16383, 16384, 65535] {
602 let encoded = value.encode_into();
603 let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
604 assert_eq!(decoded, value, "Round-trip failed for u16 value {value}");
605 assert!(remaining.is_empty());
606 }
607 }
608
609 #[test]
610 fn test_roundtrip_u32_range() {
611 for value in [0, 1, 127, 128, 16384, 65536, u32::MAX] {
613 let encoded = value.encode_into();
614 let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
615 assert_eq!(decoded, value, "Round-trip failed for u32 value {value}");
616 assert!(remaining.is_empty());
617 }
618 }
619
620 #[test]
621 fn test_roundtrip_u64_range() {
622 for value in [0, 1, 127, 128, 65536, u64::from(u32::MAX), u64::MAX] {
624 let encoded = value.encode_into();
625 let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
626 assert_eq!(decoded, value, "Round-trip failed for u64 value {value}");
627 assert!(remaining.is_empty());
628 }
629 }
630
631 #[test]
632 fn test_roundtrip_bool() {
633 for value in [true, false] {
634 let encoded = value.encode_into();
635 let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
636 assert_eq!(decoded, value, "Round-trip failed for bool {value}");
637 assert!(remaining.is_empty());
638 }
639 }
640
641 #[test]
642 fn test_sequential_decode() {
643 let mut buffer = Vec::new();
645 buffer.extend_from_slice(&42u8.encode_into());
646 buffer.extend_from_slice(&1000u16.encode_into());
647 buffer.extend_from_slice(&100_000_u32.encode_into());
648
649 let (val1, rest) = u8::try_decode_from(&buffer).unwrap();
651 assert_eq!(val1, 42);
652
653 let (val2, rest) = u16::try_decode_from(rest).unwrap();
654 assert_eq!(val2, 1000);
655
656 let (val3, rest) = u32::try_decode_from(rest).unwrap();
657 assert_eq!(val3, 100_000);
658
659 assert!(rest.is_empty(), "Should have consumed all bytes");
660 }
661
662 #[test]
663 fn test_remaining_bytes_returned() {
664 let mut buffer = Vec::new();
666 buffer.extend_from_slice(&42u8.encode_into());
667 buffer.extend_from_slice(&[0xFF, 0xEE, 0xDD]); let (val, remaining) = u8::try_decode_from(&buffer).unwrap();
670 assert_eq!(val, 42);
671 assert_eq!(remaining, &[0xFF, 0xEE, 0xDD]);
672 }
673
674 #[test]
675 fn test_encode_length_efficiency() {
676 assert_eq!(0u8.encode_into().len(), 1);
678 assert_eq!(127u8.encode_into().len(), 1);
679 assert_eq!(128u8.encode_into().len(), 2);
680 assert_eq!(255u8.encode_into().len(), 2);
681
682 assert!(u16::MAX.encode_into().len() > 1);
684 assert!(u32::MAX.encode_into().len() > 2);
685 }
686
687 use proptest::prelude::*;
692
693 proptest! {
694 #[test]
695 fn prop_roundtrip_u8(value: u8) {
696 let encoded = value.encode_into();
697 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
698 prop_assert_eq!(decoded, value);
699 prop_assert!(remaining.is_empty());
700 }
701
702 #[test]
703 fn prop_roundtrip_u16(value: u16) {
704 let encoded = value.encode_into();
705 let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
706 prop_assert_eq!(decoded, value);
707 prop_assert!(remaining.is_empty());
708 }
709
710 #[test]
711 fn prop_roundtrip_u32(value: u32) {
712 let encoded = value.encode_into();
713 let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
714 prop_assert_eq!(decoded, value);
715 prop_assert!(remaining.is_empty());
716 }
717
718 #[test]
719 fn prop_roundtrip_u64(value: u64) {
720 let encoded = value.encode_into();
721 let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
722 prop_assert_eq!(decoded, value);
723 prop_assert!(remaining.is_empty());
724 }
725
726 #[test]
727 fn prop_roundtrip_u128(value: u128) {
728 let encoded = value.encode_into();
729 let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
730 prop_assert_eq!(decoded, value);
731 prop_assert!(remaining.is_empty());
732 }
733
734 #[test]
735 fn prop_roundtrip_usize(value: usize) {
736 let encoded = value.encode_into();
737 let (decoded, remaining) = usize::try_decode_from(&encoded).unwrap();
738 prop_assert_eq!(decoded, value);
739 prop_assert!(remaining.is_empty());
740 }
741
742 #[test]
743 fn prop_roundtrip_bool(value: bool) {
744 let encoded = value.encode_into();
745 let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
746 prop_assert_eq!(decoded, value);
747 prop_assert!(remaining.is_empty());
748 }
749
750 #[test]
751 fn prop_encode_not_empty(value: u32) {
752 let encoded = value.encode_into();
753 prop_assert!(!encoded.is_empty());
754 }
755
756 #[test]
757 fn prop_encode_deterministic(value: u64) {
758 let encoded1 = value.encode_into();
759 let encoded2 = value.encode_into();
760 prop_assert_eq!(encoded1, encoded2);
761 }
762
763 #[test]
764 fn prop_small_values_compact(value in 0u32..128) {
765 let encoded = value.encode_into();
766 prop_assert_eq!(encoded.len(), 1, "Values under 128 should encode in 1 byte");
767 }
768
769 #[test]
770 fn prop_sequential_decode(v1: u8, v2: u16, v3: u32) {
771 let mut buffer = Vec::new();
772 buffer.extend_from_slice(&v1.encode_into());
773 buffer.extend_from_slice(&v2.encode_into());
774 buffer.extend_from_slice(&v3.encode_into());
775
776 let (d1, rest) = u8::try_decode_from(&buffer).unwrap();
777 prop_assert_eq!(d1, v1);
778
779 let (d2, rest) = u16::try_decode_from(rest).unwrap();
780 prop_assert_eq!(d2, v2);
781
782 let (d3, rest) = u32::try_decode_from(rest).unwrap();
783 prop_assert_eq!(d3, v3);
784
785 prop_assert!(rest.is_empty());
786 }
787 }
788
789 #[test]
795 fn assert_error_send_sync() {
796 fn is_send<T: Send>() {}
797 fn is_sync<T: Sync>() {}
798 is_send::<crate::Error>();
799 is_sync::<crate::Error>();
800 }
801
802 #[test]
804 fn assert_encoded_bytes_send_sync() {
805 fn is_send<T: Send>() {}
806 fn is_sync<T: Sync>() {}
807 is_send::<EncodedBytes>();
808 is_sync::<EncodedBytes>();
809 }
810
811 #[test]
812 fn test_encoded_bytes_valid() {
813 let bytes = vec![42];
814 let encoded = EncodedBytes::try_from(bytes).unwrap();
815 assert_eq!(encoded.as_ref(), &[42]);
816 }
817
818 #[test]
819 fn test_encoded_bytes_invalid_empty() {
820 let empty: Vec<u8> = vec![];
821 assert!(EncodedBytes::try_from(empty).is_err());
822 }
823
824 #[test]
825 fn test_encoded_bytes_invalid_truncated() {
826 let truncated = vec![0x80];
827 assert!(EncodedBytes::try_from(truncated).is_err());
828 }
829
830 #[test]
831 fn test_encoded_bytes_into_vec() {
832 let original = 128u8.encode_into();
834 let encoded = EncodedBytes::new(&original).unwrap();
835 let recovered: Vec<u8> = encoded.into();
836 assert_eq!(recovered, original);
837 }
838
839 #[cfg(feature = "std")]
840 #[test]
841 fn test_encoded_bytes_thread_safe() {
842 use std::sync::Arc;
843 use std::thread;
844
845 let encoded = EncodedBytes::new(&[42]).unwrap();
846 let shared = Arc::new(encoded);
847
848 let handles: Vec<_> = (0..4)
849 .map(|_| {
850 let data = Arc::clone(&shared);
851 thread::spawn(move || {
852 assert_eq!(&data[..], &[42]);
853 })
854 })
855 .collect();
856
857 for handle in handles {
858 handle.join().unwrap();
859 }
860 }
861
862 #[test]
867 fn security_test_all_continuation_bits() {
868 let malicious = vec![0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
870 let result = u64::try_decode_from(&malicious);
871 assert!(
873 result.is_err(),
874 "Should reject all-continuation-bit sequence"
875 );
876 }
877
878 #[test]
879 fn security_test_maximum_length_varint_u64() {
880 let max_encoded = u64::MAX.encode_into();
882 assert_eq!(max_encoded.len(), 10);
883 let (decoded, remaining) = u64::try_decode_from(&max_encoded).unwrap();
884 assert_eq!(decoded, u64::MAX);
885 assert!(remaining.is_empty());
886 }
887
888 #[test]
889 fn security_test_maximum_length_varint_u128() {
890 let max_encoded = u128::MAX.encode_into();
892 assert_eq!(max_encoded.len(), 19);
893 let (decoded, remaining) = u128::try_decode_from(&max_encoded).unwrap();
894 assert_eq!(decoded, u128::MAX);
895 assert!(remaining.is_empty());
896 }
897
898 #[test]
899 fn security_test_single_byte_with_continuation() {
900 let malicious = vec![0x80];
902 assert!(u8::try_decode_from(&malicious).is_err());
903 assert!(u16::try_decode_from(&malicious).is_err());
904 assert!(u32::try_decode_from(&malicious).is_err());
905 assert!(u64::try_decode_from(&malicious).is_err());
906 }
907
908 #[test]
909 fn security_test_multiple_continuation_bytes_truncated() {
910 let malicious = vec![0xFF, 0xFF, 0xFF];
912 assert!(u32::try_decode_from(&malicious).is_err());
913 }
914
915 #[test]
916 fn security_test_encoded_bytes_rejects_invalid() {
917 assert!(EncodedBytes::try_from(vec![]).is_err());
921
922 assert!(EncodedBytes::try_from(vec![0x80]).is_err());
924
925 let mut with_trailing = vec![42];
927 with_trailing.extend_from_slice(&[0xFF, 0xEE]);
928 assert!(EncodedBytes::try_from(with_trailing).is_err());
929
930 assert!(EncodedBytes::try_from(vec![0xFF, 0xFF, 0xFF]).is_err());
932 }
933
934 #[test]
935 fn security_test_buffer_encoding_no_overflow() {
936 let mut buffer = Vec::new();
938
939 for i in 0u16..1000 {
941 i.encode_into_buffer(&mut buffer);
942 }
943
944 assert!(buffer.len() > 1000); assert!(buffer.len() < 3000); }
948
949 #[test]
950 fn security_test_array_encoding_bounds() {
951 let (array, len) = u128::MAX.encode_into_array();
953 assert!(len <= 19, "u128::MAX should not exceed 19 bytes");
954
955 let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
957 assert_eq!(decoded, u128::MAX);
958 }
959
960 #[test]
961 fn security_test_bool_decode_nonzero_values() {
962 let nonzero_values = vec![
964 vec![1], vec![42], vec![127], vec![0xFF, 0x01], ];
969
970 for bytes in nonzero_values {
971 let (val, _) = bool::try_decode_from(&bytes).unwrap();
972 assert!(val, "Non-zero value {bytes:?} should decode as true");
973 }
974
975 let (val, _) = bool::try_decode_from(&[0]).unwrap();
977 assert!(!val);
978 }
979
980 #[test]
981 fn security_test_zero_length_slice_rejection() {
982 let empty: &[u8] = &[];
984
985 assert!(u8::try_decode_from(empty).is_err());
986 assert!(u16::try_decode_from(empty).is_err());
987 assert!(u32::try_decode_from(empty).is_err());
988 assert!(u64::try_decode_from(empty).is_err());
989 assert!(u128::try_decode_from(empty).is_err());
990 assert!(usize::try_decode_from(empty).is_err());
991 assert!(bool::try_decode_from(empty).is_err());
992 }
993
994 #[test]
995 fn security_test_repeated_decoding_no_panic() {
996 let malicious = vec![0xFF, 0xFF];
998
999 for _ in 0..100 {
1000 let _ = u32::try_decode_from(&malicious);
1001 let _ = u64::try_decode_from(&malicious);
1002 }
1003 }
1004
1005 #[test]
1006 fn security_test_alternating_bit_patterns() {
1007 let patterns = vec![
1009 vec![0xAA], vec![0x55], vec![0xAA, 0x55],
1012 vec![0x55, 0xAA],
1013 ];
1014
1015 for pattern in patterns {
1016 let _ = u8::try_decode_from(&pattern);
1019 let _ = u16::try_decode_from(&pattern);
1020 }
1021 }
1022
1023 proptest! {
1028 #[test]
1029 fn security_prop_decode_random_bytes(bytes in prop::collection::vec(any::<u8>(), 0..50)) {
1030 let _ = u8::try_decode_from(&bytes);
1033 let _ = u16::try_decode_from(&bytes);
1034 let _ = u32::try_decode_from(&bytes);
1035 let _ = u64::try_decode_from(&bytes);
1036 let _ = u128::try_decode_from(&bytes);
1037 }
1038
1039 #[test]
1040 fn security_prop_encoded_bytes_validation(bytes in prop::collection::vec(any::<u8>(), 0..100)) {
1041 let result = EncodedBytes::try_from(bytes);
1043
1044 if let Ok(encoded) = result {
1046 let decode_result = u128::try_decode_from(encoded.as_ref());
1048 prop_assert!(decode_result.is_ok(), "Validated EncodedBytes should be decodable");
1049 }
1050 }
1051
1052 #[test]
1053 fn security_prop_buffer_encoding_no_panic(values in prop::collection::vec(any::<u32>(), 0..1000)) {
1054 let mut buffer = Vec::new();
1056 for value in values {
1057 value.encode_into_buffer(&mut buffer);
1058 }
1059
1060 prop_assert!(buffer.len() < 5000, "Buffer should not grow excessively");
1062 }
1063
1064 #[test]
1065 fn security_prop_array_encoding_never_panics(value: u128) {
1066 let (_array, len) = value.encode_into_array();
1068
1069 prop_assert!(len > 0);
1071 prop_assert!(len <= 19);
1072
1073 let (array, len) = value.encode_into_array();
1075 let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
1076 prop_assert_eq!(decoded, value);
1077 }
1078
1079 #[test]
1080 fn security_prop_decode_never_returns_more_than_input(
1081 bytes in prop::collection::vec(any::<u8>(), 1..100)
1082 ) {
1083 if let Ok((_, remaining)) = u64::try_decode_from(&bytes) {
1085 prop_assert!(remaining.len() <= bytes.len());
1086 }
1087 }
1088
1089 #[test]
1090 fn security_prop_encode_size_bounded(value: u64) {
1091 let encoded = value.encode_into();
1093 prop_assert!(encoded.len() <= 10, "u64 varint should not exceed 10 bytes");
1094
1095 let (_array, len) = value.encode_into_array();
1096 prop_assert!(len <= 10, "u64 array encoding should not exceed 10 bytes");
1097 }
1098 }
1099
1100 #[test]
1106 fn assert_primitives_send_sync() {
1107 fn is_send<T: Send>() {}
1108 fn is_sync<T: Sync>() {}
1109
1110 is_send::<u8>();
1112 is_sync::<u8>();
1113 is_send::<u16>();
1114 is_sync::<u16>();
1115 is_send::<u32>();
1116 is_sync::<u32>();
1117 is_send::<u64>();
1118 is_sync::<u64>();
1119 is_send::<u128>();
1120 is_sync::<u128>();
1121 is_send::<usize>();
1122 is_sync::<usize>();
1123 is_send::<bool>();
1124 is_sync::<bool>();
1125
1126 is_send::<Vec<u8>>();
1128 is_sync::<Vec<u8>>();
1129 }
1130
1131 #[test]
1133 fn assert_encoded_types_send_sync() {
1134 fn is_send<T: Send>() {}
1135 fn is_sync<T: Sync>() {}
1136
1137 is_send::<EncodedBytes>();
1139 is_sync::<EncodedBytes>();
1140
1141 is_send::<crate::Error>();
1143 is_sync::<crate::Error>();
1144 }
1145
1146 #[cfg(feature = "std")]
1151 #[test]
1152 fn concurrency_test_parallel_encode_into() {
1153 use std::sync::Arc;
1154 use std::sync::Mutex;
1155 use std::thread;
1156
1157 let results = Arc::new(Mutex::new(Vec::new()));
1159 let handles: Vec<_> = (0..10)
1160 .map(|i| {
1161 let results = Arc::clone(&results);
1162 thread::spawn(move || {
1163 let value = i as u32 * 100;
1164 let encoded = value.encode_into();
1165 results.lock().unwrap().push((value, encoded));
1166 })
1167 })
1168 .collect();
1169
1170 for handle in handles {
1171 handle.join().unwrap();
1172 }
1173
1174 let results = results.lock().unwrap();
1176 assert_eq!(results.len(), 10);
1177 for (original, encoded) in results.iter() {
1178 let (decoded, _) = u32::try_decode_from(encoded).unwrap();
1179 assert_eq!(*original, decoded);
1180 }
1181 }
1182
1183 #[cfg(feature = "std")]
1184 #[test]
1185 fn concurrency_test_parallel_encode_into_buffer() {
1186 use std::thread;
1187
1188 let handles: Vec<_> = (0..10)
1190 .map(|i| {
1191 thread::spawn(move || {
1192 let mut buffer = Vec::new();
1193 for j in 0u16..100 {
1194 (i * 100 + j).encode_into_buffer(&mut buffer);
1195 }
1196 buffer
1197 })
1198 })
1199 .collect();
1200
1201 for handle in handles {
1202 let buffer = handle.join().unwrap();
1203 assert!(buffer.len() >= 100); assert!(buffer.len() < 300); }
1206 }
1207
1208 #[cfg(feature = "std")]
1209 #[test]
1210 fn concurrency_test_parallel_encode_into_array() {
1211 use std::thread;
1212
1213 let handles: Vec<_> = (0..10)
1215 .map(|i| {
1216 thread::spawn(move || {
1217 let value = i as u64 * 1000;
1218 let (array, len) = value.encode_into_array();
1219 (value, array, len)
1220 })
1221 })
1222 .collect();
1223
1224 for handle in handles {
1225 let (original, array, len) = handle.join().unwrap();
1226 let (decoded, _) = u64::try_decode_from(&array[..len]).unwrap();
1227 assert_eq!(original, decoded);
1228 }
1229 }
1230
1231 #[cfg(feature = "std")]
1236 #[test]
1237 fn concurrency_test_shared_decode_data() {
1238 use std::sync::Arc;
1239 use std::thread;
1240
1241 let mut data = Vec::new();
1243 for i in 0u32..100 {
1244 data.extend_from_slice(&i.encode_into());
1245 }
1246 let shared_data = Arc::new(data);
1247
1248 let handles: Vec<_> = (0..4)
1250 .map(|_| {
1251 let data = Arc::clone(&shared_data);
1252 thread::spawn(move || {
1253 let mut slice = &data[..];
1254 let mut count = 0;
1255 while !slice.is_empty() {
1256 match u32::try_decode_from(slice) {
1257 Ok((_, remaining)) => {
1258 count += 1;
1259 slice = remaining;
1260 }
1261 Err(_) => break,
1262 }
1263 }
1264 count
1265 })
1266 })
1267 .collect();
1268
1269 for handle in handles {
1270 let count = handle.join().unwrap();
1271 assert_eq!(count, 100, "All threads should decode 100 values");
1272 }
1273 }
1274
1275 #[cfg(feature = "std")]
1276 #[test]
1277 fn concurrency_test_parallel_decode_different_data() {
1278 use std::thread;
1279
1280 let handles: Vec<_> = (0..10)
1282 .map(|i| {
1283 thread::spawn(move || {
1284 let mut data = Vec::new();
1286 for j in 0u16..50 {
1287 (i * 50 + j).encode_into_buffer(&mut data);
1288 }
1289
1290 let mut slice = &data[..];
1292 let mut decoded_values = Vec::new();
1293 while !slice.is_empty() {
1294 match u16::try_decode_from(slice) {
1295 Ok((value, remaining)) => {
1296 decoded_values.push(value);
1297 slice = remaining;
1298 }
1299 Err(_) => break,
1300 }
1301 }
1302 decoded_values
1303 })
1304 })
1305 .collect();
1306
1307 for (i, handle) in handles.into_iter().enumerate() {
1308 let values = handle.join().unwrap();
1309 assert_eq!(values.len(), 50);
1310 assert_eq!(values[0], i as u16 * 50);
1312 assert_eq!(values[49], i as u16 * 50 + 49);
1313 }
1314 }
1315
1316 #[cfg(feature = "std")]
1321 #[test]
1322 fn concurrency_test_pipeline_encode_decode() {
1323 use std::sync::mpsc;
1324 use std::thread;
1325
1326 let (tx, rx) = mpsc::channel();
1327
1328 let encoder = thread::spawn(move || {
1330 for i in 0u32..1000 {
1331 tx.send(i.encode_into()).unwrap();
1332 }
1333 });
1334
1335 let decoder = thread::spawn(move || {
1337 let mut sum = 0u64;
1338 for encoded in rx {
1339 let (value, _) = u32::try_decode_from(&encoded).unwrap();
1340 sum += u64::from(value);
1341 }
1342 sum
1343 });
1344
1345 encoder.join().unwrap();
1346 let sum = decoder.join().unwrap();
1347
1348 assert_eq!(sum, 499_500);
1350 }
1351
1352 #[cfg(feature = "std")]
1353 #[test]
1354 fn concurrency_test_multi_producer_single_consumer() {
1355 use std::sync::mpsc;
1356 use std::thread;
1357
1358 let (tx, rx) = mpsc::channel();
1359
1360 let producers: Vec<_> = (0..4)
1362 .map(|thread_id| {
1363 let tx = tx.clone();
1364 thread::spawn(move || {
1365 for i in 0u16..100 {
1366 let value = thread_id * 100 + i;
1367 tx.send(value.encode_into()).unwrap();
1368 }
1369 })
1370 })
1371 .collect();
1372
1373 drop(tx);
1375
1376 let consumer = thread::spawn(move || {
1378 let mut count = 0;
1379 for encoded in rx {
1380 let (value, _) = u16::try_decode_from(&encoded).unwrap();
1381 assert!(value < 400);
1382 count += 1;
1383 }
1384 count
1385 });
1386
1387 for producer in producers {
1388 producer.join().unwrap();
1389 }
1390
1391 let total = consumer.join().unwrap();
1392 assert_eq!(total, 400); }
1394
1395 #[cfg(feature = "std")]
1400 #[test]
1401 fn concurrency_test_stress_parallel_encoding() {
1402 use std::thread;
1403
1404 let handles: Vec<_> = (0..100)
1406 .map(|i| {
1407 thread::spawn(move || {
1408 let mut buffer = Vec::new();
1409 for j in 0u8..255 {
1410 ((i * 255 + u32::from(j)) % u32::from(u16::MAX))
1411 .encode_into_buffer(&mut buffer);
1412 }
1413 buffer.len()
1414 })
1415 })
1416 .collect();
1417
1418 let mut total_bytes = 0;
1419 for handle in handles {
1420 total_bytes += handle.join().unwrap();
1421 }
1422
1423 assert!(total_bytes >= 25500); assert!(total_bytes < 76500); }
1427
1428 #[cfg(feature = "std")]
1429 #[test]
1430 fn concurrency_test_stress_shared_read() {
1431 use std::sync::Arc;
1432 use std::thread;
1433
1434 let mut data = Vec::new();
1436 for i in 0u32..10000 {
1437 i.encode_into_buffer(&mut data);
1438 }
1439 let shared_data = Arc::new(data);
1440
1441 let handles: Vec<_> = (0..50)
1443 .map(|_| {
1444 let data = Arc::clone(&shared_data);
1445 thread::spawn(move || {
1446 let mut slice = &data[..];
1447 let mut count = 0;
1448 while !slice.is_empty() {
1449 if let Ok((_, remaining)) = u32::try_decode_from(slice) {
1450 count += 1;
1451 slice = remaining;
1452 } else {
1453 break;
1454 }
1455 }
1456 count
1457 })
1458 })
1459 .collect();
1460
1461 for handle in handles {
1462 let count = handle.join().unwrap();
1463 assert_eq!(count, 10000);
1464 }
1465 }
1466
1467 #[cfg(feature = "std")]
1472 #[test]
1473 fn concurrency_test_work_stealing() {
1474 use std::sync::Arc;
1475 use std::sync::Mutex;
1476 use std::thread;
1477
1478 let work_queue = Arc::new(Mutex::new((0u32..1000).collect::<Vec<_>>()));
1480 let results = Arc::new(Mutex::new(Vec::new()));
1481
1482 let workers: Vec<_> = (0..4)
1484 .map(|_| {
1485 let queue = Arc::clone(&work_queue);
1486 let results = Arc::clone(&results);
1487 thread::spawn(move || {
1488 loop {
1489 let work_item = {
1490 let mut queue = queue.lock().unwrap();
1491 queue.pop()
1492 };
1493
1494 match work_item {
1495 Some(value) => {
1496 let encoded = value.encode_into();
1498 let (decoded, _) = u32::try_decode_from(&encoded).unwrap();
1499 results.lock().unwrap().push(decoded);
1500 }
1501 None => break,
1502 }
1503 }
1504 })
1505 })
1506 .collect();
1507
1508 for worker in workers {
1509 worker.join().unwrap();
1510 }
1511
1512 let results = results.lock().unwrap();
1513 assert_eq!(results.len(), 1000);
1514 }
1515}