summaryrefslogtreecommitdiff
path: root/internal/eventloop_error_handling_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-01 23:33:46 +0200
committerPaul Buetow <paul@buetow.org>2026-03-01 23:33:46 +0200
commit3690b89082215ff5c1fc84110074cf08b1b8909c (patch)
treee89f32688b64a467cb804e9df615a32cc6c2522c /internal/eventloop_error_handling_test.go
parent3a438f0381a21c0055db3cce3164ff0ef5970cc0 (diff)
Route non-fatal event-loop warnings to TUI
Diffstat (limited to 'internal/eventloop_error_handling_test.go')
-rw-r--r--internal/eventloop_error_handling_test.go115
1 files changed, 115 insertions, 0 deletions
diff --git a/internal/eventloop_error_handling_test.go b/internal/eventloop_error_handling_test.go
new file mode 100644
index 0000000..12f9b2f
--- /dev/null
+++ b/internal/eventloop_error_handling_test.go
@@ -0,0 +1,115 @@
+package internal
+
+import (
+ "testing"
+
+ "ior/internal/event"
+ "ior/internal/types"
+)
+
+func TestTracepointExitedMalformedOpenExitDoesNotPanicAndNotifies(t *testing.T) {
+ el := newEventLoop(eventLoopConfig{})
+ warnings := make(chan string, 1)
+ el.warningCb = func(message string) { warnings <- message }
+
+ enterEv, enterRaw := makeEnterOpenEvent(t, defaulTime, defaultPid, defaultTid)
+ el.tracepointEntered(types.NewOpenEvent(enterRaw))
+
+ _, exitRaw := makeExitNullEvent(t, defaulTime+1, defaultPid, defaultTid, types.SYS_EXIT_OPEN)
+ exitEv := types.NewNullEvent(exitRaw)
+ pairCh := make(chan *event.Pair, 1)
+
+ defer func() {
+ if r := recover(); r != nil {
+ t.Fatalf("tracepointExited panicked: %v", r)
+ }
+ }()
+
+ el.tracepointExited(exitEv, pairCh)
+
+ select {
+ case ep := <-pairCh:
+ t.Fatalf("unexpected event produced: %v", ep)
+ default:
+ }
+
+ select {
+ case msg := <-warnings:
+ if msg == "" {
+ t.Fatalf("expected non-empty warning message")
+ }
+ default:
+ t.Fatalf("expected warning notification")
+ }
+
+ if _, ok := el.enterEvs[enterEv.Tid]; ok {
+ t.Fatalf("expected enter event to be removed for tid %d", enterEv.Tid)
+ }
+}
+
+func TestTracepointExitedMalformedOpenByHandleAtExitDoesNotPanicAndNotifies(t *testing.T) {
+ el := newEventLoop(eventLoopConfig{})
+ warnings := make(chan string, 1)
+ el.warningCb = func(message string) { warnings <- message }
+
+ _, enterRaw := makeEnterOpenByHandleAtEvent(t, defaulTime, defaultPid, defaultTid, 0)
+ el.tracepointEntered(types.NewOpenByHandleAtEvent(enterRaw))
+
+ _, exitRaw := makeExitNullEvent(t, defaulTime+1, defaultPid, defaultTid, types.SYS_EXIT_OPEN_BY_HANDLE_AT)
+ exitEv := types.NewNullEvent(exitRaw)
+ pairCh := make(chan *event.Pair, 1)
+
+ defer func() {
+ if r := recover(); r != nil {
+ t.Fatalf("tracepointExited panicked: %v", r)
+ }
+ }()
+
+ el.tracepointExited(exitEv, pairCh)
+
+ select {
+ case ep := <-pairCh:
+ t.Fatalf("unexpected event produced: %v", ep)
+ default:
+ }
+
+ select {
+ case msg := <-warnings:
+ if msg == "" {
+ t.Fatalf("expected non-empty warning message")
+ }
+ default:
+ t.Fatalf("expected warning notification")
+ }
+}
+
+func TestProcessRawEventUnknownTypeDoesNotPanicAndNotifies(t *testing.T) {
+ el := newEventLoop(eventLoopConfig{})
+ warnings := make(chan string, 1)
+ el.warningCb = func(message string) { warnings <- message }
+
+ pairCh := make(chan *event.Pair, 1)
+
+ defer func() {
+ if r := recover(); r != nil {
+ t.Fatalf("processRawEvent panicked: %v", r)
+ }
+ }()
+
+ el.processRawEvent([]byte{255}, pairCh)
+
+ select {
+ case ep := <-pairCh:
+ t.Fatalf("unexpected event produced: %v", ep)
+ default:
+ }
+
+ select {
+ case msg := <-warnings:
+ if msg == "" {
+ t.Fatalf("expected non-empty warning message")
+ }
+ default:
+ t.Fatalf("expected warning notification")
+ }
+}