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