test-numpack.c revision a6050e85dfaa9af0a7b4e059c198df6dc0133388
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen/* Copyright (c) 2013-2014 Dovecot authors, see the included COPYING file */
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen#include "test-lib.h"
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen#include "buffer.h"
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen#include "numpack.h"
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen#include <stdlib.h>
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainenstatic struct test {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen uint64_t input;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen uint8_t output[10];
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen unsigned int output_size;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen} enc_tests[] = {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0xffffffff, { 0xff, 0xff, 0xff, 0xff, 0xf }, 5 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0, { 0 }, 1 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0x7f, { 0x7f }, 1 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0x80, { 0x80, 1 }, 2 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0x81, { 0x81, 1 }, 2 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0xdeadbeefcafe, { 0xfe, 0x95, 0xbf, 0xf7, 0xdb, 0xd5, 0x37 }, 7 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0xffffffffffffffff, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1 }, 10 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { 0xfffffffe, { 0xfe, 0xff, 0xff, 0xff, 0xf }, 5 },
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen};
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainenstatic struct fail {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen uint8_t input[11];
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen unsigned int input_size;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen} dec_fails[] = {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { { 0 }, 0 }, /* has no termination byte */
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { { 0x80 }, 1 }, /* ditto */
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }, 10 }, /* ditto*/
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 2 }, 10 }, /* overflow */
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, 11 }, /* ditto */
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen};
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainenvoid test_numpack(void)
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen{
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen buffer_t *buf = buffer_create_dynamic(pool_datastack_create(), 32);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen unsigned int i;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen const uint8_t *p, *end;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen uint64_t num;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen uint64_t magic=0x9669699669969669;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_begin("numpack (good)");
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen for (i = 0; i < N_ELEMENTS(enc_tests); i++) {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen buffer_set_used_size(buf, 0);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen numpack_encode(buf, enc_tests[i].input);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(buf->used == enc_tests[i].output_size, i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(memcmp(buf->data, enc_tests[i].output,
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen enc_tests[i].output_size) == 0,
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen p = buf->data; end = p + buf->used;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(numpack_decode(&p, end, &num) == 0, i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(num == enc_tests[i].input, i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen }
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_end();
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_begin("numpack (bad)");
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen for (i = 0; i < N_ELEMENTS(dec_fails); i++) {
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen p = dec_fails[i].input; end = p + dec_fails[i].input_size;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen num = magic;
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(numpack_decode(&p, end, &num) == -1, i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_assert_idx(p == dec_fails[i].input && num == magic, i);
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen }
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen test_end();
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen}
39ee82dad4d4fa61e3ed074d191afc6a9b82e249Timo Sirainen