|  | #include "HuffmanCodec.h" | 
|  | #include <stdlib.h> | 
|  | #include <iostream> | 
|  | #include <assert.h> | 
|  |  | 
|  | using namespace std; | 
|  |  | 
|  | uint32_t test_values[] = { | 
|  | 0x1ff8,     13, 0x7fffd8,  23, 0xfffffe2,  28, 0xfffffe3, 28, 0xfffffe4, 28, 0xfffffe5,  28, 0xfffffe6,  28, 0xfffffe7, 28, | 
|  | 0xfffffe8,  28, 0xffffea,  24, 0x3ffffffc, 30, 0xfffffe9, 28, 0xfffffea, 28, 0x3ffffffd, 30, 0xfffffeb,  28, 0xfffffec, 28, | 
|  | 0xfffffed,  28, 0xfffffee, 28, 0xfffffef,  28, 0xffffff0, 28, 0xffffff1, 28, 0xffffff2,  28, 0x3ffffffe, 30, 0xffffff3, 28, | 
|  | 0xffffff4,  28, 0xffffff5, 28, 0xffffff6,  28, 0xffffff7, 28, 0xffffff8, 28, 0xffffff9,  28, 0xffffffa,  28, 0xffffffb, 28, | 
|  | 0x14,       6,  0x3f8,     10, 0x3f9,      10, 0xffa,     12, 0x1ff9,    13, 0x15,       6,  0xf8,       8,  0x7fa,     11, | 
|  | 0x3fa,      10, 0x3fb,     10, 0xf9,       8,  0x7fb,     11, 0xfa,      8,  0x16,       6,  0x17,       6,  0x18,      6, | 
|  | 0x0,        5,  0x1,       5,  0x2,        5,  0x19,      6,  0x1a,      6,  0x1b,       6,  0x1c,       6,  0x1d,      6, | 
|  | 0x1e,       6,  0x1f,      6,  0x5c,       7,  0xfb,      8,  0x7ffc,    15, 0x20,       6,  0xffb,      12, 0x3fc,     10, | 
|  | 0x1ffa,     13, 0x21,      6,  0x5d,       7,  0x5e,      7,  0x5f,      7,  0x60,       7,  0x61,       7,  0x62,      7, | 
|  | 0x63,       7,  0x64,      7,  0x65,       7,  0x66,      7,  0x67,      7,  0x68,       7,  0x69,       7,  0x6a,      7, | 
|  | 0x6b,       7,  0x6c,      7,  0x6d,       7,  0x6e,      7,  0x6f,      7,  0x70,       7,  0x71,       7,  0x72,      7, | 
|  | 0xfc,       8,  0x73,      7,  0xfd,       8,  0x1ffb,    13, 0x7fff0,   19, 0x1ffc,     13, 0x3ffc,     14, 0x22,      6, | 
|  | 0x7ffd,     15, 0x3,       5,  0x23,       6,  0x4,       5,  0x24,      6,  0x5,        5,  0x25,       6,  0x26,      6, | 
|  | 0x27,       6,  0x6,       5,  0x74,       7,  0x75,      7,  0x28,      6,  0x29,       6,  0x2a,       6,  0x7,       5, | 
|  | 0x2b,       6,  0x76,      7,  0x2c,       6,  0x8,       5,  0x9,       5,  0x2d,       6,  0x77,       7,  0x78,      7, | 
|  | 0x79,       7,  0x7a,      7,  0x7b,       7,  0x7ffe,    15, 0x7fc,     11, 0x3ffd,     14, 0x1ffd,     13, 0xffffffc, 28, | 
|  | 0xfffe6,    20, 0x3fffd2,  22, 0xfffe7,    20, 0xfffe8,   20, 0x3fffd3,  22, 0x3fffd4,   22, 0x3fffd5,   22, 0x7fffd9,  23, | 
|  | 0x3fffd6,   22, 0x7fffda,  23, 0x7fffdb,   23, 0x7fffdc,  23, 0x7fffdd,  23, 0x7fffde,   23, 0xffffeb,   24, 0x7fffdf,  23, | 
|  | 0xffffec,   24, 0xffffed,  24, 0x3fffd7,   22, 0x7fffe0,  23, 0xffffee,  24, 0x7fffe1,   23, 0x7fffe2,   23, 0x7fffe3,  23, | 
|  | 0x7fffe4,   23, 0x1fffdc,  21, 0x3fffd8,   22, 0x7fffe5,  23, 0x3fffd9,  22, 0x7fffe6,   23, 0x7fffe7,   23, 0xffffef,  24, | 
|  | 0x3fffda,   22, 0x1fffdd,  21, 0xfffe9,    20, 0x3fffdb,  22, 0x3fffdc,  22, 0x7fffe8,   23, 0x7fffe9,   23, 0x1fffde,  21, | 
|  | 0x7fffea,   23, 0x3fffdd,  22, 0x3fffde,   22, 0xfffff0,  24, 0x1fffdf,  21, 0x3fffdf,   22, 0x7fffeb,   23, 0x7fffec,  23, | 
|  | 0x1fffe0,   21, 0x1fffe1,  21, 0x3fffe0,   22, 0x1fffe2,  21, 0x7fffed,  23, 0x3fffe1,   22, 0x7fffee,   23, 0x7fffef,  23, | 
|  | 0xfffea,    20, 0x3fffe2,  22, 0x3fffe3,   22, 0x3fffe4,  22, 0x7ffff0,  23, 0x3fffe5,   22, 0x3fffe6,   22, 0x7ffff1,  23, | 
|  | 0x3ffffe0,  26, 0x3ffffe1, 26, 0xfffeb,    20, 0x7fff1,   19, 0x3fffe7,  22, 0x7ffff2,   23, 0x3fffe8,   22, 0x1ffffec, 25, | 
|  | 0x3ffffe2,  26, 0x3ffffe3, 26, 0x3ffffe4,  26, 0x7ffffde, 27, 0x7ffffdf, 27, 0x3ffffe5,  26, 0xfffff1,   24, 0x1ffffed, 25, | 
|  | 0x7fff2,    19, 0x1fffe3,  21, 0x3ffffe6,  26, 0x7ffffe0, 27, 0x7ffffe1, 27, 0x3ffffe7,  26, 0x7ffffe2,  27, 0xfffff2,  24, | 
|  | 0x1fffe4,   21, 0x1fffe5,  21, 0x3ffffe8,  26, 0x3ffffe9, 26, 0xffffffd, 28, 0x7ffffe3,  27, 0x7ffffe4,  27, 0x7ffffe5, 27, | 
|  | 0xfffec,    20, 0xfffff3,  24, 0xfffed,    20, 0x1fffe6,  21, 0x3fffe9,  22, 0x1fffe7,   21, 0x1fffe8,   21, 0x7ffff3,  23, | 
|  | 0x3fffea,   22, 0x3fffeb,  22, 0x1ffffee,  25, 0x1ffffef, 25, 0xfffff4,  24, 0xfffff5,   24, 0x3ffffea,  26, 0x7ffff4,  23, | 
|  | 0x3ffffeb,  26, 0x7ffffe6, 27, 0x3ffffec,  26, 0x3ffffed, 26, 0x7ffffe7, 27, 0x7ffffe8,  27, 0x7ffffe9,  27, 0x7ffffea, 27, | 
|  | 0x7ffffeb,  27, 0xffffffe, 28, 0x7ffffec,  27, 0x7ffffed, 27, 0x7ffffee, 27, 0x7ffffef,  27, 0x7fffff0,  27, 0x3ffffee, 26, | 
|  | 0x3fffffff, 30}; | 
|  |  | 
|  |  | 
|  | void | 
|  | random_test() | 
|  | { | 
|  | const int size = 1024; | 
|  | char *dst_start = (char *)malloc(size * 2); | 
|  | char string[size]; | 
|  | for (int i = 0; i < size; i++) { | 
|  | long num = lrand48(); | 
|  | string[i] = (char)num; | 
|  | } | 
|  | const uint8_t *src = (const uint8_t *)string; | 
|  | uint32_t src_len = sizeof(string); | 
|  |  | 
|  | int bytes = huffman_decode(dst_start, src, src_len); | 
|  |  | 
|  | // cout << "bytes: " << bytes << endl; | 
|  | for (int i = 0; i < bytes; i++) { | 
|  | // cout << i << " " << (int)dst_start[i] << " " << dst_start[i] << endl; | 
|  | } | 
|  |  | 
|  | free(dst_start); | 
|  | } | 
|  |  | 
|  | union Value { | 
|  | uint32_t x; | 
|  | uint8_t y[4]; | 
|  | }; | 
|  |  | 
|  | void | 
|  | values_test() | 
|  | { | 
|  | char dst_start[4]; | 
|  | int size = sizeof(test_values) / 4; | 
|  | for (int i = 0; i < size; i += 2) { | 
|  | const uint32_t value = test_values[i]; | 
|  | const uint32_t bits = test_values[i + 1]; | 
|  |  | 
|  | // copy the bits and set remaining bits to 1 | 
|  | union Value encoded; | 
|  | union Value encoded_mapped; | 
|  | encoded.x = 0; | 
|  | uint32_t bits_counter = bits; | 
|  | for (uint32_t pos = 32; pos > 0; pos--) { | 
|  | if (bits_counter > 0) { | 
|  | if (value & (1 << (bits_counter - 1))) { | 
|  | encoded.x = encoded.x | (1 << (pos - 1)); | 
|  | } | 
|  | bits_counter--; | 
|  | } else { | 
|  | encoded.x = encoded.x | (1 << (pos - 1)); | 
|  | } | 
|  | } | 
|  |  | 
|  | int encoded_size = 0; | 
|  | if (bits > 24) { | 
|  | encoded_size = 4; | 
|  | } else if (bits > 16) { | 
|  | encoded_size = 3; | 
|  | } else if (bits > 8) { | 
|  | encoded_size = 2; | 
|  | } else { | 
|  | encoded_size = 1; | 
|  | } | 
|  |  | 
|  | encoded_mapped.y[0] = encoded.y[3]; | 
|  | encoded_mapped.y[1] = encoded.y[2]; | 
|  | encoded_mapped.y[2] = encoded.y[1]; | 
|  | encoded_mapped.y[3] = encoded.y[0]; | 
|  |  | 
|  | int bytes = huffman_decode(dst_start, encoded_mapped.y, encoded_size); | 
|  | char ascii_value = i / 2; | 
|  | assert(dst_start[0] == ascii_value); | 
|  | assert(bytes == 1); | 
|  | } | 
|  | } | 
|  |  | 
|  | int | 
|  | main() | 
|  | { | 
|  | hpack_huffman_init(); | 
|  |  | 
|  | for (int i = 0; i < 100; i++) { | 
|  | random_test(); | 
|  | } | 
|  | values_test(); | 
|  |  | 
|  | hpack_huffman_fin(); | 
|  | return 0; | 
|  | } |