diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-01 23:33:46 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-01 23:33:46 +0200 |
| commit | 3690b89082215ff5c1fc84110074cf08b1b8909c (patch) | |
| tree | e89f32688b64a467cb804e9df615a32cc6c2522c /internal/eventloop_error_handling_test.go | |
| parent | 3a438f0381a21c0055db3cce3164ff0ef5970cc0 (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.go | 115 |
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") + } +} |
