1#![warn(missing_docs)]
274#![deny(
275 trivial_casts,
276 trivial_numeric_casts,
277 unused_import_braces,
278 unused_qualifications
279)]
280#![cfg_attr(not(feature = "std"), no_std)]
281
282#[cfg(not(feature = "std"))]
283extern crate alloc;
284
285pub mod error;
287pub use error::Error;
288
289pub mod enc_into;
291pub use enc_into::EncodeInto;
292
293pub mod enc_into_buffer;
295pub use enc_into_buffer::EncodeIntoBuffer;
296
297pub mod enc_into_array;
299pub use enc_into_array::EncodeIntoArray;
300
301pub mod null;
303pub use null::{Null, TryNull};
304
305pub mod try_decode_from;
307pub use try_decode_from::TryDecodeFrom;
308
309pub mod encoded_bytes;
311pub use encoded_bytes::EncodedBytes;
312
313pub mod prelude {
315 pub use super::{
316 enc_into::*, enc_into_array::*, enc_into_buffer::*, encoded_bytes::*, null::*,
317 try_decode_from::*,
318 };
319}
320
321#[cfg(test)]
322mod test {
323 use super::prelude::*;
324
325 #[test]
326 fn test_bool() {
327 let tbuf = true.encode_into();
328 let (tval, _) = bool::try_decode_from(&tbuf).unwrap();
329 assert!(tval);
330 let fbuf = false.encode_into();
331 let (fval, _) = bool::try_decode_from(&fbuf).unwrap();
332 assert!(!fval);
333 }
334
335 #[test]
336 fn test_u8() {
337 let buf = 0xff_u8.encode_into();
338 let (num, _) = u8::try_decode_from(&buf).unwrap();
339 assert_eq!(0xff_u8, num);
340 }
341
342 #[test]
343 fn test_u16() {
344 let buf = 0xffee_u16.encode_into();
345 let (num, _) = u16::try_decode_from(&buf).unwrap();
346 assert_eq!(0xffee_u16, num);
347 }
348
349 #[test]
350 fn test_u32() {
351 let buf = 0xffee_ddcc_u32.encode_into();
352 let (num, _) = u32::try_decode_from(&buf).unwrap();
353 assert_eq!(0xffee_ddcc_u32, num);
354 }
355
356 #[test]
357 fn test_u64() {
358 let buf = 0xffee_ddcc_bbaa_9988_u64.encode_into();
359 let (num, _) = u64::try_decode_from(&buf).unwrap();
360 assert_eq!(0xffee_ddcc_bbaa_9988_u64, num);
361 }
362
363 #[test]
364 fn test_u128() {
365 let buf = 0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128.encode_into();
366 let (num, _) = u128::try_decode_from(&buf).unwrap();
367 assert_eq!(0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128, num);
368 }
369
370 #[cfg(target_pointer_width = "64")]
371 #[test]
372 fn test_usize() {
373 let buf = 0xffee_ddcc_bbaa_9988_usize.encode_into();
374 let (num, _) = usize::try_decode_from(&buf).unwrap();
375 assert_eq!(0xffee_ddcc_bbaa_9988_usize, num);
376 }
377
378 #[cfg(target_pointer_width = "32")]
379 #[test]
380 fn test_usize() {
381 let buf = 0xffeeddcc_usize.encode_into();
382 let (num, _) = usize::try_decode_from(&buf).unwrap();
383 assert_eq!(0xffeeddcc_usize, num);
384 }
385
386 struct Foo(usize);
387
388 impl Null for Foo {
389 fn null() -> Self {
390 Foo(0)
391 }
392 fn is_null(&self) -> bool {
393 self.0 == 0
394 }
395 }
396
397 impl TryNull for Foo {
398 type Error = &'static str;
399
400 fn try_null() -> Result<Self, Self::Error> {
401 Ok(Foo(0))
402 }
403 fn is_null(&self) -> bool {
404 self.0 == 0
405 }
406 }
407
408 #[test]
409 fn test_null_value() {
410 let f = Foo::null();
411 assert!(Null::is_null(&f));
412 }
413
414 #[test]
415 fn test_try_null_value() {
416 let f = Foo::try_null().unwrap();
417 assert!(TryNull::is_null(&f));
418 }
419
420 #[test]
425 fn test_decode_empty_slice_u8() {
426 let empty: &[u8] = &[];
427 let result = u8::try_decode_from(empty);
428 assert!(result.is_err(), "Should fail to decode from empty slice");
429 }
430
431 #[test]
432 fn test_decode_empty_slice_u16() {
433 let empty: &[u8] = &[];
434 let result = u16::try_decode_from(empty);
435 assert!(result.is_err(), "Should fail to decode from empty slice");
436 }
437
438 #[test]
439 fn test_decode_empty_slice_u32() {
440 let empty: &[u8] = &[];
441 let result = u32::try_decode_from(empty);
442 assert!(result.is_err(), "Should fail to decode from empty slice");
443 }
444
445 #[test]
446 fn test_decode_empty_slice_u64() {
447 let empty: &[u8] = &[];
448 let result = u64::try_decode_from(empty);
449 assert!(result.is_err(), "Should fail to decode from empty slice");
450 }
451
452 #[test]
453 fn test_decode_empty_slice_u128() {
454 let empty: &[u8] = &[];
455 let result = u128::try_decode_from(empty);
456 assert!(result.is_err(), "Should fail to decode from empty slice");
457 }
458
459 #[test]
460 fn test_decode_empty_slice_bool() {
461 let empty: &[u8] = &[];
462 let result = bool::try_decode_from(empty);
463 assert!(result.is_err(), "Should fail to decode from empty slice");
464 }
465
466 #[test]
467 fn test_decode_truncated_varint() {
468 let truncated = vec![0x80]; let result = u16::try_decode_from(&truncated);
471 assert!(result.is_err(), "Should fail on truncated varint");
472 }
473
474 #[test]
475 fn test_decode_truncated_large_varint() {
476 let truncated = vec![0xFF, 0xFF]; let result = u32::try_decode_from(&truncated);
479 assert!(result.is_err(), "Should fail on truncated large varint");
480 }
481
482 #[test]
487 fn test_encode_decode_zero_values() {
488 assert_eq!(0u8.encode_into(), vec![0]);
490 assert_eq!(0u16.encode_into(), vec![0]);
491 assert_eq!(0u32.encode_into(), vec![0]);
492 assert_eq!(0u64.encode_into(), vec![0]);
493 assert_eq!(0u128.encode_into(), vec![0]);
494 assert_eq!(0usize.encode_into(), vec![0]);
495
496 let (val, rest) = u8::try_decode_from(&[0]).unwrap();
498 assert_eq!(val, 0);
499 assert!(rest.is_empty());
500 }
501
502 #[test]
503 fn test_encode_decode_max_u8() {
504 let max = u8::MAX;
505 let encoded = max.encode_into();
506 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
507 assert_eq!(decoded, max);
508 assert!(remaining.is_empty());
509 }
510
511 #[test]
512 fn test_encode_decode_max_u16() {
513 let max = u16::MAX;
514 let encoded = max.encode_into();
515 let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
516 assert_eq!(decoded, max);
517 assert!(remaining.is_empty());
518 }
519
520 #[test]
521 fn test_encode_decode_max_u32() {
522 let max = u32::MAX;
523 let encoded = max.encode_into();
524 let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
525 assert_eq!(decoded, max);
526 assert!(remaining.is_empty());
527 }
528
529 #[test]
530 fn test_encode_decode_max_u64() {
531 let max = u64::MAX;
532 let encoded = max.encode_into();
533 let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
534 assert_eq!(decoded, max);
535 assert!(remaining.is_empty());
536 }
537
538 #[test]
539 fn test_encode_decode_max_u128() {
540 let max = u128::MAX;
541 let encoded = max.encode_into();
542 let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
543 assert_eq!(decoded, max);
544 assert!(remaining.is_empty());
545 }
546
547 #[test]
548 fn test_varint_boundary_127() {
549 let val = 127u8;
551 let encoded = val.encode_into();
552 assert_eq!(encoded.len(), 1);
553 let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
554 assert_eq!(decoded, val);
555 }
556
557 #[test]
558 fn test_varint_boundary_128() {
559 let val = 128u8;
561 let encoded = val.encode_into();
562 assert_eq!(encoded.len(), 2);
563 let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
564 assert_eq!(decoded, val);
565 }
566
567 #[test]
568 fn test_bool_nonzero_as_true() {
569 let bytes = vec![42];
571 let (val, _) = bool::try_decode_from(&bytes).unwrap();
572 assert!(val);
573 }
574
575 #[test]
580 fn test_roundtrip_u8_range() {
581 for value in [0, 1, 127, 128, 255] {
583 let encoded = value.encode_into();
584 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
585 assert_eq!(decoded, value, "Round-trip failed for u8 value {}", value);
586 assert!(remaining.is_empty());
587 }
588 }
589
590 #[test]
591 fn test_roundtrip_u16_range() {
592 for value in [0, 1, 127, 128, 255, 256, 16383, 16384, 65535] {
594 let encoded = value.encode_into();
595 let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
596 assert_eq!(decoded, value, "Round-trip failed for u16 value {}", value);
597 assert!(remaining.is_empty());
598 }
599 }
600
601 #[test]
602 fn test_roundtrip_u32_range() {
603 for value in [0, 1, 127, 128, 16384, 65536, u32::MAX] {
605 let encoded = value.encode_into();
606 let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
607 assert_eq!(decoded, value, "Round-trip failed for u32 value {}", value);
608 assert!(remaining.is_empty());
609 }
610 }
611
612 #[test]
613 fn test_roundtrip_u64_range() {
614 for value in [0, 1, 127, 128, 65536, u32::MAX as u64, u64::MAX] {
616 let encoded = value.encode_into();
617 let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
618 assert_eq!(decoded, value, "Round-trip failed for u64 value {}", value);
619 assert!(remaining.is_empty());
620 }
621 }
622
623 #[test]
624 fn test_roundtrip_bool() {
625 for value in [true, false] {
626 let encoded = value.encode_into();
627 let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
628 assert_eq!(decoded, value, "Round-trip failed for bool {}", value);
629 assert!(remaining.is_empty());
630 }
631 }
632
633 #[test]
634 fn test_sequential_decode() {
635 let mut buffer = Vec::new();
637 buffer.extend_from_slice(&42u8.encode_into());
638 buffer.extend_from_slice(&1000u16.encode_into());
639 buffer.extend_from_slice(&100_000_u32.encode_into());
640
641 let (val1, rest) = u8::try_decode_from(&buffer).unwrap();
643 assert_eq!(val1, 42);
644
645 let (val2, rest) = u16::try_decode_from(rest).unwrap();
646 assert_eq!(val2, 1000);
647
648 let (val3, rest) = u32::try_decode_from(rest).unwrap();
649 assert_eq!(val3, 100_000);
650
651 assert!(rest.is_empty(), "Should have consumed all bytes");
652 }
653
654 #[test]
655 fn test_remaining_bytes_returned() {
656 let mut buffer = Vec::new();
658 buffer.extend_from_slice(&42u8.encode_into());
659 buffer.extend_from_slice(&[0xFF, 0xEE, 0xDD]); let (val, remaining) = u8::try_decode_from(&buffer).unwrap();
662 assert_eq!(val, 42);
663 assert_eq!(remaining, &[0xFF, 0xEE, 0xDD]);
664 }
665
666 #[test]
667 fn test_encode_length_efficiency() {
668 assert_eq!(0u8.encode_into().len(), 1);
670 assert_eq!(127u8.encode_into().len(), 1);
671 assert_eq!(128u8.encode_into().len(), 2);
672 assert_eq!(255u8.encode_into().len(), 2);
673
674 assert!(u16::MAX.encode_into().len() > 1);
676 assert!(u32::MAX.encode_into().len() > 2);
677 }
678
679 use proptest::prelude::*;
684
685 proptest! {
686 #[test]
687 fn prop_roundtrip_u8(value: u8) {
688 let encoded = value.encode_into();
689 let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
690 prop_assert_eq!(decoded, value);
691 prop_assert!(remaining.is_empty());
692 }
693
694 #[test]
695 fn prop_roundtrip_u16(value: u16) {
696 let encoded = value.encode_into();
697 let (decoded, remaining) = u16::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_u32(value: u32) {
704 let encoded = value.encode_into();
705 let (decoded, remaining) = u32::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_u64(value: u64) {
712 let encoded = value.encode_into();
713 let (decoded, remaining) = u64::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_u128(value: u128) {
720 let encoded = value.encode_into();
721 let (decoded, remaining) = u128::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_usize(value: usize) {
728 let encoded = value.encode_into();
729 let (decoded, remaining) = usize::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_bool(value: bool) {
736 let encoded = value.encode_into();
737 let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
738 prop_assert_eq!(decoded, value);
739 prop_assert!(remaining.is_empty());
740 }
741
742 #[test]
743 fn prop_encode_not_empty(value: u32) {
744 let encoded = value.encode_into();
745 prop_assert!(!encoded.is_empty());
746 }
747
748 #[test]
749 fn prop_encode_deterministic(value: u64) {
750 let encoded1 = value.encode_into();
751 let encoded2 = value.encode_into();
752 prop_assert_eq!(encoded1, encoded2);
753 }
754
755 #[test]
756 fn prop_small_values_compact(value in 0u32..128) {
757 let encoded = value.encode_into();
758 prop_assert_eq!(encoded.len(), 1, "Values under 128 should encode in 1 byte");
759 }
760
761 #[test]
762 fn prop_sequential_decode(v1: u8, v2: u16, v3: u32) {
763 let mut buffer = Vec::new();
764 buffer.extend_from_slice(&v1.encode_into());
765 buffer.extend_from_slice(&v2.encode_into());
766 buffer.extend_from_slice(&v3.encode_into());
767
768 let (d1, rest) = u8::try_decode_from(&buffer).unwrap();
769 prop_assert_eq!(d1, v1);
770
771 let (d2, rest) = u16::try_decode_from(rest).unwrap();
772 prop_assert_eq!(d2, v2);
773
774 let (d3, rest) = u32::try_decode_from(rest).unwrap();
775 prop_assert_eq!(d3, v3);
776
777 prop_assert!(rest.is_empty());
778 }
779 }
780
781 #[test]
787 fn assert_error_send_sync() {
788 fn is_send<T: Send>() {}
789 fn is_sync<T: Sync>() {}
790 is_send::<crate::Error>();
791 is_sync::<crate::Error>();
792 }
793
794 #[test]
796 fn assert_encoded_bytes_send_sync() {
797 fn is_send<T: Send>() {}
798 fn is_sync<T: Sync>() {}
799 is_send::<EncodedBytes>();
800 is_sync::<EncodedBytes>();
801 }
802
803 #[test]
804 fn test_encoded_bytes_valid() {
805 let bytes = vec![42];
806 let encoded = EncodedBytes::try_from(bytes).unwrap();
807 assert_eq!(encoded.as_ref(), &[42]);
808 }
809
810 #[test]
811 fn test_encoded_bytes_invalid_empty() {
812 let empty: Vec<u8> = vec![];
813 assert!(EncodedBytes::try_from(empty).is_err());
814 }
815
816 #[test]
817 fn test_encoded_bytes_invalid_truncated() {
818 let truncated = vec![0x80];
819 assert!(EncodedBytes::try_from(truncated).is_err());
820 }
821
822 #[test]
823 fn test_encoded_bytes_into_vec() {
824 let original = 128u8.encode_into();
826 let encoded = EncodedBytes::new(&original).unwrap();
827 let recovered: Vec<u8> = encoded.into();
828 assert_eq!(recovered, original);
829 }
830
831 #[cfg(feature = "std")]
832 #[test]
833 fn test_encoded_bytes_thread_safe() {
834 use std::sync::Arc;
835 use std::thread;
836
837 let encoded = EncodedBytes::new(&[42]).unwrap();
838 let shared = Arc::new(encoded);
839
840 let handles: Vec<_> = (0..4)
841 .map(|_| {
842 let data = Arc::clone(&shared);
843 thread::spawn(move || {
844 assert_eq!(&data[..], &[42]);
845 })
846 })
847 .collect();
848
849 for handle in handles {
850 handle.join().unwrap();
851 }
852 }
853
854 #[test]
859 fn security_test_all_continuation_bits() {
860 let malicious = vec![0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
862 let result = u64::try_decode_from(&malicious);
863 assert!(
865 result.is_err(),
866 "Should reject all-continuation-bit sequence"
867 );
868 }
869
870 #[test]
871 fn security_test_maximum_length_varint_u64() {
872 let max_encoded = u64::MAX.encode_into();
874 assert_eq!(max_encoded.len(), 10);
875 let (decoded, remaining) = u64::try_decode_from(&max_encoded).unwrap();
876 assert_eq!(decoded, u64::MAX);
877 assert!(remaining.is_empty());
878 }
879
880 #[test]
881 fn security_test_maximum_length_varint_u128() {
882 let max_encoded = u128::MAX.encode_into();
884 assert_eq!(max_encoded.len(), 19);
885 let (decoded, remaining) = u128::try_decode_from(&max_encoded).unwrap();
886 assert_eq!(decoded, u128::MAX);
887 assert!(remaining.is_empty());
888 }
889
890 #[test]
891 fn security_test_single_byte_with_continuation() {
892 let malicious = vec![0x80];
894 assert!(u8::try_decode_from(&malicious).is_err());
895 assert!(u16::try_decode_from(&malicious).is_err());
896 assert!(u32::try_decode_from(&malicious).is_err());
897 assert!(u64::try_decode_from(&malicious).is_err());
898 }
899
900 #[test]
901 fn security_test_multiple_continuation_bytes_truncated() {
902 let malicious = vec![0xFF, 0xFF, 0xFF];
904 assert!(u32::try_decode_from(&malicious).is_err());
905 }
906
907 #[test]
908 fn security_test_encoded_bytes_rejects_invalid() {
909 assert!(EncodedBytes::try_from(vec![]).is_err());
913
914 assert!(EncodedBytes::try_from(vec![0x80]).is_err());
916
917 let mut with_trailing = vec![42];
919 with_trailing.extend_from_slice(&[0xFF, 0xEE]);
920 assert!(EncodedBytes::try_from(with_trailing).is_err());
921
922 assert!(EncodedBytes::try_from(vec![0xFF, 0xFF, 0xFF]).is_err());
924 }
925
926 #[test]
927 fn security_test_buffer_encoding_no_overflow() {
928 let mut buffer = Vec::new();
930
931 for i in 0u16..1000 {
933 i.encode_into_buffer(&mut buffer);
934 }
935
936 assert!(buffer.len() > 1000); assert!(buffer.len() < 3000); }
940
941 #[test]
942 fn security_test_array_encoding_bounds() {
943 let (array, len) = u128::MAX.encode_into_array();
945 assert!(len <= 19, "u128::MAX should not exceed 19 bytes");
946
947 let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
949 assert_eq!(decoded, u128::MAX);
950 }
951
952 #[test]
953 fn security_test_bool_decode_nonzero_values() {
954 let nonzero_values = vec![
956 vec![1], vec![42], vec![127], vec![0xFF, 0x01], ];
961
962 for bytes in nonzero_values {
963 let (val, _) = bool::try_decode_from(&bytes).unwrap();
964 assert!(val, "Non-zero value {:?} should decode as true", bytes);
965 }
966
967 let (val, _) = bool::try_decode_from(&[0]).unwrap();
969 assert!(!val);
970 }
971
972 #[test]
973 fn security_test_zero_length_slice_rejection() {
974 let empty: &[u8] = &[];
976
977 assert!(u8::try_decode_from(empty).is_err());
978 assert!(u16::try_decode_from(empty).is_err());
979 assert!(u32::try_decode_from(empty).is_err());
980 assert!(u64::try_decode_from(empty).is_err());
981 assert!(u128::try_decode_from(empty).is_err());
982 assert!(usize::try_decode_from(empty).is_err());
983 assert!(bool::try_decode_from(empty).is_err());
984 }
985
986 #[test]
987 fn security_test_repeated_decoding_no_panic() {
988 let malicious = vec![0xFF, 0xFF];
990
991 for _ in 0..100 {
992 let _ = u32::try_decode_from(&malicious);
993 let _ = u64::try_decode_from(&malicious);
994 }
995 }
996
997 #[test]
998 fn security_test_alternating_bit_patterns() {
999 let patterns = vec![
1001 vec![0xAA], vec![0x55], vec![0xAA, 0x55],
1004 vec![0x55, 0xAA],
1005 ];
1006
1007 for pattern in patterns {
1008 let _ = u8::try_decode_from(&pattern);
1011 let _ = u16::try_decode_from(&pattern);
1012 }
1013 }
1014
1015 proptest! {
1020 #[test]
1021 fn security_prop_decode_random_bytes(bytes in prop::collection::vec(any::<u8>(), 0..50)) {
1022 let _ = u8::try_decode_from(&bytes);
1025 let _ = u16::try_decode_from(&bytes);
1026 let _ = u32::try_decode_from(&bytes);
1027 let _ = u64::try_decode_from(&bytes);
1028 let _ = u128::try_decode_from(&bytes);
1029 }
1030
1031 #[test]
1032 fn security_prop_encoded_bytes_validation(bytes in prop::collection::vec(any::<u8>(), 0..100)) {
1033 let result = EncodedBytes::try_from(bytes);
1035
1036 if let Ok(encoded) = result {
1038 let decode_result = u128::try_decode_from(encoded.as_ref());
1040 prop_assert!(decode_result.is_ok(), "Validated EncodedBytes should be decodable");
1041 }
1042 }
1043
1044 #[test]
1045 fn security_prop_buffer_encoding_no_panic(values in prop::collection::vec(any::<u32>(), 0..1000)) {
1046 let mut buffer = Vec::new();
1048 for value in values {
1049 value.encode_into_buffer(&mut buffer);
1050 }
1051
1052 prop_assert!(buffer.len() < 5000, "Buffer should not grow excessively");
1054 }
1055
1056 #[test]
1057 fn security_prop_array_encoding_never_panics(value: u128) {
1058 let (_array, len) = value.encode_into_array();
1060
1061 prop_assert!(len > 0);
1063 prop_assert!(len <= 19);
1064
1065 let (array, len) = value.encode_into_array();
1067 let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
1068 prop_assert_eq!(decoded, value);
1069 }
1070
1071 #[test]
1072 fn security_prop_decode_never_returns_more_than_input(
1073 bytes in prop::collection::vec(any::<u8>(), 1..100)
1074 ) {
1075 if let Ok((_, remaining)) = u64::try_decode_from(&bytes) {
1077 prop_assert!(remaining.len() <= bytes.len());
1078 }
1079 }
1080
1081 #[test]
1082 fn security_prop_encode_size_bounded(value: u64) {
1083 let encoded = value.encode_into();
1085 prop_assert!(encoded.len() <= 10, "u64 varint should not exceed 10 bytes");
1086
1087 let (_array, len) = value.encode_into_array();
1088 prop_assert!(len <= 10, "u64 array encoding should not exceed 10 bytes");
1089 }
1090 }
1091
1092 #[test]
1098 fn assert_primitives_send_sync() {
1099 fn is_send<T: Send>() {}
1100 fn is_sync<T: Sync>() {}
1101
1102 is_send::<u8>();
1104 is_sync::<u8>();
1105 is_send::<u16>();
1106 is_sync::<u16>();
1107 is_send::<u32>();
1108 is_sync::<u32>();
1109 is_send::<u64>();
1110 is_sync::<u64>();
1111 is_send::<u128>();
1112 is_sync::<u128>();
1113 is_send::<usize>();
1114 is_sync::<usize>();
1115 is_send::<bool>();
1116 is_sync::<bool>();
1117
1118 is_send::<Vec<u8>>();
1120 is_sync::<Vec<u8>>();
1121 }
1122
1123 #[test]
1125 fn assert_encoded_types_send_sync() {
1126 fn is_send<T: Send>() {}
1127 fn is_sync<T: Sync>() {}
1128
1129 is_send::<EncodedBytes>();
1131 is_sync::<EncodedBytes>();
1132
1133 is_send::<crate::Error>();
1135 is_sync::<crate::Error>();
1136 }
1137
1138 #[cfg(feature = "std")]
1143 #[test]
1144 fn concurrency_test_parallel_encode_into() {
1145 use std::sync::Arc;
1146 use std::sync::Mutex;
1147 use std::thread;
1148
1149 let results = Arc::new(Mutex::new(Vec::new()));
1151 let handles: Vec<_> = (0..10)
1152 .map(|i| {
1153 let results = Arc::clone(&results);
1154 thread::spawn(move || {
1155 let value = i as u32 * 100;
1156 let encoded = value.encode_into();
1157 results.lock().unwrap().push((value, encoded));
1158 })
1159 })
1160 .collect();
1161
1162 for handle in handles {
1163 handle.join().unwrap();
1164 }
1165
1166 let results = results.lock().unwrap();
1168 assert_eq!(results.len(), 10);
1169 for (original, encoded) in results.iter() {
1170 let (decoded, _) = u32::try_decode_from(encoded).unwrap();
1171 assert_eq!(*original, decoded);
1172 }
1173 }
1174
1175 #[cfg(feature = "std")]
1176 #[test]
1177 fn concurrency_test_parallel_encode_into_buffer() {
1178 use std::thread;
1179
1180 let handles: Vec<_> = (0..10)
1182 .map(|i| {
1183 thread::spawn(move || {
1184 let mut buffer = Vec::new();
1185 for j in 0u16..100 {
1186 (i * 100 + j).encode_into_buffer(&mut buffer);
1187 }
1188 buffer
1189 })
1190 })
1191 .collect();
1192
1193 for handle in handles {
1194 let buffer = handle.join().unwrap();
1195 assert!(buffer.len() >= 100); assert!(buffer.len() < 300); }
1198 }
1199
1200 #[cfg(feature = "std")]
1201 #[test]
1202 fn concurrency_test_parallel_encode_into_array() {
1203 use std::thread;
1204
1205 let handles: Vec<_> = (0..10)
1207 .map(|i| {
1208 thread::spawn(move || {
1209 let value = i as u64 * 1000;
1210 let (array, len) = value.encode_into_array();
1211 (value, array, len)
1212 })
1213 })
1214 .collect();
1215
1216 for handle in handles {
1217 let (original, array, len) = handle.join().unwrap();
1218 let (decoded, _) = u64::try_decode_from(&array[..len]).unwrap();
1219 assert_eq!(original, decoded);
1220 }
1221 }
1222
1223 #[cfg(feature = "std")]
1228 #[test]
1229 fn concurrency_test_shared_decode_data() {
1230 use std::sync::Arc;
1231 use std::thread;
1232
1233 let mut data = Vec::new();
1235 for i in 0u32..100 {
1236 data.extend_from_slice(&i.encode_into());
1237 }
1238 let shared_data = Arc::new(data);
1239
1240 let handles: Vec<_> = (0..4)
1242 .map(|_| {
1243 let data = Arc::clone(&shared_data);
1244 thread::spawn(move || {
1245 let mut slice = &data[..];
1246 let mut count = 0;
1247 while !slice.is_empty() {
1248 match u32::try_decode_from(slice) {
1249 Ok((_, remaining)) => {
1250 count += 1;
1251 slice = remaining;
1252 }
1253 Err(_) => break,
1254 }
1255 }
1256 count
1257 })
1258 })
1259 .collect();
1260
1261 for handle in handles {
1262 let count = handle.join().unwrap();
1263 assert_eq!(count, 100, "All threads should decode 100 values");
1264 }
1265 }
1266
1267 #[cfg(feature = "std")]
1268 #[test]
1269 fn concurrency_test_parallel_decode_different_data() {
1270 use std::thread;
1271
1272 let handles: Vec<_> = (0..10)
1274 .map(|i| {
1275 thread::spawn(move || {
1276 let mut data = Vec::new();
1278 for j in 0u16..50 {
1279 (i * 50 + j).encode_into_buffer(&mut data);
1280 }
1281
1282 let mut slice = &data[..];
1284 let mut decoded_values = Vec::new();
1285 while !slice.is_empty() {
1286 match u16::try_decode_from(slice) {
1287 Ok((value, remaining)) => {
1288 decoded_values.push(value);
1289 slice = remaining;
1290 }
1291 Err(_) => break,
1292 }
1293 }
1294 decoded_values
1295 })
1296 })
1297 .collect();
1298
1299 for (i, handle) in handles.into_iter().enumerate() {
1300 let values = handle.join().unwrap();
1301 assert_eq!(values.len(), 50);
1302 assert_eq!(values[0], i as u16 * 50);
1304 assert_eq!(values[49], i as u16 * 50 + 49);
1305 }
1306 }
1307
1308 #[cfg(feature = "std")]
1313 #[test]
1314 fn concurrency_test_pipeline_encode_decode() {
1315 use std::sync::mpsc;
1316 use std::thread;
1317
1318 let (tx, rx) = mpsc::channel();
1319
1320 let encoder = thread::spawn(move || {
1322 for i in 0u32..1000 {
1323 tx.send(i.encode_into()).unwrap();
1324 }
1325 });
1326
1327 let decoder = thread::spawn(move || {
1329 let mut sum = 0u64;
1330 for encoded in rx {
1331 let (value, _) = u32::try_decode_from(&encoded).unwrap();
1332 sum += value as u64;
1333 }
1334 sum
1335 });
1336
1337 encoder.join().unwrap();
1338 let sum = decoder.join().unwrap();
1339
1340 assert_eq!(sum, 499_500);
1342 }
1343
1344 #[cfg(feature = "std")]
1345 #[test]
1346 fn concurrency_test_multi_producer_single_consumer() {
1347 use std::sync::mpsc;
1348 use std::thread;
1349
1350 let (tx, rx) = mpsc::channel();
1351
1352 let producers: Vec<_> = (0..4)
1354 .map(|thread_id| {
1355 let tx = tx.clone();
1356 thread::spawn(move || {
1357 for i in 0u16..100 {
1358 let value = thread_id * 100 + i;
1359 tx.send(value.encode_into()).unwrap();
1360 }
1361 })
1362 })
1363 .collect();
1364
1365 drop(tx);
1367
1368 let consumer = thread::spawn(move || {
1370 let mut count = 0;
1371 for encoded in rx {
1372 let (value, _) = u16::try_decode_from(&encoded).unwrap();
1373 assert!(value < 400);
1374 count += 1;
1375 }
1376 count
1377 });
1378
1379 for producer in producers {
1380 producer.join().unwrap();
1381 }
1382
1383 let total = consumer.join().unwrap();
1384 assert_eq!(total, 400); }
1386
1387 #[cfg(feature = "std")]
1392 #[test]
1393 fn concurrency_test_stress_parallel_encoding() {
1394 use std::thread;
1395
1396 let handles: Vec<_> = (0..100)
1398 .map(|i| {
1399 thread::spawn(move || {
1400 let mut buffer = Vec::new();
1401 for j in 0u8..255 {
1402 ((i * 255 + j as u32) % u16::MAX as u32).encode_into_buffer(&mut buffer);
1403 }
1404 buffer.len()
1405 })
1406 })
1407 .collect();
1408
1409 let mut total_bytes = 0;
1410 for handle in handles {
1411 total_bytes += handle.join().unwrap();
1412 }
1413
1414 assert!(total_bytes >= 25500); assert!(total_bytes < 76500); }
1418
1419 #[cfg(feature = "std")]
1420 #[test]
1421 fn concurrency_test_stress_shared_read() {
1422 use std::sync::Arc;
1423 use std::thread;
1424
1425 let mut data = Vec::new();
1427 for i in 0u32..10000 {
1428 i.encode_into_buffer(&mut data);
1429 }
1430 let shared_data = Arc::new(data);
1431
1432 let handles: Vec<_> = (0..50)
1434 .map(|_| {
1435 let data = Arc::clone(&shared_data);
1436 thread::spawn(move || {
1437 let mut slice = &data[..];
1438 let mut count = 0;
1439 while !slice.is_empty() {
1440 if let Ok((_, remaining)) = u32::try_decode_from(slice) {
1441 count += 1;
1442 slice = remaining;
1443 } else {
1444 break;
1445 }
1446 }
1447 count
1448 })
1449 })
1450 .collect();
1451
1452 for handle in handles {
1453 let count = handle.join().unwrap();
1454 assert_eq!(count, 10000);
1455 }
1456 }
1457
1458 #[cfg(feature = "std")]
1463 #[test]
1464 fn concurrency_test_work_stealing() {
1465 use std::sync::Arc;
1466 use std::sync::Mutex;
1467 use std::thread;
1468
1469 let work_queue = Arc::new(Mutex::new((0u32..1000).collect::<Vec<_>>()));
1471 let results = Arc::new(Mutex::new(Vec::new()));
1472
1473 let workers: Vec<_> = (0..4)
1475 .map(|_| {
1476 let queue = Arc::clone(&work_queue);
1477 let results = Arc::clone(&results);
1478 thread::spawn(move || {
1479 loop {
1480 let work_item = {
1481 let mut queue = queue.lock().unwrap();
1482 queue.pop()
1483 };
1484
1485 match work_item {
1486 Some(value) => {
1487 let encoded = value.encode_into();
1489 let (decoded, _) = u32::try_decode_from(&encoded).unwrap();
1490 results.lock().unwrap().push(decoded);
1491 }
1492 None => break,
1493 }
1494 }
1495 })
1496 })
1497 .collect();
1498
1499 for worker in workers {
1500 worker.join().unwrap();
1501 }
1502
1503 let results = results.lock().unwrap();
1504 assert_eq!(results.len(), 1000);
1505 }
1506}