// Tencent is pleased to support the open source community by making RapidJSON available. // // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. // // Licensed under the MIT License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://opensource.org/licenses/MIT // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #include "unittest.h" #include "rapidjson/document.h" using namespace rapidjson; static char* ReadFile(const char* filename, size_t& length) { const char *paths[] = { "jsonchecker/%s", "bin/jsonchecker/%s", "../bin/jsonchecker/%s", "../../bin/jsonchecker/%s", "../../../bin/jsonchecker/%s" }; char buffer[1024]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { sprintf(buffer, paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; } if (!fp) return 0; fseek(fp, 0, SEEK_END); length = (size_t)ftell(fp); fseek(fp, 0, SEEK_SET); char* json = (char*)malloc(length + 1); size_t readLength = fread(json, 1, length, fp); json[readLength] = '\0'; fclose(fp); return json; } TEST(JsonChecker, Reader) { char filename[256]; // jsonchecker/failXX.json for (int i = 1; i <= 33; i++) { if (i == 1) // fail1.json is valid in rapidjson, which has no limitation on type of root element (RFC 7159). continue; if (i == 18) // fail18.json is valid in rapidjson, which has no limitation on depth of nesting. continue; sprintf(filename, "fail%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { printf("jsonchecker file %s not found", filename); ADD_FAILURE(); continue; } GenericDocument<UTF8<>, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak) document.Parse((const char*)json); EXPECT_TRUE(document.HasParseError()); document.Parse<kParseIterativeFlag>((const char*)json); EXPECT_TRUE(document.HasParseError()); free(json); } // passX.json for (int i = 1; i <= 3; i++) { sprintf(filename, "pass%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { printf("jsonchecker file %s not found", filename); continue; } GenericDocument<UTF8<>, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak) document.Parse((const char*)json); EXPECT_FALSE(document.HasParseError()); document.Parse<kParseIterativeFlag>((const char*)json); EXPECT_FALSE(document.HasParseError()); free(json); } }