Fix typed flatbuffer merge function
Change-Id: I2baeb5ab5a8fc48584466110f8d622838c2f05a0
diff --git a/aos/flatbuffer_merge.h b/aos/flatbuffer_merge.h
index afb4f69..dafba34 100644
--- a/aos/flatbuffer_merge.h
+++ b/aos/flatbuffer_merge.h
@@ -54,9 +54,12 @@
template <class T>
inline aos::FlatbufferDetachedBuffer<T> MergeFlatBuffers(const T *fb1,
const T *fb2) {
- return aos::FlatbufferDetachedBuffer<T>(MergeFlatBuffers(
- T::MiniReflectTypeTable(), reinterpret_cast<const uint8_t *>(fb1),
- reinterpret_cast<const uint8_t *>(fb2)));
+ flatbuffers::FlatBufferBuilder fbb;
+ fbb.ForceDefaults(1);
+ fbb.Finish(MergeFlatBuffers<T>(
+ reinterpret_cast<const flatbuffers::Table *>(fb1),
+ reinterpret_cast<const flatbuffers::Table *>(fb2), &fbb));
+ return aos::FlatbufferDetachedBuffer<T>(fbb.Release());
}
template <class T>
diff --git a/aos/flatbuffer_merge_test.cc b/aos/flatbuffer_merge_test.cc
index ca63249..079eb11 100644
--- a/aos/flatbuffer_merge_test.cc
+++ b/aos/flatbuffer_merge_test.cc
@@ -13,6 +13,15 @@
public:
FlatbufferMerge() {}
+ void ExpectMergedOutput(const flatbuffers::DetachedBuffer &fb_merged,
+ std::string_view expected_output) {
+ ASSERT_NE(fb_merged.size(), 0u);
+
+ const ::std::string merged_output =
+ FlatbufferToJson(fb_merged, ConfigurationTypeTable());
+ EXPECT_EQ(expected_output, merged_output);
+ }
+
void JsonMerge(const ::std::string in1, const ::std::string in2,
const ::std::string out) {
printf("Merging: %s\n", in1.c_str());
@@ -110,15 +119,40 @@
// in1 merged with in2 => out.
flatbuffers::DetachedBuffer fb_merged =
MergeFlatBuffers<Configuration>(fb1.data(), fb2.data());
- ASSERT_NE(fb_merged.size(), 0u);
- const ::std::string merged_output =
- FlatbufferToJson(fb_merged, ConfigurationTypeTable());
- EXPECT_EQ(out, merged_output);
-
- printf("Merged to: %s\n", merged_output.c_str());
+ ExpectMergedOutput(fb_merged, out);
}
+ // Test all the different merge methods:
+ ExpectMergedOutput(
+ MergeFlatBuffers(ConfigurationTypeTable(), fb1.data(), fb2.data()),
+ out);
+ {
+ flatbuffers::FlatBufferBuilder fbb;
+ fbb.ForceDefaults(1);
+ fbb.Finish(MergeFlatBuffers(
+ ConfigurationTypeTable(),
+ flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
+ flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
+ ExpectMergedOutput(fbb.Release(), out);
+ }
+ {
+ flatbuffers::FlatBufferBuilder fbb;
+ fbb.ForceDefaults(1);
+ fbb.Finish(MergeFlatBuffers<Configuration>(
+ flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
+ flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
+ ExpectMergedOutput(fbb.Release(), out);
+ }
+ ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1.data(), fb2.data()),
+ out);
+ ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1, fb2), out);
+ ExpectMergedOutput(MergeFlatBuffers<Configuration>(
+ flatbuffers::GetRoot<Configuration>(fb1.data()),
+ flatbuffers::GetRoot<Configuration>(fb2.data()))
+ .buffer(),
+ out);
+
// Now, to make things extra exciting, nest a config inside a config. And
// run all the tests. This will exercise some fun nested merges and copies.
@@ -196,6 +230,8 @@
// Test the easy ones. Test every type, single, no nesting.
TEST_F(FlatbufferMerge, Basic) {
+ JsonMerge("{ }", "{ }", "{ }");
+
JsonMerge("{ \"foo_bool\": true }", "{ \"foo_bool\": false }",
"{ \"foo_bool\": false }");