mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-29 17:12:01 +00:00
Support file_identifier in Go (#7904)
Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
@@ -140,7 +140,7 @@ func TestAll(t *testing.T) {
|
||||
|
||||
// Verify that using the generated Go code builds a buffer without
|
||||
// returning errors:
|
||||
generated, off := CheckGeneratedBuild(false, t.Fatalf)
|
||||
generated, off := CheckGeneratedBuild(false, false, t.Fatalf)
|
||||
|
||||
// Verify that the buffer generated by Go code is readable by the
|
||||
// generated Go code:
|
||||
@@ -148,6 +148,16 @@ func TestAll(t *testing.T) {
|
||||
CheckMutateBuffer(generated, off, false, t.Fatalf)
|
||||
CheckObjectAPI(generated, off, false, t.Fatalf)
|
||||
|
||||
// Generate the buffer again, with file identifier.
|
||||
generated, off = CheckGeneratedBuild(false, true, t.Fatalf)
|
||||
|
||||
// Check that this buffer with file identifier is usable
|
||||
// and that the file identifier is correct.
|
||||
CheckReadBuffer(generated, off, false, t.Fatalf)
|
||||
CheckMutateBuffer(generated, off, false, t.Fatalf)
|
||||
CheckObjectAPI(generated, off, false, t.Fatalf)
|
||||
CheckFileIdentifier(generated, off, false, t.Fatalf)
|
||||
|
||||
// Verify that the buffer generated by C++ code is readable by the
|
||||
// generated Go code:
|
||||
monsterDataCpp, err := os.ReadFile(cppData)
|
||||
@@ -157,6 +167,7 @@ func TestAll(t *testing.T) {
|
||||
CheckReadBuffer(monsterDataCpp, 0, false, t.Fatalf)
|
||||
CheckMutateBuffer(monsterDataCpp, 0, false, t.Fatalf)
|
||||
CheckObjectAPI(monsterDataCpp, 0, false, t.Fatalf)
|
||||
CheckFileIdentifier(monsterDataCpp, 0, false, t.Fatalf)
|
||||
|
||||
// Verify that vtables are deduplicated when written:
|
||||
CheckVtableDeduplication(t.Fatalf)
|
||||
@@ -391,6 +402,31 @@ func CheckReadBuffer(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, f
|
||||
}
|
||||
}
|
||||
|
||||
// CheckFileIdentifier checks the "MONS" file identifier
|
||||
func CheckFileIdentifier(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {
|
||||
// Strip offset
|
||||
buf = buf[offset:]
|
||||
|
||||
var fileIdentifier string
|
||||
var hasFileIdentifier bool
|
||||
|
||||
if sizePrefix {
|
||||
fileIdentifier = flatbuffers.GetSizePrefixedBufferIdentifier(buf)
|
||||
hasFileIdentifier = example.SizePrefixedMonsterBufferHasIdentifier(buf)
|
||||
} else {
|
||||
fileIdentifier = flatbuffers.GetBufferIdentifier(buf)
|
||||
hasFileIdentifier = example.MonsterBufferHasIdentifier(buf)
|
||||
}
|
||||
|
||||
expectedFileIdentifier := "MONS"
|
||||
if fileIdentifier != expectedFileIdentifier {
|
||||
fail("expected file identifier %q, got %q", expectedFileIdentifier, fileIdentifier)
|
||||
}
|
||||
if !hasFileIdentifier {
|
||||
fail("did not find file identifier")
|
||||
}
|
||||
}
|
||||
|
||||
// CheckMutateBuffer checks that the given buffer can be mutated correctly
|
||||
// as the example Monster. Only available scalar values are mutated.
|
||||
func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {
|
||||
@@ -1358,7 +1394,7 @@ func CheckGetRootAsForNonRootTable(fail func(string, ...interface{})) {
|
||||
}
|
||||
|
||||
// CheckGeneratedBuild uses generated code to build the example Monster.
|
||||
func CheckGeneratedBuild(sizePrefix bool, fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {
|
||||
func CheckGeneratedBuild(sizePrefix, fileIdentifier bool, fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {
|
||||
b := flatbuffers.NewBuilder(0)
|
||||
str := b.CreateString("MyMonster")
|
||||
test1 := b.CreateString("test1")
|
||||
@@ -1402,10 +1438,18 @@ func CheckGeneratedBuild(sizePrefix bool, fail func(string, ...interface{})) ([]
|
||||
example.MonsterAddTestarrayofstring(b, testArrayOfString)
|
||||
mon := example.MonsterEnd(b)
|
||||
|
||||
if sizePrefix {
|
||||
b.FinishSizePrefixed(mon)
|
||||
if fileIdentifier {
|
||||
if sizePrefix {
|
||||
example.FinishSizePrefixedMonsterBuffer(b, mon)
|
||||
} else {
|
||||
example.FinishMonsterBuffer(b, mon)
|
||||
}
|
||||
} else {
|
||||
b.Finish(mon)
|
||||
if sizePrefix {
|
||||
b.FinishSizePrefixed(mon)
|
||||
} else {
|
||||
b.Finish(mon)
|
||||
}
|
||||
}
|
||||
|
||||
return b.Bytes, b.Head()
|
||||
@@ -1806,21 +1850,32 @@ func CheckParentNamespace(fail func(string, ...interface{})) {
|
||||
}
|
||||
|
||||
func CheckSizePrefixedBuffer(fail func(string, ...interface{})) {
|
||||
// Generate a size-prefixed flatbuffer
|
||||
generated, off := CheckGeneratedBuild(true, fail)
|
||||
|
||||
// Check that the size prefix is the size of monsterdata_go_wire.mon minus 4
|
||||
size := flatbuffers.GetSizePrefix(generated, off)
|
||||
if size != 220 {
|
||||
fail("mismatch between size prefix and expected size")
|
||||
}
|
||||
// Generate a size-prefixed flatbuffer, first without file identifier
|
||||
generated, off := CheckGeneratedBuild(true, false, fail)
|
||||
|
||||
// Check that the buffer can be used as expected
|
||||
CheckReadBuffer(generated, off, true, fail)
|
||||
CheckMutateBuffer(generated, off, true, fail)
|
||||
CheckObjectAPI(generated, off, true, fail)
|
||||
|
||||
// Write generated bfufer out to a file
|
||||
// Now generate a size-prefixed flatbuffer with file identifier
|
||||
generated, off = CheckGeneratedBuild(true, true, fail)
|
||||
|
||||
// Check that the size prefix is the size of monsterdata_go_wire.mon,
|
||||
// plus 4 bytes for padding
|
||||
size := flatbuffers.GetSizePrefix(generated, off)
|
||||
expectedSize := uint32(228)
|
||||
if size != expectedSize {
|
||||
fail("mismatch between size prefix (%d) and expected size (%d)", size, expectedSize)
|
||||
}
|
||||
|
||||
// Check that the buffer can be used as expected
|
||||
CheckReadBuffer(generated, off, true, fail)
|
||||
CheckMutateBuffer(generated, off, true, fail)
|
||||
CheckObjectAPI(generated, off, true, fail)
|
||||
CheckFileIdentifier(generated, off, true, fail)
|
||||
|
||||
// Write generated buffer out to a file
|
||||
if err := os.WriteFile(outData+".sp", generated[off:], os.FileMode(0644)); err != nil {
|
||||
fail("failed to write file: %s", err)
|
||||
}
|
||||
@@ -2397,7 +2452,7 @@ func BenchmarkVtableDeduplication(b *testing.B) {
|
||||
// BenchmarkParseGold measures the speed of parsing the 'gold' data
|
||||
// used throughout this test suite.
|
||||
func BenchmarkParseGold(b *testing.B) {
|
||||
buf, offset := CheckGeneratedBuild(false, b.Fatalf)
|
||||
buf, offset := CheckGeneratedBuild(false, false, b.Fatalf)
|
||||
monster := example.GetRootAsMonster(buf, offset)
|
||||
|
||||
// use these to prevent allocations:
|
||||
@@ -2459,7 +2514,7 @@ func BenchmarkParseGold(b *testing.B) {
|
||||
|
||||
// BenchmarkBuildGold uses generated code to build the example Monster.
|
||||
func BenchmarkBuildGold(b *testing.B) {
|
||||
buf, offset := CheckGeneratedBuild(false, b.Fatalf)
|
||||
buf, offset := CheckGeneratedBuild(false, false, b.Fatalf)
|
||||
bytes_length := int64(len(buf[offset:]))
|
||||
|
||||
reuse_str := "MyMonster"
|
||||
|
||||
Reference in New Issue
Block a user