xref: /aosp_15_r20/external/nanopb-c/tests/regression/issue_249/test.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker #include "test.pb.h"
2*c8d645caSAndroid Build Coastguard Worker #include <unittests.h>
3*c8d645caSAndroid Build Coastguard Worker #include <pb_encode.h>
4*c8d645caSAndroid Build Coastguard Worker #include <pb_decode.h>
5*c8d645caSAndroid Build Coastguard Worker 
write_array(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)6*c8d645caSAndroid Build Coastguard Worker static bool write_array(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
7*c8d645caSAndroid Build Coastguard Worker {
8*c8d645caSAndroid Build Coastguard Worker     int i;
9*c8d645caSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++)
10*c8d645caSAndroid Build Coastguard Worker     {
11*c8d645caSAndroid Build Coastguard Worker         if (!pb_encode_tag_for_field(stream, field))
12*c8d645caSAndroid Build Coastguard Worker             return false;
13*c8d645caSAndroid Build Coastguard Worker         if (!pb_encode_varint(stream, 1000 + i))
14*c8d645caSAndroid Build Coastguard Worker             return false;
15*c8d645caSAndroid Build Coastguard Worker     }
16*c8d645caSAndroid Build Coastguard Worker 
17*c8d645caSAndroid Build Coastguard Worker     return true;
18*c8d645caSAndroid Build Coastguard Worker }
19*c8d645caSAndroid Build Coastguard Worker 
read_array(pb_istream_t * stream,const pb_field_t * field,void ** arg)20*c8d645caSAndroid Build Coastguard Worker static bool read_array(pb_istream_t *stream, const pb_field_t *field, void **arg)
21*c8d645caSAndroid Build Coastguard Worker {
22*c8d645caSAndroid Build Coastguard Worker     uint32_t i;
23*c8d645caSAndroid Build Coastguard Worker     int *sum = *arg;
24*c8d645caSAndroid Build Coastguard Worker 
25*c8d645caSAndroid Build Coastguard Worker     if (!pb_decode_varint32(stream, &i))
26*c8d645caSAndroid Build Coastguard Worker         return false;
27*c8d645caSAndroid Build Coastguard Worker 
28*c8d645caSAndroid Build Coastguard Worker     *sum += i;
29*c8d645caSAndroid Build Coastguard Worker 
30*c8d645caSAndroid Build Coastguard Worker     return true;
31*c8d645caSAndroid Build Coastguard Worker }
32*c8d645caSAndroid Build Coastguard Worker 
main()33*c8d645caSAndroid Build Coastguard Worker int main()
34*c8d645caSAndroid Build Coastguard Worker {
35*c8d645caSAndroid Build Coastguard Worker     int status = 0;
36*c8d645caSAndroid Build Coastguard Worker     pb_byte_t buf[128] = {0};
37*c8d645caSAndroid Build Coastguard Worker     pb_size_t msglen;
38*c8d645caSAndroid Build Coastguard Worker 
39*c8d645caSAndroid Build Coastguard Worker     {
40*c8d645caSAndroid Build Coastguard Worker         MainMessage msg = MainMessage_init_zero;
41*c8d645caSAndroid Build Coastguard Worker         pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf));
42*c8d645caSAndroid Build Coastguard Worker         msg.submsg.foo.funcs.encode = &write_array;
43*c8d645caSAndroid Build Coastguard Worker         TEST(pb_encode(&stream, MainMessage_fields, &msg));
44*c8d645caSAndroid Build Coastguard Worker         msglen = stream.bytes_written;
45*c8d645caSAndroid Build Coastguard Worker     }
46*c8d645caSAndroid Build Coastguard Worker 
47*c8d645caSAndroid Build Coastguard Worker     {
48*c8d645caSAndroid Build Coastguard Worker         MainMessage msg = MainMessage_init_zero;
49*c8d645caSAndroid Build Coastguard Worker         pb_istream_t stream = pb_istream_from_buffer(buf, msglen);
50*c8d645caSAndroid Build Coastguard Worker         int sum = 0;
51*c8d645caSAndroid Build Coastguard Worker         msg.submsg.foo.funcs.decode = &read_array;
52*c8d645caSAndroid Build Coastguard Worker         msg.submsg.foo.arg = &sum;
53*c8d645caSAndroid Build Coastguard Worker         TEST(pb_decode(&stream, MainMessage_fields, &msg));
54*c8d645caSAndroid Build Coastguard Worker         TEST(sum == 1000 + 1001 + 1002 + 1003 + 1004);
55*c8d645caSAndroid Build Coastguard Worker     }
56*c8d645caSAndroid Build Coastguard Worker 
57*c8d645caSAndroid Build Coastguard Worker     return status;
58*c8d645caSAndroid Build Coastguard Worker }
59*c8d645caSAndroid Build Coastguard Worker 
60