From 53879a0d69f5e578710b7125e9b41e516c2371d4 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Wed, 10 Jan 2024 17:39:28 -0500 Subject: MutableBuffer+View: Implementation with unit tests --- tests/mutable_buffer_tests.cpp | 254 ++++++++++++++++++----------------------- 1 file changed, 113 insertions(+), 141 deletions(-) (limited to 'tests') diff --git a/tests/mutable_buffer_tests.cpp b/tests/mutable_buffer_tests.cpp index 8480f55..e714d3e 100644 --- a/tests/mutable_buffer_tests.cpp +++ b/tests/mutable_buffer_tests.cpp @@ -1,7 +1,7 @@ /* * tests/mutable_buffer_tests.cpp * - * Unit tests for MutableBuffer + * Unit tests for MutableBuffer and BufferView * * Copyright (C) 2023 Douglas Rumbaugh * Dong Xie @@ -9,7 +9,7 @@ * Distributed under the Modified BSD License. * */ -#include + #include #include #include @@ -25,15 +25,26 @@ using namespace de; START_TEST(t_create) { - auto buffer = new MutableBuffer(100, 50); + size_t lwm = 50, hwm = 100; + size_t cap = 2 * hwm; + + auto buffer = new MutableBuffer(lwm, hwm); 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->get_capacity(), cap); + ck_assert_int_eq(buffer->get_low_watermark(), lwm); + ck_assert_int_eq(buffer->get_high_watermark(), hwm); + ck_assert_int_eq(buffer->is_full(), false); - ck_assert_ptr_nonnull(buffer->get_data()); + ck_assert_int_eq(buffer->is_at_low_watermark(), false); + ck_assert_int_eq(buffer->get_record_count(), 0); ck_assert_int_eq(buffer->get_tombstone_count(), 0); - ck_assert_int_eq(buffer->get_tombstone_capacity(), 50); + + { + auto view = buffer->get_buffer_view(); + ck_assert_int_eq(view.get_tombstone_count(), 0); + ck_assert_int_eq(view.get_record_count(), 0); + } delete buffer; } @@ -42,74 +53,47 @@ END_TEST START_TEST(t_insert) { - auto buffer = new MutableBuffer(100, 50); + auto buffer = new MutableBuffer(50, 100); - uint64_t key = 0; - uint32_t val = 5; + Rec rec = {0, 5, 1}; - WRec rec = {0, 5, 1}; - - for (size_t i=0; i<99; i++) { + /* insert records up to the low watermark */ + size_t cnt = 0; + for (size_t i=0; i<50; i++) { ck_assert_int_eq(buffer->append(rec), 1); ck_assert_int_eq(buffer->check_tombstone(rec), 0); + ck_assert_int_eq(buffer->is_at_low_watermark(), false); rec.key++; rec.value++; + cnt++; - 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->get_record_count(), cnt); + ck_assert_int_eq(buffer->get_buffer_view().get_record_count(), cnt); + ck_assert_int_eq(buffer->get_tail(), cnt); } - 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; - -} -END_TEST - - -START_TEST(t_insert_tombstones) -{ - auto buffer = new MutableBuffer(100, 50); - - 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; - } - - ck_assert_int_eq(buffer->append(rec, ts), 1); - ck_assert_int_eq(buffer->check_tombstone(rec), ts); + /* insert records up to the high watermark */ + for (size_t i=0; i<50; i++) { + ck_assert_int_eq(buffer->is_full(), 0); + ck_assert_int_eq(buffer->append(rec), 1); + ck_assert_int_eq(buffer->check_tombstone(rec), 0); rec.key++; rec.value++; + cnt++; - 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(rec, true), 0); + ck_assert_int_eq(buffer->get_record_count(), cnt); + ck_assert_int_eq(buffer->get_buffer_view().get_record_count(), cnt); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->is_at_low_watermark(), true); + ck_assert_int_eq(buffer->get_tail(), cnt); + } - ck_assert_int_eq(buffer->append(rec), 1); - + /* further inserts should fail */ rec.key++; rec.value++; - ck_assert_int_eq(buffer->is_full(), 1); ck_assert_int_eq(buffer->append(rec), 0); @@ -118,88 +102,51 @@ START_TEST(t_insert_tombstones) END_TEST -START_TEST(t_truncate) +START_TEST(t_advance_head) { - auto buffer = new MutableBuffer(100, 100); + auto buffer = new MutableBuffer(50, 100); - 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; - } - - ck_assert_int_eq(buffer->append(rec, ts), 1); - ck_assert_int_eq(buffer->check_tombstone(rec), ts); + /* insert 75 records and get tail when LWM is exceeded */ + size_t new_head = 0; + Rec rec = {1, 1}; + size_t cnt = 0; + for (size_t i=0; i<75; i++) { + ck_assert_int_eq(buffer->append(rec), 1); rec.key++; rec.value++; + cnt++; - 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(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; - -} -END_TEST - - -START_TEST(t_get_data) -{ - size_t cnt = 100; - - auto buffer = new MutableBuffer(cnt, cnt/2); - - - std::vector keys(cnt); - for (size_t i=0; iis_at_low_watermark() && new_head == 0) { + new_head = buffer->get_tail() - 1; + } } - // duplicate final two records for tombstone testing - // purposes - keys[cnt-2] = keys[cnt-3]; - keys[cnt-1] = keys[cnt-2]; - - uint32_t val = 12345; - for (size_t i=0; iappend(Rec {keys[i], val}); + ck_assert_int_eq(buffer->get_available_capacity(), 200 - cnt); + + Wrapped *view_records = new Wrapped[buffer->get_record_count()]; + { + /* get a view of the pre-advanced state */ + auto view = buffer->get_buffer_view(); + ck_assert_int_eq(view.get_record_count(), cnt); + view.copy_to_buffer((psudb::byte *) view_records); + + /* advance the head */ + buffer->advance_head(new_head); + ck_assert_int_eq(buffer->get_record_count(), 25); + ck_assert_int_eq(buffer->get_buffer_view().get_record_count(), 25); + ck_assert_int_eq(view.get_record_count(), cnt); + ck_assert_int_eq(buffer->get_available_capacity(), 200 - cnt); } - Rec r1 = {keys[cnt-2], val}; - buffer->append(r1, true); - - Rec r2 = {keys[cnt-1], val}; - buffer->append(r2, true); - - - auto *sorted_records = buffer->get_data(); - std::sort(keys.begin(), keys.end()); - std::sort(sorted_records, sorted_records + buffer->get_record_count(), std::less>()); - - for (size_t i=0; iget_available_capacity(), 175); delete buffer; + delete[] view_records; } END_TEST - void insert_records(std::vector> *values, size_t start, size_t stop, MutableBuffer *buffer) { for (size_t i=start; i> *values, size_t s } -#if DE_MT_TEST +/* START_TEST(t_multithreaded_insert) { size_t cnt = 10000; - auto buffer = new MutableBuffer(cnt, true, cnt/2); + auto buffer = new MutableBuffer(cnt/2, cnt); std::vector records(cnt); for (size_t i=0; i workers(thread_cnt); @@ -239,17 +186,49 @@ START_TEST(t_multithreaded_insert) ck_assert_int_eq(buffer->is_full(), 1); ck_assert_int_eq(buffer->get_record_count(), cnt); +} +END_TEST +*/ - std::sort(records.begin(), records.end()); - auto *sorted_records = buffer->sorted_output(); - for (size_t i=0; i(100, 100); + + 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; + } + + ck_assert_int_eq(buffer->append(rec, ts), 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); + 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; + } END_TEST -#endif Suite *unit_testing() @@ -263,10 +242,8 @@ Suite *unit_testing() TCase *append = tcase_create("de::MutableBuffer::append Testing"); tcase_add_test(append, t_insert); - tcase_add_test(append, t_insert_tombstones); - #if DE_MT_TEST - tcase_add_test(append, t_multithreaded_insert); - #endif + tcase_add_test(append, t_advance_head); + //tcase_add_test(append, t_multithreaded_insert); suite_add_tcase(unit, append); @@ -277,11 +254,6 @@ Suite *unit_testing() suite_add_tcase(unit, truncate); - TCase *sorted_out = tcase_create("de::MutableBuffer::get_data"); - tcase_add_test(sorted_out, t_get_data); - - suite_add_tcase(unit, sorted_out); - return unit; } -- cgit v1.2.3