/** * @file test_encoding.c * @author Sean Chittenden * @date 2012-10-08 * @brief Basic unit tests to test the encoding and decoding of varint encoded integers. * * Copyright 2012 Sean Chittenden. * See ../COPYING for additional copyright and license information. */ #include #include #include #include #include #include #include #include #include "varint.h" typedef struct { int64_t num; size_t consumed; char nibbles[10]; } test_record_int64_t; typedef struct { uint64_t num; size_t consumed; char nibbles[10]; } test_record_uint64_t; static int test_record_int32(const test_record_int64_t* rec); static int test_record_uint32(const test_record_uint64_t* rec); static int test_record_int64(const test_record_int64_t* rec); static int test_record_uint64(const test_record_uint64_t* rec); static int test_record_int32(const test_record_int64_t* rec) { const size_t buflen = 5; char buf[buflen]; size_t outlen = 0; int32_to_varint((int32_t)rec->num, buflen, buf, &outlen); if (outlen != rec->consumed) { fprintf(stderr, "Incorrect byte length %zu (expected %zu) for input %d\n", outlen, rec->consumed, (int32_t)rec->num); return 1; } int failed = 0; for (size_t i = 0; i < outlen; ++i) { if (rec->nibbles[i] == buf[i]) { /* Good */ } else { if (failed == 0) printf(" { %d, %2zu, {", (int32_t)rec->num, outlen); printf(" 0x%02hhX,", buf[i]); ++failed; } } if (failed) { printf(" } },\n"); return failed; } int32_t dst = 0; size_t consumed = 0; varint_to_int32(buf, buflen, &dst, &consumed); if (consumed != rec->consumed) { fprintf(stderr, "Incorrect number of bytes consumed: %zu\n", consumed); return 1; } return 0; } static int test_record_uint32(const test_record_uint64_t* rec) { const size_t buflen = 5; char buf[buflen]; size_t outlen = 0; uint32_to_varint((uint32_t)rec->num, buflen, buf, &outlen); if (outlen != rec->consumed) { fprintf(stderr, "Incorrect byte length %zu (expected %zu) for input %llx\n", outlen, rec->consumed, rec->num); return 1; } int failed = 0; for (size_t i = 0; i < outlen; ++i) { if (rec->nibbles[i] == buf[i]) { /* Good */ } else { if (failed == 0) printf(" { %20x, %2zu, {", (uint32_t)rec->num, outlen); printf(" 0x%02hhX,", buf[i]); ++failed; } } if (failed) { printf(" } },\n"); return failed; } uint32_t dst = 0; size_t consumed = 0; varint_to_uint32(buf, buflen, &dst, &consumed); if (consumed != rec->consumed) { fprintf(stderr, "Incorrect number of bytes consumed: %zu\n", consumed); return 1; } return 0; } static int test_record_int64(const test_record_int64_t* rec) { const size_t buflen = 10; char buf[buflen]; size_t outlen = 0; int64_to_varint(rec->num, buflen, buf, &outlen); if (outlen != rec->consumed) { fprintf(stderr, "Incorrect byte length %zu (expected %zu) for input %lld\n", outlen, rec->consumed, rec->num); return 1; } int failed = 0; for (size_t i = 0; i < outlen; ++i) { if (rec->nibbles[i] == buf[i]) { /* Good */ } else { if (failed == 0) printf(" { %lld, %2zu, {", rec->num, outlen); printf(" 0x%02hhX,", buf[i]); ++failed; } } if (failed) { printf(" } },\n"); return failed; } int64_t dst = 0; size_t consumed = 0; varint_to_int64(buf, buflen, &dst, &consumed); if (consumed != rec->consumed) { fprintf(stderr, "Incorrect number of bytes consumed: %zu\n", consumed); return 1; } return 0; } static int test_record_uint64(const test_record_uint64_t* rec) { const size_t buflen = 10; char buf[buflen]; size_t outlen = 0; uint64_to_varint(rec->num, buflen, buf, &outlen); if (outlen != rec->consumed) { fprintf(stderr, "Incorrect byte length %zu (expected %zu) for input %llx\n", outlen, rec->consumed, rec->num); return 1; } int failed = 0; for (size_t i = 0; i < outlen; ++i) { if (rec->nibbles[i] == buf[i]) { /* Good */ } else { if (failed == 0) printf(" { %20llx, %2zu, {", rec->num, outlen); printf(" 0x%02hhX,", buf[i]); ++failed; } } if (failed) { printf(" } },\n"); return failed; } uint64_t dst = 0; size_t consumed = 0; varint_to_uint64(buf, buflen, &dst, &consumed); if (consumed != rec->consumed) { fprintf(stderr, "Incorrect number of bytes consumed: %zu\n", consumed); return 1; } return 0; } /* Rely on the uint64_t tests for a more exhaustive battery of tests. Only * test the boundary conditions using the int64_t records. */ const test_record_int64_t test_records_good_int64[] = { { 0x0, 1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { -0x1, 1, { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1, 1, { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { -0x2, 1, { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2, 1, { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7fffffff, 5, { 0xFE, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { -0x80000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0, 0, {0x0} }, }; const test_record_uint64_t test_records_good_uint64[] = { { 0x0, 1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1, 1, { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2, 1, { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3, 1, { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4, 1, { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x5, 1, { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7, 1, { 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8, 1, { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x9, 1, { 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xf, 1, { 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x10, 1, { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x11, 1, { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1f, 1, { 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x20, 1, { 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x21, 1, { 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3f, 1, { 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x40, 1, { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x41, 1, { 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7f, 1, { 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x80, 2, { 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x81, 2, { 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xff, 2, { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x100, 2, { 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x101, 2, { 0x81, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ff, 2, { 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x200, 2, { 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x201, 2, { 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ff, 2, { 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x400, 2, { 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x401, 2, { 0x81, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7ff, 2, { 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x800, 2, { 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x801, 2, { 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xfff, 2, { 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000, 2, { 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1001, 2, { 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1fff, 2, { 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000, 2, { 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2001, 2, { 0x81, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3fff, 2, { 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000, 3, { 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4001, 3, { 0x81, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7fff, 3, { 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000, 3, { 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8001, 3, { 0x81, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xffff, 3, { 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x10000, 3, { 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x10001, 3, { 0x81, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ffff, 3, { 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x20000, 3, { 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x20001, 3, { 0x81, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ffff, 3, { 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x40000, 3, { 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x40001, 3, { 0x81, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7ffff, 3, { 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x80000, 3, { 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x80001, 3, { 0x81, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xfffff, 3, { 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x100000, 3, { 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x100001, 3, { 0x81, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1fffff, 3, { 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x200000, 4, { 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x200001, 4, { 0x81, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3fffff, 4, { 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x400000, 4, { 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x400001, 4, { 0x81, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7fffff, 4, { 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x800000, 4, { 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x800001, 4, { 0x81, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xffffff, 4, { 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000000, 4, { 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000001, 4, { 0x81, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000000, 4, { 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000001, 4, { 0x81, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000000, 4, { 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000001, 4, { 0x81, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000000, 4, { 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000001, 4, { 0x81, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xfffffff, 4, { 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000000, 4, { 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000001, 4, { 0x81, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000000, 4, { 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000001, 4, { 0x81, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000000, 4, { 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000001, 4, { 0x81, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7ffffff, 4, { 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000000, 4, { 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000001, 4, { 0x81, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xfffffff, 4, { 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x10000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x10000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1fffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x20000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x20000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3fffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x40000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x40000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7fffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x80000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x80000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0xffffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x100000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x100000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ffffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x200000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x200000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ffffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x400000000, 5, { 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x400000001, 5, { 0x81, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x7ffffffff, 5, { 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { 0x800000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00 } }, { 0x800000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00 } }, { 0xfffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00 } }, { 0x1000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00 } }, { 0x1fffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00 } }, { 0x2000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00 } }, { 0x3fffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00 } }, { 0x4000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00 } }, { 0x7fffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00 } }, { 0x8000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00 } }, { 0xffffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00 } }, { 0x10000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00 } }, { 0x10000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00 } }, { 0x1ffffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00 } }, { 0x20000000000, 6, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00 } }, { 0x20000000001, 6, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00 } }, { 0x3ffffffffff, 6, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00 } }, { 0x40000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00 } }, { 0x40000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00 } }, { 0x7ffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00 } }, { 0x80000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00 } }, { 0x80000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00, 0x00 } }, { 0xfffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00 } }, { 0x100000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00 } }, { 0x100000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00 } }, { 0x1fffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00 } }, { 0x200000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00 } }, { 0x200000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00 } }, { 0x3fffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00 } }, { 0x400000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00 } }, { 0x400000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00, 0x00 } }, { 0x7fffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00 } }, { 0x800000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00 } }, { 0x800000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00 } }, { 0xffffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00 } }, { 0x1000000000000, 7, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00 } }, { 0x1000000000001, 7, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00 } }, { 0x1ffffffffffff, 7, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00 } }, { 0x2000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00 } }, { 0x2000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00, 0x00 } }, { 0x3ffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00 } }, { 0x4000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00 } }, { 0x4000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00, 0x00 } }, { 0x7ffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00 } }, { 0x8000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00 } }, { 0x8000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00, 0x00 } }, { 0xfffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00 } }, { 0x10000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00 } }, { 0x10000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00, 0x00 } }, { 0x1fffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00 } }, { 0x20000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00 } }, { 0x20000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00, 0x00 } }, { 0x3fffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00 } }, { 0x40000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00 } }, { 0x40000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00, 0x00 } }, { 0x7fffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00 } }, { 0x80000000000000, 8, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00 } }, { 0x80000000000001, 8, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00 } }, { 0xffffffffffffff, 8, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00 } }, { 0x100000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00 } }, { 0x100000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x00 } }, { 0x1ffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00 } }, { 0x200000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00 } }, { 0x200000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x02, 0x00 } }, { 0x3ffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00 } }, { 0x400000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00 } }, { 0x400000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x00 } }, { 0x7ffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00 } }, { 0x800000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00 } }, { 0x800000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0x00 } }, { 0xfffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00 } }, { 0x1000000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00 } }, { 0x1000000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x10, 0x00 } }, { 0x1fffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00 } }, { 0x2000000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00 } }, { 0x2000000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x00 } }, { 0x3fffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00 } }, { 0x4000000000000000, 9, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00 } }, { 0x4000000000000001, 9, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00 } }, { 0x7fffffffffffffff, 9, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00 } }, { 0x8000000000000000, 10, { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01 } }, { 0x8000000000000001, 10, { 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01 } }, { 0xffffffffffffffff, 10, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 } }, { 0, 0, {0x0} }, }; int main(int argc, char* argv[]) { if (argc == 1) { int failed = 0; /* uint32_t */ for (int i = 0; test_records_good_uint64[i].consumed; ++i) { if (test_records_good_uint64[i].num > UINT32_MAX) continue; failed += test_record_uint32(&test_records_good_uint64[i]); if (failed) break; } if (failed) errx(EX_SOFTWARE, "%d uint32_t tests failed", failed); /* uint64_t */ for (int i = 0; test_records_good_uint64[i].consumed; ++i) { failed += test_record_uint64(&test_records_good_uint64[i]); if (failed) break; } if (failed) errx(EX_SOFTWARE, "%d uint64_t tests failed", failed); /* int32_t */ for (int i = 0; test_records_good_int64[i].consumed; ++i) { if (test_records_good_int64[i].num > INT32_MAX) continue; failed += test_record_int32(&test_records_good_int64[i]); if (failed) break; } if (failed) errx(EX_SOFTWARE, "%d int32_t tests failed", failed); /* int64_t */ for (int i = 0; test_records_good_int64[i].consumed; ++i) { failed += test_record_int64(&test_records_good_int64[i]); if (failed) break; } if (failed) errx(EX_SOFTWARE, "%d int64_t tests failed", failed); printf("Tests completed successfully\n"); return 0; } else if (argc == 2) { char* cp; uint64_t input = strtol(argv[1], &cp, 10); if (input == 0 && (errno == EINVAL || errno == ERANGE)) err(EX_DATAERR, "%s is an invalid uint64_t value", argv[1]); const size_t bufsz = 10; char buf[bufsz]; size_t outlen = 0; uint64_to_varint(input, bufsz, buf, &outlen); printf("Varint representation of %llu (0x%llX) is:", input, input); for (size_t i = 0; i < outlen; ++i) printf(" 0x%hhX", buf[i]); printf("\n"); return 0; } errx(EX_SOFTWARE, "Unhandled program flow"); }