Files
2026-07-13 12:22:33 +08:00

75 lines
3.2 KiB
Swift

import CodexBarCore
import Foundation
import Testing
struct AgentSessionParserTests {
@Test
func `ps parser deduplicates desktop wrapper and excludes app server and helpers`() throws {
let output = try Self.fixtureString("agent-sessions-ps", extension: "txt")
let records = AgentPSOutputParser.parse(output)
let agents = AgentPSOutputParser.agentProcesses(from: records)
#expect(records.count == 9)
#expect(agents.map(\ .pid) == [102, 201])
#expect(AgentPSOutputParser.provider(for: agents[0]) == .claude)
#expect(AgentPSOutputParser.source(for: agents[0]) == .desktopApp)
#expect(AgentPSOutputParser.provider(for: agents[1]) == .codex)
#expect(agents[1].command.hasSuffix("strange argv here"))
#expect(AgentPSOutputParser.hasCodexAppServer(in: records))
}
@Test
func `lsof parser maps batched cwd records`() throws {
let output = try Self.fixtureString("agent-sessions-lsof", extension: "txt")
let paths = LSOFCWDOutputParser.parse(output)
#expect(paths[102] == "/Users/test/Projects/alpha")
#expect(paths[201] == "/Users/test/Projects/project with spaces")
}
@Test
func `same cwd processes remain uncorrelated when ownership is ambiguous`() {
let olderStart = Date(timeIntervalSince1970: 100)
let newerStart = Date(timeIntervalSince1970: 200)
let older = AgentProcessRecord(pid: 10, ppid: 1, startedAt: olderStart, command: "claude")
let newer = AgentProcessRecord(pid: 20, ppid: 1, startedAt: newerStart, command: "claude")
let olderTranscript = ClaudeSessionProjectMapper.Transcript(
url: URL(fileURLWithPath: "/tmp/older.jsonl"),
modifiedAt: Date(timeIntervalSince1970: 150))
let newerTranscript = ClaudeSessionProjectMapper.Transcript(
url: URL(fileURLWithPath: "/tmp/newer.jsonl"),
modifiedAt: Date(timeIntervalSince1970: 250))
let assignments = AgentSessionCorrelation.assignClaudeTranscripts(
processes: [older, newer],
cwdByPID: [10: "/project", 20: "/project"],
transcriptsByCWD: ["/project": [newerTranscript, olderTranscript]])
#expect(assignments.isEmpty)
}
@Test
func `newest process sorts first for rollout correlation`() {
let older = AgentProcessRecord(
pid: 10,
ppid: 1,
startedAt: Date(timeIntervalSince1970: 100),
command: "codex exec")
let newer = AgentProcessRecord(
pid: 20,
ppid: 1,
startedAt: Date(timeIntervalSince1970: 200),
command: "codex exec")
#expect(AgentSessionCorrelation.newestProcessesFirst([older, newer]).map(\ .pid) == [20, 10])
}
static func fixtureURL(_ name: String, extension fileExtension: String) throws -> URL {
try #require(Bundle.module.url(forResource: name, withExtension: fileExtension, subdirectory: "Fixtures"))
}
static func fixtureString(_ name: String, extension fileExtension: String) throws -> String {
try String(contentsOf: self.fixtureURL(name, extension: fileExtension), encoding: .utf8)
}
}