summaryrefslogtreecommitdiff
path: root/integrationtests/socket_test.go
blob: 059d339ec96b4c2468c9713298eb5268c82aafd8 (plain)
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
116
117
118
119
120
121
122
123
package integrationtests

import (
	"strings"
	"testing"
)

func TestSocketBasic(t *testing.T) {
	result, _ := runScenarioResult(t, "socket-basic", []ExpectedEvent{
		{
			Tracepoint: "enter_socket",
			MinCount:   1,
		},
		{
			Tracepoint: "enter_close",
			MinCount:   1,
		},
	})

	assertTracepointPathPrefix(t, result, "enter_socket", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_close", "socket:1:")
}

func TestSocketpairBasic(t *testing.T) {
	result, _ := runScenarioResult(t, "socketpair-basic", []ExpectedEvent{
		{
			Tracepoint: "enter_socketpair",
			MinCount:   1,
		},
		{
			Tracepoint: "enter_close",
			MinCount:   2,
		},
	})

	assertTracepointPathPrefix(t, result, "enter_socketpair", "socket:1:")
	if got := totalTracepointPathCount(result, "enter_close", "socket:1:"); got < 2 {
		t.Fatalf("enter_close records with tracked socket descriptor prefix = %d, want >= 2", got)
	}
}

func TestSocketAcceptLifecycle(t *testing.T) {
	result, _ := runScenarioResult(t, "socket-accept-lifecycle", []ExpectedEvent{
		{Tracepoint: "enter_bind", MinCount: 1},
		{Tracepoint: "enter_connect", MinCount: 1},
		{Tracepoint: "enter_listen", MinCount: 1},
		{Tracepoint: "enter_accept4", MinCount: 1},
		{Tracepoint: "enter_shutdown", MinCount: 1},
	})

	assertTracepointPathPrefix(t, result, "enter_bind", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_connect", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_listen", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_accept4", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_shutdown", "socket:1:")
}

func TestSocketAcceptLifecyclePlain(t *testing.T) {
	result, _ := runScenarioResult(t, "socket-accept-lifecycle-plain", []ExpectedEvent{
		{Tracepoint: "enter_bind", MinCount: 1},
		{Tracepoint: "enter_connect", MinCount: 1},
		{Tracepoint: "enter_listen", MinCount: 1},
		{Tracepoint: "enter_accept", MinCount: 1},
		{Tracepoint: "enter_shutdown", MinCount: 1},
	})

	assertTracepointPathPrefix(t, result, "enter_bind", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_connect", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_listen", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_accept", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_shutdown", "socket:1:")

	AssertEventsAbsent(t, result, []ExpectedEvent{
		{Tracepoint: "enter_accept4"},
	})
}

func TestSocketIntrospection(t *testing.T) {
	result, _ := runScenarioResult(t, "socket-introspection", []ExpectedEvent{
		{Tracepoint: "enter_getsockname", MinCount: 1},
		{Tracepoint: "enter_getpeername", MinCount: 1},
		{Tracepoint: "enter_setsockopt", MinCount: 1},
		{Tracepoint: "enter_getsockopt", MinCount: 1},
	})

	assertTracepointPathPrefix(t, result, "enter_getsockname", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_getpeername", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_setsockopt", "socket:1:")
	assertTracepointPathPrefix(t, result, "enter_getsockopt", "socket:1:")
}

func assertTracepointPathPrefix(t *testing.T, result TestResult, tracepoint, wantPrefix string) {
	t.Helper()
	if got := countTracepointPathPrefix(result, tracepoint, wantPrefix); got == 0 {
		t.Fatalf("expected at least one %s record with path prefix %q", tracepoint, wantPrefix)
	}
}

func countTracepointPathPrefix(result TestResult, tracepoint, wantPrefix string) int {
	var count int
	for _, rec := range result.Records {
		if !strings.Contains(rec.TraceID.String(), tracepoint) {
			continue
		}
		if strings.HasPrefix(rec.Path, wantPrefix) {
			count++
		}
	}
	return count
}

func totalTracepointPathCount(result TestResult, tracepoint, wantPrefix string) uint64 {
	var total uint64
	for _, rec := range result.Records {
		if !strings.Contains(rec.TraceID.String(), tracepoint) {
			continue
		}
		if strings.HasPrefix(rec.Path, wantPrefix) {
			total += rec.Cnt.Count
		}
	}
	return total
}