Add 'CAN-binder/libs/nanopb/' from commit '278ffb890e3d8722e4c7d824baaf221a1e375fc4'
[apps/agl-service-can-low-level.git] / CAN-binder / libs / nanopb / tests / anonymous_oneof / decode_oneof.c
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' */
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
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 }