-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathperf_events_test.go
76 lines (65 loc) · 1.75 KB
/
perf_events_test.go
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
// Copyright (c) 2019 Dropbox, Inc.
// Full license can be found in the LICENSE file.
package itest
import (
"encoding/binary"
"net"
"testing"
"time"
"github.com/dropbox/goebpf"
"github.com/stretchr/testify/require"
)
// Runs XDP program and listen for perf events generated by program
func TestPerfEvents(t *testing.T) {
// Read ELF, find map, load/attach program
eb := goebpf.NewDefaultEbpfSystem()
err := eb.LoadElf(progPath(xdpProgramFilename))
require.NoError(t, err)
perfMap := eb.GetMapByName("perf_map")
require.NotNil(t, perfMap)
program := eb.GetProgramByName("xdp_perf")
require.NotNil(t, program)
// Load / Attach program to "lo" interface
err = program.Load()
require.NoError(t, err)
err = program.Attach("lo")
require.NoError(t, err)
defer program.Detach()
// Setup/Start perf events
perfEvents, err := goebpf.NewPerfEvents(perfMap)
require.NoError(t, err)
perfCh, err := perfEvents.StartForAllProcessesAndCPUs(4096)
require.NoError(t, err)
// Send dummy UDP packet to localhost so XDP program
// will catch it and emit perf event
conn, err := net.Dial("udp", "127.0.0.1:4444")
require.NoError(t, err)
conn.Write([]byte("test"))
// Read Perf Events in a separated goroutine
var firstEventData []byte
doneChan := make(chan struct{})
go func() {
for {
data, ok := <-perfCh
if doneChan != nil {
firstEventData = data
close(doneChan)
doneChan = nil
}
if !ok {
break
}
}
}()
// Wait until first perf event (up to 1 sec)
select {
case <-doneChan:
break
case <-time.After(1 * time.Second):
require.Fail(t, "timeout while waiting for perf event")
}
perfEvents.Stop()
// Verify first received event
packetSize := binary.LittleEndian.Uint32(firstEventData)
require.True(t, packetSize > 20)
}