Add fuzz test
This commit is contained in:
@@ -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
|
Reference in New Issue
Block a user