Add ApiTest.cpp
This commit is contained in:
90
ApiTest.cpp
Normal file
90
ApiTest.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
#include "VersionedMap.h"
|
||||
|
||||
#include "Internal.h"
|
||||
#include "PrintMutation.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <inttypes.h>
|
||||
#include <latch>
|
||||
#include <string.h>
|
||||
#include <thread>
|
||||
|
||||
void setAndClearPrev() {
|
||||
debugVerboseEnabled = false;
|
||||
weaselab::VersionedMap versionedMap{0};
|
||||
|
||||
auto setAndClear = [&versionedMap](int64_t version) {
|
||||
const int64_t k = __builtin_bswap64(version);
|
||||
const int64_t zero = __builtin_bswap64(0);
|
||||
weaselab::VersionedMap::Mutation m[] = {
|
||||
{(const uint8_t *)&zero, (const uint8_t *)&k, 8, 8,
|
||||
weaselab::VersionedMap::Clear},
|
||||
{(const uint8_t *)&k, (const uint8_t *)&k, 8, 8,
|
||||
weaselab::VersionedMap::Set},
|
||||
};
|
||||
versionedMap.addMutations(m, sizeof(m) / sizeof(m[0]), version);
|
||||
assert(versionedMap.getVersion() == version);
|
||||
};
|
||||
|
||||
int64_t version = 0;
|
||||
while (version < 1000) {
|
||||
++version;
|
||||
setAndClear(version);
|
||||
}
|
||||
|
||||
std::latch ready{2};
|
||||
|
||||
auto writer = std::thread{[&]() {
|
||||
ready.arrive_and_wait();
|
||||
|
||||
int64_t version = 1000;
|
||||
while (version < 100000) {
|
||||
++version;
|
||||
setAndClear(version);
|
||||
}
|
||||
}};
|
||||
|
||||
ready.arrive_and_wait();
|
||||
|
||||
version = 0;
|
||||
while (version < 1000) {
|
||||
++version;
|
||||
|
||||
auto iter = versionedMap.begin(version);
|
||||
|
||||
auto m = *iter++;
|
||||
int64_t k = __builtin_bswap64(version);
|
||||
assert(m.version == version);
|
||||
assert(m.param1Len == 8);
|
||||
assert(m.param2Len == 8);
|
||||
int64_t zero = __builtin_bswap64(0);
|
||||
assert(memcmp(m.param1, &zero, 8) == 0);
|
||||
assert(memcmp(m.param2, &k, 8) == 0);
|
||||
assert(m.type == weaselab::VersionedMap::Clear);
|
||||
|
||||
m = *iter++;
|
||||
assert(m.version == version);
|
||||
assert(m.param1Len == 8);
|
||||
assert(m.param2Len == 8);
|
||||
assert(memcmp(m.param1, &k, 8) == 0);
|
||||
assert(memcmp(m.param2, &k, 8) == 0);
|
||||
assert(m.type == weaselab::VersionedMap::Set);
|
||||
|
||||
assert(iter == versionedMap.end(version));
|
||||
}
|
||||
|
||||
writer.join();
|
||||
|
||||
debugVerboseEnabled = true;
|
||||
printf("Before gc: %" PRId64 "\n", versionedMap.getBytes());
|
||||
versionedMap.setOldestVersion(versionedMap.getVersion());
|
||||
printf("After gc: %" PRId64 "\n", versionedMap.getBytes());
|
||||
assert(versionedMap.getOldestVersion() == versionedMap.getVersion());
|
||||
for (auto iter = versionedMap.begin(versionedMap.getVersion()),
|
||||
end = versionedMap.end(versionedMap.getVersion());
|
||||
iter != end; ++iter) {
|
||||
printMutation(*iter);
|
||||
}
|
||||
}
|
||||
|
||||
int main() { setAndClearPrev(); }
|
Reference in New Issue
Block a user