/* * tests/mutable_buffer_tests.cpp * * Unit tests for MutableBuffer * * Copyright (C) 2023 Douglas Rumbaugh * Dong Xie * * All rights reserved. Published under the Modified BSD License. * */ #include #include #include #include #include #include "testing.h" #include "framework/MutableBuffer.h" #include #define DE_MT_TEST 0 using namespace de; START_TEST(t_create) { auto rng = gsl_rng_alloc(gsl_rng_mt19937); auto buffer = new MutableBuffer(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 MutableBuffer(100, true, 50, rng); uint64_t key = 0; uint32_t val = 5; WRec rec = {0, 5, 1}; for (size_t i=0; i<99; i++) { ck_assert_int_eq(buffer->append(rec), 1); ck_assert_int_eq(buffer->check_tombstone(rec), 0); rec.key++; rec.value++; 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(rec), 1); rec.key++; rec.value++; ck_assert_int_eq(buffer->is_full(), 1); ck_assert_int_eq(buffer->append(rec), 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 MutableBuffer(100, true, 50, rng); size_t ts_cnt = 0; Rec rec = {0, 5}; for (size_t i=0; i<99; i++) { bool ts = false; if (i % 2 == 0) { ts_cnt++; ts=true; } rec.set_tombstone(ts); ck_assert_int_eq(buffer->append(rec), 1); ck_assert_int_eq(buffer->check_tombstone(rec), ts); rec.key++; rec.value++; 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 rec.set_tombstone(); ck_assert_int_eq(buffer->append(rec), 0); rec.set_tombstone(false); ck_assert_int_eq(buffer->append(rec), 1); rec.key++; rec.value++; ck_assert_int_eq(buffer->is_full(), 1); ck_assert_int_eq(buffer->append(rec), 0); delete buffer; gsl_rng_free(rng); } END_TEST START_TEST(t_truncate) { auto rng = gsl_rng_alloc(gsl_rng_mt19937); auto buffer = new MutableBuffer(100, true, 100, rng); size_t ts_cnt = 0; Rec rec = {0, 5}; for (size_t i=0; i<100; i++) { bool ts = false; if (i % 2 == 0) { ts_cnt++; ts=true; } rec.set_tombstone(ts); ck_assert_int_eq(buffer->append(rec), 1); ck_assert_int_eq(buffer->check_tombstone(rec), ts); rec.key++; rec.value++; 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); rec.set_tombstone(false); ck_assert_int_eq(buffer->append(rec), 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(rec), 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 MutableBuffer(cnt, true, cnt/2, rng); std::vector keys(cnt); for (size_t i=0; iappend(Rec {keys[i], val}); } Rec r1 = {keys[cnt-2], val}; r1.set_tombstone(); buffer->append(r1); Rec r2 = {keys[cnt-1], val}; r2.set_tombstone(); buffer->append(r2); auto *sorted_records = buffer->sorted_output(); std::sort(keys.begin(), keys.end()); for (size_t i=0; i> *values, size_t start, size_t stop, MutableBuffer *buffer) { for (size_t i=start; iappend({(*values)[i].first, (*values)[i].second}); } } #if DE_MT_TEST START_TEST(t_multithreaded_insert) { size_t cnt = 10000; auto rng = gsl_rng_alloc(gsl_rng_mt19937); auto buffer = new MutableBuffer(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()); auto *sorted_records = buffer->sorted_output(); for (size_t i=0; i