summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-02-22Add copy_file_range support and tracepoint attach testsPaul Buetow
2026-02-22Implement mmap/msync syscall support with unit and integration coveragePaul Buetow
2026-02-22Implement sync_file_range coverage and document mage world bootstrapPaul Buetow
2026-02-21Split ioworkload scenarios.go into per-category filesPaul Buetow
Split the 2494-line scenarios.go monolith into 14 focused files by syscall category: open, readwrite, close, dup, fcntl, rename, link, unlink, dir, stat, sync, truncate, iouring, plus the slimmed-down scenarios.go containing only the registry map, makeTempDir, and crash. Extracted rawLink, rawSymlink, rawReadlink helpers in scenario_link.go to reduce code duplication in linkBasic. Task: #349 (Go best practices: split oversized scenarios file) Amp-Thread-ID: https://ampcode.com/threads/T-019c81c6-e1b6-747a-9144-40f6be997e60 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative tests for all internal unit tests (task 348)Paul Buetow
- internal/types: Fix StringValue panic with no null terminator, add negative tests for serialization, Equals, and StringValue edge cases - internal/file: Add negative tests for empty name, unknown flags, SetFlags/AddFlags, Dup, empty OldnameNewname and Pathname - internal/flamegraph: Add negative tests for StringByName unknown field, Counter.ValueByName panic, merge empty, deserialize invalid data, serialize/deserialize round-trip - internal/generate/format: Add negative tests for empty input, ID errors, malformed fields, empty declarations - internal/generate/typesgo: Add negative tests for snakeToCamel edge cases, unknown types, invalid member/define parsing, no-import case - internal/generate/tracepointsgo: Add negative tests for malformed SEC, no SEC lines - internal/generate/codegen: Add negative tests for unknown event kind, invalid syscall grouping, missing exit tracepoint - internal/generate/classify: Add negative tests for empty external fields, non-fd types Amp-Thread-ID: https://ampcode.com/threads/T-019c81bf-3d5c-7216-b1b6-890db1374414 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for io_uring syscalls (EBADF)Paul Buetow
Add two new scenarios and tests: - iouring-enter-ebadf: io_uring_enter with invalid fd 99999 - iouring-register-ebadf: io_uring_register with invalid fd 99999 Both verify ior captures the tracepoint even when the syscall fails. Task: 348 Amp-Thread-ID: https://ampcode.com/threads/T-019c81bb-a460-7298-a25a-fa33502272b9 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for truncate syscalls (task 348)Paul Buetow
Add two negative test scenarios: - truncate-enoent: SYS_TRUNCATE on nonexistent file, expects ENOENT - truncate-ftruncate-ebadf: SYS_FTRUNCATE on invalid fd 99999, expects EBADF Both verify ior captures tracepoints even when syscalls fail. Amp-Thread-ID: https://ampcode.com/threads/T-019c81b7-9641-763e-b99e-20a0d3552005 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for sync syscalls (task 348)Paul Buetow
Add three EBADF scenarios testing ior's ability to capture sync-related tracepoints even when the underlying syscall fails: - sync-fsync-ebadf: fsync on invalid fd, expects enter_fsync - sync-fdatasync-ebadf: fdatasync on invalid fd, expects enter_fdatasync - sync-file-range-ebadf: sync_file_range on invalid fd, expects enter_sync_file_range Amp-Thread-ID: https://ampcode.com/threads/T-019c81b4-216a-732c-90b1-e6771e27ed75 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for stat syscalls (task 348)Paul Buetow
Add three negative test scenarios for stat-family syscalls: - stat-enoent: SYS_STAT on nonexistent file (ENOENT) - stat-access-enoent: SYS_ACCESS on nonexistent file (ENOENT, since tests run as root and EACCES is bypassed) - stat-fstat-ebadf: SYS_FSTAT on invalid fd 99999 (EBADF) Each scenario verifies that ior captures the tracepoint on syscall entry even when the syscall fails. Amp-Thread-ID: https://ampcode.com/threads/T-019c81af-d01d-75db-8a92-37951fb1503c Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for dir syscalls (task 348)Paul Buetow
Add three negative test scenarios for directory operations: - dir-mkdir-eexist: SYS_MKDIR on existing directory (EEXIST) - dir-chdir-enoent: SYS_CHDIR to nonexistent directory (ENOENT) - dir-getdents-ebadf: SYS_GETDENTS64 with invalid fd (EBADF) All use raw syscalls to hit exact tracepoints. Tests verify ior captures events even when syscalls fail (entry-side capture). Amp-Thread-ID: https://ampcode.com/threads/T-019c81ab-0d62-726e-b859-91b4898be6fe Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for unlink syscalls (task 348)Paul Buetow
Add three negative test scenarios for unlink syscall family: - unlink-enoent: SYS_UNLINK on nonexistent file (ENOENT) - unlink-rmdir-notempty: SYS_RMDIR on non-empty directory (ENOTEMPTY) - unlink-unlinkat-enoent: SYS_UNLINKAT on nonexistent file (ENOENT) All scenarios use raw syscalls to hit exact tracepoints and verify ior captures them on entry even when the kernel returns an error. Amp-Thread-ID: https://ampcode.com/threads/T-019c81a6-6612-7247-9d54-6da5b63a38b4 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for link syscalls (task 348)Paul Buetow
Add three negative scenarios and tests: - link-enoent: hard link to nonexistent source (ENOENT) via raw SYS_LINK - link-symlink-eexist: symlink where target already exists (EEXIST) via raw SYS_SYMLINK - link-readlinkat-einval: readlinkat on non-symlink file (EINVAL) via SYS_READLINKAT All use raw syscalls to hit exact tracepoints. ior captures on syscall entry, so even failed syscalls have their arguments recorded. Amp-Thread-ID: https://ampcode.com/threads/T-019c81a2-693b-716f-9ed2-25a674f1fc9a Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for rename syscalls (task 348)Paul Buetow
- rename-enoent: rename nonexistent file via SYS_RENAME (ENOENT) - rename-noreplace: renameat2 with RENAME_NOREPLACE on existing target (EEXIST) Both verify ior captures tracepoints on entry even when syscall fails. Amp-Thread-ID: https://ampcode.com/threads/T-019c819e-cdae-7777-9be6-992ca8a7b96b Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for fcntl syscalls (task 348)Paul Buetow
Add two negative scenarios: - fcntl-invalid-fd: calls SYS_FCNTL F_GETFL on invalid fd 99999 (EBADF) - fcntl-dupfd-max: calls F_DUPFD with minfd=1<<30 beyond RLIMIT_NOFILE (EINVAL) Both verify ior captures enter_fcntl tracepoints even when syscalls fail. Amp-Thread-ID: https://ampcode.com/threads/T-019c819b-5673-75ab-8eb4-227b6cf56b38 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for dup syscallsPaul Buetow
Add three negative test scenarios for dup syscalls: - dup-invalid-fd: dup on invalid fd 99999 (EBADF) - dup2-same-fd: dup2(fd, fd) no-op case (POSIX documented behavior) - dup3-invalid-flags: dup3 with 0xBAD flags (EINVAL) All verify ior captures the tracepoint even when the syscall fails, since BPF reads arguments on syscall entry before execution. Task: 348 Amp-Thread-ID: https://ampcode.com/threads/T-019c8196-6186-7054-a4e5-640fce69e493 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for close syscallsPaul Buetow
Add three negative scenarios to verify ior captures tracepoints even when close syscalls fail: - close-invalid-fd: close an fd (99999) that was never opened (EBADF) - close-double-close: open a file, close it, close same fd again (EBADF) - close-range-empty: close_range on high fd range with no open fds Task: 348 Amp-Thread-ID: https://ampcode.com/threads/T-019c8190-c9ae-776e-b00d-476207d8c10e Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for readwrite syscalls (task 348)Paul Buetow
Add four negative scenarios that verify ior captures tracepoints even when syscalls fail: - readwrite-wronly-read: read from O_WRONLY fd (EBADF) - readwrite-rdonly-write: write to O_RDONLY fd (EBADF) - readwrite-pread-invalid: pread64 with negative offset (EINVAL) - readwrite-pwrite-invalid: pwrite64 with negative offset (EINVAL) Amp-Thread-ID: https://ampcode.com/threads/T-019c818c-ec91-7673-a5ba-e9b2ba53379b Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add negative integration tests for open syscallsPaul Buetow
- openEnoent: verifies ior captures enter_openat even when syscall fails (ENOENT) - openRdonlyWrite: verifies tracing of open + failed write to read-only fd - openPidFilter: verifies child process I/O is excluded by PID filtering - AssertEventsAbsent helper with zero-value guard and 6 unit tests Task: 348 Amp-Thread-ID: https://ampcode.com/threads/T-019c8185-55f4-72f0-8ddb-3be5e4002c0d Co-authored-by: Amp <amp@ampcode.com>
2026-02-21fix: close_range path resolution - lookup fd before deleting from mapPaul Buetow
Move e.files[fd] lookup before the close_range fd cleanup loop in the FdEvent handler so the file path is resolved while the fd still exists in the map. Previously, close_range events always fell through to file.NewFdWithPid() which couldn't resolve the path since the fd was already closed. Also add unit test assertion verifying ep.File resolves to the correct filename for close_range events. Task: 349 Amp-Thread-ID: https://ampcode.com/threads/T-019c8180-1da4-7048-9200-ae93bdd90cab Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Fix integration test expectations to test actual syscall outcomes (task 349)Paul Buetow
- rename_test.go: Fix PathContains to use destination names (newname.txt, renameat-new.txt, renameat2-new.txt) since name_events use Newname as the path in ior output, not the source name - open_test.go: Change expected tracepoint from enter_openat to enter_creat - scenarios.go: Use raw SYS_CREAT instead of Go's syscall.Creat which wraps openat on amd64, so the creat tracepoint is actually exercised - Created task 350 for close_range path resolution bug found during review Amp-Thread-ID: https://ampcode.com/threads/T-019c8178-1c1f-7509-9ac9-bd48b970945b Co-authored-by: Amp <amp@ampcode.com>
2026-02-21integrationtests: address review comments on cleanup testsPaul Buetow
- Remove tautological temp dir tests that self-cleaned in script - Add TestCleanupLeakedWorkloadTempDirCaughtByAssertion that creates a dir without cleanup and verifies detection catches it - Inline snapshotWorkloadTempDirs into listWorkloadTempDirs - Add comment explaining assertNoNewWorkloadTempDirs cleanup behavior - Add non-empty check in OutputDir test to prevent vacuous pass - Fix .collapsed -> .collapsed.zst suffix consistency Amp-Thread-ID: https://ampcode.com/threads/T-019c8172-052c-74fe-8d8d-34a0529d082c Co-authored-by: Amp <amp@ampcode.com>
2026-02-21integrationtests: verify no temp files or artifacts leak after testsPaul Buetow
Add cleanup_test.go with 6 tests verifying: - OutputDir contains only expected file types (.ior.zst, .collapsed.zst, .svg, bpf symlink) - No ioworkload temp dirs leak on success or failure paths - OutputDir only has bpf symlink after ior failure (no stale output) - No artifacts leak outside the OutputDir - Leak detection mechanism works (negative test) Task: 343 Amp-Thread-ID: https://ampcode.com/threads/T-019c8172-052c-74fe-8d8d-34a0529d082c Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Address review: strengthen multi-record assertions, add corrupt-zstd testPaul Buetow
- TestLoadTestResultMultipleRecordsSamePath now checks all fields per record - Fixed unchecked error return from zstd Write - Added TestLoadTestResultCorruptZstd for non-zstd file content Amp-Thread-ID: https://ampcode.com/threads/T-019c816d-5634-7387-8065-f67e38257019 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add parse.go unit tests verifying .ior.zst deserialization and TestResult fieldsPaul Buetow
Tests cover: - All IterRecord fields (Path, TraceID, Comm, Pid, Tid, Flags, Cnt) - Multiple records with same path but different tracepoints - Empty .ior.zst file - Nonexistent file (error path) - Invalid/corrupt data (error path) Task 343: Verify parse.go correctly deserializes .ior.zst files Amp-Thread-ID: https://ampcode.com/threads/T-019c816d-5634-7387-8065-f67e38257019 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add ior crash/timeout harness tests (task 343)Paul Buetow
- Add waitBoth unit tests: ior exit error, ior timeout, both timeout, both succeed — using real processes (true/false/sleep) - Add TestIorCrashReportsError: full harness test with fake ior binary that exits with error, verifying error mentions 'ior' and workload PID is returned - Add TestIorStartFailureCleansUpWorkload: verifies workload process is killed when ior binary doesn't exist, checking with signal 0 - Refactor waitBoth to accept grace duration parameter for testability (production code passes iorShutdownGrace, tests use 500ms) - Fix pipe drain in startWorkload: drain remaining stdout after reading PID so cmd.Wait() doesn't block on pending I/O - Add writeScript helper to helpers_test.go for creating fake binaries Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-019c8162-c1cf-7612-b8f5-84c61e3d2021
2026-02-21Verify harness handles workload crash/nonzero exit (task 343)Paul Buetow
Add crash scenario to ioworkload that exits non-zero, and a test verifying the harness returns a clear error mentioning 'workload', reports a valid PID, and returns no records. Amp-Thread-ID: https://ampcode.com/threads/T-019c815e-6fb6-714a-a4db-37522416ea9a Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Fix integration test harness: symlink BPF object, increase grace period, ↵Paul Buetow
improve assertions - Symlink ior.bpf.o into output dir so ior finds it when run from temp dir - Increase iorShutdownGrace from 3s to 30s for BPF tracepoint unloading - Skip records with empty comm in AssertNoUnexpectedComm (BPF race condition) - Add diagnostic logging (up to 5 samples) in both AssertNoUnexpectedComm and AssertNoUnexpectedPID for easier debugging of test failures Amp-Thread-ID: https://ampcode.com/threads/T-019c814e-d6b6-72fb-aaf0-c49f5b3fd04e Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add io_uring integration tests and workload scenariosPaul Buetow
Implement iouring_test.go with tests for io_uring_setup, io_uring_enter, and io_uring_register tracepoints. Add corresponding workload scenarios using raw syscalls (425, 426, 427) since Go stdlib doesn't wrap io_uring on amd64. - iouring-setup: creates io_uring instance via io_uring_setup(2) - iouring-enter: creates ring, calls io_uring_enter(2) with zero ops - iouring-register: creates ring, calls io_uring_register(2) with PROBE Task #343 Amp-Thread-ID: https://ampcode.com/threads/T-019c8149-2aa6-75fb-88f3-dd6bd3a2b654 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Implement truncate_test.go + workload scenarios for truncate, ftruncatePaul Buetow
- truncate-basic: tests SYS_TRUNCATE (path-based) via syscall.Truncate - truncate-ftruncate: tests SYS_FTRUNCATE (fd-based) via syscall.Ftruncate - Both syscall wrappers use direct SYS_* calls on amd64 (no *at wrapping) Task #343 Amp-Thread-ID: https://ampcode.com/threads/T-019c8145-7437-7218-95ff-4cb451e18655 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Implement sync_test.go + workload scenarios for fsync, fdatasync, sync, ↵Paul Buetow
sync_file_range - Add syncFdatasync, syncSync, syncSyncFileRange scenario functions - Register sync-fdatasync, sync-sync, sync-sync-file-range in scenarios map - Add sync_test.go with tests for all 4 sync-related syscalls - sync is a null_event (no path); others are fd_events - All use direct SYS_* syscalls on amd64 (no wrapper delegation) Task: #343 Amp-Thread-ID: https://ampcode.com/threads/T-019c813f-e020-7558-86ce-be6fdbd96f98 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21more on integration testsPaul Buetow
2026-02-21Add integration test framework: plan, workload binary, harness scaffoldingPaul Buetow
- INTEGRATIONTESTS-PLAN.md: full design for e2e integration tests - integrationtests/cmd/ioworkload: standalone binary with 13 I/O scenarios - integrationtests/expectations.go: ExpectedEvent type and assertion helpers - integrationtests/parse.go: .ior.zst parser producing TestResult - Export IterRecord and LoadFromFile in flamegraph package - Fix TraceId -> TraceID, StringByName returns error instead of panic Amp-Thread-ID: https://ampcode.com/threads/T-019c8031-c106-757a-95a0-7a5457163ce7 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Move TODO list to taskwarriorPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c8012-eaeb-768d-a264-5a704f3939ef Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add byte count tracking to event pairsPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c8012-eaeb-768d-a264-5a704f3939ef Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Enable name_to_handle_at and io_uring fd attributionPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fec-eec9-706a-8338-3ce674802680 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21review comments added to gitignroesPaul Buetow
2026-02-21Fix outdated line references and test command in documentationPaul Buetow
2026-02-21Document optional open_by_handle_at excludePaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Enable open_by_handle_at tracepointPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Track io_uring setup fds in event loopPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Handle close_range cleanupPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Handle open_by_handle_at without pathnamePaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Handle unknown flags for openat2Paul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Ignore flamegraph artifactsPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fa3-3180-7747-83d3-d6e99572c02a Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add flamegraph artifacts for e2e runPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fa3-3180-7747-83d3-d6e99572c02a Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Add docs and ignore cursor configPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Ignore ior binaryPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Migrate make targets to magePaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21Align Go project structure and add Mage targetsPaul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f3b-1326-767b-94d5-366b91eaf712 Co-authored-by: Amp <amp@ampcode.com>
2026-02-21rewrite from Raku to Golang initialPaul Buetow