From 1196530e275fddef3bab8ab62d3c64846a8f37b4 Mon Sep 17 00:00:00 2001 From: Max Goedjen Date: Sun, 10 Aug 2025 20:14:07 -0700 Subject: [PATCH] Fixed tests. --- .../Types/SigningRequestProvenance.swift | 4 +- .../BriefTests/ReleaseParsingTests.swift | 1 - .../SecretAgentKitTests/AgentTests.swift | 37 +++++++++++++------ .../SecretAgentKitTests/StubWitness.swift | 4 +- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Sources/Packages/Sources/SecretKit/Types/SigningRequestProvenance.swift b/Sources/Packages/Sources/SecretKit/Types/SigningRequestProvenance.swift index a1095fd..2216f45 100644 --- a/Sources/Packages/Sources/SecretKit/Types/SigningRequestProvenance.swift +++ b/Sources/Packages/Sources/SecretKit/Types/SigningRequestProvenance.swift @@ -2,7 +2,7 @@ import Foundation import AppKit /// Describes the chain of applications that requested a signature operation. -public struct SigningRequestProvenance: Equatable { +public struct SigningRequestProvenance: Equatable, Sendable { /// A list of processes involved in the request. /// - Note: A chain will typically consist of many elements even for a simple request. For example, running `git fetch` in Terminal.app would generate a request chain of `ssh` -> `git` -> `zsh` -> `login` -> `Terminal.app` @@ -30,7 +30,7 @@ extension SigningRequestProvenance { extension SigningRequestProvenance { /// Describes a process in a `SigningRequestProvenance` chain. - public struct Process: Equatable { + public struct Process: Equatable, Sendable { /// The pid of the process. public let pid: Int32 diff --git a/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift b/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift index 1fc6364..ef5dd19 100644 --- a/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift +++ b/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift @@ -2,7 +2,6 @@ import Testing import Foundation @testable import Brief - @Suite struct ReleaseParsingTests { @Test diff --git a/Sources/Packages/Tests/SecretAgentKitTests/AgentTests.swift b/Sources/Packages/Tests/SecretAgentKitTests/AgentTests.swift index c99ae98..6cc464e 100644 --- a/Sources/Packages/Tests/SecretAgentKitTests/AgentTests.swift +++ b/Sources/Packages/Tests/SecretAgentKitTests/AgentTests.swift @@ -1,6 +1,7 @@ import Foundation import Testing import CryptoKit +import Synchronization @testable import SecretKit @testable import SecretAgentKit @@ -90,34 +91,35 @@ import CryptoKit @Test func witnessSignature() async { let stubReader = StubFileHandleReader(availableData: Constants.Requests.requestSignature) let list = storeList(with: [Constants.Secrets.ecdsa256Secret]) - var witnessed = false + let witnessed: Mutex = .init(false) let witness = StubWitness(speakNow: { _, trace in return false }, witness: { _, trace in - witnessed = true + witnessed.lockedValue = true }) let agent = Agent(storeList: list, witness: witness) await agent.handle(reader: stubReader, writer: stubWriter) - #expect(witnessed) + let value = witnessed.lockedValue + #expect(value) } @Test func requestTracing() async { let stubReader = StubFileHandleReader(availableData: Constants.Requests.requestSignature) let list = storeList(with: [Constants.Secrets.ecdsa256Secret]) - var speakNowTrace: SigningRequestProvenance! = nil - var witnessTrace: SigningRequestProvenance! = nil + let speakNowTrace: Mutex = .init(nil) + let witnessTrace: Mutex = .init(nil) let witness = StubWitness(speakNow: { _, trace in - speakNowTrace = trace + speakNowTrace.lockedValue = trace return false }, witness: { _, trace in - witnessTrace = trace + witnessTrace.lockedValue = trace }) let agent = Agent(storeList: list, witness: witness) await agent.handle(reader: stubReader, writer: stubWriter) - #expect(witnessTrace == speakNowTrace) - #expect(witnessTrace.origin.displayName == "Finder") - #expect(witnessTrace.origin.validSignature == true) - #expect(witnessTrace.origin.parentPID == 1) + #expect(witnessTrace.lockedValue == speakNowTrace.lockedValue) + #expect(witnessTrace.lockedValue?.origin.displayName == "Finder") + #expect(witnessTrace.lockedValue?.origin.validSignature == true) + #expect(witnessTrace.lockedValue?.origin.parentPID == 1) } // MARK: Exception Handling @@ -143,6 +145,19 @@ import CryptoKit } +extension Mutex where Value: Sendable { + + var lockedValue: Value { + get { + withLock { $0 } + } + nonmutating set { + withLock { $0 = newValue } + } + } + +} + extension AgentTests { func storeList(with secrets: [Stub.Secret]) -> SecretStoreList { diff --git a/Sources/Packages/Tests/SecretAgentKitTests/StubWitness.swift b/Sources/Packages/Tests/SecretAgentKitTests/StubWitness.swift index 87e0fd9..2fa1af8 100644 --- a/Sources/Packages/Tests/SecretAgentKitTests/StubWitness.swift +++ b/Sources/Packages/Tests/SecretAgentKitTests/StubWitness.swift @@ -3,8 +3,8 @@ import SecretAgentKit struct StubWitness { - let speakNow: (AnySecret, SigningRequestProvenance) -> Bool - let witness: (AnySecret, SigningRequestProvenance) -> () + let speakNow: @Sendable (AnySecret, SigningRequestProvenance) -> Bool + let witness: @Sendable (AnySecret, SigningRequestProvenance) -> () }