Skip to content

Commit fb059ea

Browse files
committed
feat: decoder.h can pick 1st available response anywhere in the buffer + tests
1 parent 215f357 commit fb059ea

File tree

3 files changed

+331
-30
lines changed

3 files changed

+331
-30
lines changed

examples/decoder_tests/decoder_tester.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,40 @@ class DecoderTester {
2121

2222
DecoderTester(RpcDecoder<>& _d): decoder(_d){}
2323

24+
void first_response_info() {
25+
if (!decoder.response_queued()) {
26+
Serial.println("No response queued");
27+
return;
28+
}
29+
Serial.println("-- First response info --");
30+
Serial.print("RESP OFFSET: ");
31+
Serial.println(static_cast<int>(decoder._response_offset));
32+
Serial.print("RESP SIZE: ");
33+
Serial.println(static_cast<int>(decoder._response_size));
34+
}
35+
36+
size_t get_response_size() {
37+
return decoder._response_size;
38+
}
39+
40+
size_t get_response_offset() {
41+
return decoder._response_offset;
42+
}
43+
44+
template<typename RType>
45+
bool get_response(const uint32_t msg_id, RType& result, RpcError& error) {
46+
return decoder.get_response(msg_id, result, error);
47+
}
48+
2449
void crop_bytes(size_t size, size_t offset){
2550
decoder.consume(size, offset);
2651
}
2752

53+
void pop_first() {
54+
uint8_t temp_buffer[512];
55+
decoder.pop_packet(temp_buffer, 512);
56+
}
57+
2858
void print_raw_buf(){
2959

3060
Serial.print("Decoder raw buffer content: ");

examples/decoder_tests/decoder_tests.ino

Lines changed: 227 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
80244
void 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)
170391
void 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

Comments
 (0)