Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/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
}