summaryrefslogtreecommitdiff
path: root/internal/eventloop_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-04-17 00:30:10 +0300
committerPaul Buetow <paul@buetow.org>2025-04-17 00:30:10 +0300
commitf27848b812aecd0bb0aecb100119c0ab71b5fbeb (patch)
treef5fe52b02a9a377ee523844d77cb1ad4caf13e7b /internal/eventloop_test.go
parentae12f7882c03c201732501df18e98a9772be9c71 (diff)
more about this
Diffstat (limited to 'internal/eventloop_test.go')
-rw-r--r--internal/eventloop_test.go84
1 files changed, 61 insertions, 23 deletions
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()