Skip to content

Commit fafa9cc

Browse files
author
MarcoFalke
committed
test: Embed univalue json tests in binary
1 parent fa04485 commit fafa9cc

File tree

2 files changed

+232
-95
lines changed

2 files changed

+232
-95
lines changed

src/univalue/CMakeLists.txt

Lines changed: 113 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,119 @@ target_include_directories(univalue
1515
target_link_libraries(univalue PRIVATE core_interface)
1616

1717
if(BUILD_TESTS)
18-
add_executable(unitester test/unitester.cpp)
19-
target_compile_definitions(unitester
20-
PRIVATE
21-
JSON_TEST_SRC=\"${CMAKE_CURRENT_SOURCE_DIR}/test\"
18+
include(GenerateHeaders)
19+
generate_header_from_json(test/fail1.json)
20+
generate_header_from_json(test/fail10.json)
21+
generate_header_from_json(test/fail11.json)
22+
generate_header_from_json(test/fail12.json)
23+
generate_header_from_json(test/fail13.json)
24+
generate_header_from_json(test/fail14.json)
25+
generate_header_from_json(test/fail15.json)
26+
generate_header_from_json(test/fail16.json)
27+
generate_header_from_json(test/fail17.json)
28+
generate_header_from_json(test/fail18.json)
29+
generate_header_from_json(test/fail19.json)
30+
generate_header_from_json(test/fail2.json)
31+
generate_header_from_json(test/fail20.json)
32+
generate_header_from_json(test/fail21.json)
33+
generate_header_from_json(test/fail22.json)
34+
generate_header_from_json(test/fail23.json)
35+
generate_header_from_json(test/fail24.json)
36+
generate_header_from_json(test/fail25.json)
37+
generate_header_from_json(test/fail26.json)
38+
generate_header_from_json(test/fail27.json)
39+
generate_header_from_json(test/fail28.json)
40+
generate_header_from_json(test/fail29.json)
41+
generate_header_from_json(test/fail3.json)
42+
generate_header_from_json(test/fail30.json)
43+
generate_header_from_json(test/fail31.json)
44+
generate_header_from_json(test/fail32.json)
45+
generate_header_from_json(test/fail33.json)
46+
generate_header_from_json(test/fail34.json)
47+
generate_header_from_json(test/fail35.json)
48+
generate_header_from_json(test/fail36.json)
49+
generate_header_from_json(test/fail37.json)
50+
generate_header_from_json(test/fail38.json)
51+
generate_header_from_json(test/fail39.json)
52+
generate_header_from_json(test/fail4.json)
53+
generate_header_from_json(test/fail40.json)
54+
generate_header_from_json(test/fail41.json)
55+
generate_header_from_json(test/fail42.json)
56+
generate_header_from_json(test/fail44.json)
57+
generate_header_from_json(test/fail45.json)
58+
generate_header_from_json(test/fail5.json)
59+
generate_header_from_json(test/fail6.json)
60+
generate_header_from_json(test/fail7.json)
61+
generate_header_from_json(test/fail8.json)
62+
generate_header_from_json(test/fail9.json)
63+
generate_header_from_json(test/pass1.json)
64+
generate_header_from_json(test/pass2.json)
65+
generate_header_from_json(test/pass3.json)
66+
generate_header_from_json(test/pass4.json)
67+
generate_header_from_json(test/round1.json)
68+
generate_header_from_json(test/round2.json)
69+
generate_header_from_json(test/round3.json)
70+
generate_header_from_json(test/round4.json)
71+
generate_header_from_json(test/round5.json)
72+
generate_header_from_json(test/round6.json)
73+
generate_header_from_json(test/round7.json)
74+
add_executable(unitester
75+
${CMAKE_CURRENT_BINARY_DIR}/test/fail1.json.h
76+
${CMAKE_CURRENT_BINARY_DIR}/test/fail10.json.h
77+
${CMAKE_CURRENT_BINARY_DIR}/test/fail11.json.h
78+
${CMAKE_CURRENT_BINARY_DIR}/test/fail12.json.h
79+
${CMAKE_CURRENT_BINARY_DIR}/test/fail13.json.h
80+
${CMAKE_CURRENT_BINARY_DIR}/test/fail14.json.h
81+
${CMAKE_CURRENT_BINARY_DIR}/test/fail15.json.h
82+
${CMAKE_CURRENT_BINARY_DIR}/test/fail16.json.h
83+
${CMAKE_CURRENT_BINARY_DIR}/test/fail17.json.h
84+
${CMAKE_CURRENT_BINARY_DIR}/test/fail18.json.h
85+
${CMAKE_CURRENT_BINARY_DIR}/test/fail19.json.h
86+
${CMAKE_CURRENT_BINARY_DIR}/test/fail2.json.h
87+
${CMAKE_CURRENT_BINARY_DIR}/test/fail20.json.h
88+
${CMAKE_CURRENT_BINARY_DIR}/test/fail21.json.h
89+
${CMAKE_CURRENT_BINARY_DIR}/test/fail22.json.h
90+
${CMAKE_CURRENT_BINARY_DIR}/test/fail23.json.h
91+
${CMAKE_CURRENT_BINARY_DIR}/test/fail24.json.h
92+
${CMAKE_CURRENT_BINARY_DIR}/test/fail25.json.h
93+
${CMAKE_CURRENT_BINARY_DIR}/test/fail26.json.h
94+
${CMAKE_CURRENT_BINARY_DIR}/test/fail27.json.h
95+
${CMAKE_CURRENT_BINARY_DIR}/test/fail28.json.h
96+
${CMAKE_CURRENT_BINARY_DIR}/test/fail29.json.h
97+
${CMAKE_CURRENT_BINARY_DIR}/test/fail3.json.h
98+
${CMAKE_CURRENT_BINARY_DIR}/test/fail30.json.h
99+
${CMAKE_CURRENT_BINARY_DIR}/test/fail31.json.h
100+
${CMAKE_CURRENT_BINARY_DIR}/test/fail32.json.h
101+
${CMAKE_CURRENT_BINARY_DIR}/test/fail33.json.h
102+
${CMAKE_CURRENT_BINARY_DIR}/test/fail34.json.h
103+
${CMAKE_CURRENT_BINARY_DIR}/test/fail35.json.h
104+
${CMAKE_CURRENT_BINARY_DIR}/test/fail36.json.h
105+
${CMAKE_CURRENT_BINARY_DIR}/test/fail37.json.h
106+
${CMAKE_CURRENT_BINARY_DIR}/test/fail38.json.h
107+
${CMAKE_CURRENT_BINARY_DIR}/test/fail39.json.h
108+
${CMAKE_CURRENT_BINARY_DIR}/test/fail4.json.h
109+
${CMAKE_CURRENT_BINARY_DIR}/test/fail40.json.h
110+
${CMAKE_CURRENT_BINARY_DIR}/test/fail41.json.h
111+
${CMAKE_CURRENT_BINARY_DIR}/test/fail42.json.h
112+
${CMAKE_CURRENT_BINARY_DIR}/test/fail44.json.h
113+
${CMAKE_CURRENT_BINARY_DIR}/test/fail45.json.h
114+
${CMAKE_CURRENT_BINARY_DIR}/test/fail5.json.h
115+
${CMAKE_CURRENT_BINARY_DIR}/test/fail6.json.h
116+
${CMAKE_CURRENT_BINARY_DIR}/test/fail7.json.h
117+
${CMAKE_CURRENT_BINARY_DIR}/test/fail8.json.h
118+
${CMAKE_CURRENT_BINARY_DIR}/test/fail9.json.h
119+
${CMAKE_CURRENT_BINARY_DIR}/test/pass1.json.h
120+
${CMAKE_CURRENT_BINARY_DIR}/test/pass2.json.h
121+
${CMAKE_CURRENT_BINARY_DIR}/test/pass3.json.h
122+
${CMAKE_CURRENT_BINARY_DIR}/test/pass4.json.h
123+
${CMAKE_CURRENT_BINARY_DIR}/test/round1.json.h
124+
${CMAKE_CURRENT_BINARY_DIR}/test/round2.json.h
125+
${CMAKE_CURRENT_BINARY_DIR}/test/round3.json.h
126+
${CMAKE_CURRENT_BINARY_DIR}/test/round4.json.h
127+
${CMAKE_CURRENT_BINARY_DIR}/test/round5.json.h
128+
${CMAKE_CURRENT_BINARY_DIR}/test/round6.json.h
129+
${CMAKE_CURRENT_BINARY_DIR}/test/round7.json.h
130+
test/unitester.cpp
22131
)
23132
target_link_libraries(unitester
24133
PRIVATE

src/univalue/test/unitester.cpp

Lines changed: 119 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,71 @@
11
// Copyright 2014 BitPay Inc.
2-
// Distributed under the MIT/X11 software license, see the accompanying
2+
// Copyright (c) 2015-present The Bitcoin Core developers
3+
// Distributed under the MIT software license, see the accompanying
34
// file COPYING or https://opensource.org/licenses/mit-license.php.
45

56
#include <univalue.h>
67

8+
#include <univalue/test/fail1.json.h>
9+
#include <univalue/test/fail10.json.h>
10+
#include <univalue/test/fail11.json.h>
11+
#include <univalue/test/fail12.json.h>
12+
#include <univalue/test/fail13.json.h>
13+
#include <univalue/test/fail14.json.h>
14+
#include <univalue/test/fail15.json.h>
15+
#include <univalue/test/fail16.json.h>
16+
#include <univalue/test/fail17.json.h>
17+
#include <univalue/test/fail18.json.h>
18+
#include <univalue/test/fail19.json.h>
19+
#include <univalue/test/fail2.json.h>
20+
#include <univalue/test/fail20.json.h>
21+
#include <univalue/test/fail21.json.h>
22+
#include <univalue/test/fail22.json.h>
23+
#include <univalue/test/fail23.json.h>
24+
#include <univalue/test/fail24.json.h>
25+
#include <univalue/test/fail25.json.h>
26+
#include <univalue/test/fail26.json.h>
27+
#include <univalue/test/fail27.json.h>
28+
#include <univalue/test/fail28.json.h>
29+
#include <univalue/test/fail29.json.h>
30+
#include <univalue/test/fail3.json.h>
31+
#include <univalue/test/fail30.json.h>
32+
#include <univalue/test/fail31.json.h>
33+
#include <univalue/test/fail32.json.h>
34+
#include <univalue/test/fail33.json.h>
35+
#include <univalue/test/fail34.json.h>
36+
#include <univalue/test/fail35.json.h>
37+
#include <univalue/test/fail36.json.h>
38+
#include <univalue/test/fail37.json.h>
39+
#include <univalue/test/fail38.json.h>
40+
#include <univalue/test/fail39.json.h>
41+
#include <univalue/test/fail4.json.h>
42+
#include <univalue/test/fail40.json.h>
43+
#include <univalue/test/fail41.json.h>
44+
#include <univalue/test/fail42.json.h>
45+
#include <univalue/test/fail44.json.h>
46+
#include <univalue/test/fail45.json.h>
47+
#include <univalue/test/fail5.json.h>
48+
#include <univalue/test/fail6.json.h>
49+
#include <univalue/test/fail7.json.h>
50+
#include <univalue/test/fail8.json.h>
51+
#include <univalue/test/fail9.json.h>
52+
#include <univalue/test/pass1.json.h>
53+
#include <univalue/test/pass2.json.h>
54+
#include <univalue/test/pass3.json.h>
55+
#include <univalue/test/pass4.json.h>
56+
#include <univalue/test/round1.json.h>
57+
#include <univalue/test/round2.json.h>
58+
#include <univalue/test/round3.json.h>
59+
#include <univalue/test/round4.json.h>
60+
#include <univalue/test/round5.json.h>
61+
#include <univalue/test/round6.json.h>
62+
#include <univalue/test/round7.json.h>
63+
64+
#include <array>
765
#include <cassert>
866
#include <cstdio>
967
#include <string>
1068

11-
#ifndef JSON_TEST_SRC
12-
#error JSON_TEST_SRC must point to test source directory
13-
#endif
14-
15-
std::string srcdir(JSON_TEST_SRC);
16-
1769
static std::string rtrim(std::string s)
1870
{
1971
s.erase(s.find_last_not_of(" \n\r\t")+1);
@@ -44,87 +96,64 @@ static void runtest(std::string filename, const std::string& jdata)
4496
}
4597
}
4698

47-
static void runtest_file(const char *filename_)
48-
{
49-
std::string basename(filename_);
50-
std::string filename = srcdir + "/" + basename;
51-
FILE *f = fopen(filename.c_str(), "r");
52-
assert(f != nullptr);
53-
54-
std::string jdata;
55-
56-
char buf[4096];
57-
while (!feof(f)) {
58-
int bread = fread(buf, 1, sizeof(buf), f);
59-
assert(!ferror(f));
60-
61-
std::string s(buf, bread);
62-
jdata += s;
63-
}
64-
65-
assert(!ferror(f));
66-
fclose(f);
67-
68-
runtest(basename, jdata);
69-
}
70-
71-
static const char *filenames[] = {
72-
"fail1.json",
73-
"fail10.json",
74-
"fail11.json",
75-
"fail12.json",
76-
"fail13.json",
77-
"fail14.json",
78-
"fail15.json",
79-
"fail16.json",
80-
"fail17.json",
81-
"fail18.json",
82-
"fail19.json",
83-
"fail2.json",
84-
"fail20.json",
85-
"fail21.json",
86-
"fail22.json",
87-
"fail23.json",
88-
"fail24.json",
89-
"fail25.json",
90-
"fail26.json",
91-
"fail27.json",
92-
"fail28.json",
93-
"fail29.json",
94-
"fail3.json",
95-
"fail30.json",
96-
"fail31.json",
97-
"fail32.json",
98-
"fail33.json",
99-
"fail34.json",
100-
"fail35.json",
101-
"fail36.json",
102-
"fail37.json",
103-
"fail38.json", // invalid unicode: only first half of surrogate pair
104-
"fail39.json", // invalid unicode: only second half of surrogate pair
105-
"fail4.json", // extra comma
106-
"fail40.json", // invalid unicode: broken UTF-8
107-
"fail41.json", // invalid unicode: unfinished UTF-8
108-
"fail42.json", // valid json with garbage following a nul byte
109-
"fail44.json", // unterminated string
110-
"fail45.json", // nested beyond max depth
111-
"fail5.json",
112-
"fail6.json",
113-
"fail7.json",
114-
"fail8.json",
115-
"fail9.json", // extra comma
116-
"pass1.json",
117-
"pass2.json",
118-
"pass3.json",
119-
"pass4.json",
120-
"round1.json", // round-trip test
121-
"round2.json", // unicode
122-
"round3.json", // bare string
123-
"round4.json", // bare number
124-
"round5.json", // bare true
125-
"round6.json", // bare false
126-
"round7.json", // bare null
127-
};
99+
#define TEST_FILE(name) {#name, json_tests::name}
100+
inline constexpr std::array tests{std::to_array<std::tuple<std::string_view, std::string_view>>({
101+
TEST_FILE(fail1),
102+
TEST_FILE(fail10),
103+
TEST_FILE(fail11),
104+
TEST_FILE(fail12),
105+
TEST_FILE(fail13),
106+
TEST_FILE(fail14),
107+
TEST_FILE(fail15),
108+
TEST_FILE(fail16),
109+
TEST_FILE(fail17),
110+
TEST_FILE(fail18),
111+
TEST_FILE(fail19),
112+
TEST_FILE(fail2),
113+
TEST_FILE(fail20),
114+
TEST_FILE(fail21),
115+
TEST_FILE(fail22),
116+
TEST_FILE(fail23),
117+
TEST_FILE(fail24),
118+
TEST_FILE(fail25),
119+
TEST_FILE(fail26),
120+
TEST_FILE(fail27),
121+
TEST_FILE(fail28),
122+
TEST_FILE(fail29),
123+
TEST_FILE(fail3),
124+
TEST_FILE(fail30),
125+
TEST_FILE(fail31),
126+
TEST_FILE(fail32),
127+
TEST_FILE(fail33),
128+
TEST_FILE(fail34),
129+
TEST_FILE(fail35),
130+
TEST_FILE(fail36),
131+
TEST_FILE(fail37),
132+
TEST_FILE(fail38), // invalid unicode: only first half of surrogate pair
133+
TEST_FILE(fail39), // invalid unicode: only second half of surrogate pair
134+
TEST_FILE(fail4), // extra comma
135+
TEST_FILE(fail40), // invalid unicode: broken UTF-8
136+
TEST_FILE(fail41), // invalid unicode: unfinished UTF-8
137+
TEST_FILE(fail42), // valid json with garbage following a nul byte
138+
TEST_FILE(fail44), // unterminated string
139+
TEST_FILE(fail45), // nested beyond max depth
140+
TEST_FILE(fail5),
141+
TEST_FILE(fail6),
142+
TEST_FILE(fail7),
143+
TEST_FILE(fail8),
144+
TEST_FILE(fail9), // extra comma
145+
TEST_FILE(pass1),
146+
TEST_FILE(pass2),
147+
TEST_FILE(pass3),
148+
TEST_FILE(pass4),
149+
TEST_FILE(round1), // round-trip test
150+
TEST_FILE(round2), // unicode
151+
TEST_FILE(round3), // bare string
152+
TEST_FILE(round4), // bare number
153+
TEST_FILE(round5), // bare true
154+
TEST_FILE(round6), // bare false
155+
TEST_FILE(round7), // bare null
156+
})};
128157

129158
// Test \u handling
130159
void unescape_unicode_test()
@@ -158,13 +187,12 @@ void no_nul_test()
158187

159188
int main (int argc, char *argv[])
160189
{
161-
for (const auto& f: filenames) {
162-
runtest_file(f);
190+
for (const auto& [file, json] : tests) {
191+
runtest(std::string{file}, std::string{json});
163192
}
164193

165194
unescape_unicode_test();
166195
no_nul_test();
167196

168197
return 0;
169198
}
170-

0 commit comments

Comments
 (0)