blob: 893b4022a4be6a991c6e361fb44ecc11e9dcf4a6 [file] [log] [blame]
Tyler Chatow5e369a42019-11-23 11:57:31 -08001#include "aos/json_to_flatbuffer.h"
2#include "aos/json_to_flatbuffer_generated.h"
3#include "aos/util/file.h"
4#include "flatbuffers/reflection.h"
5#include "gtest/gtest.h"
6
7namespace aos {
8namespace testing {
9
10class FlatbufferIntrospectionTest : public ::testing::Test {
11 public:
12 FlatbufferIntrospectionTest()
13 : schema_data_(
14 util::ReadFileToStringOrDie("aos/json_to_flatbuffer.bfbs")) {
15 schema_ = reflection::GetSchema(schema_data_.data());
16 }
17
18 protected:
19 FlatbufferString<reflection::Schema> schema_data_;
20 const reflection::Schema *schema_;
21};
22
23TEST_F(FlatbufferIntrospectionTest, IntegerTest) {
24 flatbuffers::FlatBufferBuilder builder;
25 ConfigurationBuilder config_builder(builder);
26
27 config_builder.add_foo_byte(-5);
28 config_builder.add_foo_ubyte(5);
29 config_builder.add_foo_bool(true);
30
31 config_builder.add_foo_short(-10);
32 config_builder.add_foo_ushort(10);
33
34 config_builder.add_foo_int(-20);
35 config_builder.add_foo_uint(20);
36
37 config_builder.add_foo_long(-100);
38 config_builder.add_foo_ulong(100);
39
40 builder.Finish(config_builder.Finish());
41
42 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
43
44 EXPECT_EQ(out,
45 "{\"foo_bool\": true, \"foo_byte\": -5, \"foo_int\": -20, "
46 "\"foo_long\": -100, \"foo_short\": -10, \"foo_ubyte\": 5, "
47 "\"foo_uint\": 20, \"foo_ulong\": 100, \"foo_ushort\": 10}");
48}
49
50TEST_F(FlatbufferIntrospectionTest, FloatTest) {
51 flatbuffers::FlatBufferBuilder builder;
52 ConfigurationBuilder config_builder(builder);
53
54 config_builder.add_foo_float(1.0 / 3.0);
55 config_builder.add_foo_double(5.0 / 9.0);
56
57 builder.Finish(config_builder.Finish());
58
59 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
60
61 EXPECT_EQ(out,
62 "{\"foo_double\": 0.555555555555556, \"foo_float\": 0.333333}");
63}
64
65TEST_F(FlatbufferIntrospectionTest, VectorScalarTest) {
66 flatbuffers::FlatBufferBuilder builder;
67
68 // Flatbuffers don't like creating vectors simultaneously with table, so do
69 // first.
70 auto foo_bytes = builder.CreateVector<int8_t>({-3, -2, -1, 0, 1, 2, 3});
71 auto foo_ubytes = builder.CreateVector<uint8_t>({0, 1, 2, 3, 4, 5, 6});
72 auto foo_bools = builder.CreateVector<uint8_t>({true, false, true, false});
73
74 auto foo_shorts =
75 builder.CreateVector<int16_t>({-30, -20, -10, 0, 10, 20, 30});
76 auto foo_ushorts =
77 builder.CreateVector<uint16_t>({0, 10, 20, 30, 40, 50, 60});
78
79 auto foo_ints =
80 builder.CreateVector<int32_t>({-300, -200, -100, 0, 100, 200, 300});
81 auto foo_uints =
82 builder.CreateVector<uint32_t>({0, 100, 200, 300, 400, 500, 600});
83
84 auto foo_longs =
85 builder.CreateVector<int64_t>({-3000, -2000, -1000, 0, 1000, 2000, 3000});
86 auto foo_ulongs =
87 builder.CreateVector<uint64_t>({0, 1000, 2000, 3000, 4000, 5000, 6000});
88
89 auto foo_floats =
90 builder.CreateVector<float>({0.0, 1.0 / 9.0, 2.0 / 9.0, 3.0 / 9.0});
91 auto foo_doubles =
92 builder.CreateVector<double>({0, 1.0 / 9.0, 2.0 / 9.0, 3.0 / 9.0});
93
94 ConfigurationBuilder config_builder(builder);
95 config_builder.add_vector_foo_byte(foo_bytes);
96 config_builder.add_vector_foo_ubyte(foo_ubytes);
97 config_builder.add_vector_foo_bool(foo_bools);
98
99 config_builder.add_vector_foo_short(foo_shorts);
100 config_builder.add_vector_foo_ushort(foo_ushorts);
101
102 config_builder.add_vector_foo_int(foo_ints);
103 config_builder.add_vector_foo_uint(foo_uints);
104
105 config_builder.add_vector_foo_long(foo_longs);
106 config_builder.add_vector_foo_ulong(foo_ulongs);
107
108 config_builder.add_vector_foo_float(foo_floats);
109 config_builder.add_vector_foo_double(foo_doubles);
110
111 builder.Finish(config_builder.Finish());
112
113 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
114
115 EXPECT_EQ(
116 out,
117 "{\"vector_foo_bool\": [true, false, true, false], \"vector_foo_byte\": "
118 "[-3, -2, -1, 0, 1, 2, 3], \"vector_foo_double\": [0, 0.111111111111111, "
119 "0.222222222222222, 0.333333333333333], \"vector_foo_float\": [0, "
120 "0.111111, 0.222222, 0.333333], \"vector_foo_int\": [-300, -200, -100, "
121 "0, 100, 200, 300], \"vector_foo_long\": [-3000, -2000, -1000, 0, 1000, "
122 "2000, 3000], \"vector_foo_short\": [-30, -20, -10, 0, 10, 20, 30], "
123 "\"vector_foo_ubyte\": [0, 1, 2, 3, 4, 5, 6], \"vector_foo_uint\": [0, "
124 "100, 200, 300, 400, 500, 600], \"vector_foo_ulong\": [0, 1000, 2000, "
125 "3000, 4000, 5000, 6000], \"vector_foo_ushort\": [0, 10, 20, 30, 40, 50, "
126 "60]}");
127}
128
129TEST_F(FlatbufferIntrospectionTest, StringTest) {
130 flatbuffers::FlatBufferBuilder builder;
131
132 auto foo_string = builder.CreateString("I <3 FlatBuffers!");
133
134 ConfigurationBuilder config_builder(builder);
135 config_builder.add_foo_string(foo_string);
136
137 builder.Finish(config_builder.Finish());
138
139 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
140
141 EXPECT_EQ(out, "{\"foo_string\": \"I <3 FlatBuffers!\"}");
142}
143
144TEST_F(FlatbufferIntrospectionTest, EnumTest) {
145 flatbuffers::FlatBufferBuilder builder;
146
147 ConfigurationBuilder config_builder(builder);
Austin Schuh872723c2019-12-25 14:38:09 -0800148 config_builder.add_foo_enum(BaseType::UShort);
Tyler Chatow5e369a42019-11-23 11:57:31 -0800149
150 builder.Finish(config_builder.Finish());
151
152 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
153
154 EXPECT_EQ(out, "{\"foo_enum\": \"UShort\"}");
155}
156
157TEST_F(FlatbufferIntrospectionTest, VectorStringTest) {
158 flatbuffers::FlatBufferBuilder builder;
159
160 std::vector<std::vector<std::string>> words{
161 {"abc", "acb"}, {"bac", "bca"}, {"cab", "cba"}};
162 std::vector<flatbuffers::Offset<
163 flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>>>
164 strings;
165
166 for (const auto &v : words) {
167 strings.push_back(builder.CreateVectorOfStrings(v));
168 }
169
170 std::vector<flatbuffers::Offset<VectorOfStrings>> sub_vectors;
171
172 for (const auto &v : strings) {
173 VectorOfStringsBuilder v_builder(builder);
174 v_builder.add_str(v);
175 sub_vectors.push_back(v_builder.Finish());
176 }
177
178 auto foo_vov = builder.CreateVector(sub_vectors);
179
180 VectorOfVectorOfStringBuilder vov_builder(builder);
181 vov_builder.add_v(foo_vov);
182 auto vov = vov_builder.Finish();
183
184 ConfigurationBuilder config_builder(builder);
185 config_builder.add_vector_foo_string(strings[0]);
186 config_builder.add_vov(vov);
187
188 builder.Finish(config_builder.Finish());
189
190 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
191
192 EXPECT_EQ(out,
193 "{\"vector_foo_string\": [\"abc\", \"acb\"], \"vov\": {\"v\": "
194 "[{\"str\": [\"abc\", \"acb\"]}, {\"str\": [\"bac\", \"bca\"]}, "
195 "{\"str\": [\"cab\", \"cba\"]}]}}");
196}
197
198TEST_F(FlatbufferIntrospectionTest, TableTest) {
199 flatbuffers::FlatBufferBuilder builder;
200
201 auto foo_string2 = builder.CreateString("Nested Config String");
202 auto foo_bytes2 = builder.CreateVector<int8_t>({6, 7, 8, 9, 10});
203
204 ConfigurationBuilder config_builder2(builder);
205 config_builder2.add_foo_byte(10);
206 config_builder2.add_foo_string(foo_string2);
207 config_builder2.add_vector_foo_byte(foo_bytes2);
208
209 flatbuffers::Offset<Configuration> config_2 = config_builder2.Finish();
210
211 auto foo_string = builder.CreateString("Root Config String");
212 auto foo_bytes = builder.CreateVector<int8_t>({0, 1, 2, 3, 4, 5});
213
214 ConfigurationBuilder config_builder(builder);
215 config_builder.add_nested_config(config_2);
216 config_builder.add_foo_byte(5);
217 config_builder.add_foo_string(foo_string);
218 config_builder.add_vector_foo_byte(foo_bytes);
219
220 builder.Finish(config_builder.Finish());
221
222 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
223
224 EXPECT_EQ(out,
225 "{\"foo_byte\": 5, \"foo_string\": \"Root Config String\", "
226 "\"nested_config\": {\"foo_byte\": 10, \"foo_string\": \"Nested "
227 "Config String\", \"vector_foo_byte\": [6, 7, 8, 9, 10]}, "
228 "\"vector_foo_byte\": [0, 1, 2, 3, 4, 5]}");
229}
230
231TEST_F(FlatbufferIntrospectionTest, StructTest) {
232 flatbuffers::FlatBufferBuilder builder;
233
234 FooStructNested foo_struct2(10);
235
236 FooStruct foo_struct(5, foo_struct2);
237
238 ConfigurationBuilder config_builder(builder);
239 config_builder.add_foo_struct(&foo_struct);
240
241 builder.Finish(config_builder.Finish());
242
243 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
244
245 EXPECT_EQ(out,
246 "{\"foo_struct\": {\"foo_byte\": 5, \"nested_struct\": "
247 "{\"foo_byte\": 10}}}");
248}
249
250TEST_F(FlatbufferIntrospectionTest, VectorStructTest) {
251 flatbuffers::FlatBufferBuilder builder;
252
253 FooStructNested foo_struct2(1);
254
255 auto structs = builder.CreateVectorOfStructs(
256 std::vector<FooStruct>({{5, foo_struct2}, {10, foo_struct2}}));
257
258 ConfigurationBuilder config_builder(builder);
259 config_builder.add_vector_foo_struct(structs);
260
261 builder.Finish(config_builder.Finish());
262
263 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
264
265 EXPECT_EQ(out,
266 "{\"vector_foo_struct\": [{\"foo_byte\": 5, \"nested_struct\": "
267 "{\"foo_byte\": 1}}, {\"foo_byte\": 10, \"nested_struct\": "
268 "{\"foo_byte\": 1}}]}");
269}
270
271TEST_F(FlatbufferIntrospectionTest, VectorEnumTest) {
272 flatbuffers::FlatBufferBuilder builder;
273
Austin Schuh872723c2019-12-25 14:38:09 -0800274 auto enums = builder.CreateVector<BaseType>(
275 {BaseType::UShort, BaseType::Obj, BaseType::UInt});
Tyler Chatow5e369a42019-11-23 11:57:31 -0800276
277 ConfigurationBuilder config_builder(builder);
Austin Schuh872723c2019-12-25 14:38:09 -0800278 config_builder.add_vector_foo_enum(
279 flatbuffers::Offset<flatbuffers::Vector<int8_t>>(enums.o));
Tyler Chatow5e369a42019-11-23 11:57:31 -0800280
281 builder.Finish(config_builder.Finish());
282
283 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
284
285 EXPECT_EQ(out, "{\"vector_foo_enum\": [\"UShort\", \"Obj\", \"UInt\"]}");
286}
287
288TEST_F(FlatbufferIntrospectionTest, StructEnumTest) {
289 flatbuffers::FlatBufferBuilder builder;
290
Austin Schuh872723c2019-12-25 14:38:09 -0800291 StructEnum foo_struct(BaseType::UShort);
Tyler Chatow5e369a42019-11-23 11:57:31 -0800292
293 ConfigurationBuilder config_builder(builder);
294 config_builder.add_foo_struct_enum(&foo_struct);
295
296 builder.Finish(config_builder.Finish());
297
298 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
299
300 EXPECT_EQ(out, "{\"foo_struct_enum\": {\"foo_enum\": \"UShort\"}}");
301}
302
303TEST_F(FlatbufferIntrospectionTest, StringEscapeTest) {
304 flatbuffers::FlatBufferBuilder builder;
305
306 auto foo_string = builder.CreateString("\"\\\b\f\n\r\t");
307
308 ConfigurationBuilder config_builder(builder);
309 config_builder.add_foo_string(foo_string);
310
311 builder.Finish(config_builder.Finish());
312
313 std::string out = FlatbufferToJson(schema_, builder.GetBufferPointer());
314 EXPECT_EQ(out, "{\"foo_string\": \"\\\"\\\\\\b\\f\\n\\r\\t\"}");
315}
316
317} // namespace testing
318} // namespace aos