| Submitter | Orit Wasserman |
|---|---|
| Date | Jan. 30, 2013, 10:35 a.m. |
| Message ID | <1359542158-30060-3-git-send-email-owasserm@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/216822/ |
| State | New |
| Headers | show |
Comments
> Signed-off-by: Orit Wasserman <owasserm@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 > >
Patch
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) +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(); + } +} + +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(); +}
Signed-off-by: Orit Wasserman <owasserm@redhat.com> --- tests/Makefile | 2 + tests/test-xbzrle.c | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 tests/test-xbzrle.c