package main import ( "fmt" "os" ) // scenarios maps scenario names to their execution functions. var scenarios = map[string]func() error{ "crash": crash, "open-basic": openBasic, "open-openat2": openOpenat2, "open-creat": openCreat, "open-by-handle-at": openByHandleAt, "open-duration-gap": openDurationGap, "open-enoent": openEnoent, "open-rdonly-write": openRdonlyWrite, "open-pid-filter": openPidFilter, "readwrite-basic": readwriteBasic, "readwrite-pread": readwritePread, "readwrite-preadv": readwritePreadv, "readwrite-preadv2": readwritePreadv2, "readwrite-pwrite": readwritePwrite, "readwrite-pwritev": readwritePwritev, "readwrite-pwritev2": readwritePwritev2, "readwrite-readv": readwriteReadv, "readwrite-writev": readwriteWritev, "readwrite-wronly-read": readwriteWronlyRead, "readwrite-rdonly-write": readwriteRdonlyWrite, "readwrite-pread-invalid": readwritePreadInvalid, "readwrite-pwrite-invalid": readwritePwriteInvalid, "readwrite-readahead": readwriteReadahead, "readwrite-readahead-ebadf": readwriteReadaheadEbadf, "readwrite-fadvise64": readwriteFadvise64, "readwrite-fadvise64-ebadf": readwriteFadvise64Ebadf, "readwrite-cachestat": readwriteCachestat, "retbytes-phase-a": retbytesPhaseA, "socket-basic": socketBasic, "socketpair-basic": socketpairBasic, "socket-accept-lifecycle": socketAcceptLifecycle, "socket-accept-lifecycle-plain": socketAcceptLifecyclePlain, "socket-introspection": socketIntrospection, "pipe-basic": pipeBasic, "pipe2-basic": pipe2Basic, "eventfd-basic": eventfdBasic, "eventfd2-basic": eventfd2Basic, "fd-from-air-eventfd-users": fdFromAirEventfdUsers, "inotify-basic": inotifyBasic, "mq-posix-basic": mqPosixBasic, "sysv-shm-basic": sysvShmBasic, "sysv-msg-basic": sysvMsgBasic, "sysv-sem-basic": sysvSemBasic, "mountfs-management": mountfsManagement, "polling-epoll": pollingEpoll, "sleep-syscalls": sleepSyscalls, "posix-timer-lifecycle": posixTimerLifecycle, "interval-timer-noop": intervalTimerNoop, "process-exec-lifecycle": processExecLifecycle, "family-mixed": familyMixed, "close-basic": closeBasic, "close-range": closeRange, "close-range-bounded": closeRangeBounded, "close-invalid-fd": closeInvalidFd, "close-double-close": closeDoubleClose, "close-range-empty": closeRangeEmpty, "dup-basic": dupBasic, "dup-dup2": dupDup2, "dup-dup3": dupDup3, "dup-invalid-fd": dupInvalidFd, "dup2-same-fd": dup2SameFd, "dup3-invalid-flags": dup3InvalidFlags, "fcntl-dupfd": fcntlDupfd, "fcntl-setfl": fcntlSetfl, "fcntl-dupfd-cloexec": fcntlDupfdCloexec, "fcntl-invalid-fd": fcntlInvalidFd, "fcntl-dupfd-max": fcntlDupfdMax, "ioctl-basic": ioctlBasic, "rename-basic": renameBasic, "rename-renameat": renameRenameat, "rename-renameat2": renameRenameat2, "rename-enoent": renameEnoent, "rename-noreplace": renameNoreplace, "link-basic": linkBasic, "link-linkat": linkLinkat, "link-symlinkat": linkSymlinkat, "link-readlinkat": linkReadlinkat, "link-enoent": linkEnoent, "link-symlink-eexist": linkSymlinkEexist, "link-readlinkat-einval": linkReadlinkatEinval, "unlink-basic": unlinkBasic, "unlink-unlinkat": unlinkUnlinkat, "unlink-rmdir": unlinkRmdir, "unlink-enoent": unlinkEnoent, "unlink-rmdir-notempty": unlinkRmdirNotempty, "unlink-unlinkat-enoent": unlinkUnlinkatEnoent, "dir-basic": dirBasic, "dir-mkdirat": dirMkdirat, "dir-mknodat-fifo": dirMknodatFifo, "dir-chdir": dirChdir, "dir-getcwd": dirGetcwd, "dir-getdents": dirGetdents, "dir-mkdir-eexist": dirMkdirEexist, "dir-chdir-enoent": dirChdirEnoent, "dir-getdents-ebadf": dirGetdentsEbadf, "stat-basic": statBasic, "stat-fstat": statFstat, "stat-lstat": statLstat, "stat-newfstatat": statNewfstatat, "stat-statx": statStatx, "stat-access": statAccess, "stat-faccessat": statFaccessat, "stat-enoent": statEnoent, "stat-access-enoent": statAccessEnoent, "stat-fstat-ebadf": statFstatEbadf, "stat-statfs": statStatfs, "xattr-getxattrat": xattrGetxattrat, "xattr-listxattrat": xattrListxattrat, "xattr-removexattrat": xattrRemovexattrat, "xattr-getxattr": xattrGetxattr, "xattr-lgetxattr": xattrLgetxattr, "xattr-listxattr": xattrListxattr, "xattr-llistxattr": xattrLlistxattr, "xattr-lsetxattr": xattrLsetxattr, "xattr-setxattrat": xattrSetxattrat, "xattr-removexattr": xattrRemovexattr, "xattr-lremovexattr": xattrLremovexattr, "xattr-fd": xattrFd, "chmod-basic": chmodBasic, "chown-basic": chownBasic, "utime-basic": utimeBasic, "utime-utimes": utimeUtimes, "utime-futimesat": utimeFutimesat, "utime-utimensat": utimeUtimensat, "utime-enoent": utimeEnoent, "sync-basic": syncBasic, "sync-fdatasync": syncFdatasync, "sync-sync": syncSync, "sync-sync-file-range": syncSyncFileRange, "sync-sync-file-range-to-eof": syncSyncFileRangeToEOF, "sync-fsync-ebadf": syncFsyncEbadf, "sync-fdatasync-ebadf": syncFdatasyncEbadf, "sync-file-range-ebadf": syncFileRangeEbadf, "mmap-basic": mmapBasic, "mmap-msync-sync": mmapMsyncSync, "mmap-msync-invalid-flags": mmapMsyncInvalidFlags, "mmap-mremap-munmap": mmapMremapMunmap, "mmap-memory-lock": mmapMemoryLock, "copy-file-range-basic": copyFileRangeBasic, "copy-file-range-bad-dst-fd": copyFileRangeBadDstFd, "truncate-basic": truncateBasic, "truncate-ftruncate": truncateFtruncate, "truncate-enoent": truncateEnoent, "truncate-ftruncate-ebadf": truncateFtruncateEbadf, "pidfd-getfd-success": pidfdGetfdSuccess, "pidfd-getfd-failure": pidfdGetfdFailure, "pidfd-send-signal": pidfdSendSignal, "security-keys-ptrace-perf": securityKeysPtracePerf, "security-landlock": securityLandlockCreateRuleset, "security-getrandom": securityGetrandom, "flock-basic": flockBasic, "iouring-setup": iouringSetup, "iouring-enter": iouringEnter, "iouring-register": iouringRegister, "iouring-enter-ebadf": iouringEnterEbadf, "iouring-register-ebadf": iouringRegisterEbadf, "aio-setup": aioSetup, "aio-setup-einval": aioSetupEinval, "aio-submit": aioSubmit, "aio-getevents": aioGetevents, "aio-cancel": aioCancel, "signals-basic": signalsBasic, "misc-basic": miscBasic, "sched-basic": schedBasic, "priority-basic": priorityBasic, "ioprio-basic": ioprioBasic, } func makeTempDir(prefix string) (string, func(), error) { dir, err := os.MkdirTemp("", fmt.Sprintf("ioworkload-%s-", prefix)) if err != nil { return "", nil, fmt.Errorf("create temp dir: %w", err) } cleanup := func() { os.RemoveAll(dir) } return dir, cleanup, nil } // crash simulates a workload that fails with a non-zero exit code. // Used to verify the test harness handles workload failures gracefully. func crash() error { return fmt.Errorf("intentional crash for testing") }