summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/eventloop_test.go84
-rw-r--r--internal/ior.go6
2 files changed, 64 insertions, 26 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()
diff --git a/internal/ior.go b/internal/ior.go
index 98fb39c..f06b730 100644
--- a/internal/ior.go
+++ b/internal/ior.go
@@ -117,7 +117,7 @@ func runTrace() error {
close(pprofDone)
}
- loop := newEventLoop()
+ el := newEventLoop()
duration := time.Duration(flags.Get().Duration) * time.Second
fmt.Println("Probing for", duration)
ctx, cancel := context.WithTimeout(context.Background(), duration)
@@ -133,7 +133,7 @@ func runTrace() error {
go func() {
<-ctx.Done()
- fmt.Println(loop.stats())
+ fmt.Println(el.stats())
if flags.Get().PprofEnable {
fmt.Println("Stoppig profiling, writing ior.cpuprofile and ior.memprofile")
pprof.StopCPUProfile()
@@ -143,7 +143,7 @@ func runTrace() error {
}()
startTime := time.Now()
- loop.run(ctx, ch)
+ el.run(ctx, ch)
totalDuration := time.Since(startTime)
<-pprofDone
fmt.Println("Good bye... (unloading BPF tracepoints will take a few seconds...) after", totalDuration)