xref: /aosp_15_r20/external/nanopb-c/tests/missing_fields/missing_fields.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker /* Checks that missing required fields are detected properly */
2*c8d645caSAndroid Build Coastguard Worker 
3*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
4*c8d645caSAndroid Build Coastguard Worker #include <pb_encode.h>
5*c8d645caSAndroid Build Coastguard Worker #include <pb_decode.h>
6*c8d645caSAndroid Build Coastguard Worker #include "missing_fields.pb.h"
7*c8d645caSAndroid Build Coastguard Worker 
main()8*c8d645caSAndroid Build Coastguard Worker int main()
9*c8d645caSAndroid Build Coastguard Worker {
10*c8d645caSAndroid Build Coastguard Worker     uint8_t buffer[512];
11*c8d645caSAndroid Build Coastguard Worker     size_t size;
12*c8d645caSAndroid Build Coastguard Worker 
13*c8d645caSAndroid Build Coastguard Worker     /* Create a message with one missing field */
14*c8d645caSAndroid Build Coastguard Worker     {
15*c8d645caSAndroid Build Coastguard Worker         MissingField msg = {0};
16*c8d645caSAndroid Build Coastguard Worker         pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
17*c8d645caSAndroid Build Coastguard Worker 
18*c8d645caSAndroid Build Coastguard Worker         if (!pb_encode(&stream, MissingField_fields, &msg))
19*c8d645caSAndroid Build Coastguard Worker         {
20*c8d645caSAndroid Build Coastguard Worker             printf("Encode failed.\n");
21*c8d645caSAndroid Build Coastguard Worker             return 1;
22*c8d645caSAndroid Build Coastguard Worker         }
23*c8d645caSAndroid Build Coastguard Worker 
24*c8d645caSAndroid Build Coastguard Worker         size = stream.bytes_written;
25*c8d645caSAndroid Build Coastguard Worker     }
26*c8d645caSAndroid Build Coastguard Worker 
27*c8d645caSAndroid Build Coastguard Worker     /* Test that it decodes properly if we don't require that field */
28*c8d645caSAndroid Build Coastguard Worker     {
29*c8d645caSAndroid Build Coastguard Worker         MissingField msg = {0};
30*c8d645caSAndroid Build Coastguard Worker         pb_istream_t stream = pb_istream_from_buffer(buffer, size);
31*c8d645caSAndroid Build Coastguard Worker 
32*c8d645caSAndroid Build Coastguard Worker         if (!pb_decode(&stream, MissingField_fields, &msg))
33*c8d645caSAndroid Build Coastguard Worker         {
34*c8d645caSAndroid Build Coastguard Worker             printf("Decode failed: %s\n", PB_GET_ERROR(&stream));
35*c8d645caSAndroid Build Coastguard Worker             return 2;
36*c8d645caSAndroid Build Coastguard Worker         }
37*c8d645caSAndroid Build Coastguard Worker     }
38*c8d645caSAndroid Build Coastguard Worker 
39*c8d645caSAndroid Build Coastguard Worker     /* Test that it does *not* decode properly if we require the field */
40*c8d645caSAndroid Build Coastguard Worker     {
41*c8d645caSAndroid Build Coastguard Worker         AllFields msg = {0};
42*c8d645caSAndroid Build Coastguard Worker         pb_istream_t stream = pb_istream_from_buffer(buffer, size);
43*c8d645caSAndroid Build Coastguard Worker 
44*c8d645caSAndroid Build Coastguard Worker         if (pb_decode(&stream, AllFields_fields, &msg))
45*c8d645caSAndroid Build Coastguard Worker         {
46*c8d645caSAndroid Build Coastguard Worker             printf("Decode didn't detect missing field.\n");
47*c8d645caSAndroid Build Coastguard Worker             return 3;
48*c8d645caSAndroid Build Coastguard Worker         }
49*c8d645caSAndroid Build Coastguard Worker     }
50*c8d645caSAndroid Build Coastguard Worker 
51*c8d645caSAndroid Build Coastguard Worker     return 0; /* All ok */
52*c8d645caSAndroid Build Coastguard Worker }
53*c8d645caSAndroid Build Coastguard Worker 
54