> Signed-off-by: Orit Wasserman <owass...@redhat.com> > --- > tests/Makefile | 2 + > tests/test-xbzrle.c | 185 > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 187 insertions(+) > create mode 100644 tests/test-xbzrle.c > > diff --git a/tests/Makefile b/tests/Makefile > index c681ceb..c6d3999 100644 > --- a/tests/Makefile > +++ b/tests/Makefile > @@ -41,6 +41,7 @@ check-unit-y += > tests/test-visitor-serialization$(EXESUF) > check-unit-y += tests/test-iov$(EXESUF) > gcov-files-test-iov-y = util/iov.c > check-unit-y += tests/test-aio$(EXESUF)
Please add gcov-files-test-xbzrle-y too. Paolo > +check-unit-y += tests/test-xbzrle$(EXESUF) > gcov-files-test-aio-$(CONFIG_WIN32) = aio-win32.c > gcov-files-test-aio-$(CONFIG_POSIX) = aio-posix.c > check-unit-y += tests/test-thread-pool$(EXESUF) > @@ -98,6 +99,7 @@ tests/test-thread-pool$(EXESUF): > tests/test-thread-pool.o $(block-obj-y) libqemu > tests/test-iov$(EXESUF): tests/test-iov.o libqemuutil.a > tests/test-hbitmap$(EXESUF): tests/test-hbitmap.o libqemuutil.a > libqemustub.a > tests/test-x86-cpuid$(EXESUF): tests/test-x86-cpuid.o > +tests/test-xbzrle$(EXESUF): tests/test-xbzrle.o xbzrle.o > page_cache.o libqemuutil.a > > tests/test-qapi-types.c tests/test-qapi-types.h :\ > $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py > diff --git a/tests/test-xbzrle.c b/tests/test-xbzrle.c > new file mode 100644 > index 0000000..9e19623 > --- /dev/null > +++ b/tests/test-xbzrle.c > @@ -0,0 +1,185 @@ > +#include <stdint.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <strings.h> > +#include <string.h> > +#include <sys/time.h> > +#include <assert.h> > +#include "qemu-common.h" > +#include "include/migration/migration.h" > + > +#define PAGE_SIZE 4096 > + > +static void test_uleb(void) > +{ > + uint32_t i, val; > + uint8_t *buf = g_malloc(sizeof(uint8_t)*2); > + int encode_ret, decode_ret; > + > + for (i = 0; i <= 0x3fff; i++) { > + encode_ret = uleb128_encode_small(buf, i); > + decode_ret = uleb128_decode_small(buf, &val); > + g_assert(encode_ret == decode_ret); > + g_assert(i == val); > + } > + > + /* decode invalid value */ > + buf[0] = 0x80; > + buf[1] = 0x80; > + > + decode_ret = uleb128_decode_small(buf, &val); > + g_assert(decode_ret == -1); > + > + g_free(buf); > +} > + > +static void encode_decode_zero(void) > +{ > + uint8_t *buffer = g_malloc0(PAGE_SIZE); > + uint8_t *compressed = g_malloc0(PAGE_SIZE); > + int i = 0; > + int dlen = 0; > + int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006); > + > + for (i = diff_len; i > 0; i--) { > + buffer[1000 + i] = i; > + } > + > + buffer[1000 + diff_len + 3] = 103; > + buffer[1000 + diff_len + 5] = 105; > + > + /* encode zero page */ > + dlen = xbzrle_encode_buffer(buffer, buffer, PAGE_SIZE, > compressed, > + PAGE_SIZE); > + g_assert(dlen == 0); > + > + g_free(buffer); > + g_free(compressed); > +} > + > +static void encode_decode_unchanged(void) > +{ > + uint8_t *compressed = g_malloc0(PAGE_SIZE); > + uint8_t *test = g_malloc0(PAGE_SIZE); > + int i = 0; > + int dlen = 0; > + int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006); > + > + for (i = diff_len; i > 0; i--) { > + test[1000 + i] = i + 4; > + } > + > + test[1000 + diff_len + 3] = 107; > + test[1000 + diff_len + 5] = 109; > + > + /* test unchanged buffer */ > + dlen = xbzrle_encode_buffer(test, test, PAGE_SIZE, compressed, > + PAGE_SIZE); > + g_assert(dlen == 0); > + > + g_free(test); > + g_free(compressed); > +} > + > +static void encode_decode_1_byte(void) > +{ > + uint8_t *buffer = g_malloc0(PAGE_SIZE); > + uint8_t *test = g_malloc0(PAGE_SIZE); > + uint8_t *compressed = g_malloc(PAGE_SIZE); > + int dlen = 0, rc = 0; > + uint8_t *buf = g_malloc(sizeof(uint8_t)*2); > + > + test[PAGE_SIZE - 1] = 1; > + > + dlen = xbzrle_encode_buffer(buffer, test, PAGE_SIZE, compressed, > + PAGE_SIZE); > + g_assert(dlen == (uleb128_encode_small(buf, 4095) + 2)); > + > + rc = xbzrle_decode_buffer(compressed, dlen, buffer, PAGE_SIZE); > + g_assert(rc == PAGE_SIZE); > + g_assert(memcmp(test, buffer, PAGE_SIZE) == 0); > + > + g_free(buffer); > + g_free(compressed); > + g_free(test); > + g_free(buf); > +} > + > +static void encode_decode_overflow(void) > +{ > + uint8_t *compressed = g_malloc0(PAGE_SIZE); > + uint8_t *test = g_malloc0(PAGE_SIZE); > + uint8_t *buffer = g_malloc0(PAGE_SIZE); > + int i = 0, rc = 0; > + > + for (i = 0; i < PAGE_SIZE/2 - 1; i++) { > + test[i*2] = 1; > + } > + > + /* encode overflow */ > + rc = xbzrle_encode_buffer(buffer, test, PAGE_SIZE, compressed, > + PAGE_SIZE); > + g_assert(rc == -1); > + > + g_free(buffer); > + g_free(compressed); > + g_free(test); > +} > + > +static void encode_decode_range(void) > +{ > + uint8_t *buffer = g_malloc0(PAGE_SIZE); > + uint8_t *compressed = g_malloc(PAGE_SIZE); > + uint8_t *test = g_malloc0(PAGE_SIZE); > + int i = 0, rc = 0; > + int dlen = 0; > + > + int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006); > + > + for (i = diff_len; i > 0; i--) { > + buffer[1000 + i] = i; > + test[1000 + i] = i + 4; > + } > + > + buffer[1000 + diff_len + 3] = 103; > + test[1000 + diff_len + 3] = 107; > + > + buffer[1000 + diff_len + 5] = 105; > + test[1000 + diff_len + 5] = 109; > + > + /* test encode/decode */ > + dlen = xbzrle_encode_buffer(test, buffer, PAGE_SIZE, compressed, > + PAGE_SIZE); > + > + rc = xbzrle_decode_buffer(compressed, dlen, test, PAGE_SIZE); > + g_assert(rc < PAGE_SIZE); > + g_assert(memcmp(test, buffer, PAGE_SIZE) == 0); > + > + g_free(buffer); > + g_free(compressed); > + g_free(test); > +} > + > +static void test_encode_decode(void) > +{ > + int i; > + > + encode_decode_zero(); > + encode_decode_unchanged(); > + encode_decode_1_byte(); > + encode_decode_overflow(); > + > + for (i = 0; i < 10000; i++) { > + encode_decode_range(); > + } Please make these five separate tests (i.e. five separate g_test_add_func invocations). Paolo > +} > + > +int main(int argc, char **argv) > +{ > + g_test_init(&argc, &argv, NULL); > + g_test_rand_int(); > + g_test_add_func("/xbzrle/uleb", test_uleb); > + g_test_add_func("/xbzrle/encode_decode", test_encode_decode); > + > + return g_test_run(); > +} > -- > 1.7.11.7 > >