diff options
| author | Douglas B. Rumbaugh <doug@douglasrumbaugh.com> | 2023-10-31 12:42:21 -0400 |
|---|---|---|
| committer | Douglas B. Rumbaugh <doug@douglasrumbaugh.com> | 2023-10-31 12:42:21 -0400 |
| commit | 83ca486048a5053d8c75bb5041091edb1b183a85 (patch) | |
| tree | 8401cbe2f7afb8b2a44e9ee9849030c3284dffce /tests | |
| parent | 68ae6279476e7d37837ac06474fb558e50ce6706 (diff) | |
| download | dynamic-extension-83ca486048a5053d8c75bb5041091edb1b183a85.tar.gz | |
DE CC Testing: initial test file for FIFOScheduler
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/de_cc_isam_level.cpp | 461 |
1 files changed, 461 insertions, 0 deletions
diff --git a/tests/de_cc_isam_level.cpp b/tests/de_cc_isam_level.cpp new file mode 100644 index 0000000..e574578 --- /dev/null +++ b/tests/de_cc_isam_level.cpp @@ -0,0 +1,461 @@ +/* + * tests/dynamic_extension_tests.cpp + * + * Unit tests for Dynamic Extension Framework + * + * Copyright (C) 2023 Douglas B. Rumbaugh <drumbaugh@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ + +#include <random> + +#include "framework/DynamicExtension.h" +#include "shard/MemISAM.h" + +#include <check.h> + +using namespace de; + +typedef Record<int32_t, int32_t> Rec; +typedef DynamicExtension<Rec, MemISAM<Rec>, ISAMRangeQuery<Rec>, LayoutPolicy::LEVELING, DeletePolicy::TOMBSTONE> DE; + +START_TEST(t_create) +{ + auto de_isam = new DE(100, 2, 1); + + ck_assert_ptr_nonnull(de_isam); + ck_assert_int_eq(de_isam->get_record_count(), 0); + ck_assert_int_eq(de_isam->get_height(), 0); + + delete de_isam; +} +END_TEST + + +START_TEST(t_insert) +{ + auto ext_wirs = new DE(100, 2, 1); + + int32_t key = 0; + int32_t val = 0; + for (size_t i=0; i<100; i++) { + Rec r = {key, val}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + key++; + val++; + } + + ck_assert_int_eq(ext_wirs->get_height(), 0); + ck_assert_int_eq(ext_wirs->get_record_count(), 100); + + delete ext_wirs; +} +END_TEST + + +START_TEST(t_debug_insert) +{ + auto ext_wirs = new DE(100, 2, 1); + + int32_t key = 0; + int32_t val = 0; + for (size_t i=0; i<1000; i++) { + Rec r = {key, val}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + ck_assert_int_eq(ext_wirs->get_record_count(), i+1); + key++; + val++; + } + + delete ext_wirs; +} +END_TEST + + +START_TEST(t_insert_with_mem_merges) +{ + auto ext_wirs = new DE(100, 2, 1); + + int32_t key = 0; + int32_t val = 0; + for (size_t i=0; i<300; i++) { + Rec r = {key, val}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + key++; + val++; + } + + ck_assert_int_eq(ext_wirs->get_record_count(), 300); + ck_assert_int_eq(ext_wirs->get_height(), 1); + + delete ext_wirs; +} +END_TEST + + +/* +START_TEST(t_range_sample_memtable) +{ + auto ext_wirs = new DE(100, 2, 1); + + int32_t key = 0; + int32_t val = 0; + for (size_t i=0; i<100; i++) { + Rec r = {key, val}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + key++; + val++; + } + + int32_t lower_bound = 20; + int32_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]; + + ext_wirs->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 ext_wirs; +} +END_TEST + + +START_TEST(t_range_sample_memlevels) +{ + auto ext_wirs = new DE(100, 2, 1); + + int32_t key = 0; + int32_t val = 0; + for (size_t i=0; i<300; i++) { + Rec r = {key, val}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + key++; + val++; + } + + int32_t lower_bound = 100; + int32_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]; + ext_wirs->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 ext_wirs; +} +END_TEST + +START_TEST(t_range_sample_weighted) +{ + auto ext_wirs = new DE(100, 2, 1); + size_t n = 10000; + + std::vector<int32_t> keys; + + int32_t key = 1; + for (size_t i=0; i< n / 2; i++) { + keys.push_back(key); + } + + // put in a quarter of the count with weight two. + key = 2; + for (size_t i=0; i< n / 4; i++) { + keys.push_back(key); + } + + // the remaining quarter with weight four. + key = 3; + for (size_t i=0; i< n / 4; i++) { + keys.push_back(key); + } + + std::random_device rd; + std::mt19937 gen{rd()}; + std::shuffle(keys.begin(), keys.end(), gen); + + for (size_t i=0; i<keys.size(); i++) { + int32_t weight; + if (keys[i] == 1) { + weight = 2; + } else if (keys[i] == 2) { + weight = 4; + } else { + weight = 8; + } + + Rec r = {keys[i], (int32_t) i, weight}; + ext_wirs->insert(r); + } + size_t k = 1000; + int32_t lower_key = 0; + int32_t upper_key = 5; + + size_t cnt[3] = {0}; + size_t total_samples = 0; + + wirs_query_parms<Rec> p; + p.lower_bound = lower_key; + p.upper_bound = upper_key; + p.sample_size = k; + p.rng = gsl_rng_alloc(gsl_rng_mt19937); + + for (size_t i=0; i<1000; i++) { + + auto result = ext_wirs->query(&p); + auto r = result.get(); + total_samples += r.size(); + + for (size_t j=0; j<r.size(); j++) { + cnt[r[j].key - 1]++; + } + } + + ck_assert(roughly_equal(cnt[0], (double) total_samples/4.0, total_samples, .03)); + ck_assert(roughly_equal(cnt[1], (double) total_samples/4.0, total_samples, .03)); + ck_assert(roughly_equal(cnt[2], (double) total_samples/2.0, total_samples, .03)); + + gsl_rng_free(p.rng); + delete ext_wirs; +} +END_TEST + +*/ + + +START_TEST(t_tombstone_merging_01) +{ + size_t reccnt = 100000; + auto ext_wirs = new DE(100, 2, .01); + + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + + std::set<std::pair<int32_t, int32_t>> records; + std::set<std::pair<int32_t, int32_t>> to_delete; + std::set<std::pair<int32_t, int32_t>> deleted; + + while (records.size() < reccnt) { + int32_t key = rand(); + int32_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, 1}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + + if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { + std::vector<std::pair<int32_t, int32_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, 1}; + ext_wirs->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); + } + + ck_assert(ext_wirs->validate_tombstone_proportion()); + } + + ck_assert(ext_wirs->validate_tombstone_proportion()); + + gsl_rng_free(rng); + delete ext_wirs; +} +END_TEST + +DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) { + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + + auto ext_wirs = new DE(1000, 2, 1); + + std::set<Rec> records; + std::set<Rec> to_delete; + std::set<Rec> deleted; + + while (records.size() < reccnt) { + int32_t key = rand(); + int32_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(ext_wirs->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++) { + ext_wirs->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 ext_wirs; +} + +START_TEST(t_static_structure) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + + size_t reccnt = 100000; + auto ext_wirs = new DE(100, 2, 1); + + std::set<Rec> records; + std::set<Rec> to_delete; + std::set<Rec> deleted; + + while (records.size() < reccnt) { + int32_t key = rand(); + int32_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(ext_wirs->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(ext_wirs->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 = ext_wirs->create_static_structure(); + ck_assert_int_eq(flat->get_record_count(), reccnt - deletes); + + int32_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 ext_wirs; +} +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<WIRS>::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 *sampling = tcase_create("de::DynamicExtension<WIRS>::range_sample Testing"); + + tcase_add_test(sampling, t_range_sample_weighted); + suite_add_tcase(unit, sampling); + tcase_add_test(sampling, t_range_sample_memtable); + tcase_add_test(sampling, t_range_sample_memlevels); + */ + + 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; +} |