From f27848b812aecd0bb0aecb100119c0ab71b5fbeb Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 17 Apr 2025 00:30:10 +0300 Subject: more about this --- internal/eventloop_test.go | 84 +++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 23 deletions(-) (limited to 'internal/eventloop_test.go') diff --git a/internal/eventloop_test.go b/internal/eventloop_test.go index 2cb4477..71ef352 100644 --- a/internal/eventloop_test.go +++ b/internal/eventloop_test.go @@ -2,22 +2,30 @@ package internal import ( "context" - "fmt" "ior/internal/event" "ior/internal/types" "syscall" "testing" ) +const ( + defaulTime = 1234567 + defaultPid = 10 + defaultTid = 11 +) + type testData struct { - rawTracepoints [][]byte // All the raw tracepoints sent to the event loop - validates []func(t *testing.T, ev *event.Pair) // Validation functions to be called on the event loop output + // All the raw tracepoints sent to the event loop + rawTracepoints [][]byte + // Validation functions to be called on the event loop output + validates []func(t *testing.T, el *eventLoop, ev *event.Pair) } func TestEventloop(t *testing.T) { testTable := map[string]testData{ "OpenEventTest1": makeOpenEventTestData1(t), "OpenEventTest2": makeOpenEventTestData2(t), + "OpenEventTest3": makeOpenEventTestData3(t), } ctx, cancel := context.WithCancel(context.Background()) @@ -26,9 +34,9 @@ func TestEventloop(t *testing.T) { inCh := make(chan []byte) outCh := make(chan *event.Pair) - ev := newEventLoop() - ev.printCb = func(ev *event.Pair) { outCh <- ev } - go ev.run(ctx, inCh) + el := newEventLoop() + el.printCb = func(ev *event.Pair) { outCh <- ev } + go el.run(ctx, inCh) for testName, td := range testTable { t.Run(testName, func(t *testing.T) { @@ -41,7 +49,7 @@ func TestEventloop(t *testing.T) { for _, validate := range td.validates { ep := <-outCh t.Log("Received", ep) - validate(t, ep) + validate(t, el, ep) } select { case x := <-outCh: @@ -52,39 +60,37 @@ func TestEventloop(t *testing.T) { } } +// Tests a simple enter/exit pair of tracepoints. func makeOpenEventTestData1(t *testing.T) (td testData) { - enterEv, enterEvBytes := makeEnterOpenEvent(t) + enterEv, enterEvBytes := makeEnterOpenEvent(t, defaulTime, defaultPid, defaultTid) td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) - exitEv, exitEvBytes := makeExitOpenEvent(t) + exitEv, exitEvBytes := makeExitOpenEvent(t, defaulTime, defaultPid, defaultTid) td.rawTracepoints = append(td.rawTracepoints, exitEvBytes) - td.validates = append(td.validates, func(t *testing.T, ep *event.Pair) { + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { if !enterEv.Equals(ep.EnterEv) { t.Errorf("Expected '%v' but got '%v'", enterEv, ep.EnterEv) - return } if !exitEv.Equals(ep.ExitEv) { t.Errorf("Expected '%v' but got '%v'", exitEv, ep.ExitEv) - return } filenameA := ep.FileName() filenameB := types.StringValue(enterEv.Filename[:]) if filenameA != filenameB { t.Errorf("Expected file name '%v' but got '%v'", filenameB, filenameA) - return } comm := types.StringValue(enterEv.Comm[:]) if ep.Comm != comm { t.Errorf("Expected comm name '%v' but got '%v'", comm, ep.Comm) - return } - t.Log(fmt.Sprintf("Event pair '%v' appears fine", ep)) }) return td } + +// Tests skipping of incomplete enter/exit tracepoints. func makeOpenEventTestData2(t *testing.T) (td testData) { // Almost the same, but with duplicates td1 := makeOpenEventTestData1(t) @@ -98,13 +104,45 @@ func makeOpenEventTestData2(t *testing.T) (td testData) { return td } -func makeEnterOpenEvent(t *testing.T) (types.OpenEvent, []byte) { +// Tests 2 parallel tracepoints but from different threads. +func makeOpenEventTestData3(t *testing.T) (td testData) { + enterEv1, enterEvBytes1 := makeEnterOpenEvent(t, defaulTime, defaultPid, defaultTid) + enterEv2, enterEvBytes2 := makeEnterOpenEvent(t, defaulTime+1, defaultPid, defaultTid+1) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes1) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes2) + + exitEv1, exitEvBytes1 := makeExitOpenEvent(t, defaulTime+2, defaultPid, defaultTid) + exitEv2, exitEvBytes2 := makeExitOpenEvent(t, defaulTime+3, defaultPid, defaultTid+1) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes1) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes2) + + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv1.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv1, ep.EnterEv) + } + if !exitEv1.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv1, ep.ExitEv) + } + }) + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv2.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv2, ep.EnterEv) + } + if !exitEv2.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv2, ep.ExitEv) + } + }) + + return td +} + +func makeEnterOpenEvent(t *testing.T, time uint64, pid, tid uint32) (types.OpenEvent, []byte) { ev := types.OpenEvent{ EventType: types.ENTER_OPEN_EVENT, TraceId: types.SYS_ENTER_OPENAT, - Time: 123456789, - Pid: 10, - Tid: 11, + Time: time, + Pid: pid, + Tid: tid, Flags: syscall.O_RDWR, Filename: [types.MAX_FILENAME_LENGTH]byte{}, Comm: [types.MAX_PROGNAME_LENGTH]byte{}, @@ -119,14 +157,14 @@ func makeEnterOpenEvent(t *testing.T) (types.OpenEvent, []byte) { return ev, bytes } -func makeExitOpenEvent(t *testing.T) (types.RetEvent, []byte) { +func makeExitOpenEvent(t *testing.T, time uint64, pid, tid uint32) (types.RetEvent, []byte) { ev := types.RetEvent{ EventType: types.EXIT_OPEN_EVENT, TraceId: types.SYS_EXIT_OPENAT, - Time: 123456789, + Time: time, Ret: 42, - Pid: 10, - Tid: 11, + Pid: pid, + Tid: tid, } bytes, err := ev.Bytes() -- cgit v1.2.3