summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/mutable_buffer_tests.cpp254
1 files changed, 113 insertions, 141 deletions
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 <drumbaugh@psu.edu>
* Dong Xie <dongx@psu.edu>
@@ -9,7 +9,7 @@
* Distributed under the Modified BSD License.
*
*/
-#include <string>
+
#include <thread>
#include <vector>
#include <algorithm>
@@ -25,15 +25,26 @@ using namespace de;
START_TEST(t_create)
{
- auto buffer = new MutableBuffer<Rec>(100, 50);
+ size_t lwm = 50, hwm = 100;
+ size_t cap = 2 * hwm;
+
+ auto buffer = new MutableBuffer<Rec>(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<WRec>(100, 50);
+ auto buffer = new MutableBuffer<Rec>(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<Rec>(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<Rec>(100, 100);
+ auto buffer = new MutableBuffer<Rec>(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<Rec>(cnt, cnt/2);
-
-
- std::vector<uint64_t> keys(cnt);
- for (size_t i=0; i<cnt-2; i++) {
- keys[i] = rand();
+ if (buffer->is_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; i<cnt-2; i++) {
- buffer->append(Rec {keys[i], val});
+ ck_assert_int_eq(buffer->get_available_capacity(), 200 - cnt);
+
+ Wrapped<Rec> *view_records = new Wrapped<Rec>[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<Wrapped<Rec>>());
-
- for (size_t i=0; i<cnt; i++) {
- ck_assert_int_eq(sorted_records[i].rec.key, keys[i]);
- }
+ /* once the buffer view falls out of scope, the capacity of the buffer should increase */
+ ck_assert_int_eq(buffer->get_available_capacity(), 175);
delete buffer;
+ delete[] view_records;
}
END_TEST
-
void insert_records(std::vector<std::pair<uint64_t, uint32_t>> *values, size_t start, size_t stop, MutableBuffer<Rec> *buffer)
{
for (size_t i=start; i<stop; i++) {
@@ -208,18 +155,18 @@ void insert_records(std::vector<std::pair<uint64_t, uint32_t>> *values, size_t s
}
-#if DE_MT_TEST
+/*
START_TEST(t_multithreaded_insert)
{
size_t cnt = 10000;
- auto buffer = new MutableBuffer<Rec>(cnt, true, cnt/2);
+ auto buffer = new MutableBuffer<Rec>(cnt/2, cnt);
std::vector<Rec> records(cnt);
for (size_t i=0; i<cnt; i++) {
records[i] = Rec {(uint64_t) rand(), (uint32_t) rand()};
}
- // perform a t_multithreaded insertion
+ // perform a multithreaded insertion
size_t thread_cnt = 8;
size_t per_thread = cnt / thread_cnt;
std::vector<std::thread> 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<cnt; i++) {
- ck_assert_int_eq(sorted_records[i].key, records[i].key);
+
+START_TEST(t_truncate)
+{
+ auto buffer = new MutableBuffer<Rec>(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;
}