mirror of
https://github.com/signalapp/libsignal.git
synced 2026-04-26 01:35:22 +02:00
Now that the stores no longer use this optimization, it's unnecessary complexity in the implementation of NativeHandleOwner. We can always pull it out of git history if necessary.
69 lines
2.5 KiB
Swift
69 lines
2.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<OpaquePointer?> {
|
|
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: NonNull<OpaquePointer?>) -> SignalFfiErrorRef? {
|
|
UnsafeMutablePointer<Bool>(handle.opaque).pointee = true
|
|
return nil
|
|
}
|
|
}
|
|
|
|
class ClonableHandleOwnerTests: XCTestCase {
|
|
func testOwned() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
_ = MockClonableHandleOwner(owned: NonNull(OpaquePointer($0))!)
|
|
}
|
|
XCTAssertTrue(handle.destroyed.original)
|
|
XCTAssertFalse(handle.destroyed.clone)
|
|
}
|
|
|
|
func testTake() {
|
|
var handle = FakeHandle()
|
|
withUnsafeMutablePointer(to: &handle) {
|
|
var owner = MockClonableHandleOwner(owned: NonNull(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: NonNull(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)
|
|
}
|
|
}
|