Files
versioned-map/ApiTest.cpp

90 lines
2.4 KiB
C++

#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, 8, (const uint8_t *)&k, 8,
weaselab::VersionedMap::Clear},
{(const uint8_t *)&k, 8, (const uint8_t *)&k, 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.notModifiedSince == 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.notModifiedSince == 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(); }