Statistics
| Branch: | Revision:

root / tests / test-xbzrle.c @ feature-archipelago

History | View | Annotate | Download (4.9 kB)

1 21e3cd29 Orit Wasserman
/*
2 21e3cd29 Orit Wasserman
 * Xor Based Zero Run Length Encoding unit tests.
3 21e3cd29 Orit Wasserman
 *
4 21e3cd29 Orit Wasserman
 * Copyright 2013 Red Hat, Inc. and/or its affiliates
5 21e3cd29 Orit Wasserman
 *
6 21e3cd29 Orit Wasserman
 * Authors:
7 21e3cd29 Orit Wasserman
 *  Orit Wasserman  <owasserm@redhat.com>
8 21e3cd29 Orit Wasserman
 *
9 21e3cd29 Orit Wasserman
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 21e3cd29 Orit Wasserman
 * See the COPYING file in the top-level directory.
11 21e3cd29 Orit Wasserman
 *
12 21e3cd29 Orit Wasserman
 */
13 21e3cd29 Orit Wasserman
#include <stdint.h>
14 21e3cd29 Orit Wasserman
#include <stdio.h>
15 21e3cd29 Orit Wasserman
#include <stdlib.h>
16 21e3cd29 Orit Wasserman
#include <strings.h>
17 21e3cd29 Orit Wasserman
#include <string.h>
18 21e3cd29 Orit Wasserman
#include <sys/time.h>
19 21e3cd29 Orit Wasserman
#include <assert.h>
20 21e3cd29 Orit Wasserman
#include "qemu-common.h"
21 21e3cd29 Orit Wasserman
#include "include/migration/migration.h"
22 21e3cd29 Orit Wasserman
23 21e3cd29 Orit Wasserman
#define PAGE_SIZE 4096
24 21e3cd29 Orit Wasserman
25 21e3cd29 Orit Wasserman
static void test_uleb(void)
26 21e3cd29 Orit Wasserman
{
27 21e3cd29 Orit Wasserman
    uint32_t i, val;
28 21e3cd29 Orit Wasserman
    uint8_t buf[2];
29 21e3cd29 Orit Wasserman
    int encode_ret, decode_ret;
30 21e3cd29 Orit Wasserman
31 21e3cd29 Orit Wasserman
    for (i = 0; i <= 0x3fff; i++) {
32 21e3cd29 Orit Wasserman
        encode_ret = uleb128_encode_small(&buf[0], i);
33 21e3cd29 Orit Wasserman
        decode_ret = uleb128_decode_small(&buf[0], &val);
34 21e3cd29 Orit Wasserman
        g_assert(encode_ret == decode_ret);
35 21e3cd29 Orit Wasserman
        g_assert(i == val);
36 21e3cd29 Orit Wasserman
    }
37 21e3cd29 Orit Wasserman
38 21e3cd29 Orit Wasserman
    /* decode invalid value */
39 21e3cd29 Orit Wasserman
    buf[0] = 0x80;
40 21e3cd29 Orit Wasserman
    buf[1] = 0x80;
41 21e3cd29 Orit Wasserman
42 21e3cd29 Orit Wasserman
    decode_ret = uleb128_decode_small(&buf[0], &val);
43 21e3cd29 Orit Wasserman
    g_assert(decode_ret == -1);
44 21e3cd29 Orit Wasserman
    g_assert(val == 0);
45 21e3cd29 Orit Wasserman
}
46 21e3cd29 Orit Wasserman
47 21e3cd29 Orit Wasserman
static void test_encode_decode_zero(void)
48 21e3cd29 Orit Wasserman
{
49 21e3cd29 Orit Wasserman
    uint8_t *buffer = g_malloc0(PAGE_SIZE);
50 21e3cd29 Orit Wasserman
    uint8_t *compressed = g_malloc0(PAGE_SIZE);
51 21e3cd29 Orit Wasserman
    int i = 0;
52 21e3cd29 Orit Wasserman
    int dlen = 0;
53 21e3cd29 Orit Wasserman
    int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006);
54 21e3cd29 Orit Wasserman
55 21e3cd29 Orit Wasserman
    for (i = diff_len; i > 0; i--) {
56 21e3cd29 Orit Wasserman
        buffer[1000 + i] = i;
57 21e3cd29 Orit Wasserman
    }
58 21e3cd29 Orit Wasserman
59 21e3cd29 Orit Wasserman
    buffer[1000 + diff_len + 3] = 103;
60 21e3cd29 Orit Wasserman
    buffer[1000 + diff_len + 5] = 105;
61 21e3cd29 Orit Wasserman
62 21e3cd29 Orit Wasserman
    /* encode zero page */
63 21e3cd29 Orit Wasserman
    dlen = xbzrle_encode_buffer(buffer, buffer, PAGE_SIZE, compressed,
64 21e3cd29 Orit Wasserman
                       PAGE_SIZE);
65 21e3cd29 Orit Wasserman
    g_assert(dlen == 0);
