blob: dd709082af682ed55181aad8733412001a803a55 [file] [log] [blame]
Austin Schuh3e95e5d2019-09-20 00:08:54 -07001#include "aos/json_to_flatbuffer.h"
2
Austin Schuh3e95e5d2019-09-20 00:08:54 -07003#include "aos/json_to_flatbuffer_generated.h"
4#include "flatbuffers/minireflect.h"
Brian Silverman5c710412021-02-09 19:09:32 -08005#include "gtest/gtest.h"
Austin Schuh3e95e5d2019-09-20 00:08:54 -07006
7namespace aos {
8namespace testing {
9
10class JsonToFlatbufferTest : public ::testing::Test {
11 public:
12 JsonToFlatbufferTest() {}
13
14 bool JsonAndBack(const ::std::string str) { return JsonAndBack(str, str); }
15
16 bool JsonAndBack(const ::std::string in, const ::std::string out) {
17 printf("Testing: %s\n", in.c_str());
Austin Schuhadd6eb32020-11-09 21:24:26 -080018 FlatbufferDetachedBuffer<Configuration> fb =
19 JsonToFlatbuffer<Configuration>(in.data());
Austin Schuh3e95e5d2019-09-20 00:08:54 -070020
Austin Schuhadd6eb32020-11-09 21:24:26 -080021 if (fb.span().size() == 0) {
Austin Schuh3e95e5d2019-09-20 00:08:54 -070022 return false;
23 }
24
Austin Schuhadd6eb32020-11-09 21:24:26 -080025 const ::std::string back = FlatbufferToJson(fb);
Austin Schuh3e95e5d2019-09-20 00:08:54 -070026
27 printf("Back to string: %s\n", back.c_str());
28
29 return back == out;
30 }
31};
32
33// Tests that the various escapes work as expected.
34TEST_F(JsonToFlatbufferTest, ValidEscapes) {
35 EXPECT_TRUE(
36 JsonAndBack("{ \"foo_string\": \"a\\\"b\\/c\\bd\\fc\\nd\\re\\tf\" }",
37 "{ \"foo_string\": \"a\\\"b/c\\bd\\fc\\nd\\re\\tf\" }"));
38}
39
40// Test the easy ones. Test every type, single, no nesting.
41TEST_F(JsonToFlatbufferTest, Basic) {
42 EXPECT_TRUE(JsonAndBack("{ \"foo_bool\": true }"));
43
44 EXPECT_TRUE(JsonAndBack("{ \"foo_byte\": 5 }"));
45 EXPECT_TRUE(JsonAndBack("{ \"foo_ubyte\": 5 }"));
46
47 EXPECT_TRUE(JsonAndBack("{ \"foo_short\": 5 }"));
48 EXPECT_TRUE(JsonAndBack("{ \"foo_ushort\": 5 }"));
49
50 EXPECT_TRUE(JsonAndBack("{ \"foo_int\": 5 }"));
51 EXPECT_TRUE(JsonAndBack("{ \"foo_uint\": 5 }"));
52
53 EXPECT_TRUE(JsonAndBack("{ \"foo_long\": 5 }"));
54 EXPECT_TRUE(JsonAndBack("{ \"foo_ulong\": 5 }"));
55
56 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.0 }"));
57 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.0 }"));
58
Alex Perrycb7da4b2019-08-28 19:35:56 -070059 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"None\" }"));
60 EXPECT_TRUE(JsonAndBack("{ \"foo_enum\": \"UType\" }"));
61
62 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"None\" }"));
63 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"UType\" }"));
64
Austin Schuh3e95e5d2019-09-20 00:08:54 -070065 EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -080066
67 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Zero\" }"));
68 EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Big\" }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -070069}
70
Austin Schuhbba0c3c2019-11-29 22:00:34 -080071// Tests that NaN is handled correctly
72TEST_F(JsonToFlatbufferTest, Nan) {
73 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": nan }"));
74 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": -nan }"));
75}
76
Austin Schuh84314af2019-10-03 09:11:34 -070077// Tests that we can handle decimal points.
78TEST_F(JsonToFlatbufferTest, DecimalPoint) {
79 EXPECT_TRUE(JsonAndBack("{ \"foo_float\": 5.1 }"));
80 EXPECT_TRUE(JsonAndBack("{ \"foo_double\": 5.1 }"));
81}
82
Austin Schuh3e95e5d2019-09-20 00:08:54 -070083// Test what happens if you pass a field name that we don't know.
84TEST_F(JsonToFlatbufferTest, InvalidFieldName) {
85 EXPECT_FALSE(JsonAndBack("{ \"foo\": 5 }"));
86}
87
Alex Perrycb7da4b2019-08-28 19:35:56 -070088// Tests that an invalid enum type is handled correctly.
89TEST_F(JsonToFlatbufferTest, InvalidEnumName) {
90 EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
91
92 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
Brian Silverman5c710412021-02-09 19:09:32 -080093
94 EXPECT_FALSE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Nope\" }"));
95
96 EXPECT_FALSE(
97 JsonAndBack("{ \"foo_enum_nonconsecutive_default\": \"Nope\" }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -070098}
99
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700100// Test that adding a duplicate field results in an error.
101TEST_F(JsonToFlatbufferTest, DuplicateField) {
102 EXPECT_FALSE(
103 JsonAndBack("{ \"foo_int\": 5, \"foo_int\": 7 }", "{ \"foo_int\": 7 }"));
104}
105
106// Test that various syntax errors are caught correctly
107TEST_F(JsonToFlatbufferTest, InvalidSyntax) {
108 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5"));
109 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 "));
110 EXPECT_FALSE(JsonAndBack("{ \"foo_string\": \""));
111 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5 } }"));
112
113 EXPECT_FALSE(JsonAndBack("{ foo_int: 5 }"));
114
115 EXPECT_FALSE(JsonAndBack("{ \"foo_int\": 5, }", "{ \"foo_int\": 5 }"));
116
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700117 EXPECT_FALSE(
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700118 JsonAndBack("{ \"apps\":\n[\n{\n\"name\": \"woot\"\n},\n{\n\"name\": "
119 "\"wow\"\n} ,\n]\n}"));
120
121 EXPECT_FALSE(JsonAndBack(
122 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] , }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700123
124 EXPECT_FALSE(
125 JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] , }"));
126
127 EXPECT_FALSE(
128 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } , }"));
129}
130
131// Test arrays of simple types.
132TEST_F(JsonToFlatbufferTest, Array) {
133 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700134 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_byte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700135 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700136 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ubyte\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700137
138 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700139 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_short\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700140 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700141 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ushort\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700142
143 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700144 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_int\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700145 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700146 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_uint\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700147
148 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700149 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_long\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700150 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ 9, 7, 1 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700151 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_ulong\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700152
153 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700154 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700155 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700156 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700157
158 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ] }",
159 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ] }"));
160 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_double\": [ 9, 7, 1 ] }",
161 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
162
163 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ \"bar\", \"baz\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700164 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_string\": [ ] }"));
Ravago Jonescf453ab2020-05-06 21:14:53 -0700165 EXPECT_TRUE(JsonAndBack(
166 "{ \"vector_foo_enum\": [ \"None\", \"UType\", \"Bool\" ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700167 EXPECT_TRUE(JsonAndBack("{ \"vector_foo_enum\": [ ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700168}
169
170// Test nested messages, and arrays of nested messages.
171TEST_F(JsonToFlatbufferTest, NestedStruct) {
172 EXPECT_TRUE(
173 JsonAndBack("{ \"single_application\": { \"name\": \"woot\" } }"));
174
Alex Perrycb7da4b2019-08-28 19:35:56 -0700175 EXPECT_TRUE(JsonAndBack("{ \"single_application\": { } }"));
176
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700177 EXPECT_TRUE(JsonAndBack(
178 "{ \"apps\": [ { \"name\": \"woot\" }, { \"name\": \"wow\" } ] }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700179
Ravago Jonescf453ab2020-05-06 21:14:53 -0700180 EXPECT_TRUE(JsonAndBack("{ \"apps\": [ { }, { } ] }"));
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700181}
182
Austin Schuh84314af2019-10-03 09:11:34 -0700183// Test that we can parse an empty message.
184TEST_F(JsonToFlatbufferTest, EmptyMessage) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700185 // Empty message works.
Austin Schuh84314af2019-10-03 09:11:34 -0700186 EXPECT_TRUE(JsonAndBack("{ }"));
187}
188
Austin Schuh81da4b22019-10-06 14:03:24 -0700189// Tests that comments get stripped.
190TEST_F(JsonToFlatbufferTest, Comments) {
191 EXPECT_TRUE(JsonAndBack("{ /* foo */ \"vector_foo_double\": [ 9, 7, 1 ] }",
192 "{ \"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
193}
194
Austin Schuh9e2532d2019-10-06 14:01:15 -0700195// Tests that multiple arrays get properly handled.
196TEST_F(JsonToFlatbufferTest, MultipleArrays) {
197 EXPECT_TRUE(
198 JsonAndBack("{ \"vector_foo_float\": [ 9, 7, 1 ], \"vector_foo_double\": "
199 "[ 9, 7, 1 ] }",
200 "{ \"vector_foo_float\": [ 9.0, 7.0, 1.0 ], "
201 "\"vector_foo_double\": [ 9.0, 7.0, 1.0 ] }"));
202}
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700203
Alex Perrycb7da4b2019-08-28 19:35:56 -0700204// Tests that multiple arrays get properly handled.
205TEST_F(JsonToFlatbufferTest, NestedArrays) {
206 EXPECT_TRUE(
Ravago Jonescf453ab2020-05-06 21:14:53 -0700207 JsonAndBack("{ \"vov\": { \"v\": [ { \"str\": [ \"a\", \"b\" ] }, { "
208 "\"str\": [ \"c\", \"d\" ] } ] } }"));
Alex Perrycb7da4b2019-08-28 19:35:56 -0700209}
210
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700211// TODO(austin): Missmatched values.
Austin Schuh09d7ffa2019-10-03 23:43:34 -0700212//
213// TODO(austin): unions?
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700214
Austin Schuhd3936202020-04-07 20:11:07 -0700215TEST_F(JsonToFlatbufferTest, TrimmedVector) {
216 std::string json_short = "{ \"vector_foo_int\": [ 0";
217 for (int i = 1; i < 100; ++i) {
218 json_short += ", ";
219 json_short += std::to_string(i);
220 }
221 std::string json_long = json_short;
222 json_short += " ] }";
223 json_long += ", 101 ] }";
224
Austin Schuhadd6eb32020-11-09 21:24:26 -0800225 const FlatbufferDetachedBuffer<Configuration> fb_short(
226 JsonToFlatbuffer<Configuration>(json_short));
227 ASSERT_GT(fb_short.span().size(), 0);
228 const FlatbufferDetachedBuffer<Configuration> fb_long(
229 JsonToFlatbuffer<Configuration>(json_long));
230 ASSERT_GT(fb_long.span().size(), 0);
Austin Schuhd3936202020-04-07 20:11:07 -0700231
Austin Schuhadd6eb32020-11-09 21:24:26 -0800232 const std::string back_json_short = FlatbufferToJson<Configuration>(
233 fb_short, {.multi_line = false, .max_vector_size = 100});
234 const std::string back_json_long = FlatbufferToJson<Configuration>(
235 fb_long, {.multi_line = false, .max_vector_size = 100});
Austin Schuhd3936202020-04-07 20:11:07 -0700236
237 EXPECT_EQ(json_short, back_json_short);
238 EXPECT_EQ("{ \"vector_foo_int\": [ ... 101 elements ... ] }", back_json_long);
239}
240
Austin Schuh7f99e472020-06-17 20:38:17 -0700241// Tests that a nullptr buffer prints nullptr.
242TEST_F(JsonToFlatbufferTest, NullptrData) {
243 EXPECT_EQ("null", TableFlatbufferToJson((const flatbuffers::Table *)(nullptr),
Ravago Jonescf453ab2020-05-06 21:14:53 -0700244 ConfigurationTypeTable()));
Austin Schuh7f99e472020-06-17 20:38:17 -0700245}
246
Austin Schuh3e95e5d2019-09-20 00:08:54 -0700247} // namespace testing
248} // namespace aos