1/*
2 * format_portability_unit.c
3 *
4 */
5
6#include <assert.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include <roaring/roaring.h>
12
13#include "config.h"
14#include "test.h"
15
16long filesize(char const* path) {
17 FILE* fp = fopen(path, "rb");
18 assert_non_null(fp);
19
20 assert_int_not_equal(fseek(fp, 0L, SEEK_END), -1);
21
22 return ftell(fp);
23}
24
25char* readfile(char const* path) {
26 FILE* fp = fopen(path, "rb");
27 assert_non_null(fp);
28
29 assert_int_not_equal(fseek(fp, 0L, SEEK_END), -1);
30
31 long bytes = ftell(fp);
32 char* buf = malloc(bytes);
33 assert_non_null(buf);
34
35 rewind(fp);
36 assert_int_equal(bytes, fread(buf, 1, bytes, fp));
37
38 fclose(fp);
39 return buf;
40}
41
42int compare(char* x, char* y, size_t size) {
43 for (size_t i = 0; i < size; ++i) {
44 if (x[i] != y[i]) {
45 return i + 1;
46 }
47 }
48 return 0;
49}
50
51void test_deserialize(char* filename) {
52 char* input_buffer = readfile(filename);
53 assert_non_null(input_buffer);
54
55 roaring_bitmap_t* bitmap =
56 roaring_bitmap_portable_deserialize(input_buffer);
57 assert_non_null(bitmap);
58
59 size_t expected_size = roaring_bitmap_portable_size_in_bytes(bitmap);
60
61 assert_int_equal(expected_size, filesize(filename));
62
63 char* output_buffer = malloc(expected_size);
64 size_t actual_size =
65 roaring_bitmap_portable_serialize(bitmap, output_buffer);
66
67 assert_int_equal(actual_size, expected_size);
68 assert_false(compare(input_buffer, output_buffer, actual_size));
69
70 free(output_buffer);
71 free(input_buffer);
72 roaring_bitmap_free(bitmap);
73}
74
75void test_deserialize_portable_norun() {
76 char filename[1024];
77
78 strcpy(filename, TEST_DATA_DIR);
79 strcat(filename, "bitmapwithoutruns.bin");
80
81 test_deserialize(filename);
82}
83
84void test_deserialize_portable_wrun() {
85 char filename[1024];
86
87 strcpy(filename, TEST_DATA_DIR);
88 strcat(filename, "bitmapwithruns.bin");
89
90 test_deserialize(filename);
91}
92
93int main() {
94 const struct CMUnitTest tests[] = {
95 cmocka_unit_test(test_deserialize_portable_norun),
96 cmocka_unit_test(test_deserialize_portable_wrun),
97 };
98
99 return cmocka_run_group_tests(tests, NULL, NULL);
100}
101