-#define NANOPB_INTERNALS
+/* This includes the whole .c file to get access to static functions. */
+#define PB_ENABLE_MALLOC
+#include "pb_common.c"
+#include "pb_decode.c"
#include <stdio.h>
#include <string.h>
-#include "pb_decode.h"
#include "unittests.h"
#include "unittestproto.pb.h"
pb_decode_varint(&s, (uint64_t*)&i) && i == -1));
TEST((s = S("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01"),
pb_decode_varint(&s, &u) && u == UINT64_MAX));
+ TEST((s = S("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01"),
+ !pb_decode_varint(&s, &u)));
+ }
+
+ {
+ pb_istream_t s;
+ uint32_t u;
+
+ COMMENT("Test pb_decode_varint32");
+ TEST((s = S("\x00"), pb_decode_varint32(&s, &u) && u == 0));
+ TEST((s = S("\x01"), pb_decode_varint32(&s, &u) && u == 1));
+ TEST((s = S("\xAC\x02"), pb_decode_varint32(&s, &u) && u == 300));
+ TEST((s = S("\xFF\xFF\xFF\xFF\x0F"), pb_decode_varint32(&s, &u) && u == UINT32_MAX));
+ TEST((s = S("\xFF\xFF\xFF\xFF\xFF\x01"), !pb_decode_varint32(&s, &u)));
}
{
{
pb_istream_t s;
- struct { size_t size; uint8_t bytes[5]; } d;
+ struct { pb_size_t size; uint8_t bytes[5]; } d;
pb_field_t f = {1, PB_LTYPE_BYTES, 0, 0, sizeof(d), 0, 0};
COMMENT("Test pb_dec_bytes")
{
pb_istream_t s;
CallbackArray dest;
- struct { size_t size; uint8_t bytes[10]; } ref;
+ struct { pb_size_t size; uint8_t bytes[10]; } ref;
dest.data.funcs.decode = &callback_check;
dest.data.arg = &ref;
{
pb_istream_t s;
- IntegerContainer dest = {};
+ IntegerContainer dest = {{0}};
COMMENT("Testing pb_decode_delimited")
TEST((s = S("\x09\x0A\x07\x0A\x05\x01\x02\x03\x04\x05"),
dest.submsg.data_count == 5)
}
+ {
+ pb_istream_t s = {0};
+ void *data = NULL;
+
+ COMMENT("Testing allocate_field")
+ TEST(allocate_field(&s, &data, 10, 10) && data != NULL);
+ TEST(allocate_field(&s, &data, 10, 20) && data != NULL);
+
+ {
+ void *oldvalue = data;
+ size_t very_big = (size_t)-1;
+ size_t somewhat_big = very_big / 2 + 1;
+ size_t not_so_big = (size_t)1 << (4 * sizeof(size_t));
+
+ TEST(!allocate_field(&s, &data, very_big, 2) && data == oldvalue);
+ TEST(!allocate_field(&s, &data, somewhat_big, 2) && data == oldvalue);
+ TEST(!allocate_field(&s, &data, not_so_big, not_so_big) && data == oldvalue);
+ }
+
+ pb_free(data);
+ }
+
if (status != 0)
fprintf(stdout, "\n\nSome tests FAILED!\n");