/development/std/process/subprocess_tests_darwin.nct
subprocess_tests_darwin.nct
//! Native launch-report protocol edge qualification.
see ./subprocess_darwin.nct
use /internal/os/darwin
use /ptr
test launch_report_channel_distinguishes_truncation_and_read_failure {
match create_launch_pipe() {
LaunchPipeAttempt.ready(read_fd, write_fd) {
let partial_errno: i32 = 13
let write_result = darwin.syscall3(
darwin.SYS_WRITE,
write_fd,
ptr.addr(ptr.from_ref(&partial_errno)),
2,
)
let write_close = darwin.syscall1(darwin.SYS_CLOSE, write_fd)
if write_result.errno != 0 || write_result.value != 2 || write_close.errno != 0 {
let _ = darwin.syscall1(darwin.SYS_CLOSE, read_fd)
return error.new("std.process.test", "partial exec report write failed")
}
let report = read_exec_report(read_fd)
let read_close = darwin.syscall1(darwin.SYS_CLOSE, read_fd)
if read_close.errno != 0 {
return error.new("std.process.test", "partial exec report close failed")
}
match move report {
ExecReportAttempt.malformed {}
ExecReportAttempt.executed {
return error.new("std.process.test", "partial exec report became success")
}
ExecReportAttempt.rejected(_) {
return error.new("std.process.test", "partial exec report became rejection")
}
ExecReportAttempt.channel_failed(_) {
return error.new("std.process.test", "partial exec report became channel failure")
}
}
}
LaunchPipeAttempt.failed(_) {
return error.new("std.process.test", "partial report pipe creation failed")
}
}
match create_launch_pipe() {
LaunchPipeAttempt.ready(read_fd, write_fd) {
let read_close = darwin.syscall1(darwin.SYS_CLOSE, read_fd)
if read_close.errno != 0 {
let _ = darwin.syscall1(darwin.SYS_CLOSE, write_fd)
return error.new("std.process.test", "failed-channel read close failed")
}
let report = read_exec_report(read_fd)
let write_close = darwin.syscall1(darwin.SYS_CLOSE, write_fd)
if write_close.errno != 0 {
return error.new("std.process.test", "failed-channel write close failed")
}
match move report {
ExecReportAttempt.channel_failed(errno) {
if errno == 0 {
return error.new("std.process.test", "failed report channel lost errno")
}
}
ExecReportAttempt.executed {
return error.new("std.process.test", "failed report channel became success")
}
ExecReportAttempt.rejected(_) {
return error.new("std.process.test", "failed report channel became rejection")
}
ExecReportAttempt.malformed {
return error.new("std.process.test", "failed report channel became malformed")
}
}
}
LaunchPipeAttempt.failed(_) {
return error.new("std.process.test", "failed-channel pipe creation failed")
}
}
return
}