@@ -25,6 +25,8 @@ all_tests() ->
2525 array_of_zero_width_elements ,
2626 array_of_described_zero_width_elements_unsupported ,
2727 unsupported_type ,
28+ server_mode_symbolic_body_descriptors ,
29+ server_mode_body_descriptor_prefix_collision ,
2830 peek_described_section_total_sizes ,
2931 peek_described_section ,
3032 peek_non_described_throws ,
@@ -166,6 +168,48 @@ unsupported_type(_Config) ->
166168 Expected = {primitive_type_unsupported , UnsupportedType , {position , 0 }},
167169 ? assertThrow (Expected , amqp10_binary_parser :parse_many (Bin , [])).
168170
171+ % % A symbolic body descriptor of the exact registered length is classified as
172+ % % the corresponding standard body section in server_mode.
173+ server_mode_symbolic_body_descriptors (_Config ) ->
174+ Data8 = <<0 , 16#a3 , 16 , " amqp:data:binary" , 16#a0 , 1 , " x" >>,
175+ Seq8 = <<0 , 16#a3 , 23 , " amqp:amqp-sequence:list" , 16#45 >>,
176+ Value8 = <<0 , 16#a3 , 17 , " amqp:amqp-value:*" , 16#a1 , 1 , " x" >>,
177+ ? assertEqual ([{{pos , 0 }, {body , 16#75 }}],
178+ amqp10_binary_parser :parse_many (Data8 , [server_mode ])),
179+ ? assertEqual ([{{pos , 0 }, {body , 16#76 }}],
180+ amqp10_binary_parser :parse_many (Seq8 , [server_mode ])),
181+ ? assertEqual ([{{pos , 0 }, {body , 16#77 }}],
182+ amqp10_binary_parser :parse_many (Value8 , [server_mode ])),
183+ % % The sym32 forms must be classified identically.
184+ Data32 = <<0 , 16#b3 , 16 :32 , " amqp:data:binary" , 16#a0 , 1 , " x" >>,
185+ Seq32 = <<0 , 16#b3 , 23 :32 , " amqp:amqp-sequence:list" , 16#45 >>,
186+ Value32 = <<0 , 16#b3 , 17 :32 , " amqp:amqp-value:*" , 16#a1 , 1 , " x" >>,
187+ ? assertEqual ([{{pos , 0 }, {body , 16#75 }}],
188+ amqp10_binary_parser :parse_many (Data32 , [server_mode ])),
189+ ? assertEqual ([{{pos , 0 }, {body , 16#76 }}],
190+ amqp10_binary_parser :parse_many (Seq32 , [server_mode ])),
191+ ? assertEqual ([{{pos , 0 }, {body , 16#77 }}],
192+ amqp10_binary_parser :parse_many (Value32 , [server_mode ])).
193+
194+ server_mode_body_descriptor_prefix_collision (_Config ) ->
195+ % % Well-formed but unknown descriptor "amqp:data:binary@" (length 17).
196+ Collision8 = <<0 , 16#a3 , 17 , " amqp:data:binary" , $@ , 16#a0 , 3 , " abc" >>,
197+ ? assertEqual (
198+ [{described , {symbol , <<" amqp:data:binary@" >>}, {binary , <<" abc" >>}}],
199+ amqp10_binary_parser :parse_many (Collision8 , [server_mode ])),
200+
201+ % % The same collision via the sym32 constructor.
202+ Collision32 = <<0 , 16#b3 , 17 :32 , " amqp:data:binary" , $@ , 16#a0 , 3 , " abc" >>,
203+ ? assertEqual (
204+ [{described , {symbol , <<" amqp:data:binary@" >>}, {binary , <<" abc" >>}}],
205+ amqp10_binary_parser :parse_many (Collision32 , [server_mode ])),
206+
207+ % % A prefix collision on the amqp-value descriptor.
208+ ValueCollision = <<0 , 16#a3 , 18 , " amqp:amqp-value:*!" , 16#a1 , 1 , " x" >>,
209+ ? assertEqual (
210+ [{described , {symbol , <<" amqp:amqp-value:*!" >>}, {utf8 , <<" x" >>}}],
211+ amqp10_binary_parser :parse_many (ValueCollision , [server_mode ])).
212+
169213% %%===================================================================
170214% %% peek/1 (exercises peek_value_size internally via described types)
171215% %%===================================================================
0 commit comments