Add fuzz test

This commit is contained in:
2024-01-19 15:48:07 -08:00
parent a2a55c9717
commit 756f74c6de
3 changed files with 58 additions and 7 deletions

View File

@@ -6,6 +6,7 @@
#include <cstring>
#include <map>
#include <random>
#include <set>
#include <span>
#include <string>
#include <string_view>
@@ -825,7 +826,7 @@ void rotate(Node **node, bool dir) {
updateMaxVersion(l);
}
void checkParentPointers(Node *node, bool &success) {
[[maybe_unused]] void checkParentPointers(Node *node, bool &success) {
for (int i = 0; i < 2; ++i) {
if (node->child[i] != nullptr) {
if (node->child[i]->parent != node) {
@@ -839,7 +840,7 @@ void checkParentPointers(Node *node, bool &success) {
}
}
int64_t checkMaxVersion(Node *node, bool &success) {
[[maybe_unused]] int64_t checkMaxVersion(Node *node, bool &success) {
int64_t expected = std::max(node->pointVersion, node->rangeVersion);
for (int i = 0; i < 2; ++i) {
if (node->child[i] != nullptr) {
@@ -1213,4 +1214,38 @@ int main(void) {
bool success = checkCorrectness(cs.root, refImpl);
return success ? 0 : 1;
}
#endif
#ifdef ENABLE_FUZZ
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
initFuzz(data, size);
int64_t writeVersion = 0;
ConflictSet::Impl cs{writeVersion};
ReferenceImpl refImpl{writeVersion};
while (gArbitrary.hasEntropy()) {
Arena arena;
int numWrites = gArbitrary.bounded(10);
int64_t v = ++writeVersion;
auto *writes = new (arena) ConflictSet::WriteRange[numWrites];
std::set<int> keys;
while (int(keys.size()) < numWrites) {
keys.insert(gRandom.bounded(100));
}
auto iter = keys.begin();
for (int i = 0; i < numWrites; ++i) {
writes[i].begin = toKey(arena, *iter++);
writes[i].end.len = 0;
writes[i].writeVersion = v;
}
cs.addWrites(writes, numWrites);
refImpl.addWrites(writes, numWrites);
bool success = checkCorrectness(cs.root, refImpl);
if (!success) {
abort();
}
}
return 0;
}
#endif