Fixes forward offset verifiable objects within arrays (#8135)
Fixes failing tests & removes XCTestsManifests
Co-authored-by: Derek Bailey <derekbailey@google.com>
diff --git a/swift/Sources/FlatBuffers/Verifiable.swift b/swift/Sources/FlatBuffers/Verifiable.swift
index b445c4c..09f1a35 100644
--- a/swift/Sources/FlatBuffers/Verifiable.swift
+++ b/swift/Sources/FlatBuffers/Verifiable.swift
@@ -129,7 +129,7 @@
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)
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift
index f9a9670..8fe5f81 100644
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift
+++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift
@@ -439,11 +439,26 @@
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)
}
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift
index 30d16b1..96b5614 100644
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift
+++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift
@@ -50,6 +50,12 @@
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 @@
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\"}"
- }
-
}
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift
index ee61102..4eb3f34 100644
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift
+++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift
@@ -244,8 +244,7 @@
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)
}
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift
index 39e13b1..45be6cf 100644
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift
+++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift
@@ -65,17 +65,22 @@
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\"}"
- }
}
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift
index d7f949b..cb52d11 100644
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift
+++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift
@@ -30,6 +30,8 @@
var validFlatbuffersObject: ByteBuffer!
var invalidFlatbuffersObject: ByteBuffer!
+ var invalidFlatbuffersObject2: ByteBuffer!
+ var invalidFlatbuffersObject3: ByteBuffer!
override func setUp() {
// swiftformat:disable all
@@ -41,6 +43,11 @@
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 @@
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()
diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift
deleted file mode 100644
index e164fc3..0000000
--- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift
+++ /dev/null
@@ -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
diff --git a/tests/swift/tests/Tests/LinuxMain.swift b/tests/swift/tests/Tests/LinuxMain.swift
deleted file mode 100644
index a959fc7..0000000
--- a/tests/swift/tests/Tests/LinuxMain.swift
+++ /dev/null
@@ -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)