tetragon

Форк
0
/
btf_test.go 
163 строки · 4.6 Кб
1
// SPDX-License-Identifier: Apache-2.0
2
// Copyright Authors of Tetragon
3

4
package btf
5

6
import (
7
	"fmt"
8
	"os"
9
	"path/filepath"
10
	"testing"
11

12
	"github.com/cilium/tetragon/pkg/defaults"
13
	"github.com/stretchr/testify/assert"
14
	"golang.org/x/sys/unix"
15
)
16

17
var testBtfFiles = []struct {
18
	btf     string
19
	create  string
20
	wantbtf string
21
	err     error
22
}{
23
	{"", "", defaults.DefaultBTFFile, nil},
24
	{defaults.DefaultBTFFile, "", defaults.DefaultBTFFile, nil},
25
	{"invalid-btf-file", "", "", fmt.Errorf("BTF file 'invalid-btf-file' does not exist should fail")},
26
	{"valid-btf-file", "valid-btf-file", "valid-btf-file", nil},
27
}
28

29
func setupfiles() func(*testing.T, string, ...string) {
30
	return func(t *testing.T, param string, files ...string) {
31
		for _, f := range files {
32
			if param == "create" {
33
				h, e := os.Create(f)
34
				assert.NoError(t, e)
35
				h.Close()
36
			} else if param == "remove" {
37
				os.Remove(f)
38
			}
39
		}
40
	}
41
}
42

43
func TestObserverFindBTF(t *testing.T) {
44
	tmpdir := t.TempDir()
45

46
	old := os.Getenv("TETRAGON_BTF")
47
	defer os.Setenv("TETRAGON_BTF", old)
48

49
	handlefiles := setupfiles()
50
	for _, test := range testBtfFiles {
51
		if test.create != "" {
52
			handlefiles(t, "create", test.create, filepath.Join(tmpdir, test.create))
53
			defer handlefiles(t, "remove", test.create, filepath.Join(tmpdir, test.create))
54
		}
55

56
		_, err := os.Stat(defaults.DefaultBTFFile)
57
		if err != nil && test.wantbtf == defaults.DefaultBTFFile {
58
			continue
59
		}
60

61
		btf, err := observerFindBTF(tmpdir, test.btf)
62
		if test.err != nil {
63
			assert.Errorf(t, err, "observerFindBTF() on '%s'  -  want:%v  -  got:no error", test.btf, test.err)
64
			continue
65
		}
66
		assert.NoErrorf(t, err, "observerFindBTF() on '%s'  - want:no error  -  got:%v", test.btf, err)
67
		assert.Equalf(t, test.wantbtf, btf, "observerFindBTF() on '%s'  -  want:'%s'  -  got:'%s'", test.btf, test.wantbtf, btf)
68

69
		// Test now without lib set
70
		btf, err = observerFindBTF("", test.btf)
71
		if test.err != nil {
72
			assert.Errorf(t, err, "observerFindBTF() on '%s'  -  want:%v  -  got:no error", test.btf, test.err)
73
			continue
74
		}
75
		assert.NoErrorf(t, err, "observerFindBTF() on '%s'  -   want:no error  -  got:%v", test.btf, err)
76
		assert.Equalf(t, test.wantbtf, btf, "observerFindBTF() on '%s'  -  want:'%s'  -  got:'%s'", test.btf, test.wantbtf, btf)
77
	}
78
}
79

80
func TestObserverFindBTFEnv(t *testing.T) {
81
	old := os.Getenv("TETRAGON_BTF")
82
	defer os.Setenv("TETRAGON_BTF", old)
83

84
	lib := defaults.DefaultTetragonLib
85
	btffile := defaults.DefaultBTFFile
86
	_, err := os.Stat(btffile)
87
	if err != nil {
88
		/* No default vmlinux file */
89
		btf, err := observerFindBTF("", "")
90
		if old != "" {
91
			assert.NoError(t, err)
92
			assert.NotEmpty(t, btf)
93
		} else {
94
			assert.Error(t, err)
95
			assert.Empty(t, btf)
96
		}
97
		/* Let's clear up environment vars */
98
		os.Setenv("TETRAGON_BTF", "")
99
		btf, err = observerFindBTF("", "")
100
		assert.Error(t, err)
101
		assert.Empty(t, btf)
102

103
		/* Let's try provided path to lib but tests put the btf inside /boot/ */
104
		btf, err = observerFindBTF(lib, "")
105
		assert.Error(t, err)
106
		assert.Empty(t, btf)
107

108
		/* Let's try out the btf file that is inside /boot/ */
109
		var uname unix.Utsname
110
		err = unix.Uname(&uname)
111
		assert.NoError(t, err)
112
		kernelVersion := unix.ByteSliceToString(uname.Release[:])
113
		os.Setenv("TETRAGON_BTF", filepath.Join("/boot/", fmt.Sprintf("btf-%s", kernelVersion)))
114
		btf, err = observerFindBTF(lib, "")
115
		assert.NoError(t, err)
116
		assert.NotEmpty(t, btf)
117

118
		btffile = btf
119
		err = os.Setenv("TETRAGON_BTF", btffile)
120
		assert.NoError(t, err)
121
		btf, err = observerFindBTF(lib, "")
122
		assert.NoError(t, err)
123
		assert.Equal(t, btffile, btf)
124
	} else {
125
		btf, err := observerFindBTF("", "")
126
		assert.NoError(t, err)
127
		assert.Equal(t, btffile, btf)
128

129
		err = os.Setenv("TETRAGON_BTF", btffile)
130
		assert.NoError(t, err)
131
		btf, err = observerFindBTF(lib, "")
132
		assert.NoError(t, err)
133
		assert.Equal(t, btffile, btf)
134
	}
135

136
	/* Following should fail */
137
	err = os.Setenv("TETRAGON_BTF", "invalid-btf-file")
138
	assert.NoError(t, err)
139
	btf, err := observerFindBTF(lib, "")
140
	assert.Error(t, err)
141
	assert.Equal(t, "", btf)
142
}
143

144
func TestInitCachedBTF(t *testing.T) {
145
	_, err := os.Stat(defaults.DefaultBTFFile)
146
	if err != nil {
147
		btffile := os.Getenv("TETRAGON_BTF")
148
		err = InitCachedBTF(defaults.DefaultTetragonLib, "")
149
		if btffile != "" {
150
			assert.NoError(t, err)
151
			file := GetCachedBTFFile()
152
			assert.EqualValues(t, btffile, file, "GetCachedBTFFile()  -  want:'%s'  - got:'%s'", btffile, file)
153
		} else {
154
			assert.Error(t, err)
155
		}
156
	} else {
157
		err = InitCachedBTF(defaults.DefaultTetragonLib, "")
158
		assert.NoError(t, err)
159

160
		btffile := GetCachedBTFFile()
161
		assert.EqualValues(t, defaults.DefaultBTFFile, btffile, "GetCachedBTFFile()  -  want:'%s'  - got:'%s'", defaults.DefaultBTFFile, btffile)
162
	}
163
}
164

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.