1 /* Decode a message using oneof fields */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <pb_decode.h>
7 #include "oneof.pb.h"
8 #include "test_helpers.h"
9 #include "unittests.h"
10
11 /* Test the 'AnonymousOneOfMessage' */
test_oneof_1(pb_istream_t * stream,int option)12 int test_oneof_1(pb_istream_t *stream, int option)
13 {
14 AnonymousOneOfMessage msg;
15 int status = 0;
16
17 /* To better catch initialization errors */
18 memset(&msg, 0xAA, sizeof(msg));
19
20 if (!pb_decode(stream, AnonymousOneOfMessage_fields, &msg))
21 {
22 printf("Decoding failed: %s\n", PB_GET_ERROR(stream));
23 return 1;
24 }
25
26 /* Check that the basic fields work normally */
27 TEST(msg.prefix == 123);
28 TEST(msg.suffix == 321);
29
30 /* Check that we got the right oneof according to command line */
31 if (option == 1)
32 {
33 TEST(msg.which_values == AnonymousOneOfMessage_first_tag);
34 TEST(msg.first == 999);
35 }
36 else if (option == 2)
37 {
38 TEST(msg.which_values == AnonymousOneOfMessage_second_tag);
39 TEST(strcmp(msg.second, "abcd") == 0);
40 }
41 else if (option == 3)
42 {
43 TEST(msg.which_values == AnonymousOneOfMessage_third_tag);
44 TEST(msg.third.array[0] == 1);
45 TEST(msg.third.array[1] == 2);
46 TEST(msg.third.array[2] == 3);
47 TEST(msg.third.array[3] == 4);
48 TEST(msg.third.array[4] == 5);
49 }
50
51 return status;
52 }
53
main(int argc,char ** argv)54 int main(int argc, char **argv)
55 {
56 uint8_t buffer[AnonymousOneOfMessage_size];
57 size_t count;
58 int option;
59
60 if (argc != 2)
61 {
62 fprintf(stderr, "Usage: decode_oneof [number]\n");
63 return 1;
64 }
65 option = atoi(argv[1]);
66
67 SET_BINARY_MODE(stdin);
68 count = fread(buffer, 1, sizeof(buffer), stdin);
69
70 if (!feof(stdin))
71 {
72 printf("Message does not fit in buffer\n");
73 return 1;
74 }
75
76 {
77 int status = 0;
78 pb_istream_t stream;
79
80 stream = pb_istream_from_buffer(buffer, count);
81 status = test_oneof_1(&stream, option);
82
83 if (status != 0)
84 return status;
85 }
86
87 return 0;
88 }
89