summaryrefslogtreecommitdiff
path: root/internal/tui
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-25 08:24:28 +0200
committerPaul Buetow <paul@buetow.org>2026-02-25 08:24:28 +0200
commit615f305f308c849c1a7b6cadb93e5e520455e422 (patch)
tree43fa082c8f7433f2ea3f1987e29a62226776459b /internal/tui
parent78e9de77d8c443fe8dbe560b5ccb168a6142eb55 (diff)
Add TUI StreamEvent constructor and tests
Diffstat (limited to 'internal/tui')
-rw-r--r--internal/tui/eventstream/streamevent.go43
-rw-r--r--internal/tui/eventstream/streamevent_test.go87
2 files changed, 130 insertions, 0 deletions
diff --git a/internal/tui/eventstream/streamevent.go b/internal/tui/eventstream/streamevent.go
new file mode 100644
index 0000000..85ea217
--- /dev/null
+++ b/internal/tui/eventstream/streamevent.go
@@ -0,0 +1,43 @@
+package eventstream
+
+import (
+ "ior/internal/event"
+ "ior/internal/types"
+)
+
+type StreamEvent struct {
+ Seq uint64
+ TimeNs uint64
+ Syscall string
+ Comm string
+ PID uint32
+ TID uint32
+ FileName string
+ DurationNs uint64
+ GapNs uint64
+ Bytes uint64
+ RetVal int64
+ IsError bool
+}
+
+func NewStreamEvent(seq uint64, pair *event.Pair) StreamEvent {
+ e := StreamEvent{
+ Seq: seq,
+ TimeNs: pair.EnterEv.GetTime(),
+ Syscall: pair.EnterEv.GetTraceId().Name(),
+ Comm: pair.Comm,
+ PID: pair.EnterEv.GetPid(),
+ TID: pair.EnterEv.GetTid(),
+ FileName: pair.FileName(),
+ DurationNs: pair.Duration,
+ GapNs: pair.DurationToPrev,
+ Bytes: pair.Bytes,
+ }
+
+ if retEv, ok := pair.ExitEv.(*types.RetEvent); ok {
+ e.RetVal = retEv.Ret
+ e.IsError = retEv.Ret < 0
+ }
+
+ return e
+}
diff --git a/internal/tui/eventstream/streamevent_test.go b/internal/tui/eventstream/streamevent_test.go
new file mode 100644
index 0000000..d053072
--- /dev/null
+++ b/internal/tui/eventstream/streamevent_test.go
@@ -0,0 +1,87 @@
+package eventstream
+
+import (
+ "ior/internal/event"
+ "ior/internal/file"
+ "ior/internal/types"
+ "testing"
+)
+
+func TestNewStreamEventPopulatesFields(t *testing.T) {
+ enter := &types.OpenEvent{TraceId: types.SYS_ENTER_OPENAT, Time: 1234, Pid: 42, Tid: 84}
+ exit := &types.RetEvent{TraceId: types.SYS_EXIT_OPENAT, Time: 1300, Ret: -2, Pid: 42, Tid: 84}
+ pair := event.NewPair(enter)
+ pair.ExitEv = exit
+ pair.File = file.NewFd(7, "/tmp/test.txt", 0)
+ pair.Comm = "cat"
+ pair.Duration = 66
+ pair.DurationToPrev = 19
+ pair.Bytes = 512
+
+ got := NewStreamEvent(9, pair)
+
+ if got.Seq != 9 {
+ t.Fatalf("Seq = %d, want 9", got.Seq)
+ }
+ if got.TimeNs != 1234 {
+ t.Fatalf("TimeNs = %d, want 1234", got.TimeNs)
+ }
+ if got.Syscall != "openat" {
+ t.Fatalf("Syscall = %q, want openat", got.Syscall)
+ }
+ if got.Comm != "cat" {
+ t.Fatalf("Comm = %q, want cat", got.Comm)
+ }
+ if got.PID != 42 || got.TID != 84 {
+ t.Fatalf("PID/TID = %d/%d, want 42/84", got.PID, got.TID)
+ }
+ if got.FileName != "/tmp/test.txt" {
+ t.Fatalf("FileName = %q, want /tmp/test.txt", got.FileName)
+ }
+ if got.DurationNs != 66 || got.GapNs != 19 || got.Bytes != 512 {
+ t.Fatalf("DurationNs/GapNs/Bytes = %d/%d/%d, want 66/19/512", got.DurationNs, got.GapNs, got.Bytes)
+ }
+ if got.RetVal != -2 {
+ t.Fatalf("RetVal = %d, want -2", got.RetVal)
+ }
+ if !got.IsError {
+ t.Fatalf("IsError = false, want true")
+ }
+}
+
+func TestNewStreamEventCopiesBeforeRecycle(t *testing.T) {
+ enter := &types.OpenEvent{TraceId: types.SYS_ENTER_READ, Time: 2000, Pid: 1, Tid: 2}
+ exit := &types.RetEvent{TraceId: types.SYS_EXIT_READ, Time: 2010, Ret: 8, Pid: 1, Tid: 2}
+ pair := event.NewPair(enter)
+ pair.ExitEv = exit
+ pair.File = file.NewFd(3, "/tmp/in.txt", 0)
+ pair.Comm = "reader"
+ pair.Duration = 10
+ pair.DurationToPrev = 5
+ pair.Bytes = 8
+
+ got := NewStreamEvent(1, pair)
+ pair.Recycle()
+
+ if got.Syscall != "read" || got.Comm != "reader" || got.FileName != "/tmp/in.txt" {
+ t.Fatalf("event changed after recycle: %+v", got)
+ }
+ if got.RetVal != 8 || got.IsError {
+ t.Fatalf("RetVal/IsError = %d/%v, want 8/false", got.RetVal, got.IsError)
+ }
+}
+
+func TestNewStreamEventWithoutRetEvent(t *testing.T) {
+ enter := &types.NullEvent{TraceId: types.SYS_ENTER_SYNC, Time: 10, Pid: 1, Tid: 1}
+ exit := &types.NullEvent{TraceId: types.SYS_EXIT_SYNC, Time: 11, Pid: 1, Tid: 1}
+ pair := event.NewPair(enter)
+ pair.ExitEv = exit
+
+ got := NewStreamEvent(3, pair)
+ if got.RetVal != 0 {
+ t.Fatalf("RetVal = %d, want 0", got.RetVal)
+ }
+ if got.IsError {
+ t.Fatalf("IsError = true, want false")
+ }
+}