Files
steipete--codexbar/TestsLinux/AntigravityProcessLauncherLinuxTests.swift
2026-07-13 12:22:33 +08:00

73 lines
2.6 KiB
Swift

#if canImport(Glibc) || canImport(Musl)
import Foundation
#if canImport(Glibc)
import Glibc
#elseif canImport(Musl)
import Musl
#endif
import Testing
@testable import CodexBarCore
struct AntigravityProcessLauncherLinuxTests {
@Test
func `pty launcher uses home and closes unrelated descriptors`() throws {
let tempDirectory = FileManager.default.temporaryDirectory
.appendingPathComponent("antigravity-spawn-\(UUID().uuidString)", isDirectory: true)
try FileManager.default.createDirectory(at: tempDirectory, withIntermediateDirectories: true)
defer { try? FileManager.default.removeItem(at: tempDirectory) }
let inheritedSourceFD = open("/dev/null", O_RDONLY)
guard inheritedSourceFD >= 0 else {
Issue.record("Failed to open descriptor fixture")
return
}
defer { close(inheritedSourceFD) }
let inheritedFD = fcntl(inheritedSourceFD, F_DUPFD, 200)
guard inheritedFD >= 200 else {
Issue.record("Failed to duplicate descriptor fixture")
return
}
defer { close(inheritedFD) }
let outputURL = tempDirectory.appendingPathComponent("result.txt")
let scriptURL = tempDirectory.appendingPathComponent("probe.sh")
let script = """
#!/bin/sh
pwd > \(outputURL.path)
if [ -e /proc/self/fd/\(inheritedFD) ]; then
echo inherited >> \(outputURL.path)
else
echo closed >> \(outputURL.path)
fi
"""
// Direct writes close the executable before spawn; atomic replacement can race with exec on overlay
// filesystems.
try Data(script.utf8).write(to: scriptURL)
#expect(chmod(scriptURL.path, 0o700) == 0)
let handle = try AntigravityPTYProcessLauncher().launch(binary: scriptURL.path)
defer {
handle.killRoot()
handle.terminateTree(signal: SIGKILL, knownDescendants: [])
handle.closePTY()
}
for _ in 0..<200 {
if FileManager.default.fileExists(atPath: outputURL.path),
let output = try? String(contentsOf: outputURL, encoding: .utf8)
{
let lines = output
.split(separator: "\n")
.map(String.init)
if lines.count >= 2, output.hasSuffix("\n") { break }
}
Thread.sleep(forTimeInterval: 0.01)
}
let lines = try String(contentsOf: outputURL, encoding: .utf8)
.split(separator: "\n")
.map(String.init)
#expect(lines == [NSHomeDirectory(), "closed"])
}
}
#endif