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 'AnonymousOneOfMessage' */
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 AnonymousOneOfMessage 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, AnonymousOneOfMessage_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 == AnonymousOneOfMessage_first_tag);
34*c8d645caSAndroid Build Coastguard Worker TEST(msg.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 == AnonymousOneOfMessage_second_tag);
39*c8d645caSAndroid Build Coastguard Worker TEST(strcmp(msg.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 == AnonymousOneOfMessage_third_tag);
44*c8d645caSAndroid Build Coastguard Worker TEST(msg.third.array[0] == 1);
45*c8d645caSAndroid Build Coastguard Worker TEST(msg.third.array[1] == 2);
46*c8d645caSAndroid Build Coastguard Worker TEST(msg.third.array[2] == 3);
47*c8d645caSAndroid Build Coastguard Worker TEST(msg.third.array[3] == 4);
48*c8d645caSAndroid Build Coastguard Worker TEST(msg.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
main(int argc,char ** argv)54*c8d645caSAndroid Build Coastguard Worker int main(int argc, char **argv)
55*c8d645caSAndroid Build Coastguard Worker {
56*c8d645caSAndroid Build Coastguard Worker uint8_t buffer[AnonymousOneOfMessage_size];
57*c8d645caSAndroid Build Coastguard Worker size_t count;
58*c8d645caSAndroid Build Coastguard Worker int option;
59*c8d645caSAndroid Build Coastguard Worker
60*c8d645caSAndroid Build Coastguard Worker if (argc != 2)
61*c8d645caSAndroid Build Coastguard Worker {
62*c8d645caSAndroid Build Coastguard Worker fprintf(stderr, "Usage: decode_oneof [number]\n");
63*c8d645caSAndroid Build Coastguard Worker return 1;
64*c8d645caSAndroid Build Coastguard Worker }
65*c8d645caSAndroid Build Coastguard Worker option = atoi(argv[1]);
66*c8d645caSAndroid Build Coastguard Worker
67*c8d645caSAndroid Build Coastguard Worker SET_BINARY_MODE(stdin);
68*c8d645caSAndroid Build Coastguard Worker count = fread(buffer, 1, sizeof(buffer), stdin);
69*c8d645caSAndroid Build Coastguard Worker
70*c8d645caSAndroid Build Coastguard Worker if (!feof(stdin))
71*c8d645caSAndroid Build Coastguard Worker {
72*c8d645caSAndroid Build Coastguard Worker printf("Message does not fit in buffer\n");
73*c8d645caSAndroid Build Coastguard Worker return 1;
74*c8d645caSAndroid Build Coastguard Worker }
75*c8d645caSAndroid Build Coastguard Worker
76*c8d645caSAndroid Build Coastguard Worker {
77*c8d645caSAndroid Build Coastguard Worker int status = 0;
78*c8d645caSAndroid Build Coastguard Worker pb_istream_t stream;
79*c8d645caSAndroid Build Coastguard Worker
80*c8d645caSAndroid Build Coastguard Worker stream = pb_istream_from_buffer(buffer, count);
81*c8d645caSAndroid Build Coastguard Worker status = test_oneof_1(&stream, option);
82*c8d645caSAndroid Build Coastguard Worker
83*c8d645caSAndroid Build Coastguard Worker if (status != 0)
84*c8d645caSAndroid Build Coastguard Worker return status;
85*c8d645caSAndroid Build Coastguard Worker }
86*c8d645caSAndroid Build Coastguard Worker
87*c8d645caSAndroid Build Coastguard Worker return 0;
88*c8d645caSAndroid Build Coastguard Worker }
89