17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This includes the whole .c file to get access to static functions. */ 27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "pb_encode.c" 37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdio.h> 57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h> 67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "unittests.h" 77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "unittestproto.pb.h" 87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool streamcallback(pb_ostream_t *stream, const uint8_t *buf, size_t count) 107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Allow only 'x' to be written */ 127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen while (count--) 137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (*buf++ != 'x') 157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool fieldcallback(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int value = 0x55; 237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_encode_tag_for_field(stream, field)) 247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_varint(stream, value); 267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool crazyfieldcallback(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* This callback writes different amount of data the second time. */ 317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t *state = (uint32_t*)arg; 327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen *state <<= 8; 337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_encode_tag_for_field(stream, field)) 347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_varint(stream, *state); 367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Check that expression x writes data y. 397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Y is a string, which may contain null bytes. Null terminator is ignored. 407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define WRITES(x, y) \ 427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenmemset(buffer, 0xAA, sizeof(buffer)), \ 437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohens = pb_ostream_from_buffer(buffer, sizeof(buffer)), \ 447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen(x) && \ 457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenmemcmp(buffer, y, sizeof(y) - 1) == 0 && \ 467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbuffer[sizeof(y) - 1] == 0xAA 477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main() 497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int status = 0; 517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer1[] = "foobartest1234"; 547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer2[sizeof(buffer1)]; 557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t stream = pb_ostream_from_buffer(buffer2, sizeof(buffer1)); 567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_write and pb_ostream_t"); 587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(pb_write(&stream, buffer1, sizeof(buffer1))); 597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(memcmp(buffer1, buffer2, sizeof(buffer1)) == 0); 607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_write(&stream, buffer1, 1)); 617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(stream.bytes_written == sizeof(buffer1)); 627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer1[] = "xxxxxxx"; 667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t stream = {&streamcallback, 0, SIZE_MAX, 0}; 677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_write with custom callback"); 697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(pb_write(&stream, buffer1, 5)); 707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen buffer1[0] = 'a'; 717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_write(&stream, buffer1, 5)); 727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode_varint") 797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, 0), "\0")); 807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, 1), "\1")); 817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, 0x7F), "\x7F")); 827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, 0x80), "\x80\x01")); 837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, UINT32_MAX), "\xFF\xFF\xFF\xFF\x0F")); 847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_varint(&s, UINT64_MAX), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01")); 857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode_tag") 927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag(&s, PB_WT_STRING, 5), "\x2A")); 937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag(&s, PB_WT_VARINT, 99), "\x98\x06")); 947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_field_t field = {10, PB_LTYPE_SVARINT}; 1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode_tag_for_field") 1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag_for_field(&s, &field), "\x50")); 1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen field.type = PB_LTYPE_FIXED64; 1057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag_for_field(&s, &field), "\x51")); 1067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen field.type = PB_LTYPE_STRING; 1087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag_for_field(&s, &field), "\x52")); 1097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen field.type = PB_LTYPE_FIXED32; 1117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_tag_for_field(&s, &field), "\x55")); 1127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 1167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode_string") 1197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_string(&s, (const uint8_t*)"abcd", 4), "\x04""abcd")); 1207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_string(&s, (const uint8_t*)"abcd\x00", 5), "\x05""abcd\x00")); 1217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_string(&s, (const uint8_t*)"", 0), "\x00")); 1227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 1267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t value = 1; 1287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t max = INT32_MAX; 1297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t min = INT32_MIN; 1307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t lmax = INT64_MAX; 1317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t lmin = INT64_MIN; 1327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_field_t field = {1, PB_LTYPE_VARINT, 0, 0, sizeof(value)}; 1337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_enc_varint and pb_enc_svarint") 1357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_varint(&s, &field, &value), "\x01")); 1367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen field.data_size = sizeof(max); 1387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_svarint(&s, &field, &max), "\xfe\xff\xff\xff\x0f")); 1397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_svarint(&s, &field, &min), "\xff\xff\xff\xff\x0f")); 1407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen field.data_size = sizeof(lmax); 1427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_svarint(&s, &field, &lmax), "\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01")); 1437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_svarint(&s, &field, &lmin), "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01")); 1447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 1487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float fvalue; 1507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double dvalue; 1517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_enc_fixed32 using float") 1537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fvalue = 0.0f; 1547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed32(&s, NULL, &fvalue), "\x00\x00\x00\x00")) 1557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fvalue = 99.0f; 1567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed32(&s, NULL, &fvalue), "\x00\x00\xc6\x42")) 1577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fvalue = -12345678.0f; 1587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed32(&s, NULL, &fvalue), "\x4e\x61\x3c\xcb")) 1597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_enc_fixed64 using double") 1617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen dvalue = 0.0; 1627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed64(&s, NULL, &dvalue), "\x00\x00\x00\x00\x00\x00\x00\x00")) 1637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen dvalue = 99.0; 1647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed64(&s, NULL, &dvalue), "\x00\x00\x00\x00\x00\xc0\x58\x40")) 1657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen dvalue = -12345678.0; 1667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_fixed64(&s, NULL, &dvalue), "\x00\x00\x00\xc0\x29\x8c\x67\xc1")) 1677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 1717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen struct { size_t size; uint8_t bytes[5]; } value = {5, {'x', 'y', 'z', 'z', 'y'}}; 1737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_enc_bytes") 1757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_bytes(&s, &BytesMessage_fields[0], &value), "\x05xyzzy")) 1767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen value.size = 0; 1777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_bytes(&s, &BytesMessage_fields[0], &value), "\x00")) 1787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[30]; 1827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen char value[30] = "xyzzy"; 1847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_enc_string") 1867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x05xyzzy")) 1877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen value[0] = '\0'; 1887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x00")) 1897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen memset(value, 'x', 30); 1907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x0Axxxxxxxxxx")) 1917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 1927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 1947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[10]; 1957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 1967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen IntegerArray msg = {5, {1, 2, 3, 4, 5}}; 1977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with int32 array") 1997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, IntegerArray_fields, &msg), "\x0A\x05\x01\x02\x03\x04\x05")) 2017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data_count = 0; 2037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, IntegerArray_fields, &msg), "")) 2047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data_count = 10; 2067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_encode(&s, IntegerArray_fields, &msg)) 2077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[10]; 2117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen FloatArray msg = {1, {99.0f}}; 2137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with float array") 2157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, FloatArray_fields, &msg), 2177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen "\x0A\x04\x00\x00\xc6\x42")) 2187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data_count = 0; 2207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, FloatArray_fields, &msg), "")) 2217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data_count = 3; 2237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_encode(&s, FloatArray_fields, &msg)) 2247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[50]; 2287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen FloatArray msg = {1, {99.0f}}; 2307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test array size limit in pb_encode") 2327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen s = pb_ostream_from_buffer(buffer, sizeof(buffer)); 2347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST((msg.data_count = 10) && pb_encode(&s, FloatArray_fields, &msg)) 2357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen s = pb_ostream_from_buffer(buffer, sizeof(buffer)); 2377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST((msg.data_count = 11) && !pb_encode(&s, FloatArray_fields, &msg)) 2387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[10]; 2427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen CallbackArray msg; 2447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data.funcs.encode = &fieldcallback; 2467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with callback field.") 2487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, CallbackArray_fields, &msg), "\x08\x55")) 2497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[10]; 2537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen IntegerContainer msg = {{5, {1,2,3,4,5}}}; 2557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with packed array in a submessage.") 2577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, IntegerContainer_fields, &msg), 2587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen "\x0A\x07\x0A\x05\x01\x02\x03\x04\x05")) 2597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[32]; 2637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen BytesMessage msg = {{3, "xyz"}}; 2657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with bytes message.") 2677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, BytesMessage_fields, &msg), 2687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen "\x0A\x03xyz")) 2697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.data.size = 17; /* More than maximum */ 2717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_encode(&s, BytesMessage_fields, &msg)) 2727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[20]; 2777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen IntegerContainer msg = {{5, {1,2,3,4,5}}}; 2797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode_delimited.") 2817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode_delimited(&s, IntegerContainer_fields, &msg), 2827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen "\x09\x0A\x07\x0A\x05\x01\x02\x03\x04\x05")) 2837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen IntegerContainer msg = {{5, {1,2,3,4,5}}}; 2877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size_t size; 2887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_get_encoded_size.") 2907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(pb_get_encoded_size(&size, IntegerContainer_fields, &msg) && 2917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size == 9); 2927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 2937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 2957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[10]; 2967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 2977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen CallbackContainer msg; 2987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen CallbackContainerContainer msg2; 2997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t state = 1; 3007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.submsg.data.funcs.encode = &fieldcallback; 3027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg2.submsg.submsg.data.funcs.encode = &fieldcallback; 3037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test pb_encode with callback field in a submessage.") 3057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, CallbackContainer_fields, &msg), "\x0A\x02\x08\x55")) 3067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(WRITES(pb_encode(&s, CallbackContainerContainer_fields, &msg2), 3077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen "\x0A\x04\x0A\x02\x08\x55")) 3087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Misbehaving callback: varying output between calls */ 3107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.submsg.data.funcs.encode = &crazyfieldcallback; 3117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg.submsg.data.arg = &state; 3127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg2.submsg.submsg.data.funcs.encode = &crazyfieldcallback; 3137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen msg2.submsg.submsg.data.arg = &state; 3147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_encode(&s, CallbackContainer_fields, &msg)) 3167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen state = 1; 3177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(!pb_encode(&s, CallbackContainerContainer_fields, &msg2)) 3187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[StringMessage_size]; 3227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t s; 3237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen StringMessage msg = {"0123456789"}; 3247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen s = pb_ostream_from_buffer(buffer, sizeof(buffer)); 3267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen COMMENT("Test that StringMessage_size is correct") 3287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(pb_encode(&s, StringMessage_fields, &msg)); 3307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(s.bytes_written == StringMessage_size); 3317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (status != 0) 3347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fprintf(stdout, "\n\nSome tests FAILED!\n"); 3357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return status; 3377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 338