@@ -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" , par_sz, 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" , par_sz, " 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" , par_sz, 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" , par_sz, " 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" , par_sz, " Hello" , true );
383+ // 3rd request
384+ packer.serialize (req_sz, 0 , 1 , " sum" , par_sz, 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