mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-01 19:58:15 +00:00
This reduces the friction when merging from github and google repos by using the exact same clang style guide. MARKDOWN=true
81 lines
3.1 KiB
C++
81 lines
3.1 KiB
C++
#include "alignment_test.h"
|
|
|
|
#include "flatbuffers/flatbuffer_builder.h"
|
|
#include "flatbuffers/util.h"
|
|
#include "test_assert.h"
|
|
#include "tests/alignment_test_generated.h"
|
|
|
|
namespace flatbuffers {
|
|
namespace tests {
|
|
|
|
void AlignmentTest() {
|
|
FlatBufferBuilder builder;
|
|
|
|
BadAlignmentLarge large;
|
|
Offset<OuterLarge> outer_large = CreateOuterLarge(builder, &large);
|
|
|
|
BadAlignmentSmall* small;
|
|
Offset<Vector<const BadAlignmentSmall*>> small_offset =
|
|
builder.CreateUninitializedVectorOfStructs(9, &small);
|
|
(void)small; // We do not have to write data to trigger the test failure
|
|
|
|
Offset<BadAlignmentRoot> root =
|
|
CreateBadAlignmentRoot(builder, outer_large, small_offset);
|
|
|
|
builder.Finish(root);
|
|
|
|
Verifier verifier(builder.GetBufferPointer(), builder.GetSize());
|
|
TEST_ASSERT(verifier.VerifyBuffer<BadAlignmentRoot>(nullptr));
|
|
|
|
// ============= Test Small Structs Vector misalignment ========
|
|
|
|
builder.Clear();
|
|
|
|
// creating 5 structs with 2 bytes each
|
|
// 10 bytes in total for Vector data is needed
|
|
std::vector<EvenSmallStruct> even_vector = {{2, 1}, {3, 1}, {4, 1}};
|
|
std::vector<OddSmallStruct> odd_vector = {{6, 5, 4}, {9, 8, 7}, {1, 2, 3}};
|
|
// CreateVectorOfStructs is used in the generated CreateSmallStructsDirect()
|
|
// method, but we test it directly
|
|
Offset<Vector<const EvenSmallStruct*>> even_structs_offset =
|
|
builder.CreateVectorOfStructs<EvenSmallStruct>(even_vector);
|
|
Offset<Vector<const OddSmallStruct*>> odd_structs_offset =
|
|
builder.CreateVectorOfStructs<OddSmallStruct>(odd_vector);
|
|
Offset<SmallStructs> small_structs_root =
|
|
CreateSmallStructs(builder, even_structs_offset, odd_structs_offset);
|
|
|
|
builder.Finish(small_structs_root);
|
|
|
|
// Save the binary that we later can annotate with `flatc --annotate` command
|
|
// NOTE: the conversion of the JSON data to --binary via `flatc --binary`
|
|
// command is not changed with that fix and was always producing the
|
|
// correct binary data.
|
|
// SaveFile("alignment_test_{before,after}_fix.bin",
|
|
// reinterpret_cast<char *>(builder.GetBufferPointer()),
|
|
// builder.GetSize(), true);
|
|
|
|
Verifier verifier_small_structs(builder.GetBufferPointer(),
|
|
builder.GetSize());
|
|
TEST_ASSERT(verifier_small_structs.VerifyBuffer<SmallStructs>(nullptr));
|
|
|
|
// Reading SmallStructs vector values back and compare with original
|
|
auto root_msg =
|
|
flatbuffers::GetRoot<SmallStructs>(builder.GetBufferPointer());
|
|
|
|
TEST_EQ(root_msg->even_structs()->size(), even_vector.size());
|
|
for (flatbuffers::uoffset_t i = 0; i < root_msg->even_structs()->size();
|
|
++i) {
|
|
TEST_EQ(even_vector[i].var_0(), root_msg->even_structs()->Get(i)->var_0());
|
|
TEST_EQ(even_vector[i].var_1(), root_msg->even_structs()->Get(i)->var_1());
|
|
}
|
|
|
|
TEST_EQ(root_msg->odd_structs()->size(), even_vector.size());
|
|
for (flatbuffers::uoffset_t i = 0; i < root_msg->odd_structs()->size(); ++i) {
|
|
TEST_EQ(odd_vector[i].var_0(), root_msg->odd_structs()->Get(i)->var_0());
|
|
TEST_EQ(odd_vector[i].var_1(), root_msg->odd_structs()->Get(i)->var_1());
|
|
}
|
|
}
|
|
|
|
} // namespace tests
|
|
} // namespace flatbuffers
|