1 // Tencent is pleased to support the open source community by making RapidJSON available.
2 //
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4 //
5 // Licensed under the MIT License (the "License"); you may not use this file except
6 // in compliance with the License. You may obtain a copy of the License at
7 //
8 // http://opensource.org/licenses/MIT
9 //
10 // Unless required by applicable law or agreed to in writing, software distributed
11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13 // specific language governing permissions and limitations under the License.
14 
15 #include "unittest.h"
16 
17 #include "rapidjson/document.h"
18 
19 using namespace rapidjson;
20 
ReadFile(const char * filename,size_t & length)21 static char* ReadFile(const char* filename, size_t& length) {
22     const char *paths[] = {
23         "jsonchecker/%s",
24         "bin/jsonchecker/%s",
25         "../bin/jsonchecker/%s",
26         "../../bin/jsonchecker/%s",
27         "../../../bin/jsonchecker/%s"
28     };
29     char buffer[1024];
30     FILE *fp = 0;
31     for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
32         sprintf(buffer, paths[i], filename);
33         fp = fopen(buffer, "rb");
34         if (fp)
35             break;
36     }
37 
38     if (!fp)
39         return 0;
40 
41     fseek(fp, 0, SEEK_END);
42     length = (size_t)ftell(fp);
43     fseek(fp, 0, SEEK_SET);
44     char* json = (char*)malloc(length + 1);
45     size_t readLength = fread(json, 1, length, fp);
46     json[readLength] = '\0';
47     fclose(fp);
48     return json;
49 }
50 
TEST(JsonChecker,Reader)51 TEST(JsonChecker, Reader) {
52     char filename[256];
53 
54     // jsonchecker/failXX.json
55     for (int i = 1; i <= 33; i++) {
56         if (i == 1) // fail1.json is valid in rapidjson, which has no limitation on type of root element (RFC 7159).
57             continue;
58         if (i == 18)    // fail18.json is valid in rapidjson, which has no limitation on depth of nesting.
59             continue;
60 
61         sprintf(filename, "fail%d.json", i);
62         size_t length;
63         char* json = ReadFile(filename, length);
64         if (!json) {
65             printf("jsonchecker file %s not found", filename);
66             ADD_FAILURE();
67             continue;
68         }
69 
70         GenericDocument<UTF8<>, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak)
71         document.Parse((const char*)json);
72         EXPECT_TRUE(document.HasParseError());
73 
74         document.Parse<kParseIterativeFlag>((const char*)json);
75         EXPECT_TRUE(document.HasParseError());
76 
77         free(json);
78     }
79 
80     // passX.json
81     for (int i = 1; i <= 3; i++) {
82         sprintf(filename, "pass%d.json", i);
83         size_t length;
84         char* json = ReadFile(filename, length);
85         if (!json) {
86             printf("jsonchecker file %s not found", filename);
87             continue;
88         }
89 
90         GenericDocument<UTF8<>, CrtAllocator> document; // Use Crt allocator to check exception-safety (no memory leak)
91         document.Parse((const char*)json);
92         EXPECT_FALSE(document.HasParseError());
93 
94         document.Parse<kParseIterativeFlag>((const char*)json);
95         EXPECT_FALSE(document.HasParseError());
96 
97         free(json);
98     }
99 }
100