17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Checks that missing required fields are detected properly */
27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdio.h>
47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_encode.h>
57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_decode.h>
67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "missing_fields.pb.h"
77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main()
97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    uint8_t buffer[512];
117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    size_t size;
127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Create a message with one missing field */
147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        MissingField msg = {0};
167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        if (!pb_encode(&stream, MissingField_fields, &msg))
197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        {
207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            printf("Encode failed.\n");
217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            return 1;
227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        }
237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        size = stream.bytes_written;
257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Test that it decodes properly if we don't require that field */
287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        MissingField msg = {0};
307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        pb_istream_t stream = pb_istream_from_buffer(buffer, size);
317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        if (!pb_decode(&stream, MissingField_fields, &msg))
337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        {
347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            printf("Decode failed: %s\n", PB_GET_ERROR(&stream));
357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            return 2;
367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        }
377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Test that it does *not* decode properly if we require the field */
407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        AllFields msg = {0};
427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        pb_istream_t stream = pb_istream_from_buffer(buffer, size);
437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        if (pb_decode(&stream, AllFields_fields, &msg))
457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        {
467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            printf("Decode didn't detect missing field.\n");
477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            return 3;
487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        }
497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return 0; /* All ok */
527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
54