| Age | Commit message (Collapse) | Author |
|
|
|
|
|
|
|
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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
- 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>
|
|
- 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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
- 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
|
|
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>
|
|
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>
|
|
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>
|
|
- 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>
|
|
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>
|
|
|
|
- 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>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c8012-eaeb-768d-a264-5a704f3939ef
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c8012-eaeb-768d-a264-5a704f3939ef
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fec-eec9-706a-8338-3ce674802680
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fd9-5870-77b7-9909-3eb7550d17bb
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fa3-3180-7747-83d3-d6e99572c02a
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fa3-3180-7747-83d3-d6e99572c02a
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f4e-cc5f-76f1-aaf0-dd7cbaabbb18
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-019c7f3b-1326-767b-94d5-366b91eaf712
Co-authored-by: Amp <amp@ampcode.com>
|
|
|