66 21e3cd29 Orit Wasserman
67 21e3cd29 Orit Wasserman
    g_free(buffer);
68 21e3cd29 Orit Wasserman
    g_free(compressed);
69 21e3cd29 Orit Wasserman
}
70 21e3cd29 Orit Wasserman
71 21e3cd29 Orit Wasserman
static void test_encode_decode_unchanged(void)
72 21e3cd29 Orit Wasserman
{
73 21e3cd29 Orit Wasserman
    uint8_t *compressed = g_malloc0(PAGE_SIZE);
74 21e3cd29 Orit Wasserman
    uint8_t *test = g_malloc0(PAGE_SIZE);
75 21e3cd29 Orit Wasserman
    int i = 0;
76 21e3cd29 Orit Wasserman
    int dlen = 0;
77 21e3cd29 Orit Wasserman
    int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006);
78 21e3cd29 Orit Wasserman
79 21e3cd29 Orit Wasserman
    for (i = diff_len; i > 0; i--) {
80 21e3cd29 Orit Wasserman
        test[1000 + i] = i + 4;
81 21e3cd29 Orit Wasserman
    }
82 21e3cd29 Orit Wasserman
83 21e3cd29 Orit Wasserman
    test[1000 + diff_len + 3] = 107;
84 21e3cd29 Orit Wasserman
    test[1000 + diff_len + 5] = 109;
85 21e3cd29 Orit Wasserman
86 21e3cd29 Orit Wasserman
    /* test unchanged buffer */
87 21e3cd29 Orit Wasserman
    dlen = xbzrle_encode_buffer(test, test, PAGE_SIZE, compressed,
88 21e3cd29 Orit Wasserman
                                PAGE_SIZE);
89 21e3cd29 Orit Wasserman
    g_assert(dlen == 0);
90 21e3cd29 Orit Wasserman
91 21e3cd29 Orit Wasserman
    g_free(test);
92 21e3cd29 Orit Wasserman
    g_free(compressed);
