ebpf_exporter
174 строки · 3.8 Кб
1package cgroup
2
3import (
4"fmt"
5"os"
6"testing"
7"time"
8)
9
10const preExistingFile = "i-was-here"
11const sleepDuration = time.Millisecond * 5
12
13func TestMonitor(t *testing.T) {
14cases := []struct {
15kind string
16check func() bool
17factory func(path string) (monitor, error)
18}{
19{
20kind: "Monitor",
21factory: func(path string) (monitor, error) {
22return NewMonitor(path)
23},
24},
25{
26kind: "walkerMonitor",
27factory: func(path string) (monitor, error) {
28return newWalkerMonitor(path)
29},
30},
31{
32kind: "fanotifyMonitor",
33check: func() bool {
34// Only test fanotify under root
35return os.Geteuid() == 0
36},
37factory: func(path string) (monitor, error) {
38return newFanotifyMonitor(path)
39},
40},
41}
42
43for _, c := range cases {
44t.Run(c.kind, func(t *testing.T) {
45path := t.TempDir()
46
47preExistingPath := fmt.Sprintf("%s/%s", path, preExistingFile)
48if err := os.Mkdir(preExistingPath, 0755); err != nil {
49t.Fatalf("Error creating %q: %v", preExistingPath, err)
50}
51
52if c.check != nil && !c.check() {
53t.Skip()
54}
55
56m, err := c.factory(path)
57if err != nil {
58t.Fatal(err)
59}
60
61if m == nil {
62t.Skip()
63}
64
65testMonitor(t, m, path, preExistingPath)
66})
67}
68}
69
70func testMonitor(t *testing.T, m monitor, path, preExistingPath string) {
71preExistingID, err := inode(preExistingPath)
72if err != nil {
73t.Fatalf("Error resolving %q: %v", preExistingPath, err)
74}
75
76preExistingResolved := m.Resolve(preExistingID)
77if preExistingResolved != preExistingPath {
78t.Errorf("Expected %d to resolve into pre-existing %q, got %q", preExistingID, preExistingPath, preExistingResolved)
79}
80
81// What are the chances?
82missingName := m.Resolve(88888888888)
83
84if missingName != "" {
85t.Errorf("Expected empty string for a missing inode, got %q", missingName)
86}
87
88// Check addition one by one
89for i := 0; i < 20; i++ {
90dir := fmt.Sprintf("%s/lol-%d", path, i)
91
92err = os.Mkdir(dir, 0755)
93if err != nil {
94t.Fatalf("Error creating %q: %v", dir, err)
95}
96
97// Sleep for a short time to let fanotify to process
98time.Sleep(sleepDuration)
99
100id, err := inode(dir)
101if err != nil {
102t.Fatalf("Error resolving %q: %v", dir, err)
103}
104
105resolved := m.Resolve(id)
106if resolved != dir {
107t.Errorf("Expected %q, got %q", dir, resolved)
108}
109}
110
111// Check burst addition
112for i := 20; i < 40; i++ {
113dir := fmt.Sprintf("%s/lol-%d", path, i)
114
115err = os.Mkdir(dir, 0755)
116if err != nil {
117t.Fatalf("Error creating %q: %v", dir, err)
118}
119}
120
121// Sleep for a short time to let fanotify to process
122time.Sleep(sleepDuration)
123
124// Continue checking burst addition
125for i := 20; i < 40; i++ {
126dir := fmt.Sprintf("%s/lol-%d", path, i)
127
128id, err := inode(dir)
129if err != nil {
130t.Fatalf("Error resolving %q: %v", dir, err)
131}
132
133resolved := m.Resolve(id)
134if resolved != dir {
135t.Errorf("Expected %q, got %q", dir, resolved)
136}
137}
138
139// Check if overwrites are picked up
140overwritePath := fmt.Sprintf("%s/%s", path, "lol-22")
141
142idBefore, err := inode(overwritePath)
143if err != nil {
144t.Fatalf("Error resolving %q (before): %v", overwritePath, err)
145}
146
147resolvedBefore := m.Resolve(idBefore)
148if resolvedBefore != overwritePath {
149t.Errorf("Expected %d to resolve into %q, got %q (before)", idBefore, overwritePath, resolvedBefore)
150}
151
152err = os.Remove(overwritePath)
153if err != nil {
154t.Fatalf("Error removing %q: %v", overwritePath, err)
155}
156
157err = os.Mkdir(overwritePath, 0755)
158if err != nil {
159t.Fatalf("Error re-creating %q: %v", overwritePath, err)
160}
161
162idAfter, err := inode(overwritePath)
163if err != nil {
164t.Fatalf("Error resolving %q (after): %v", overwritePath, err)
165}
166
167// Sleep for a short time to let fanotify to process
168time.Sleep(sleepDuration)
169
170resolvedAfter := m.Resolve(idAfter)
171if resolvedAfter != overwritePath {
172t.Errorf("Expected %d to resolve into %q, got %q (after)", idAfter, overwritePath, resolvedAfter)
173}
174}
175