@@ -48,7 +48,7 @@ void runDecoderTest(const char* label) {
4848  Serial.println (" -- Done --\n " 
4949}
5050
51- void  runDecoderConsumeTest (const  char * label, size_t  second_packet_sz ) {
51+ void  runDecoderConsumeTest (const  char * label, size_t  expected_2nd_pack_size ) {
5252  Serial.println (label);
5353
5454  print_buf ();
@@ -63,20 +63,184 @@ void runDecoderConsumeTest(const char* label, size_t second_packet_sz) {
6363    delay (50 );
6464  }
6565
66+   dt.first_response_info ();
67+ 
68+   while  (!decoder.response_queued ()) {
69+     Serial.println (" 1st response not ready" 
70+     decoder.decode ();
71+     delay (50 );
72+   }
73+ 
6674  size_t  pack_size = decoder.get_packet_size ();
6775  Serial.print (" 1st Packet size: " 
6876  Serial.println (pack_size);
6977
78+   dt.first_response_info ();
79+ 
80+   if  ((dt.get_response_offset ()!=pack_size)||(dt.get_response_size ()!=expected_2nd_pack_size)) {
81+     Serial.println (" ERROR parsing 1st response\n " 
82+     return ;
83+   }
84+ 
85+   Serial.print (" Consuming 2nd packet of given size: " 
86+   Serial.println (dt.get_response_size ());
87+ 
88+   dt.crop_bytes (dt.get_response_size (), dt.get_response_offset ());
89+ 
90+   dt.print_raw_buf ();
91+ 
92+   Serial.println (" -- Done --\n " 
93+ }
94+ 
95+ void  runDecoderPopFirstTest (const  char * label, size_t  expected_2nd_pack_size) {
96+   Serial.println (label);
97+ 
98+   print_buf ();
99+   DummyTransport dummy_transport (packer.data (), packer.size ());
100+   RpcDecoder<> decoder (dummy_transport);
101+ 
102+   DecoderTester dt (decoder);
103+ 
104+   while  (!decoder.packet_incoming ()) {
105+     Serial.println (" Packet not ready" 
106+     decoder.decode ();
107+     delay (50 );
108+   }
109+ 
110+   while  (!decoder.response_queued ()) {
111+     Serial.println (" 1st response not ready" 
112+     decoder.decode ();
113+     delay (50 );
114+   }
115+ 
116+   dt.first_response_info ();
117+ 
118+   size_t  pack_size = decoder.get_packet_size ();
119+   Serial.print (" Consuming 1st Packet of size: " 
120+   Serial.println (pack_size);
121+   dt.pop_first ();
122+   dt.print_raw_buf ();
123+ 
124+   dt.first_response_info ();
125+ 
126+   if  ((dt.get_response_offset ()!=0 )||(dt.get_response_size ()!=expected_2nd_pack_size)) {
127+     Serial.println (" ERROR moving 1st response\n " 
128+     return ;
129+   }
130+ 
70131  Serial.print (" Consuming 2nd packet of given size: " 
71-   Serial.println (second_packet_sz);
132+   Serial.println (dt.get_response_size ());
133+ 
134+   dt.crop_bytes (dt.get_response_size (), dt.get_response_offset ());
135+ 
136+   dt.print_raw_buf ();
137+   dt.first_response_info ();
138+ 
139+   Serial.println (" -- Done --\n " 
140+ }
141+ 
142+ void  runDecoderGetResponseTest (const  char * label, size_t  expected_2nd_pack_size, int  _id) {
143+   Serial.println (label);
144+ 
145+   print_buf ();
146+   DummyTransport dummy_transport (packer.data (), packer.size ());
147+   RpcDecoder<> decoder (dummy_transport);
148+ 
149+   DecoderTester dt (decoder);
150+ 
151+   while  (!decoder.packet_incoming ()) {
152+     Serial.println (" Packet not ready" 
153+     decoder.decode ();
154+     delay (50 );
155+   }
156+ 
157+   dt.first_response_info ();
158+ 
159+   while  (!decoder.response_queued ()) {
160+     Serial.println (" 1st response not ready" 
161+     decoder.decode ();
162+     delay (50 );
163+   }
164+ 
165+   size_t  pack_size = decoder.get_packet_size ();
166+   Serial.print (" 1st Packet size: " 
167+   Serial.println (pack_size);
168+ 
169+   dt.first_response_info ();
170+ 
171+   if  ((dt.get_response_offset ()!=pack_size)||(dt.get_response_size ()!=expected_2nd_pack_size)) {
172+     Serial.println (" ERROR parsing 1st response\n " 
173+     return ;
174+   }
175+ 
176+   Serial.print (" Getting response (2nd packet) size: " 
177+   Serial.println (dt.get_response_size ());
178+ 
179+   int  res;
180+   RpcError _err;
181+   dt.get_response (_id, res, _err);
182+ 
183+   Serial.print (" Result: " 
184+   Serial.println (res);
185+ 
186+   dt.print_raw_buf ();
187+ 
188+   Serial.println (" -- Done --\n " 
189+ }
190+ 
191+ 
192+ void  runDecoderGetTopResponseTest (const  char * label, size_t  expected_size, int  _id) {
193+   Serial.println (label);
194+ 
195+   print_buf ();
196+   DummyTransport dummy_transport (packer.data (), packer.size ());
197+   RpcDecoder<> decoder (dummy_transport);
198+ 
199+   DecoderTester dt (decoder);
200+ 
201+   while  (!decoder.packet_incoming ()) {
202+     Serial.println (" Packet not ready" 
203+     decoder.decode ();
204+     delay (50 );
205+   }
72206
73-   dt.crop_bytes (second_packet_sz, pack_size);
207+   dt.first_response_info ();
208+ 
209+   while  (!decoder.response_queued ()) {
210+     Serial.println (" 1st response not ready" 
211+     decoder.decode ();
212+     delay (50 );
213+   }
214+ 
215+   size_t  pack_size = decoder.get_packet_size ();
216+   Serial.print (" 1st Packet size: " 
217+   Serial.println (pack_size);
218+ 
219+   dt.first_response_info ();
220+ 
221+   if  ((dt.get_response_offset ()!=0 )||(dt.get_response_size ()!=expected_size)) {
222+     Serial.println (" ERROR parsing 1st response\n " 
223+     return ;
224+   }
225+ 
226+   Serial.print (" Getting response size: " 
227+   Serial.println (dt.get_response_size ());
228+ 
229+   int  res;
230+   RpcError _err;
231+   dt.get_response (_id, res, _err);
232+ 
233+   Serial.print (" Result: " 
234+   Serial.println (res);
74235
75236  dt.print_raw_buf ();
76237
238+   dt.first_response_info ();
239+ 
77240  Serial.println (" -- Done --\n " 
78241}
79242
243+ 
80244void  testNestedArrayRequest () {
81245  packer.clear ();
82246  MsgPack::arr_size_t  outer_arr (3 );
@@ -166,6 +330,63 @@ void testMultipleRpcPackets() {
166330
167331}
168332
333+ //  Multiple RPCs in one buffer. Pop the 1st request and then the 2nd response
334+ void  testPopRpcPackets () {
335+   packer.clear ();
336+   MsgPack::arr_size_t  req_sz (4 );
337+   MsgPack::arr_size_t  par_sz (2 );
338+   MsgPack::arr_size_t  resp_sz (4 );
339+   MsgPack::object::nil_t  nil;
340+ 
341+   //  1st request
342+   packer.serialize (req_sz, 0 , 1 , " sum" 10 , 20 );
343+   //  2nd response
344+   packer.serialize (resp_sz, 1 , 1 , nil, 42 );
345+   //  3rd request
346+   packer.serialize (req_sz, 0 , 2 , " echo" " Hello" true );
347+ 
348+   runDecoderPopFirstTest (" == Test: Pop-first packet ==" 5 );
349+ 
350+ }
351+ 
352+ //  Multiple RPCs in one buffer. Get the response in the buffer
353+ void  testGetResponsePacket () {
354+   packer.clear ();
355+   MsgPack::arr_size_t  req_sz (4 );
356+   MsgPack::arr_size_t  par_sz (2 );
357+   MsgPack::arr_size_t  resp_sz (4 );
358+   MsgPack::object::nil_t  nil;
359+ 
360+   //  1st request
361+   packer.serialize (req_sz, 0 , 1 , " sum" 10 , 20 );
362+   //  2nd response
363+   packer.serialize (resp_sz, 1 , 1 , nil, 101 );
364+   //  3rd request
365+   packer.serialize (req_sz, 0 , 2 , " echo" " Hello" true );
366+ 
367+   runDecoderGetResponseTest (" == Test: Get response packet ==" 5 , 1 );
368+ 
369+ }
370+ 
371+ //  Multiple RPCs in one buffer. The response is top of the buffer
372+ void  testGetTopResponsePacket () {
373+   packer.clear ();
374+   MsgPack::arr_size_t  req_sz (4 );
375+   MsgPack::arr_size_t  par_sz (2 );
376+   MsgPack::arr_size_t  resp_sz (4 );
377+   MsgPack::object::nil_t  nil;
378+ 
379+   //  1st response
380+   packer.serialize (resp_sz, 1 , 1 , nil, 101 );
381+   //  2nd request
382+   packer.serialize (req_sz, 0 , 2 , " echo" " Hello" true );
383+   //  3rd request
384+   packer.serialize (req_sz, 0 , 1 , " sum" 30 , 30 );
385+ 
386+   runDecoderGetTopResponseTest (" == Test: Get top response packet ==" 5 , 1 );
387+ 
388+ }
389+ 
169390//  Binary parameter (e.g., binary blob)
170391void  testBinaryParam () {
171392  packer.clear ();
@@ -225,6 +446,9 @@ void setup() {
225446  testDeepNestedStructure ();
226447  testArrayOfMapsResponse ();
227448  testMultipleRpcPackets ();
449+   testPopRpcPackets ();
450+   testGetResponsePacket ();
451+   testGetTopResponsePacket ();
228452  testBinaryParam ();
229453  testExtensionParam ();
230454  testCombinedComplexBuffer ();
0 commit comments