void test_art_insert_iter(void) { art_tree t; int res = art_tree_init(&t); int len; char buf[512]; FILE *f = fopen("thirdparty/libart/tests/words.txt", "r"); uint64_t xor_mask = 0; uintptr_t line = 1, nlines; fail_unless(res == 0); while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; if (art_insert(&t, (unsigned char *)buf, len, (void *)line)) { fail("art_insert didn't return NULL"); } xor_mask ^= (line * (buf[0] + len)); line++; } nlines = line - 1; { uint64_t out[] = {0, 0}; fail_unless(art_iter(&t, iter_cb, &out) == 0); fail_unless(out[0] == nlines); fail_unless(out[1] == xor_mask); } res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_insert_verylong(void) { art_tree t; int res = art_tree_init(&t); unsigned char key1[300] = { 16, 0, 0, 0, 7, 10, 0, 0, 0, 2, 17, 10, 0, 0, 0, 120, 10, 0, 0, 0, 120, 10, 0, 0, 0, 216, 10, 0, 0, 0, 202, 10, 0, 0, 0, 194, 10, 0, 0, 0, 224, 10, 0, 0, 0, 230, 10, 0, 0, 0, 210, 10, 0, 0, 0, 206, 10, 0, 0, 0, 208, 10, 0, 0, 0, 232, 10, 0, 0, 0, 124, 10, 0, 0, 0, 124, 2, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 182, 92, 236, 147, 171, 101, 150, 195, 112, 185, 218, 108, 246, 139, 164, 234, 195, 58, 177, 0, 8, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 180, 93, 46, 151, 9, 212, 190, 95, 102, 178, 217, 44, 178, 235, 29, 190, 218, 8, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 180, 93, 46, 151, 9, 212, 190, 95, 102, 183, 219, 229, 214, 59, 125, 182, 71, 108, 180, 220, 238, 150, 91, 117, 150, 201, 84, 183, 128, 8, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 180, 93, 46, 151, 9, 212, 190, 95, 108, 176, 217, 47, 50, 219, 61, 134, 207, 97, 151, 88, 237, 246, 208, 8, 18, 255, 255, 255, 219, 191, 198, 134, 5, 223, 212, 72, 44, 208, 250, 180, 14, 1, 0, 0, 8, '\0'}; unsigned char key2[303] = { 16, 0, 0, 0, 7, 10, 0, 0, 0, 2, 17, 10, 0, 0, 0, 120, 10, 0, 0, 0, 120, 10, 0, 0, 0, 216, 10, 0, 0, 0, 202, 10, 0, 0, 0, 194, 10, 0, 0, 0, 224, 10, 0, 0, 0, 230, 10, 0, 0, 0, 210, 10, 0, 0, 0, 206, 10, 0, 0, 0, 208, 10, 0, 0, 0, 232, 10, 0, 0, 0, 124, 10, 0, 0, 0, 124, 2, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 182, 92, 236, 147, 171, 101, 150, 195, 112, 185, 218, 108, 246, 139, 164, 234, 195, 58, 177, 0, 8, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 180, 93, 46, 151, 9, 212, 190, 95, 102, 178, 217, 44, 178, 235, 29, 190, 218, 8, 16, 0, 0, 0, 2, 12, 185, 89, 44, 213, 251, 173, 202, 211, 95, 185, 89, 110, 118, 251, 173, 202, 199, 101, 0, 8, 18, 180, 93, 46, 151, 9, 212, 190, 95, 102, 183, 219, 229, 214, 59, 125, 182, 71, 108, 180, 220, 238, 150, 91, 117, 150, 201, 84, 183, 128, 8, 16, 0, 0, 0, 3, 12, 185, 89, 44, 213, 251, 133, 178, 195, 105, 183, 87, 237, 150, 155, 165, 150, 229, 97, 182, 0, 8, 18, 161, 91, 239, 50, 10, 61, 150, 223, 114, 179, 217, 64, 8, 12, 186, 219, 172, 150, 91, 53, 166, 221, 101, 178, 0, 8, 18, 255, 255, 255, 219, 191, 198, 134, 5, 208, 212, 72, 44, 208, 250, 180, 14, 1, 0, 0, 8, '\0'}; fail_unless(res == 0); fail_unless(NULL == art_insert(&t, key1, 299, (void *)key1)); fail_unless(NULL == art_insert(&t, key2, 302, (void *)key2)); art_insert(&t, key2, 302, (void *)key2); fail_unless(art_size(&t) == 2); res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_insert_delete(void) { art_tree t; int res = art_tree_init(&t); int len; char buf[512]; FILE *f = fopen("thirdparty/libart/tests/words.txt", "r"); uintptr_t line = 1, nlines; fail_unless(res == 0); while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; if (art_insert(&t, (unsigned char *)buf, len, (void *)line)) { fail("art_insert didn't return NULL"); } line++; } nlines = line - 1; // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { uintptr_t val; len = (int)strlen(buf); buf[len - 1] = '\0'; // Search first, ensure all entries still // visible val = (uintptr_t)art_search(&t, (unsigned char *)buf, len); if (line != val) { fail("Line: %d Val: %" PRIuPTR " Str: %s", line, val, buf); } // Delete, should get lineno back val = (uintptr_t)art_delete(&t, (unsigned char *)buf, len); if (line != val) { fail("Line: %d Val: %" PRIuPTR " Str: %s", line, val, buf); } // Check the size if (art_size(&t) != nlines - line) { fail("bad size after delete"); } line++; } // Check the minimum and maximum fail_unless(!art_minimum(&t)); fail_unless(!art_maximum(&t)); res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_init_and_destroy(void) { art_tree t; int res = art_tree_init(&t); fail_unless(res == 0); fail_unless(art_size(&t) == 0); res = art_tree_destroy(&t); fail_unless(res == 0); }
END_TEST START_TEST(test_art_insert_delete) { art_tree t; int res = art_tree_init(&t); fail_unless(res == 0); int len; char buf[512]; FILE *f = fopen("tests/words.txt", "r"); uintptr_t line = 1, nlines; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; fail_unless(NULL == art_insert(&t, (unsigned char*)buf, len, (void*)line)); line++; } nlines = line - 1; // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; // Search first, ensure all entries still // visible uintptr_t val = (uintptr_t)art_search(&t, (unsigned char*)buf, len); fail_unless(line == val, "Line: %d Val: %" PRIuPTR " Str: %s\n", line, val, buf); // Delete, should get lineno back val = (uintptr_t)art_delete(&t, (unsigned char*)buf, len); fail_unless(line == val, "Line: %d Val: %" PRIuPTR " Str: %s\n", line, val, buf); // Check the size fail_unless(art_size(&t) == nlines - line); line++; } // Check the minimum and maximum fail_unless(!art_minimum(&t)); fail_unless(!art_maximum(&t)); res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_insert_search_uuid(void) { art_tree t; art_leaf *l; int res = art_tree_init(&t); int len; char buf[512]; FILE *f = fopen("thirdparty/libart/tests/uuid.txt", "r"); uintptr_t line = 1; fail_unless(res == 0); while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; if (art_insert(&t, (unsigned char *)buf, len, (void *)line)) { fail("art_insert didn't return NULL"); } line++; } // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { uintptr_t val; len = (int)strlen(buf); buf[len - 1] = '\0'; val = (uintptr_t)art_search(&t, (unsigned char *)buf, len); if (line != val) { fail("Line: %d Val: %" PRIuPTR " Str: %s\n", line, val, buf); } line++; } // Check the minimum l = art_minimum(&t); diag("minimum is %s", l->key); fail_unless( l && strcmp((char *)l->key, "00026bda-e0ea-4cda-8245-522764e9f325") == 0); // Check the maximum l = art_maximum(&t); diag("maximum is %s", l->key); fail_unless( l && strcmp((char *)l->key, "ffffcb46-a92e-4822-82af-a7190f9c1ec5") == 0); res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_long_prefix(void) { art_tree t; int res = art_tree_init(&t); uintptr_t v; const char *s; fail_unless(res == 0); s = "this:key:has:a:long:prefix:3"; v = 3; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, (void *)v)); s = "this:key:has:a:long:common:prefix:2"; v = 2; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, (void *)v)); s = "this:key:has:a:long:common:prefix:1"; v = 1; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, (void *)v)); // Search for the keys s = "this:key:has:a:long:common:prefix:1"; fail_unless( 1 == (uintptr_t)art_search(&t, (unsigned char *)s, (int)strlen(s) + 1)); s = "this:key:has:a:long:common:prefix:2"; fail_unless( 2 == (uintptr_t)art_search(&t, (unsigned char *)s, (int)strlen(s) + 1)); s = "this:key:has:a:long:prefix:3"; fail_unless( 3 == (uintptr_t)art_search(&t, (unsigned char *)s, (int)strlen(s) + 1)); { const char *expected[] = { "this:key:has:a:long:common:prefix:1", "this:key:has:a:long:common:prefix:2", "this:key:has:a:long:prefix:3", }; prefix_data p = {0, 3, expected}; fail_unless(!art_iter_prefix(&t, (unsigned char *)"this:key:has", 12, test_prefix_cb, &p)); diag("Count: %d Max: %d", p.count, p.max_count); fail_unless(p.count == p.max_count); } res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_insert_search(void) { art_tree t; int res = art_tree_init(&t); int len; char buf[512]; FILE *f = fopen("thirdparty/libart/tests/words.txt", "r"); uintptr_t line = 1; art_leaf *l; fail_unless(res == 0); while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; if (art_insert(&t, (unsigned char *)buf, len, (void *)line)) { fail("art_insert didn't return NULL"); } line++; } // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; { uintptr_t val = (uintptr_t)art_search(&t, (unsigned char *)buf, len); if (line != val) { fail("Line: %d Val: %" PRIuPTR " Str: %s", line, val, buf); } } line++; } // Check the minimum l = art_minimum(&t); fail_unless(l && strcmp((char *)l->key, "A") == 0); // Check the maximum l = art_maximum(&t); fail_unless(l && strcmp((char *)l->key, "zythum") == 0); res = art_tree_destroy(&t); fail_unless(res == 0); }
END_TEST START_TEST(test_art_insert_search) { art_tree t; int res = art_tree_init(&t); fail_unless(res == 0); int len; char buf[512]; FILE *f = fopen("tests/words.txt", "r"); uintptr_t line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; fail_unless(NULL == art_insert(&t, (unsigned char*)buf, len, (void*)line)); line++; } // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; uintptr_t val = (uintptr_t)art_search(&t, (unsigned char*)buf, len); fail_unless(line == val, "Line: %d Val: %" PRIuPTR " Str: %s\n", line, val, buf); line++; } // Check the minimum art_leaf *l = art_minimum(&t); fail_unless(l && strcmp((char*)l->key, "A") == 0); // Check the maximum l = art_maximum(&t); fail_unless(l && strcmp((char*)l->key, "zythum") == 0); res = art_tree_destroy(&t); fail_unless(res == 0); }
END_TEST START_TEST(test_art_insert_search_uuid) { art_tree t; int res = art_tree_init(&t); fail_unless(res == 0); int len; char buf[512]; FILE *f = fopen("tests/uuid.txt", "r"); uintptr_t line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; fail_unless(NULL == art_insert(&t, (unsigned char*)buf, len, (void*)line)); line++; } // Seek back to the start fseek(f, 0, SEEK_SET); // Search for each line line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; uintptr_t val = (uintptr_t)art_search(&t, (unsigned char*)buf, len); fail_unless(line == val, "Line: %d Val: %" PRIuPTR " Str: %s\n", line, val, buf); line++; } // Check the minimum art_leaf *l = art_minimum(&t); fail_unless(l && strcmp((char*)l->key, "00026bda-e0ea-4cda-8245-522764e9f325") == 0); // Check the maximum l = art_maximum(&t); fail_unless(l && strcmp((char*)l->key, "ffffcb46-a92e-4822-82af-a7190f9c1ec5") == 0); res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_prefix(void) { art_tree t; void *v; art_tree_init(&t); fail_unless(art_insert(&t, (const unsigned char*)"food", 4, "food") == NULL); fail_unless(art_insert(&t, (const unsigned char*)"foo", 3, "foo") == NULL); diag("size is now %d", art_size(&t)); fail_unless(art_size(&t) == 2); fail_unless((v = art_search(&t, (const unsigned char*)"food", 4)) != NULL); diag("food lookup yields %s", v); fail_unless(v && strcmp((char*)v, "food") == 0); art_iter(&t, dump_iter, NULL); fail_unless((v = art_search(&t, (const unsigned char*)"foo", 3)) != NULL); diag("foo lookup yields %s", v); fail_unless(v && strcmp((char*)v, "foo") == 0); art_tree_destroy(&t); }
END_TEST START_TEST(test_art_insert) { art_tree t; int res = art_tree_init(&t); fail_unless(res == 0); int len; char buf[512]; FILE *f = fopen("tests/words.txt", "r"); uintptr_t line = 1; while (fgets(buf, sizeof buf, f)) { len = strlen(buf); buf[len-1] = '\0'; fail_unless(NULL == art_insert(&t, (unsigned char*)buf, len, (void*)line)); fail_unless(art_size(&t) == line); line++; } res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_insert(void) { art_tree t; int res = art_tree_init(&t); int len; char buf[512]; FILE *f = fopen("thirdparty/libart/tests/words.txt", "r"); uintptr_t line = 1; fail_unless(res == 0); while (fgets(buf, sizeof buf, f)) { len = (int)strlen(buf); buf[len - 1] = '\0'; if (art_insert(&t, (unsigned char *)buf, len, (void *)line)) { fail("insert should have returned NULL but did not"); } if (art_size(&t) != line) { fail("art_size didn't match current line no"); } line++; } res = art_tree_destroy(&t); fail_unless(res == 0); }
void test_art_iter_prefix(void) { art_tree t; int res = art_tree_init(&t); const char *s = "api.foo.bar"; const char *expected2[] = {"abc.123.456", "api", "api.foe.fum", "api.foo", "api.foo.bar", "api.foo.baz"}; fail_unless(res == 0); fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); s = "api.foo.baz"; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); s = "api.foe.fum"; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); s = "abc.123.456"; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); s = "api.foo"; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); s = "api"; fail_unless(NULL == art_insert(&t, (unsigned char *)s, (int)strlen(s) + 1, NULL)); { // Iterate over api const char *expected[] = {"api", "api.foe.fum", "api.foo", "api.foo.bar", "api.foo.baz"}; prefix_data p = {0, 5, expected}; fail_unless( !art_iter_prefix(&t, (unsigned char *)"api", 3, test_prefix_cb, &p)); diag("Count: %d Max: %d", p.count, p.max_count); fail_unless(p.count == p.max_count); } { // Iterate over 'a' prefix_data p2 = {0, 6, expected2}; fail_unless( !art_iter_prefix(&t, (unsigned char *)"a", 1, test_prefix_cb, &p2)); fail_unless(p2.count == p2.max_count); } { // Check a failed iteration prefix_data p3 = {0, 0, NULL}; fail_unless( !art_iter_prefix(&t, (unsigned char *)"b", 1, test_prefix_cb, &p3)); fail_unless(p3.count == 0); } { // Iterate over api. const char *expected4[] = {"api.foe.fum", "api.foo", "api.foo.bar", "api.foo.baz"}; prefix_data p4 = {0, 4, expected4}; fail_unless( !art_iter_prefix(&t, (unsigned char *)"api.", 4, test_prefix_cb, &p4)); diag("Count: %d Max: %d", p4.count, p4.max_count); fail_unless(p4.count == p4.max_count); } { // Iterate over api.foo.ba const char *expected5[] = {"api.foo.bar"}; prefix_data p5 = {0, 1, expected5}; fail_unless(!art_iter_prefix(&t, (unsigned char *)"api.foo.bar", 11, test_prefix_cb, &p5)); diag("Count: %d Max: %d", p5.count, p5.max_count); fail_unless(p5.count == p5.max_count); } // Check a failed iteration on api.end { prefix_data p6 = {0, 0, NULL}; fail_unless(!art_iter_prefix(&t, (unsigned char *)"api.end", 7, test_prefix_cb, &p6)); fail_unless(p6.count == 0); } // Iterate over empty prefix { prefix_data p7 = {0, 6, expected2}; fail_unless( !art_iter_prefix(&t, (unsigned char *)"", 0, test_prefix_cb, &p7)); fail_unless(p7.count == p7.max_count); } res = art_tree_destroy(&t); fail_unless(res == 0); }
int main(int argc, char *argv[]) { if (initialize_context(&my_context, argc, argv) != 0) { usage(argv[0]); return 1; } if (art_tree_map_init(&myds, &my_context) != 0) { fprintf(stderr, "failed to initialize memory pool file\n"); return 1; } if (my_context.pop == NULL) { perror("pool initialization"); return 1; } if (art_tree_init(my_context.pop, &my_context.newpool)) { perror("pool setup"); return 1; } if ((my_context.mode & FILL)) { if (add_elements(&my_context)) { perror("add elements"); return 1; } } if ((my_context.mode & INSERT)) { if (insert_element(&my_context)) { perror("insert elements"); return 1; } } if ((my_context.mode & SEARCH)) { if (search_element(&my_context)) { perror("search elements"); return 1; } } if ((my_context.mode & REMOVE)) { if (delete_element(&my_context)) { perror("delete elements"); return 1; } } if (my_context.mode & DUMP) { art_iter(my_context.pop, dump_art_leaf_callback, NULL); } if (my_context.mode & GRAPH) { printf("digraph g {\nrankdir=LR;\n"); art_iter(my_context.pop, dump_art_node_callback, NULL); printf("}"); } exit_handler(&my_context); return 0; }
vio_err_t vio_dict_open(vio_dict *dict) { if (art_tree_init(&dict->words)) return VE_DICTIONARY_ALLOC_FAIL; return 0; }