LCOV - code coverage report
Current view: top level - callbacks - decode_callbacks.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 42 48 87.5 %
Date: 2023-02-14 20:10:26 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* Decoding testcase for callback fields.
       2             :  * Run e.g. ./test_encode_callbacks | ./test_decode_callbacks
       3             :  */
       4             : 
       5             : #include <stdio.h>
       6             : #include <pb_decode.h>
       7             : #include "callbacks.pb.h"
       8             : #include "test_helpers.h"
       9             : 
      10           6 : bool print_string(pb_istream_t *stream, const pb_field_t *field, void **arg)
      11             : {
      12           6 :     uint8_t buffer[1024] = {0};
      13             :     
      14             :     /* We could read block-by-block to avoid the large buffer... */
      15           6 :     if (stream->bytes_left > sizeof(buffer) - 1)
      16           0 :         return false;
      17             :     
      18           6 :     if (!pb_read(stream, buffer, stream->bytes_left))
      19           0 :         return false;
      20             :     
      21             :     /* Print the string, in format comparable with protoc --decode.
      22             :      * Format comes from the arg defined in main().
      23             :      */
      24           6 :     printf((char*)*arg, buffer);
      25           6 :     return true;
      26             : }
      27             : 
      28           2 : bool print_int32(pb_istream_t *stream, const pb_field_t *field, void **arg)
      29             : {
      30             :     uint64_t value;
      31           2 :     if (!pb_decode_varint(stream, &value))
      32           0 :         return false;
      33             :     
      34           2 :     printf((char*)*arg, (long)value);
      35           2 :     return true;
      36             : }
      37             : 
      38           2 : bool print_fixed32(pb_istream_t *stream, const pb_field_t *field, void **arg)
      39             : {
      40             :     uint32_t value;
      41           2 :     if (!pb_decode_fixed32(stream, &value))
      42           0 :         return false;
      43             :     
      44           2 :     printf((char*)*arg, (long)value);
      45           2 :     return true;
      46             : }
      47             : 
      48           2 : bool print_fixed64(pb_istream_t *stream, const pb_field_t *field, void **arg)
      49             : {
      50             :     uint64_t value;
      51           2 :     if (!pb_decode_fixed64(stream, &value))
      52           0 :         return false;
      53             :     
      54           2 :     printf((char*)*arg, (long)value);
      55           2 :     return true;
      56             : }
      57             : 
      58           1 : int main()
      59             : {
      60             :     uint8_t buffer[1024];
      61             :     size_t length;
      62             :     pb_istream_t stream;
      63             :     /* Note: empty initializer list initializes the struct with all-0.
      64             :      * This is recommended so that unused callbacks are set to NULL instead
      65             :      * of crashing at runtime.
      66             :      */
      67           1 :     TestMessage testmessage = {{{NULL}}};
      68             :     
      69             :     SET_BINARY_MODE(stdin);
      70           1 :     length = fread(buffer, 1, 1024, stdin);
      71           1 :     stream = pb_istream_from_buffer(buffer, length);    
      72             :     
      73           1 :     testmessage.submsg.stringvalue.funcs.decode = &print_string;
      74           1 :     testmessage.submsg.stringvalue.arg = "submsg {\n  stringvalue: \"%s\"\n";
      75           1 :     testmessage.submsg.int32value.funcs.decode = &print_int32;
      76           1 :     testmessage.submsg.int32value.arg = "  int32value: %ld\n";
      77           1 :     testmessage.submsg.fixed32value.funcs.decode = &print_fixed32;
      78           1 :     testmessage.submsg.fixed32value.arg = "  fixed32value: %ld\n";
      79           1 :     testmessage.submsg.fixed64value.funcs.decode = &print_fixed64;
      80           1 :     testmessage.submsg.fixed64value.arg = "  fixed64value: %ld\n}\n";
      81             :     
      82           1 :     testmessage.stringvalue.funcs.decode = &print_string;
      83           1 :     testmessage.stringvalue.arg = "stringvalue: \"%s\"\n";
      84           1 :     testmessage.int32value.funcs.decode = &print_int32;
      85           1 :     testmessage.int32value.arg = "int32value: %ld\n";
      86           1 :     testmessage.fixed32value.funcs.decode = &print_fixed32;
      87           1 :     testmessage.fixed32value.arg = "fixed32value: %ld\n";
      88           1 :     testmessage.fixed64value.funcs.decode = &print_fixed64;
      89           1 :     testmessage.fixed64value.arg = "fixed64value: %ld\n";
      90           1 :     testmessage.repeatedstring.funcs.decode = &print_string;
      91           1 :     testmessage.repeatedstring.arg = "repeatedstring: \"%s\"\n";
      92             :     
      93           1 :     if (!pb_decode(&stream, TestMessage_fields, &testmessage))
      94           0 :         return 1;
      95             :     
      96           1 :     return 0;
      97             : }

Generated by: LCOV version 1.14