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