mirror of
https://github.com/signalapp/libsignal.git
synced 2026-04-25 17:25:18 +02:00
- Java: org.whispersystems:signal-client-java ->
org.signal:libsignal-client
- Java: org.whispersystems:signal-client-android ->
org.signal:libsignal-android
- Java: org.whispersystems:libsignal-server ->
org.signal:libsignal-server
- Swift: SignalClient -> LibSignalClient
- NPM: @signalapp/signal-client -> @signalapp/libsignal-client
- Repository: github.com/signalapp/libsignal-client ->
github.com/signalapp/libsignal
98 lines
3.5 KiB
Swift
98 lines
3.5 KiB
Swift
//
|
|
// Copyright 2020 Signal Messenger, LLC.
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import XCTest
|
|
@testable import LibSignalClient
|
|
|
|
private struct FakeHandle {
|
|
// We're using the tuple to guarantee in-memory layout for this test.
|
|
// It's a little sketchy but it keeps the test from getting more complicated.
|
|
// swiftlint:disable:next large_tuple
|
|
var destroyed: (original: Bool, clone: Bool, redzone: Bool) = (false, false, true)
|
|
}
|
|
|
|
private class MockClonableHandleOwner: ClonableHandleOwner {
|
|
override class func cloneNativeHandle(_ newHandle: inout OpaquePointer?, currentHandle: OpaquePointer?) -> SignalFfiErrorRef? {
|
|
XCTAssertFalse(UnsafePointer<Bool>(currentHandle!).pointee)
|
|
newHandle = OpaquePointer(UnsafePointer<Bool>(currentHandle!) + 1)
|
|
return nil
|
|
}
|
|
|
|
override class func destroyNativeHandle(_ handle: OpaquePointer) -> SignalFfiErrorRef? {
|
|
UnsafeMutablePointer<Bool>(handle).pointee = true
|
|
return nil
|
|
}
|
|
}
|
|
|
|
class ClonableHandleOwnerTests: XCTestCase {
|
|
func testOwned() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
_ = MockClonableHandleOwner(owned: OpaquePointer($0))
|
|
}
|
|
XCTAssertTrue(handle.destroyed.original)
|
|
XCTAssertFalse(handle.destroyed.clone)
|
|
}
|
|
|
|
func testBorrowAndForget() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
var owner = MockClonableHandleOwner(borrowing: OpaquePointer($0))
|
|
cloneOrForgetAsNeeded(&owner)
|
|
}
|
|
XCTAssertFalse(handle.destroyed.original)
|
|
XCTAssertFalse(handle.destroyed.clone)
|
|
}
|
|
|
|
func testBorrowAndEscape() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
var owner = MockClonableHandleOwner(borrowing: OpaquePointer($0))
|
|
let fakeEscape = Unmanaged.passRetained(owner)
|
|
cloneOrForgetAsNeeded(&owner)
|
|
fakeEscape.release()
|
|
}
|
|
XCTAssertFalse(handle.destroyed.original)
|
|
XCTAssertTrue(handle.destroyed.clone)
|
|
}
|
|
|
|
func testTake() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
var owner = MockClonableHandleOwner(owned: OpaquePointer($0))
|
|
let takenHandle = try! cloneOrTakeHandle(from: &owner)
|
|
XCTAssertEqual(takenHandle, OpaquePointer($0))
|
|
}
|
|
XCTAssertFalse(handle.destroyed.original)
|
|
XCTAssertFalse(handle.destroyed.clone)
|
|
}
|
|
|
|
func testTakeAfterEscape() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
var owner = MockClonableHandleOwner(owned: OpaquePointer($0))
|
|
let fakeEscape = Unmanaged.passRetained(owner)
|
|
let takenHandle = try! cloneOrTakeHandle(from: &owner)
|
|
XCTAssertEqual(UnsafeRawPointer(takenHandle), UnsafeRawPointer($0) + 1)
|
|
let takenHandle2 = try! cloneOrTakeHandle(from: &owner)
|
|
XCTAssertEqual(UnsafeRawPointer(takenHandle2), UnsafeRawPointer($0) + 1)
|
|
fakeEscape.release()
|
|
}
|
|
XCTAssertTrue(handle.destroyed.original)
|
|
XCTAssertFalse(handle.destroyed.clone)
|
|
}
|
|
|
|
static var allTests: [(String, (ClonableHandleOwnerTests) -> () throws -> Void)] {
|
|
return [
|
|
("testOwned", testOwned),
|
|
("testBorrowAndForget", testBorrowAndForget),
|
|
("testBorrowAndEscape", testBorrowAndEscape),
|
|
("testTake", testTake),
|
|
("testTakeAfterEscape", testTakeAfterEscape),
|
|
]
|
|
}
|
|
|
|
}
|