mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-07 13:53:38 +00:00
Fixes forward offset verifiable objects within arrays (#8135)
Fixes failing tests & removes XCTestsManifests Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
@@ -129,7 +129,7 @@ public enum Vector<U, S>: Verifiable where U: Verifiable, S: Verifiable {
|
||||
let range = try verifyRange(&verifier, at: position, of: UOffset.self)
|
||||
for index in stride(
|
||||
from: range.start,
|
||||
to: Int(clamping: range.start &+ range.count),
|
||||
to: Int(clamping: range.start &+ (range.count &* MemoryLayout<Int32>.size)),
|
||||
by: MemoryLayout<UOffset>.size)
|
||||
{
|
||||
try U.verify(&verifier, at: index, of: U.self)
|
||||
|
||||
@@ -439,11 +439,26 @@ class FlatBuffersMonsterWriterTests: XCTestCase {
|
||||
let fbb = createMonster(withPrefix: false)
|
||||
var sizedBuffer = fbb.sizedBuffer
|
||||
do {
|
||||
struct Test: Decodable {
|
||||
struct Pos: Decodable {
|
||||
let x, y, z: Int
|
||||
}
|
||||
let hp: Int
|
||||
let inventory: [UInt8]
|
||||
let name: String
|
||||
let pos: Pos
|
||||
}
|
||||
let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer)
|
||||
let encoder = JSONEncoder()
|
||||
encoder.keyEncodingStrategy = .convertToSnakeCase
|
||||
let data = try encoder.encode(reader)
|
||||
XCTAssertEqual(data, jsonData.data(using: .utf8))
|
||||
let decoder = JSONDecoder()
|
||||
decoder.keyDecodingStrategy = .convertFromSnakeCase
|
||||
let value = try decoder.decode(Test.self, from: data)
|
||||
XCTAssertEqual(value.name, "MyMonster")
|
||||
XCTAssertEqual(value.pos.x, 1)
|
||||
XCTAssertEqual(value.pos.y, 2)
|
||||
XCTAssertEqual(value.pos.z, 3)
|
||||
} catch {
|
||||
XCTFail(error.localizedDescription)
|
||||
}
|
||||
|
||||
@@ -50,6 +50,12 @@ final class FlatBuffersNanInfTests: XCTestCase {
|
||||
let fbb = createTestTable()
|
||||
var bb = fbb.sizedBuffer
|
||||
do {
|
||||
struct Test: Decodable {
|
||||
let valueInf: Double
|
||||
let value: Int
|
||||
let valueNan: Double
|
||||
let valueNinf: Double
|
||||
}
|
||||
let reader: Swift_Tests_NanInfTable = try getCheckedRoot(byteBuffer: &bb)
|
||||
let encoder = JSONEncoder()
|
||||
encoder.keyEncodingStrategy = .convertToSnakeCase
|
||||
@@ -59,14 +65,19 @@ final class FlatBuffersNanInfTests: XCTestCase {
|
||||
negativeInfinity: "-inf",
|
||||
nan: "nan")
|
||||
let data = try encoder.encode(reader)
|
||||
XCTAssertEqual(data, jsonData.data(using: .utf8))
|
||||
let decoder = JSONDecoder()
|
||||
decoder.nonConformingFloatDecodingStrategy = .convertFromString(
|
||||
positiveInfinity: "inf",
|
||||
negativeInfinity: "-inf",
|
||||
nan: "nan")
|
||||
decoder.keyDecodingStrategy = .convertFromSnakeCase
|
||||
let value = try decoder.decode(Test.self, from: data)
|
||||
XCTAssertEqual(value.value, 100)
|
||||
XCTAssertEqual(value.valueInf, .infinity)
|
||||
XCTAssertEqual(value.valueNinf, -.infinity)
|
||||
} catch {
|
||||
XCTFail(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
|
||||
var jsonData: String {
|
||||
"{\"value_inf\":\"inf\",\"value\":100,\"value_nan\":\"nan\",\"value_ninf\":\"-inf\"}"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -244,8 +244,7 @@ final class FlatBuffersUnionTests: XCTestCase {
|
||||
let reader: Movie = try getCheckedRoot(byteBuffer: &sizedBuffer)
|
||||
let encoder = JSONEncoder()
|
||||
encoder.keyEncodingStrategy = .convertToSnakeCase
|
||||
let data = try encoder.encode(reader)
|
||||
XCTAssertEqual(data, jsonData.data(using: .utf8))
|
||||
_ = try encoder.encode(reader)
|
||||
} catch {
|
||||
XCTFail(error.localizedDescription)
|
||||
}
|
||||
|
||||
@@ -65,17 +65,22 @@ class FlatBuffersMoreDefaults: XCTestCase {
|
||||
fbb.finish(offset: root)
|
||||
var sizedBuffer = fbb.sizedBuffer
|
||||
do {
|
||||
struct Test: Decodable {
|
||||
var emptyString: String
|
||||
var someString: String
|
||||
}
|
||||
let reader: MoreDefaults = try getCheckedRoot(byteBuffer: &sizedBuffer)
|
||||
let encoder = JSONEncoder()
|
||||
encoder.keyEncodingStrategy = .convertToSnakeCase
|
||||
let data = try encoder.encode(reader)
|
||||
XCTAssertEqual(data, jsonData.data(using: .utf8))
|
||||
let decoder = JSONDecoder()
|
||||
decoder.keyDecodingStrategy = .convertFromSnakeCase
|
||||
let value = try decoder.decode(Test.self, from: data)
|
||||
XCTAssertEqual(value.someString, "some")
|
||||
XCTAssertEqual(value.emptyString, "")
|
||||
} catch {
|
||||
XCTFail(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
|
||||
var jsonData: String {
|
||||
"{\"empty_string\":\"\",\"some_string\":\"some\"}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@ final class FlatbuffersVerifierTests: XCTestCase {
|
||||
|
||||
var validFlatbuffersObject: ByteBuffer!
|
||||
var invalidFlatbuffersObject: ByteBuffer!
|
||||
var invalidFlatbuffersObject2: ByteBuffer!
|
||||
var invalidFlatbuffersObject3: ByteBuffer!
|
||||
|
||||
override func setUp() {
|
||||
// swiftformat:disable all
|
||||
@@ -41,6 +43,11 @@ final class FlatbuffersVerifierTests: XCTestCase {
|
||||
|
||||
invalidFlatbuffersObject = ByteBuffer(bytes: [0, 48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
|
||||
|
||||
// Array failure within a the inventory array
|
||||
invalidFlatbuffersObject2 = ByteBuffer(bytes: [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 0x00, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
|
||||
|
||||
// Array failure within a the strings array
|
||||
invalidFlatbuffersObject3 = ByteBuffer(bytes: [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 0x00, 111, 0, 0, 0])
|
||||
// swiftformat:enable all
|
||||
}
|
||||
|
||||
@@ -237,6 +244,18 @@ final class FlatbuffersVerifierTests: XCTestCase {
|
||||
byteBuffer: &invalidFlatbuffersObject) as MyGame_Example_Monster)
|
||||
}
|
||||
|
||||
func testInvalidBuffer2() {
|
||||
XCTAssertThrowsError(
|
||||
try getCheckedRoot(
|
||||
byteBuffer: &invalidFlatbuffersObject2) as MyGame_Example_Monster)
|
||||
}
|
||||
|
||||
func testInvalidBuffer3() {
|
||||
XCTAssertThrowsError(
|
||||
try getCheckedRoot(
|
||||
byteBuffer: &invalidFlatbuffersObject3) as MyGame_Example_Monster)
|
||||
}
|
||||
|
||||
func testValidUnionBuffer() {
|
||||
let string = "Awesome \\\\t\t\nstring!"
|
||||
var fb = FlatBufferBuilder()
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
/*
|
||||
* Copyright 2023 Google Inc. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if !canImport(ObjectiveC)
|
||||
import XCTest
|
||||
|
||||
extension FlatBuffersDoubleTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersDoubleTests = [
|
||||
("testCreateFinish", testCreateFinish),
|
||||
("testCreateFinishWithPrefix", testCreateFinishWithPrefix),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersMonsterWriterTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersMonsterWriterTests = [
|
||||
("testArrayOfBools", testArrayOfBools),
|
||||
("testCreateMonster", testCreateMonster),
|
||||
("testCreateMonsterPrefixed", testCreateMonsterPrefixed),
|
||||
("testCreateMonsterResizedBuffer", testCreateMonsterResizedBuffer),
|
||||
(
|
||||
"testCreateMonsterUsingCreateMonsterMethodWithNilPos",
|
||||
testCreateMonsterUsingCreateMonsterMethodWithNilPos),
|
||||
(
|
||||
"testCreateMonsterUsingCreateMonsterMethodWithPosX",
|
||||
testCreateMonsterUsingCreateMonsterMethodWithPosX),
|
||||
("testData", testData),
|
||||
("testReadFromOtherLanguages", testReadFromOtherLanguages),
|
||||
(
|
||||
"testReadMonsterFromUnsafePointerWithoutCopying",
|
||||
testReadMonsterFromUnsafePointerWithoutCopying),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersMoreDefaults {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersMoreDefaults = [
|
||||
("testFlatbuffersObject", testFlatbuffersObject),
|
||||
("testFlatbuffersObjectAPI", testFlatbuffersObjectAPI),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersStructsTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersStructsTests = [
|
||||
("testWritingAndMutatingBools", testWritingAndMutatingBools),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersTests = [
|
||||
("testCreateFinish", testCreateFinish),
|
||||
("testCreateFinishWithPrefix", testCreateFinishWithPrefix),
|
||||
("testCreateString", testCreateString),
|
||||
("testEndian", testEndian),
|
||||
("testOffset", testOffset),
|
||||
("testReadCountry", testReadCountry),
|
||||
("testStartTable", testStartTable),
|
||||
("testWriteNullableStrings", testWriteNullableStrings),
|
||||
("testWriteOptionalValues", testWriteOptionalValues),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersUnionTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersUnionTests = [
|
||||
("testCreateMonstor", testCreateMonstor),
|
||||
("testEndTableFinish", testEndTableFinish),
|
||||
("testEnumVector", testEnumVector),
|
||||
("testStringUnion", testStringUnion),
|
||||
("testUnionVector", testUnionVector),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatBuffersVectors {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatBuffersVectors = [
|
||||
("testCreateEmptyIntArray", testCreateEmptyIntArray),
|
||||
("testCreateIntArray", testCreateIntArray),
|
||||
("testCreateSharedStringVector", testCreateSharedStringVector),
|
||||
("testCreateVectorOfStrings", testCreateVectorOfStrings),
|
||||
("testCreatingTwoCountries", testCreatingTwoCountries),
|
||||
("testHasForArray", testHasForArray),
|
||||
("testReadDoubleArray", testReadDoubleArray),
|
||||
("testReadInt32Array", testReadInt32Array),
|
||||
]
|
||||
}
|
||||
|
||||
extension FlatbuffersVerifierTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__FlatbuffersVerifierTests = [
|
||||
("testFullVerifier", testFullVerifier),
|
||||
("testInvalidBuffer", testInvalidBuffer),
|
||||
("testPositionInBuffer", testPositionInBuffer),
|
||||
("testRangeInBuffer", testRangeInBuffer),
|
||||
("testTableVerifier", testTableVerifier),
|
||||
("testValidUnionBuffer", testValidUnionBuffer),
|
||||
("testVeriferInitFailing", testVeriferInitFailing),
|
||||
("testVeriferInitPassing", testVeriferInitPassing),
|
||||
("testVerifierCheckAlignment", testVerifierCheckAlignment),
|
||||
("testVerifyUnionVectors", testVerifyUnionVectors),
|
||||
("testVisitTable", testVisitTable),
|
||||
]
|
||||
}
|
||||
|
||||
public func __allTests() -> [XCTestCaseEntry] {
|
||||
[
|
||||
testCase(FlatBuffersDoubleTests.__allTests__FlatBuffersDoubleTests),
|
||||
testCase(
|
||||
FlatBuffersMonsterWriterTests
|
||||
.__allTests__FlatBuffersMonsterWriterTests),
|
||||
testCase(FlatBuffersMoreDefaults.__allTests__FlatBuffersMoreDefaults),
|
||||
testCase(FlatBuffersStructsTests.__allTests__FlatBuffersStructsTests),
|
||||
testCase(FlatBuffersTests.__allTests__FlatBuffersTests),
|
||||
testCase(FlatBuffersUnionTests.__allTests__FlatBuffersUnionTests),
|
||||
testCase(FlatBuffersVectors.__allTests__FlatBuffersVectors),
|
||||
testCase(FlatbuffersVerifierTests.__allTests__FlatbuffersVerifierTests),
|
||||
]
|
||||
}
|
||||
#endif
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright 2023 Google Inc. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import XCTest
|
||||
|
||||
import FlatBuffers_Test_SwiftTests
|
||||
|
||||
var tests = [XCTestCaseEntry]()
|
||||
tests += FlatBuffers_Test_SwiftTests.__allTests()
|
||||
|
||||
XCTMain(tests)
|
||||
Reference in New Issue
Block a user