xref: /aosp_15_r20/external/nanopb-c/tests/oneof/decode_oneof.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker /* Decode a message using oneof fields */
2*c8d645caSAndroid Build Coastguard Worker 
3*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
4*c8d645caSAndroid Build Coastguard Worker #include <stdlib.h>
5*c8d645caSAndroid Build Coastguard Worker #include <string.h>
6*c8d645caSAndroid Build Coastguard Worker #include <pb_decode.h>
7*c8d645caSAndroid Build Coastguard Worker #include "oneof.pb.h"
8*c8d645caSAndroid Build Coastguard Worker #include "test_helpers.h"
9*c8d645caSAndroid Build Coastguard Worker #include "unittests.h"
10*c8d645caSAndroid Build Coastguard Worker 
11*c8d645caSAndroid Build Coastguard Worker /* Test the 'OneOfMessage' */
test_oneof_1(pb_istream_t * stream,int option)12*c8d645caSAndroid Build Coastguard Worker int test_oneof_1(pb_istream_t *stream, int option)
13*c8d645caSAndroid Build Coastguard Worker {
14*c8d645caSAndroid Build Coastguard Worker     OneOfMessage msg;
15*c8d645caSAndroid Build Coastguard Worker     int status = 0;
16*c8d645caSAndroid Build Coastguard Worker 
17*c8d645caSAndroid Build Coastguard Worker     /* To better catch initialization errors */
18*c8d645caSAndroid Build Coastguard Worker     memset(&msg, 0xAA, sizeof(msg));
19*c8d645caSAndroid Build Coastguard Worker 
20*c8d645caSAndroid Build Coastguard Worker     if (!pb_decode(stream, OneOfMessage_fields, &msg))
21*c8d645caSAndroid Build Coastguard Worker     {
22*c8d645caSAndroid Build Coastguard Worker         printf("Decoding failed: %s\n", PB_GET_ERROR(stream));
23*c8d645caSAndroid Build Coastguard Worker         return 1;
24*c8d645caSAndroid Build Coastguard Worker     }
25*c8d645caSAndroid Build Coastguard Worker 
26*c8d645caSAndroid Build Coastguard Worker     /* Check that the basic fields work normally */
27*c8d645caSAndroid Build Coastguard Worker     TEST(msg.prefix == 123);
28*c8d645caSAndroid Build Coastguard Worker     TEST(msg.suffix == 321);
29*c8d645caSAndroid Build Coastguard Worker 
30*c8d645caSAndroid Build Coastguard Worker     /* Check that we got the right oneof according to command line */
31*c8d645caSAndroid Build Coastguard Worker     if (option == 1)
32*c8d645caSAndroid Build Coastguard Worker     {
33*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_first_tag);
34*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.first == 999);
35*c8d645caSAndroid Build Coastguard Worker     }
36*c8d645caSAndroid Build Coastguard Worker     else if (option == 2)
37*c8d645caSAndroid Build Coastguard Worker     {
38*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_second_tag);
39*c8d645caSAndroid Build Coastguard Worker         TEST(strcmp(msg.values.second, "abcd") == 0);
40*c8d645caSAndroid Build Coastguard Worker     }
41*c8d645caSAndroid Build Coastguard Worker     else if (option == 3)
42*c8d645caSAndroid Build Coastguard Worker     {
43*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_third_tag);
44*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[0] == 1);
45*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[1] == 2);
46*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[2] == 3);
47*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[3] == 4);
48*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[4] == 5);
49*c8d645caSAndroid Build Coastguard Worker     }
50*c8d645caSAndroid Build Coastguard Worker 
51*c8d645caSAndroid Build Coastguard Worker     return status;
52*c8d645caSAndroid Build Coastguard Worker }
53*c8d645caSAndroid Build Coastguard Worker 
54*c8d645caSAndroid Build Coastguard Worker 
55*c8d645caSAndroid Build Coastguard Worker /* Test the 'PlainOneOfMessage' */
test_oneof_2(pb_istream_t * stream,int option)56*c8d645caSAndroid Build Coastguard Worker int test_oneof_2(pb_istream_t *stream, int option)
57*c8d645caSAndroid Build Coastguard Worker {
58*c8d645caSAndroid Build Coastguard Worker     PlainOneOfMessage msg = PlainOneOfMessage_init_zero;
59*c8d645caSAndroid Build Coastguard Worker     int status = 0;
60*c8d645caSAndroid Build Coastguard Worker 
61*c8d645caSAndroid Build Coastguard Worker     if (!pb_decode(stream, PlainOneOfMessage_fields, &msg))
62*c8d645caSAndroid Build Coastguard Worker     {
63*c8d645caSAndroid Build Coastguard Worker         printf("Decoding failed: %s\n", PB_GET_ERROR(stream));
64*c8d645caSAndroid Build Coastguard Worker         return 1;
65*c8d645caSAndroid Build Coastguard Worker     }
66*c8d645caSAndroid Build Coastguard Worker 
67*c8d645caSAndroid Build Coastguard Worker     /* Check that we got the right oneof according to command line */
68*c8d645caSAndroid Build Coastguard Worker     if (option == 1)
69*c8d645caSAndroid Build Coastguard Worker     {
70*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_first_tag);
71*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.first == 999);
72*c8d645caSAndroid Build Coastguard Worker     }
73*c8d645caSAndroid Build Coastguard Worker     else if (option == 2)
74*c8d645caSAndroid Build Coastguard Worker     {
75*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_second_tag);
76*c8d645caSAndroid Build Coastguard Worker         TEST(strcmp(msg.values.second, "abcd") == 0);
77*c8d645caSAndroid Build Coastguard Worker     }
78*c8d645caSAndroid Build Coastguard Worker     else if (option == 3)
79*c8d645caSAndroid Build Coastguard Worker     {
80*c8d645caSAndroid Build Coastguard Worker         TEST(msg.which_values == OneOfMessage_third_tag);
81*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[0] == 1);
82*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[1] == 2);
83*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[2] == 3);
84*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[3] == 4);
85*c8d645caSAndroid Build Coastguard Worker         TEST(msg.values.third.array[4] == 5);
86*c8d645caSAndroid Build Coastguard Worker     }
87*c8d645caSAndroid Build Coastguard Worker 
88*c8d645caSAndroid Build Coastguard Worker     return status;
89*c8d645caSAndroid Build Coastguard Worker }
90*c8d645caSAndroid Build Coastguard Worker 
main(int argc,char ** argv)91*c8d645caSAndroid Build Coastguard Worker int main(int argc, char **argv)
92*c8d645caSAndroid Build Coastguard Worker {
93*c8d645caSAndroid Build Coastguard Worker     uint8_t buffer[OneOfMessage_size];
94*c8d645caSAndroid Build Coastguard Worker     size_t count;
95*c8d645caSAndroid Build Coastguard Worker     int option;
96*c8d645caSAndroid Build Coastguard Worker 
97*c8d645caSAndroid Build Coastguard Worker     if (argc != 2)
98*c8d645caSAndroid Build Coastguard Worker     {
99*c8d645caSAndroid Build Coastguard Worker         fprintf(stderr, "Usage: decode_oneof [number]\n");
100*c8d645caSAndroid Build Coastguard Worker         return 1;
101*c8d645caSAndroid Build Coastguard Worker     }
102*c8d645caSAndroid Build Coastguard Worker     option = atoi(argv[1]);
103*c8d645caSAndroid Build Coastguard Worker 
104*c8d645caSAndroid Build Coastguard Worker     SET_BINARY_MODE(stdin);
105*c8d645caSAndroid Build Coastguard Worker     count = fread(buffer, 1, sizeof(buffer), stdin);
106*c8d645caSAndroid Build Coastguard Worker 
107*c8d645caSAndroid Build Coastguard Worker     if (!feof(stdin))
108*c8d645caSAndroid Build Coastguard Worker     {
109*c8d645caSAndroid Build Coastguard Worker         printf("Message does not fit in buffer\n");
110*c8d645caSAndroid Build Coastguard Worker         return 1;
111*c8d645caSAndroid Build Coastguard Worker     }
112*c8d645caSAndroid Build Coastguard Worker 
113*c8d645caSAndroid Build Coastguard Worker     {
114*c8d645caSAndroid Build Coastguard Worker         int status = 0;
115*c8d645caSAndroid Build Coastguard Worker         pb_istream_t stream;
116*c8d645caSAndroid Build Coastguard Worker 
117*c8d645caSAndroid Build Coastguard Worker         stream = pb_istream_from_buffer(buffer, count);
118*c8d645caSAndroid Build Coastguard Worker         status = test_oneof_1(&stream, option);
119*c8d645caSAndroid Build Coastguard Worker 
120*c8d645caSAndroid Build Coastguard Worker         if (status != 0)
121*c8d645caSAndroid Build Coastguard Worker             return status;
122*c8d645caSAndroid Build Coastguard Worker 
123*c8d645caSAndroid Build Coastguard Worker         stream = pb_istream_from_buffer(buffer, count);
124*c8d645caSAndroid Build Coastguard Worker         status = test_oneof_2(&stream, option);
125*c8d645caSAndroid Build Coastguard Worker 
126*c8d645caSAndroid Build Coastguard Worker         if (status != 0)
127*c8d645caSAndroid Build Coastguard Worker             return status;
128*c8d645caSAndroid Build Coastguard Worker     }
129*c8d645caSAndroid Build Coastguard Worker 
130*c8d645caSAndroid Build Coastguard Worker     return 0;
131*c8d645caSAndroid Build Coastguard Worker }
132