summaryrefslogtreecommitdiffstats
path: root/tests/include/testing.h
diff options
context:
space:
mode:
authorDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2024-12-06 16:54:05 -0500
committerDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2024-12-06 16:54:05 -0500
commit9876d74e503df64eb9e82e540ca41fcf593ebf64 (patch)
tree3512690afa8c04f702bd8de500bf8f41b05571c4 /tests/include/testing.h
parente2b81a2d311470d503edae93e68e82791f6bb17c (diff)
downloaddynamic-extension-master.tar.gz
Adjusted query result interfacesHEADmaster
Now, the vector<> is part of the user-defined type, not required by the framework. This should allow for more flexibility in either using alternative containers, or for more sensible implementations of queries with single value results (like range count).
Diffstat (limited to 'tests/include/testing.h')
-rw-r--r--tests/include/testing.h308
1 files changed, 172 insertions, 136 deletions
diff --git a/tests/include/testing.h b/tests/include/testing.h
index 33cbb3f..090221c 100644
--- a/tests/include/testing.h
+++ b/tests/include/testing.h
@@ -3,7 +3,7 @@
*
* Unit test utility functions/definitions
*
- * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu>
+ * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu>
* Dong Xie <dongx@psu.edu>
*
* Distributed under the Modified BSD License.
@@ -13,160 +13,184 @@
#include <string>
-#include <unistd.h>
#include <fcntl.h>
#include <fstream>
#include <sstream>
+#include <unistd.h>
-#include "util/types.h"
-#include "psu-util/alignment.h"
-#include "framework/structure/MutableBuffer.h"
#include "framework/interface/Record.h"
+#include "framework/structure/MutableBuffer.h"
+#include "psu-util/alignment.h"
+#include "util/types.h"
typedef de::WeightedRecord<uint64_t, uint32_t, uint64_t> WRec;
typedef de::Record<uint64_t, uint32_t> Rec;
typedef de::EuclidPoint<uint64_t> PRec;
-typedef de::Record<const char*, uint64_t> StringRec;
+typedef de::Record<const char *, uint64_t> StringRec;
static std::string kjv_wordlist = "tests/data/kjv-wordlist.txt";
static std::string summa_wordlist = "tests/data/summa-wordlist.txt";
-static std::vector<std::unique_ptr<char[]>> string_data;
+static struct sd {
+ std::vector<char *> data;
+ ~sd() {
+ for (size_t i = 0; i < data.size(); i++) {
+ delete data[i];
+ }
+ }
+} string_data;
-[[maybe_unused]] static std::vector<StringRec> read_string_data(std::string fname, size_t n) {
- std::vector<StringRec> vec;
- vec.reserve(n);
- string_data.reserve(n);
+[[maybe_unused]] static std::vector<StringRec>
+read_string_data(std::string fname, size_t n) {
+ std::vector<StringRec> vec;
+ vec.reserve(n);
+ string_data.data.reserve(n);
- std::fstream file;
- file.open(fname, std::ios::in);
+ std::fstream file;
+ file.open(fname, std::ios::in);
- for (size_t i=0; i<n; i++) {
- std::string line;
- if (!std::getline(file, line, '\n')) break;
+ for (size_t i = 0; i < n; i++) {
+ std::string line;
+ if (!std::getline(file, line, '\n'))
+ break;
- std::stringstream ls(line);
- std::string field;
+ std::stringstream ls(line);
+ std::string field;
- std::getline(ls, field, '\t');
- uint64_t val = atol(field.c_str());
- std::getline(ls, field, '\n');
+ std::getline(ls, field, '\t');
+ uint64_t val = atol(field.c_str());
+ std::getline(ls, field, '\n');
- char *c = strdup(field.c_str());
+ string_data.data.push_back(strdup(field.c_str()));
- string_data.push_back(std::unique_ptr<char[]>(c));
+ StringRec r{string_data.data[string_data.data.size() - 1], val,
+ field.size()};
- StringRec r{string_data[string_data.size() -1].get(), val, field.size()};
-
- vec.push_back(r);
- }
+ vec.push_back(r);
+ }
- return vec;
+ return vec;
}
-
-template <de::RecordInterface R>
+template <de::RecordInterface R>
std::vector<R> strip_wrapping(std::vector<de::Wrapped<R>> vec) {
- std::vector<R> out(vec.size());
- for (uint32_t i=0; i<vec.size(); i++) {
- out[i] = vec[i].rec;
- }
+ std::vector<R> out(vec.size());
+ for (uint32_t i = 0; i < vec.size(); i++) {
+ out[i] = vec[i].rec;
+ }
- return out;
+ return out;
}
-[[maybe_unused]] static bool initialize_test_file(std::string fname, size_t page_cnt)
-{
- auto flags = O_RDWR | O_CREAT | O_TRUNC;
- mode_t mode = 0640;
- char *page = nullptr;
-
- int fd = open(fname.c_str(), flags, mode);
- if (fd == -1) {
- goto error;
+[[maybe_unused]] static bool initialize_test_file(std::string fname,
+ size_t page_cnt) {
+ auto flags = O_RDWR | O_CREAT | O_TRUNC;
+ mode_t mode = 0640;
+ char *page = nullptr;
+
+ int fd = open(fname.c_str(), flags, mode);
+ if (fd == -1) {
+ goto error;
+ }
+
+ page = (char *)aligned_alloc(psudb::SECTOR_SIZE, psudb::PAGE_SIZE);
+ if (!page) {
+ goto error_opened;
+ }
+
+ for (size_t i = 0; i <= page_cnt; i++) {
+ *((int *)page) = i;
+ if (write(fd, page, psudb::PAGE_SIZE) == -1) {
+ goto error_alloced;
}
+ }
- page = (char *) aligned_alloc(psudb::SECTOR_SIZE, psudb::PAGE_SIZE);
- if (!page) {
- goto error_opened;
- }
+ free(page);
- for (size_t i=0; i<=page_cnt; i++) {
- *((int *) page) = i;
- if (write(fd, page, psudb::PAGE_SIZE) == -1) {
- goto error_alloced;
- }
- }
-
- free(page);
-
- return 1;
+ return 1;
error_alloced:
- free(page);
+ free(page);
error_opened:
- close(fd);
+ close(fd);
error:
- return 0;
+ return 0;
}
-[[maybe_unused]] static bool roughly_equal(int n1, int n2, size_t mag, double epsilon) {
- return ((double) std::abs(n1 - n2) / (double) mag) < epsilon;
+[[maybe_unused]] static bool roughly_equal(int n1, int n2, size_t mag,
+ double epsilon) {
+ return ((double)std::abs(n1 - n2) / (double)mag) < epsilon;
}
template <de::RecordInterface R>
-static de::MutableBuffer<R> *create_test_mbuffer(size_t cnt)
-{
- auto buffer = new de::MutableBuffer<R>(cnt/2, cnt);
-
- if constexpr (de::KVPInterface<R>){
- if constexpr (std::is_same_v<decltype(R::key), const char*>){
- auto records = read_string_data(kjv_wordlist, cnt);
- for (size_t i=0; i<cnt; i++) {
- buffer->append(records[i]);
- }
+static de::MutableBuffer<R> *create_test_mbuffer(size_t cnt) {
+ auto buffer = new de::MutableBuffer<R>(cnt / 2, cnt);
+ R r = {};
+
+ if constexpr (de::KVPInterface<R>) {
+ if constexpr (std::is_same_v<decltype(R::key), const char *>) {
+ auto records = read_string_data(kjv_wordlist, cnt);
+ for (size_t i = 0; i < cnt; i++) {
+ buffer->append(records[i]);
+ }
+ } else {
+ for (size_t i = 0; i < cnt; i++) {
+ r.key = rand();
+ r.value = rand();
+ if constexpr (de::WeightedRecordInterface<R>) {
+ r.weight = 1;
+ buffer->append(r);
} else {
- for (size_t i = 0; i < cnt; i++) {
- if constexpr (de::WeightedRecordInterface<R>) {
- buffer->append({(uint64_t) rand(), (uint32_t) rand(), 1});
- } else {
- buffer->append({(uint64_t) rand(), (uint32_t) rand()});
- }
- }
- }
- } else if constexpr (de::NDRecordInterface<R>) {
- for (size_t i=0; i<cnt; i++) {
- buffer->append({(uint64_t) rand(), (uint64_t) rand()});
+ buffer->append(r);
}
- }
+ }
+ }
+ } else if constexpr (de::NDRecordInterface<R>) {
+ for (size_t i = 0; i < cnt; i++) {
+ r.data[0] = rand();
+ r.data[1] = rand();
+ buffer->append(r);
+ }
+ }
- return buffer;
+ return buffer;
}
template <de::RecordInterface R>
-static de::MutableBuffer<R> *create_sequential_mbuffer(size_t start, size_t stop)
-{
- size_t cnt = stop - start;
- auto buffer = new de::MutableBuffer<R>(cnt/2, cnt);
-
- for (uint32_t i=start; i<stop; i++) {
-
- if constexpr (de::WeightedRecordInterface<R>) {
- buffer->append({i, i, 1});
- } else {
- buffer->append({i, i});
- }
+static de::MutableBuffer<R> *create_sequential_mbuffer(size_t start,
+ size_t stop) {
+ size_t cnt = stop - start;
+ auto buffer = new de::MutableBuffer<R>(cnt / 2, cnt);
+
+ R r = {};
+
+ for (uint32_t i = start; i < stop; i++) {
+ if constexpr (de::NDRecordInterface<R>) {
+ r.data[0] = i;
+ r.data[1] = i;
+ buffer->append(r);
+ } else {
+ r.key = i;
+ r.value = i;
+ if constexpr (de::WeightedRecordInterface<R>) {
+ r.weight = 1;
+ buffer->append(r);
+ } else {
+ buffer->append(r);
+ }
}
+ }
- return buffer;
+ return buffer;
}
/*
template <de::KVPInterface R>
-static de::MutableBuffer<R> *create_test_mbuffer_tombstones(size_t cnt, size_t ts_cnt)
+static de::MutableBuffer<R> *create_test_mbuffer_tombstones(size_t cnt, size_t
+ts_cnt)
{
auto buffer = new de::MutableBuffer<R>(cnt/2, cnt);
@@ -198,43 +222,55 @@ static de::MutableBuffer<R> *create_test_mbuffer_tombstones(size_t cnt, size_t t
*/
template <typename R>
-requires de::WeightedRecordInterface<R> && de::KVPInterface<R>
-static de::MutableBuffer<R> *create_weighted_mbuffer(size_t cnt)
-{
- auto buffer = new de::MutableBuffer<R>(cnt/2, cnt);
-
- // Put in half of the count with weight one.
- for (uint32_t i=0; i< cnt / 2; i++) {
- buffer->append(R {1, i, 2});
- }
-
- // put in a quarter of the count with weight four.
- for (uint32_t i=0; i< cnt / 4; i++) {
- buffer->append(R {2, i, 4});
- }
-
- // the remaining quarter with weight eight.
- for (uint32_t i=0; i< cnt / 4; i++) {
- buffer->append(R {3, i, 8});
- }
-
- return buffer;
+ requires de::WeightedRecordInterface<R> && de::KVPInterface<R>
+static de::MutableBuffer<R> *create_weighted_mbuffer(size_t cnt) {
+ auto buffer = new de::MutableBuffer<R>(cnt / 2, cnt);
+ R r = {};
+
+ // Put in half of the count with weight one.
+ for (uint32_t i = 0; i < cnt / 2; i++) {
+ r.key = 1;
+ r.value = i;
+ r.weight = 2;
+ buffer->append(r);
+ }
+
+ // put in a quarter of the count with weight four.
+ for (uint32_t i = 0; i < cnt / 4; i++) {
+ r.key = 2;
+ r.value = i;
+ r.weight = 4;
+ buffer->append(r);
+ }
+
+ // the remaining quarter with weight eight.
+ for (uint32_t i = 0; i < cnt / 4; i++) {
+ r.key = 3;
+ r.value = i;
+ r.weight = 8;
+ buffer->append(r);
+ }
+
+ return buffer;
}
template <de::KVPInterface R>
-static de::MutableBuffer<R> *create_double_seq_mbuffer(size_t cnt, bool ts=false)
-{
- auto buffer = new de::MutableBuffer<R>(cnt/2, cnt);
-
- for (uint32_t i = 0; i < cnt / 2; i++) {
- buffer->append({i, i}, ts);
- }
-
- for (uint32_t i = 0; i < cnt / 2; i++) {
- buffer->append({i, i+1}, ts);
- }
-
- return buffer;
+static de::MutableBuffer<R> *create_double_seq_mbuffer(size_t cnt,
+ bool ts = false) {
+ auto buffer = new de::MutableBuffer<R>(cnt / 2, cnt);
+ R r = {};
+
+ for (uint32_t i = 0; i < cnt / 2; i++) {
+ r.key = i;
+ r.value = i;
+ buffer->append(r, ts);
+ }
+
+ for (uint32_t i = 0; i < cnt / 2; i++) {
+ r.key = i;
+ r.value = i + 1;
+ buffer->append(r, ts);
+ }
+
+ return buffer;
}
-
-