93 21e3cd29 Orit Wasserman
}
94 21e3cd29 Orit Wasserman
95 21e3cd29 Orit Wasserman
static void test_encode_decode_1_byte(void)
96 21e3cd29 Orit Wasserman
{
97 21e3cd29 Orit Wasserman
    uint8_t *buffer = g_malloc0(PAGE_SIZE);
98 21e3cd29 Orit Wasserman
    uint8_t *test = g_malloc0(PAGE_SIZE);
99 21e3cd29 Orit Wasserman
    uint8_t *compressed = g_malloc(PAGE_SIZE);
100 21e3cd29 Orit Wasserman
    int dlen = 0, rc = 0;
101 21e3cd29 Orit Wasserman
    uint8_t buf[2];
102 21e3cd29 Orit Wasserman
103 21e3cd29 Orit Wasserman
    test[PAGE_SIZE - 1] = 1;
104 21e3cd29 Orit Wasserman
105 21e3cd29 Orit Wasserman
    dlen = xbzrle_encode_buffer(buffer, test, PAGE_SIZE, compressed,
106 21e3cd29 Orit Wasserman
                       PAGE_SIZE);
107 21e3cd29 Orit Wasserman
    g_assert(dlen == (uleb128_encode_small(&buf[0], 4095) + 2));
108 21e3cd29 Orit Wasserman
109 21e3cd29 Orit Wasserman
    rc = xbzrle_decode_buffer(compressed, dlen, buffer, PAGE_SIZE);
110 21e3cd29 Orit Wasserman
    g_assert(rc == PAGE_SIZE);
111 21e3cd29 Orit Wasserman
    g_assert(memcmp(test, buffer, PAGE_SIZE) == 0);
112 21e3cd29 Orit Wasserman
113 21e3cd29 Orit Wasserman
    g_free(buffer);
114 21e3cd29 Orit Wasserman
    g_free(compressed);
115 21e3cd29 Orit Wasserman
    g_free(test);
116 21e3cd29 Orit Wasserman
}
117 21e3cd29 Orit Wasserman
118 21e3cd29 Orit Wasserman
static void test_encode_decode_overflow(void)
119 21e3cd29 Orit Wasserman
{
120 21e3cd29 Orit Wasserman
    uint8_t *compressed = g_malloc0(PAGE_SIZE);
121 21e3cd29 Orit Wasserman
    uint8_t *test = g_malloc0(PAGE_SIZE);
122 21e3cd29 Orit Wasserman
    uint8_t *buffer = g_malloc0(PAGE_SIZE);
123 21e3cd29 Orit Wasserman
    int i = 0, rc = 0;
124 21e3cd29 Orit Wasserman
125 21e3cd29 Orit Wasserman
    for (i = 0; i < PAGE_SIZE / 2 - 1; i++) {
126 21e3cd29 Orit Wasserman
        test[i * 2] = 1;
127 21e3cd29 Orit Wasserman
    }
128 21e3cd29 Orit Wasserman
129 21e3cd29 Orit Wasserman
    /* encode overflow */
130 21e3cd29 Orit Wasserman
    rc = xbzrle_encode_buffer(buffer, test, PAGE_SIZE, compressed,
131 21e3cd29 Orit Wasserman
                              PAGE_SIZE);
132 21e3cd29 Orit Wasserman
    g_assert(rc == -1);
133 21e3cd29 Orit Wasserman
134 21e3cd29 Orit Wasserman
    g_free(buffer);
135 21e3cd29 Orit Wasserman
    g_free(compressed);
136 21e3cd29 Orit Wasserman
    g_free(test);
137 21e3cd29 Orit Wasserman
}
138 21e3cd29 Orit Wasserman
139 21e3cd29 Orit Wasserman
static void encode_decode_range(void)
140 21e3cd29 Orit Wasserman
{
141 21e3cd29 Orit Wasserman
    uint8_t *buffer = g_malloc0(PAGE_SIZE);
142 21e3cd29 Orit Wasserman
    uint8_t *compressed = g_malloc(PAGE_SIZE);
143 21e3cd29 Orit Wasserman
    uint8_t *test = g_malloc0(PAGE_SIZE);
144 21e3cd29 Orit Wasserman
    int i = 0, rc = 0;
145 21e3cd29 Orit Wasserman
    int dlen = 0;
146 21e3cd29 Orit Wasserman
147 21e3cd29 Orit Wasserman
    int diff_len = g_test_rand_int_range(0, PAGE_SIZE - 1006);
148 21e3cd29 Orit Wasserman
149 21e3cd29 Orit Wasserman
    for (i = diff_len; i > 0; i--) {
150 21e3cd29 Orit Wasserman
        buffer[1000 + i] = i;
151 21e3cd29 Orit Wasserman
        test[1000 + i] = i + 4;
152 21e3cd29 Orit Wasserman
    }
153 21e3cd29 Orit Wasserman
154 21e3cd29 Orit Wasserman
    buffer[1000 + diff_len + 3] = 103;
155 21e3cd29 Orit Wasserman
    test[1000 + diff_len + 3] = 107;
156 21e3cd29 Orit Wasserman
157 21e3cd29 Orit Wasserman
    buffer[1000 + diff_len + 5] = 105;
158 21e3cd29 Orit Wasserman
    test[1000 + diff_len + 5] = 109;
159 21e3cd29 Orit Wasserman
160 21e3cd29 Orit Wasserman
    /* test encode/decode */
161 21e3cd29 Orit Wasserman
    dlen = xbzrle_encode_buffer(test, buffer, PAGE_SIZE, compressed,
162 21e3cd29 Orit Wasserman
                                PAGE_SIZE);
163 21e3cd29 Orit Wasserman
164 21e3cd29 Orit Wasserman
    rc = xbzrle_decode_buffer(compressed, dlen, test, PAGE_SIZE);
165 21e3cd29 Orit Wasserman
    g_assert(rc < PAGE_SIZE);
166 21e3cd29 Orit Wasserman
    g_assert(memcmp(test, buffer, PAGE_SIZE) == 0);
167 21e3cd29 Orit Wasserman
168 21e3cd29 Orit Wasserman
    g_free(buffer);
169 21e3cd29 Orit Wasserman
    g_free(compressed);
170 21e3cd29 Orit Wasserman
    g_free(test);
171 21e3cd29 Orit Wasserman
}
172 21e3cd29 Orit Wasserman
173 21e3cd29 Orit Wasserman
static void test_encode_decode(void)
174 21e3cd29 Orit Wasserman
{
175 21e3cd29 Orit Wasserman
    int i;
176 21e3cd29 Orit Wasserman
177 21e3cd29 Orit Wasserman
    for (i = 0; i < 10000; i++) {
178 21e3cd29 Orit Wasserman
        encode_decode_range();
179 21e3cd29 Orit Wasserman
    }
180 21e3cd29 Orit Wasserman
}
181 21e3cd29 Orit Wasserman
182 21e3cd29 Orit Wasserman
int main(int argc, char **argv)
183 21e3cd29 Orit Wasserman
{
184 21e3cd29 Orit Wasserman
    g_test_init(&argc, &argv, NULL);
185 21e3cd29 Orit Wasserman
    g_test_rand_int();
186 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/uleb", test_uleb);
187 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/encode_decode_zero", test_encode_decode_zero);
188 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/encode_decode_unchanged",
189 21e3cd29 Orit Wasserman
                    test_encode_decode_unchanged);
190 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/encode_decode_1_byte", test_encode_decode_1_byte);
191 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/encode_decode_overflow",
192 21e3cd29 Orit Wasserman
                    test_encode_decode_overflow);
193 21e3cd29 Orit Wasserman
    g_test_add_func("/xbzrle/encode_decode", test_encode_decode);
194 21e3cd29 Orit Wasserman
195 21e3cd29 Orit Wasserman
    return g_test_run();
196 21e3cd29 Orit Wasserman
}