diff options
author | Max Galkin <maksim.galkin@gmail.com> | 2015-03-07 13:00:05 -0800 |
---|---|---|
committer | Wouter van Oortmerssen <wvo@google.com> | 2015-03-11 17:27:39 -0700 |
commit | 4464405250ee9151177d3f4b88fb9959c924ad37 (patch) | |
tree | b8fc9dc8aea38c50d7d16cd492b816dff957638d /tests/test.cpp | |
parent | c3807fa39dda5445924ef77253efb446459f6e56 (diff) | |
download | flatbuffers-4464405250ee9151177d3f4b88fb9959c924ad37.tar.gz flatbuffers-4464405250ee9151177d3f4b88fb9959c924ad37.tar.bz2 flatbuffers-4464405250ee9151177d3f4b88fb9959c924ad37.zip |
Make FuzzTest2 fuzzier.
1. Random table fields are now marked deprecated. The deprecation rate is adjustable, default is ~10% of fields.
2. Vector type previously produced a dummy field, now a trivial ubyte vector is generated instead.
3. The fuzzed "instances" were previously generated with identical data, now they are randomized: I suppose such was the intent from the beginning, just wasn't implemented.
I ran the new test with a few different settings and random seeds (but only on Windows + VS2015), and it always passed.
Change-Id: I2014686b6680aec24049ccda3f6deffe5205a83e
Diffstat (limited to 'tests/test.cpp')
-rw-r--r-- | tests/test.cpp | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/tests/test.cpp b/tests/test.cpp index ae86f776..4f9a12c5 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -366,6 +366,8 @@ void FuzzTest2() { const int num_struct_definitions = 5; // Subset of num_definitions. const int fields_per_definition = 15; const int instances_per_definition = 5; + const int deprecation_rate = 10; // 1 in deprecation_rate fields will + // be deprecated. std::string schema = "namespace test;\n\n"; @@ -404,24 +406,41 @@ void FuzzTest2() { "{\n"); for (int field = 0; field < fields_per_definition; field++) { + const bool is_last_field = field == fields_per_definition - 1; + + // Deprecate 1 in deprecation_rate fields. Only table fields can be + // deprecated. + // Don't deprecate the last field to avoid dangling commas in JSON. + const bool deprecated = !is_struct && + !is_last_field && + (lcg_rand() % deprecation_rate == 0); + std::string field_name = "f" + flatbuffers::NumToString(field); AddToSchemaAndInstances((" " + field_name + ":").c_str(), - (field_name + ": ").c_str()); + deprecated ? "" : (field_name + ": ").c_str()); // Pick random type: int base_type = lcg_rand() % (flatbuffers::BASE_TYPE_UNION + 1); switch (base_type) { case flatbuffers::BASE_TYPE_STRING: if (is_struct) { - Dummy(); // No strings in structs, + Dummy(); // No strings in structs. } else { - AddToSchemaAndInstances("string", "\"hi\""); + AddToSchemaAndInstances("string", deprecated ? "" : "\"hi\""); + } + break; + case flatbuffers::BASE_TYPE_VECTOR: + if (is_struct) { + Dummy(); // No vectors in structs. + } + else { + AddToSchemaAndInstances("[ubyte]", + deprecated ? "" : "[\n0,\n1,\n255\n]"); } break; case flatbuffers::BASE_TYPE_NONE: case flatbuffers::BASE_TYPE_UTYPE: case flatbuffers::BASE_TYPE_STRUCT: case flatbuffers::BASE_TYPE_UNION: - case flatbuffers::BASE_TYPE_VECTOR: if (definition) { // Pick a random previous definition and random data instance of // that definition. @@ -429,7 +448,9 @@ void FuzzTest2() { int instance = lcg_rand() % instances_per_definition; AddToSchemaAndInstances( ("D" + flatbuffers::NumToString(defref)).c_str(), - definitions[defref].instances[instance].c_str()); + deprecated + ? "" + : definitions[defref].instances[instance].c_str()); } else { // If this is the first definition, we have no definition we can // refer to. @@ -438,13 +459,18 @@ void FuzzTest2() { break; default: // All the scalar types. - AddToSchemaAndInstances( - flatbuffers::kTypeNames[base_type], - flatbuffers::NumToString(lcg_rand() % 128).c_str()); + schema += flatbuffers::kTypeNames[base_type]; + + if (!deprecated) { + // We want each instance to use its own random value. + for (int inst = 0; inst < instances_per_definition; inst++) + definitions[definition].instances[inst] += + flatbuffers::NumToString(lcg_rand() % 128).c_str(); + } } AddToSchemaAndInstances( - ";\n", - field == fields_per_definition - 1 ? "\n" : ",\n"); + deprecated ? "(deprecated);\n" : ";\n", + deprecated ? "" : is_last_field ? "\n" : ",\n"); } AddToSchemaAndInstances("}\n\n", "}"); } @@ -596,7 +622,8 @@ int main(int /*argc*/, const char * /*argv*/[]) { std::string rawbuf; auto flatbuf = CreateFlatBufferTest(rawbuf); - AccessFlatBufferTest(reinterpret_cast<const uint8_t *>(rawbuf.c_str()), rawbuf.length()); + AccessFlatBufferTest(reinterpret_cast<const uint8_t *>(rawbuf.c_str()), + rawbuf.length()); AccessFlatBufferTest(flatbuf.get(), rawbuf.length()); #ifndef __ANDROID__ // requires file access |