diff --git a/Packages/macOS/CmuxGit/Tests/CmuxGitTests/ReftableGitMetadataTests.swift b/Packages/macOS/CmuxGit/Tests/CmuxGitTests/ReftableGitMetadataTests.swift index da97c7234d38..8b4e83db0a22 100644 --- a/Packages/macOS/CmuxGit/Tests/CmuxGitTests/ReftableGitMetadataTests.swift +++ b/Packages/macOS/CmuxGit/Tests/CmuxGitTests/ReftableGitMetadataTests.swift @@ -1,4 +1,5 @@ import Darwin +import Dispatch import Foundation import Testing @testable import CmuxGit @@ -20,6 +21,31 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing { } @Suite struct ReftableGitMetadataTests { + // These real-process tests assert Git semantics, not UI latency. Keep them + // bounded while allowing process scheduling during the parallel package run. + private static let integrationWallTime: TimeInterval = 15 + + @Test func expiredReferenceDeadlineRemainsUnreadable() throws { + let fixture = try GitRepositoryFixture() + try fixture.writeBranch("main") + let repository = try #require( + GitMetadataService.resolveGitRepository(containing: fixture.root.path) + ) + let reader = SystemGitReferenceReader( + runner: FakeWorkspaceChangesGitRunner(results: [:], beforeRun: { _, _ in + Issue.record("An expired reference read must not start Git") + }) + ) + + let snapshot = reader.snapshot( + repository: repository, + deadline: DispatchTime(uptimeNanoseconds: 1) + ) + + #expect(snapshot.checkedOutBranch == .unreadable) + #expect(snapshot.currentCommit == nil) + } + @Test func referenceResolverRetainsAbsoluteUserPathGitCandidates() { let userGitDirectory = "/Users/cmux-tests/.local/bin" let resolver = SystemGitExecutableResolver( @@ -163,7 +189,12 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing { ) #expect(head.trimmingCharacters(in: .whitespacesAndNewlines) == "ref: refs/heads/.invalid") - let service = GitMetadataService() + let service = GitMetadataService( + fileStatusReader: SystemGitFileStatusReader(), + safetyConfiguration: GitMetadataSafetyConfiguration( + gitStatusWallTime: Self.integrationWallTime + ) + ) let initialMetadata = await service.workspaceMetadata(for: worktree.path) #expect(initialMetadata.branch == initialBranch) #expect(await service.checkedOutBranch(forDirectory: worktree.path) == .branch(initialBranch)) @@ -201,7 +232,9 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing { let repository = try #require( GitMetadataService.resolveGitRepository(containing: repositoryRoot.path) ) - let snapshot = SystemGitReferenceReader().snapshot(repository: repository) + let snapshot = SystemGitReferenceReader( + boundedCommandWallTimeLimit: Self.integrationWallTime + ).snapshot(repository: repository) #expect(snapshot.checkedOutBranch == .branch(branch)) #expect(snapshot.currentCommit == nil) @@ -355,11 +388,20 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing { environment["GIT_CONFIG_KEY_0"] = "core.worktree" environment["GIT_CONFIG_VALUE_0"] = unrelated.path let reader = SystemGitReferenceReader( - runner: SystemWorkspaceChangesGitRunner(environment: environment) + runner: SystemWorkspaceChangesGitRunner( + // Use the executable that successfully created this repository; + // backend fallback has its own test below. + executableURL: fixture.gitExecutableURL, + environment: environment + ) ) - let snapshot = reader.snapshot(repository: intendedRepository) + let snapshot = reader.snapshot( + repository: intendedRepository, + deadline: .now() + Self.integrationWallTime + ) + #expect(snapshot.usesGitPlumbing) #expect(snapshot.checkedOutBranch == .branch(intendedBranch)) } @@ -389,7 +431,10 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing { let snapshot = SystemGitReferenceReader(runners: [ SystemWorkspaceChangesGitRunner(executableURL: URL(fileURLWithPath: "/usr/bin/false")), SystemWorkspaceChangesGitRunner(executableURL: fixture.gitExecutableURL), - ]).snapshot(repository: repository) + ]).snapshot( + repository: repository, + deadline: .now() + Self.integrationWallTime + ) #expect(snapshot.checkedOutBranch == .branch(branch)) }