1+ use std:: { ffi:: OsString , str:: FromStr } ;
2+
13use rand:: distr:: { Alphanumeric , SampleString } ;
24
35include ! ( concat!( env!( "OUT_DIR" ) , "/arrays.rs" ) ) ;
46
57use crate :: arrays:: * ;
6- use xdr_lib:: Reader ;
8+ use xdr_lib:: { DeserializeError , Reader } ;
79
810#[ test]
911fn test_opaque_arrays_minsize ( ) {
@@ -36,6 +38,92 @@ fn test_opaque_arrays() {
3638 assert_eq ! ( reader. get_bytes_3( ) , bytes3. as_slice( ) ) ;
3739}
3840
41+ #[ test]
42+ fn test_opaque_arrays_size_check ( ) {
43+ let data: Vec < u8 > = vec ! [ 0x0 , 0x0 ] ;
44+ assert_eq ! (
45+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
46+ Err ( xdr_lib:: DeserializeError )
47+ ) ;
48+ }
49+
50+ #[ test]
51+ fn test_opaque_arrays_missing_bytes_2_count ( ) {
52+ let data: Vec < u8 > = vec ! [ 0xF , 0xF , 0xF ] ;
53+ assert_eq ! (
54+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
55+ Err ( xdr_lib:: DeserializeError )
56+ ) ;
57+
58+ let data: Vec < u8 > = vec ! [ 0xF , 0xF , 0xF , 0x1 , 0x1 , 0x1 ] ;
59+ assert_eq ! (
60+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
61+ Err ( xdr_lib:: DeserializeError )
62+ ) ;
63+ }
64+
65+ #[ test]
66+ fn test_opaque_arrays_missing_bytes_2 ( ) {
67+ #[ rustfmt:: skip]
68+ let data: Vec < u8 > = vec ! [
69+ 0xF , 0xF , 0xF , 0x0 , // bytes
70+ 0x0 , 0x0 , 0x0 , 0x1 , // bytes_2_count
71+ 0x1 // bytes_2
72+ ] ;
73+
74+ assert_eq ! (
75+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
76+ Err ( xdr_lib:: DeserializeError )
77+ ) ;
78+ }
79+
80+ #[ test]
81+ fn test_opaque_arrays_bytes_2_too_long ( ) {
82+ #[ rustfmt:: skip]
83+ let data: Vec < u8 > = vec ! [
84+ 0xF , 0xF , 0xF , 0x0 , // bytes
85+ 0x0 , 0x0 , 0x0 , 0x4 , // bytes_2_count
86+ 0x1 , 0xF , 0xF , 0xF , // bytes_2
87+ 0x0 , 0x0 , 0x0 , 0x4 , // bytes_3_count
88+ 0x1 , 0x1 , 0x0 , 0x0 // bytes_3
89+ ] ;
90+ assert_eq ! (
91+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
92+ Err ( xdr_lib:: DeserializeError )
93+ ) ;
94+ }
95+
96+ #[ test]
97+ fn test_opaque_arrays_missing_bytes_3_count ( ) {
98+ #[ rustfmt:: skip]
99+ let data: Vec < u8 > = vec ! [
100+ 0xF , 0xF , 0xF , 0x0 , // bytes
101+ 0x0 , 0x0 , 0x0 , 0x1 , // bytes_2_count
102+ 0x1 , 0xF , 0xF , 0xF , // bytes_2
103+ 0x0 , 0x0 ,
104+ ] ;
105+ assert_eq ! (
106+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
107+ Err ( xdr_lib:: DeserializeError )
108+ ) ;
109+ }
110+
111+ #[ test]
112+ fn test_opaque_rrays_missing_bytes_3 ( ) {
113+ #[ rustfmt:: skip]
114+ let data: Vec < u8 > = vec ! [
115+ 0xF , 0xF , 0xF , 0x0 , // bytes
116+ 0x0 , 0x0 , 0x0 , 0x1 , // bytes_2_count
117+ 0x1 , 0xF , 0xF , 0xF , // bytes_2
118+ 0x0 , 0x0 , 0x0 , 0x5 , // bytes_3_count
119+ 0x1 , 0x1 , 0x0 , 0x0 // bytes_3
120+ ] ;
121+ assert_eq ! (
122+ OpaqueArraysReader :: new( data. as_slice( ) ) ,
123+ Err ( xdr_lib:: DeserializeError )
124+ ) ;
125+ }
126+
39127#[ test]
40128fn test_opaque_arrays_reader ( ) {
41129 let mut data = Vec :: new ( ) ;
@@ -81,11 +169,12 @@ fn test_int_arrays_reader() {
81169 let reader = IntArraysReader :: new ( & data) . unwrap ( ) ;
82170
83171 let mut fixed_iter = reader. get_fixed ( ) ;
172+ assert_eq ! ( reader. get_fixed( ) . get_count( ) , 4 ) ;
84173 assert_eq ! ( fixed_iter. next( ) . unwrap( ) . unwrap( ) . get_a( ) , 1 ) ;
85174 assert_eq ! ( fixed_iter. next( ) . unwrap( ) . unwrap( ) . get_a( ) , 2 ) ;
86175 assert_eq ! ( fixed_iter. next( ) . unwrap( ) . unwrap( ) . get_a( ) , 3 ) ;
87176 assert_eq ! ( fixed_iter. next( ) . unwrap( ) . unwrap( ) . get_a( ) , 4 ) ;
88- assert ! ( fixed_iter. next( ) . is_none ( ) ) ;
177+ assert_eq ! ( fixed_iter. next( ) , None ) ;
89178
90179 let mut limited_iter = reader. get_limited ( ) ;
91180 assert_eq ! ( limited_iter. next( ) . unwrap( ) . unwrap( ) . get_a( ) , 10 ) ;
@@ -101,6 +190,59 @@ fn test_int_arrays_reader() {
101190 assert_eq ! ( reader. get_width( ) , Ok ( 12 + 8 + 16 ) ) ;
102191}
103192
193+ #[ test]
194+ fn test_int_arrays_empty ( ) {
195+ let data: Vec < u8 > = Vec :: new ( ) ;
196+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
197+ }
198+
199+ #[ test]
200+ fn test_int_arrays_fixed_array_missing_element ( ) {
201+ let data: Vec < u8 > = vec ! [ 0xF , 0xE , 0xE ] ;
202+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
203+ }
204+
205+ #[ test]
206+ fn test_int_arrays_fixed_array_limited_missing_count ( ) {
207+ let data: Vec < u8 > = vec ! [ 0xF , 0xE , 0xE , 0x0 ] ;
208+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
209+ }
210+
211+ #[ test]
212+ fn test_int_arrays_fixed_array_limited_under_count ( ) {
213+ #[ rustfmt:: skip]
214+ let data: Vec < u8 > = vec ! [
215+ 0xF , 0xE , 0xE , 0x0 , // fixed
216+ 0x0 , 0x0 , 0x0 , 0x2 , // limited_count
217+ 0x0 , 0x0 , 0x0 , 0x1 , // limited
218+ ] ;
219+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
220+ }
221+
222+ #[ test]
223+ fn test_int_arrays_fixed_array_missing_unlimited_count ( ) {
224+ let data: Vec < u8 > = vec ! [
225+ 0xF , 0xE , 0xE , 0x2 , // fixed
226+ 0x0 , 0x0 , 0x0 , 0x2 , // limited_count
227+ 0x0 , 0x0 , 0x0 , 0x1 , // limited
228+ 0x0 , 0x0 , 0x0 , 0x1 ,
229+ ] ;
230+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
231+ }
232+
233+ #[ test]
234+ fn test_int_arrays_fixed_array_under_unlimited_count ( ) {
235+ #[ rustfmt:: skip]
236+ let data: Vec < u8 > = vec ! [
237+ 0xF , 0xE , 0xE , 0x2 , // fixed
238+ 0x0 , 0x0 , 0x0 , 0x2 , // limited_count
239+ 0x0 , 0x0 , 0x0 , 0x1 , // limited
240+ 0x0 , 0x0 , 0x0 , 0x1 ,
241+ 0x0 , 0x0 , 0x0 , 0x2 , // unlimited_count
242+ ] ;
243+ assert_eq ! ( IntArraysReader :: new( data. as_slice( ) ) , Err ( DeserializeError ) ) ;
244+ }
245+
104246#[ test]
105247fn test_strings_reader ( ) {
106248 let mut data = Vec :: new ( ) ;
@@ -180,3 +322,62 @@ fn test_many_ints_reader() {
180322 assert_eq ! ( reader. get_third_width( ) , Ok ( 12 ) ) ;
181323 assert_eq ! ( reader. get_width( ) , Ok ( 12 + 12 + 16 ) ) ;
182324}
325+
326+ #[ test]
327+ fn test_unlimited_array_of_unlimited ( ) {
328+ let mut data: Vec < u8 > = vec ! [ ] ;
329+ let mut strings: Vec < xdr_lib:: Result < OsString > > = vec ! [ ] ;
330+ data. extend ( 100_u32 . to_be_bytes ( ) ) ;
331+ for _ in 0 ..100 {
332+ let my_string = Alphanumeric . sample_string ( & mut rand:: rng ( ) , 2 ) ;
333+
334+ strings. push ( Ok ( OsString :: from_str ( & my_string) . unwrap ( ) ) ) ;
335+
336+ // if false && i == 49 {
337+ // data.extend(5_u32.to_be_bytes());
338+ // } else {
339+ data. extend ( 2_u32 . to_be_bytes ( ) ) ;
340+ // }
341+ data. extend ( my_string. as_bytes ( ) ) ;
342+ data. extend ( & [ 0x0 , 0x0 ] ) ;
343+ }
344+
345+ assert_eq ! ( data. len( ) % 4 , 0 ) ;
346+
347+ let reader = UnlimitedArrayOfLimitedReader :: new ( data. as_slice ( ) ) . unwrap ( ) ;
348+ assert_eq ! (
349+ reader
350+ . get_a( )
351+ . map( |v| v. map( |res| res. get_data( ) . to_os_string( ) ) )
352+ . collect:: <Vec <xdr_lib:: Result <OsString >>>( ) ,
353+ strings
354+ ) ;
355+ }
356+
357+ #[ test]
358+ fn test_unlimited_array_of_unlimited_error_in_middle ( ) {
359+ let mut data: Vec < u8 > = vec ! [ ] ;
360+ let mut strings: Vec < xdr_lib:: Result < OsString > > = vec ! [ ] ;
361+ data. extend ( 100_u32 . to_be_bytes ( ) ) ;
362+ for i in 0 ..100 {
363+ let my_string = Alphanumeric . sample_string ( & mut rand:: rng ( ) , 2 ) ;
364+
365+ strings. push ( Ok ( OsString :: from_str ( & my_string) . unwrap ( ) ) ) ;
366+
367+ if i == 49 {
368+ data. extend ( 5_u32 . to_be_bytes ( ) ) ;
369+ strings. push ( Err ( DeserializeError ) ) ;
370+ } else {
371+ data. extend ( 2_u32 . to_be_bytes ( ) ) ;
372+ }
373+ data. extend ( my_string. as_bytes ( ) ) ;
374+ data. extend ( & [ 0x0 , 0x0 ] ) ;
375+ }
376+
377+ assert_eq ! ( data. len( ) % 4 , 0 ) ;
378+
379+ assert_eq ! (
380+ UnlimitedArrayOfLimitedReader :: new( data. as_slice( ) ) ,
381+ Err ( DeserializeError )
382+ ) ;
383+ }
0 commit comments