summaryrefslogtreecommitdiffstats
path: root/tests/dynamic_extension_tests.inc
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2024-01-12 14:08:33 -0500
committerDouglas Rumbaugh <dbr4@psu.edu>2024-01-12 14:09:45 -0500
commitc4514c2e62a711189cf3c914297885d97fb51a09 (patch)
tree9cea57c0ce23c6fdaf627495c7bd4f4f8dc9019d /tests/dynamic_extension_tests.inc
parent3a89d7f6ea2679ff7b9bb1e3c37da9480be6c115 (diff)
downloaddynamic-extension-c4514c2e62a711189cf3c914297885d97fb51a09.tar.gz
Initial pass at unit test refactoring
Restructured unit tests to be a bit more modular. I have some further plans to expand on this, particular for the query tests (including both shard and framework level test functions that can be injected at will).
Diffstat (limited to 'tests/dynamic_extension_tests.inc')
-rw-r--r--tests/dynamic_extension_tests.inc416
1 files changed, 0 insertions, 416 deletions
diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc
deleted file mode 100644
index be82132..0000000
--- a/tests/dynamic_extension_tests.inc
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * tests/dynamic_extension_tests.inc
- *
- * Unit tests for Dynamic Extension Framework
- *
- * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu>
- * Dong Xie <dongx@psu.edu>
- *
- * Distributed under the Modified BSD License.
- *
- */
-
-START_TEST(t_create)
-{
- auto test_de = new DE(100, 2, 1);
-
- ck_assert_ptr_nonnull(test_de);
- ck_assert_int_eq(test_de->get_record_count(), 0);
- ck_assert_int_eq(test_de->get_height(), 0);
-
- delete test_de;
-}
-END_TEST
-
-
-START_TEST(t_insert)
-{
- auto test_de = new DE(100, 2, 1);
-
- uint64_t key = 0;
- uint32_t val = 0;
- for (size_t i=0; i<100; i++) {
- Rec r = {key, val};
- ck_assert_int_eq(test_de->insert(r), 1);
- key++;
- val++;
- }
-
- ck_assert_int_eq(test_de->get_height(), 0);
- ck_assert_int_eq(test_de->get_record_count(), 100);
-
- delete test_de;
-}
-END_TEST
-
-
-START_TEST(t_debug_insert)
-{
- auto test_de = new DE(100, 2, 1);
-
- uint64_t key = 0;
- uint32_t val = 0;
- for (size_t i=0; i<1000; i++) {
- Rec r = {key, val};
- ck_assert_int_eq(test_de->insert(r), 1);
- ck_assert_int_eq(test_de->get_record_count(), i+1);
- key++;
- val++;
- }
-
- delete test_de;
-}
-END_TEST
-
-
-START_TEST(t_insert_with_mem_merges)
-{
- auto test_de = new DE(100, 2, 1);
-
- uint64_t key = 0;
- uint32_t val = 0;
- for (size_t i=0; i<300; i++) {
- Rec r = {key, val};
- ck_assert_int_eq(test_de->insert(r), 1);
- key++;
- val++;
- }
-
- test_de->await_next_epoch();
-
- ck_assert_int_eq(test_de->get_record_count(), 300);
- ck_assert_int_eq(test_de->get_height(), 1);
-
- delete test_de;
-}
-END_TEST
-
-
-/*
-START_TEST(t_range_sample_memtable)
-{
- auto test_de = new DE(100, 2, 1);
-
- uint64_t key = 0;
- uint32_t val = 0;
- for (size_t i=0; i<100; i++) {
- Rec r = {key, val};
- ck_assert_int_eq(test_de->insert(r), 1);
- key++;
- val++;
- }
-
- uint64_t lower_bound = 20;
- uint64_t upper_bound = 50;
-
- char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE);
- char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE);
- Rec sample_set[100];
-
- test_de->range_sample(sample_set, lower_bound, upper_bound, 100);
-
- for(size_t i=0; i<100; i++) {
- ck_assert_int_le(sample_set[i].key, upper_bound);
- ck_assert_int_ge(sample_set[i].key, lower_bound);
- }
-
- free(buf);
- free(util_buf);
-
- delete test_de;
-}
-END_TEST
-
-
-START_TEST(t_range_sample_memlevels)
-{
- auto test_de = new DE(100, 2, 1);
-
- uint64_t key = 0;
- uint32_t val = 0;
- for (size_t i=0; i<300; i++) {
- Rec r = {key, val};
- ck_assert_int_eq(test_de->insert(r), 1);
- key++;
- val++;
- }
-
- uint64_t lower_bound = 100;
- uint64_t upper_bound = 250;
-
- char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE);
- char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE);
-
- Rec sample_set[100];
- test_de->range_sample(sample_set, lower_bound, upper_bound, 100);
-
- for(size_t i=0; i<100; i++) {
- ck_assert_int_le(sample_set[i].key, upper_bound);
- ck_assert_int_ge(sample_set[i].key, lower_bound);
- }
-
- free(buf);
- free(util_buf);
-
- delete test_de;
-}
-END_TEST
-*/
-
-START_TEST(t_range_query)
-{
- auto test_de = new DE(100, 2, 1);
- size_t n = 10000;
-
- std::vector<uint64_t> keys;
- for (size_t i=0; i<n; i++) {
- keys.push_back(rand() % 25000);
- }
-
- std::random_device rd;
- std::mt19937 gen{rd()};
- std::shuffle(keys.begin(), keys.end(), gen);
-
- for (size_t i=0; i<keys.size(); i++) {
- Rec r = {keys[i], (uint32_t) i};
- ck_assert_int_eq(test_de->insert(r), 1);
- }
-
- test_de->await_next_epoch();
-
- std::sort(keys.begin(), keys.end());
-
- auto idx = rand() % (keys.size() - 250);
-
- uint64_t lower_key = keys[idx];
- uint64_t upper_key = keys[idx + 250];
-
- rq::Parms<Rec> p;
- p.lower_bound = lower_key;
- p.upper_bound = upper_key;
-
- auto result = test_de->query(&p);
- auto r = result.get();
- std::sort(r.begin(), r.end());
- ck_assert_int_eq(r.size(), 251);
-
- for (size_t i=0; i<r.size(); i++) {
- ck_assert_int_eq(r[i].key, keys[idx + i]);
- }
-
- delete test_de;
-}
-END_TEST
-
-
-START_TEST(t_tombstone_merging_01)
-{
- size_t reccnt = 100000;
- auto test_de = new DE(100, 2, .01);
-
- auto rng = gsl_rng_alloc(gsl_rng_mt19937);
-
- std::set<std::pair<uint64_t, uint32_t>> records;
- std::set<std::pair<uint64_t, uint32_t>> to_delete;
- std::set<std::pair<uint64_t, uint32_t>> deleted;
-
- while (records.size() < reccnt) {
- uint64_t key = rand();
- uint32_t val = rand();
-
- if (records.find({key, val}) != records.end()) continue;
-
- records.insert({key, val});
- }
-
- size_t deletes = 0;
- size_t cnt=0;
- for (auto rec : records) {
- Rec r = {rec.first, rec.second};
- ck_assert_int_eq(test_de->insert(r), 1);
-
- if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) {
- std::vector<std::pair<uint64_t, uint32_t>> del_vec;
- std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()});
-
- for (size_t i=0; i<del_vec.size(); i++) {
- Rec dr = {del_vec[i].first, del_vec[i].second};
- test_de->erase(dr);
- deletes++;
- to_delete.erase(del_vec[i]);
- deleted.insert(del_vec[i]);
- }
- }
-
- if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) {
- to_delete.insert(rec);
- }
- }
-
- test_de->await_next_epoch();
-
- ck_assert(test_de->validate_tombstone_proportion());
-
- gsl_rng_free(rng);
- delete test_de;
-}
-END_TEST
-
-DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) {
- auto rng = gsl_rng_alloc(gsl_rng_mt19937);
-
- auto test_de = new DE(1000, 2, 1);
-
- std::set<Rec> records;
- std::set<Rec> to_delete;
- std::set<Rec> deleted;
-
- while (records.size() < reccnt) {
- uint64_t key = rand();
- uint32_t val = rand();
-
- if (records.find({key, val}) != records.end()) continue;
-
- records.insert({key, val});
- }
-
- size_t deletes = 0;
- for (auto rec : records) {
- ck_assert_int_eq(test_de->insert(rec), 1);
-
- if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) {
- std::vector<Rec> del_vec;
- std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()});
-
- for (size_t i=0; i<del_vec.size(); i++) {
- test_de->erase(del_vec[i]);
- deletes++;
- to_delete.erase(del_vec[i]);
- deleted.insert(del_vec[i]);
- }
- }
-
- if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) {
- to_delete.insert(rec);
- }
- }
-
- gsl_rng_free(rng);
-
- return test_de;
-}
-
-START_TEST(t_static_structure)
-{
- auto rng = gsl_rng_alloc(gsl_rng_mt19937);
-
- size_t reccnt = 100000;
- auto test_de = new DE(100, 2, 1);
-
- std::set<Rec> records;
- std::set<Rec> to_delete;
- std::set<Rec> deleted;
-
- while (records.size() < reccnt) {
- uint64_t key = rand();
- uint32_t val = rand();
-
- if (records.find({key, val}) != records.end()) continue;
-
- records.insert({key, val});
- }
-
- size_t deletes = 0;
- size_t t_reccnt = 0;
- size_t k=0;
- for (auto rec : records) {
- k++;
- ck_assert_int_eq(test_de->insert(rec), 1);
- t_reccnt++;
-
- if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) {
- std::vector<Rec> del_vec;
- std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()});
-
- for (size_t i=0; i<del_vec.size(); i++) {
- ck_assert_int_eq(test_de->erase(del_vec[i]), 1);
-
- deletes++;
- to_delete.erase(del_vec[i]);
- deleted.insert(del_vec[i]);
- }
- }
-
- if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) {
- to_delete.insert(rec);
- }
- }
-
- auto flat = test_de->create_static_structure();
- ck_assert_int_eq(flat->get_record_count(), reccnt - deletes);
-
- uint64_t prev_key = 0;
- for (size_t i=0; i<flat->get_record_count(); i++) {
- auto k = flat->get_record_at(i)->rec.key;
- ck_assert_int_ge(k, prev_key);
- prev_key = k;
- }
-
- gsl_rng_free(rng);
- delete flat;
- delete test_de;
-}
-END_TEST
-
-
-Suite *unit_testing()
-{
- Suite *unit = suite_create("de::DynamicExtension Unit Testing");
-
- TCase *create = tcase_create("de::DynamicExtension::constructor Testing");
- tcase_add_test(create, t_create);
- suite_add_tcase(unit, create);
-
- TCase *insert = tcase_create("de::DynamicExtension<ISAMTree>::insert Testing");
- tcase_add_test(insert, t_insert);
- tcase_add_test(insert, t_insert_with_mem_merges);
- tcase_add_test(insert, t_debug_insert);
- suite_add_tcase(unit, insert);
-
- TCase *query = tcase_create("de::DynamicExtension<ISAMTree>::range_query Testing");
- tcase_add_test(query, t_range_query);
- suite_add_tcase(unit, query);
-
- TCase *ts = tcase_create("de::DynamicExtension::tombstone_compaction Testing");
- tcase_add_test(ts, t_tombstone_merging_01);
- tcase_set_timeout(ts, 500);
- suite_add_tcase(unit, ts);
-
- TCase *flat = tcase_create("de::DynamicExtension::create_static_structure Testing");
- tcase_add_test(flat, t_static_structure);
- tcase_set_timeout(flat, 500);
- suite_add_tcase(unit, flat);
-
- return unit;
-}
-
-int run_unit_tests()
-{
- int failed = 0;
- Suite *unit = unit_testing();
- SRunner *unit_runner = srunner_create(unit);
-
- srunner_run_all(unit_runner, CK_NORMAL);
- failed = srunner_ntests_failed(unit_runner);
- srunner_free(unit_runner);
-
- return failed;
-}
-
-
-int main()
-{
- int unit_failed = run_unit_tests();
-
- return (unit_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}