Coverage Report

Created: 2025-12-03 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/valijson/tests/fuzzing/fuzzer.cpp
Line
Count
Source
1
#include <valijson/adapters/rapidjson_adapter.hpp>
2
#include <valijson/schema_parser.hpp>
3
#include <valijson/validator.hpp>
4
5
using valijson::Schema;
6
using valijson::SchemaParser;
7
using valijson::ValidationResults;
8
using valijson::Validator;
9
using valijson::adapters::AdapterTraits;
10
using valijson::adapters::RapidJsonAdapter;
11
using AdapterType = RapidJsonAdapter;
12
13
void runOneTest(const AdapterType &test, const Schema &schema,
14
                Validator::TypeCheckingMode mode)
15
28.4k
{
16
28.4k
    try {
17
28.4k
        if (!test.isObject()) {
18
147
            return;
19
147
        }
20
21
28.3k
        const AdapterType::Object testObject = test.getObject();
22
28.3k
        const auto dataItr = testObject.find("data");
23
24
28.3k
        if (dataItr == testObject.end()) {
25
5.09k
            return;
26
5.09k
        }
27
28
23.2k
        Validator validator(mode);
29
23.2k
        ValidationResults results;
30
23.2k
        validator.validate(schema, dataItr->second, &results);
31
23.2k
    } catch (const std::exception &) {
32
7.62k
    }
33
28.4k
}
34
35
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
36
5.16k
{
37
5.16k
    AdapterTraits<AdapterType>::DocumentType document;
38
5.16k
    document.template Parse<rapidjson::kParseIterativeFlag>(reinterpret_cast<const char *>(data), size);
39
40
5.16k
    if (document.HasParseError() || !document.IsArray()) {
41
1.01k
        return 0;
42
1.01k
    }
43
44
26.4k
    for (const auto &testCase : AdapterType(document).getArray()) {
45
26.4k
        if (!testCase.isObject()) {
46
4.55k
            continue;
47
4.55k
        }
48
49
21.9k
        const AdapterType::Object object = testCase.getObject();
50
21.9k
        const auto schemaItr = object.find("schema");
51
21.9k
        const auto testsItr = object.find("tests");
52
53
21.9k
        if (schemaItr == object.end() || testsItr == object.end() ||
54
19.9k
            !testsItr->second.isArray()) {
55
1.90k
            continue;
56
1.90k
        }
57
58
19.9k
        Schema schema;
59
19.9k
        SchemaParser parser(size % 2 ? SchemaParser::kDraft4
60
19.9k
                                     : SchemaParser::kDraft7);
61
62
19.9k
        try {
63
19.9k
            parser.populateSchema(schemaItr->second, schema);
64
19.9k
        } catch (const std::exception &) {
65
11.6k
            continue;
66
11.6k
        }
67
68
8.39k
        const auto mode = testsItr->second.hasStrictTypes()
69
8.39k
                              ? Validator::kStrongTypes
70
8.39k
                              : Validator::kWeakTypes;
71
72
28.4k
        for (const AdapterType test : testsItr->second.getArray()) {
73
28.4k
            runOneTest(test, schema, mode);
74
28.4k
        }
75
8.39k
    }
76
77
4.14k
    return 0;
78
4.14k
}