1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
package internal
import (
"testing"
"ior/internal/event"
"ior/internal/types"
)
func TestTracepointExitedMalformedOpenExitDoesNotPanicAndNotifies(t *testing.T) {
el := mustNewEventLoop(t, 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 := mustNewEventLoop(t, 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 := mustNewEventLoop(t, 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")
}
}
|