From 64fd53cea864a26c9cd4b34646a787c1049587e6 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Tue, 9 May 2023 14:37:32 -0400 Subject: MutableBuffer tests and bugfixes --- tests/mutable_buffer_tests.cpp | 300 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 tests/mutable_buffer_tests.cpp (limited to 'tests/mutable_buffer_tests.cpp') diff --git a/tests/mutable_buffer_tests.cpp b/tests/mutable_buffer_tests.cpp new file mode 100644 index 0000000..8768551 --- /dev/null +++ b/tests/mutable_buffer_tests.cpp @@ -0,0 +1,300 @@ +#include +#include +#include +#include +#include + +#include "testing.h" +#include "framework/MutableBuffer.h" + +#include + +using namespace de; + +START_TEST(t_create) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + ck_assert_ptr_nonnull(buffer); + ck_assert_int_eq(buffer->get_capacity(), 100); + ck_assert_int_eq(buffer->get_record_count(), 0); + ck_assert_int_eq(buffer->is_full(), false); + ck_assert_ptr_nonnull(buffer->sorted_output()); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->get_tombstone_capacity(), 50); + + delete buffer; + gsl_rng_free(rng); +} +END_TEST + + +START_TEST(t_insert) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + uint64_t key = 0; + uint32_t val = 5; + + for (size_t i=0; i<99; i++) { + ck_assert_int_eq(buffer->append(key, val, 1, false), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), 0); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->is_full(), 0); + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + key++; + val++; + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + delete buffer; + gsl_rng_free(rng); + +} +END_TEST + + +START_TEST(t_insert_tombstones) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + uint64_t key = 0; + uint32_t val = 5; + size_t ts_cnt = 0; + + for (size_t i=0; i<99; i++) { + bool ts = false; + if (i % 2 == 0) { + ts_cnt++; + ts=true; + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, ts), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), ts); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), ts_cnt); + ck_assert_int_eq(buffer->is_full(), 0); + } + + // inserting one more tombstone should not be possible + ck_assert_int_eq(buffer->append(key, val, 1.0, true), 0); + + + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + key++; + val++; + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + delete buffer; + gsl_rng_free(rng); +} +END_TEST + + +START_TEST(t_truncate) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 100, rng); + + uint64_t key = 0; + uint32_t val = 5; + size_t ts_cnt = 0; + + for (size_t i=0; i<100; i++) { + bool ts = false; + if (i % 2 == 0) { + ts_cnt++; + ts=true; + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, ts), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), ts); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), ts_cnt); + } + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + ck_assert_int_eq(buffer->truncate(), 1); + + ck_assert_int_eq(buffer->is_full(), 0); + ck_assert_int_eq(buffer->get_record_count(), 0); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + delete buffer; + gsl_rng_free(rng); + +} +END_TEST + + +START_TEST(t_sorted_output) +{ + size_t cnt = 100; + + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(cnt, true, cnt/2, rng); + + + std::vector keys(cnt); + for (size_t i=0; iappend(keys[i], val, 1.0, false); + } + + buffer->append(keys[cnt-2], val, 1.0, true); + buffer->append(keys[cnt-1], val, 1.0, true); + + + WeightedRec *sorted_records = buffer->sorted_output(); + std::sort(keys.begin(), keys.end()); + + for (size_t i=0; i> *values, size_t start, size_t stop, WeightedMBuffer *buffer) +{ + for (size_t i=start; iappend((*values)[i].first, (*values)[i].second, 1.0); + } + +} + +START_TEST(t_multithreaded_insert) +{ + size_t cnt = 10000; + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(cnt, true, cnt/2, rng); + + std::vector> records(cnt); + for (size_t i=0; i workers(thread_cnt); + size_t start = 0; + size_t stop = start + per_thread; + for (size_t i=0; iis_full(), 1); + ck_assert_int_eq(buffer->get_record_count(), cnt); + + std::sort(records.begin(), records.end()); + WeightedRec *sorted_records = buffer->sorted_output(); + for (size_t i=0; i