1
// SPDX-License-Identifier: Apache-2.0
2
// Copyright Authors of Tetragon
12
"github.com/cilium/tetragon/pkg/defaults"
13
"github.com/stretchr/testify/assert"
14
"golang.org/x/sys/unix"
17
var testBtfFiles = []struct {
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},
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" {
36
} else if param == "remove" {
43
func TestObserverFindBTF(t *testing.T) {
46
old := os.Getenv("TETRAGON_BTF")
47
defer os.Setenv("TETRAGON_BTF", old)
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))
56
_, err := os.Stat(defaults.DefaultBTFFile)
57
if err != nil && test.wantbtf == defaults.DefaultBTFFile {
61
btf, err := observerFindBTF(tmpdir, test.btf)
63
assert.Errorf(t, err, "observerFindBTF() on '%s' - want:%v - got:no error", test.btf, test.err)
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)
69
// Test now without lib set
70
btf, err = observerFindBTF("", test.btf)
72
assert.Errorf(t, err, "observerFindBTF() on '%s' - want:%v - got:no error", test.btf, test.err)
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)
80
func TestObserverFindBTFEnv(t *testing.T) {
81
old := os.Getenv("TETRAGON_BTF")
82
defer os.Setenv("TETRAGON_BTF", old)
84
lib := defaults.DefaultTetragonLib
85
btffile := defaults.DefaultBTFFile
86
_, err := os.Stat(btffile)
88
/* No default vmlinux file */
89
btf, err := observerFindBTF("", "")
91
assert.NoError(t, err)
92
assert.NotEmpty(t, btf)
97
/* Let's clear up environment vars */
98
os.Setenv("TETRAGON_BTF", "")
99
btf, err = observerFindBTF("", "")
103
/* Let's try provided path to lib but tests put the btf inside /boot/ */
104
btf, err = observerFindBTF(lib, "")
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)
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)
125
btf, err := observerFindBTF("", "")
126
assert.NoError(t, err)
127
assert.Equal(t, btffile, btf)
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)
136
/* Following should fail */
137
err = os.Setenv("TETRAGON_BTF", "invalid-btf-file")
138
assert.NoError(t, err)
139
btf, err := observerFindBTF(lib, "")
141
assert.Equal(t, "", btf)
144
func TestInitCachedBTF(t *testing.T) {
145
_, err := os.Stat(defaults.DefaultBTFFile)
147
btffile := os.Getenv("TETRAGON_BTF")
148
err = InitCachedBTF(defaults.DefaultTetragonLib, "")
150
assert.NoError(t, err)
151
file := GetCachedBTFFile()
152
assert.EqualValues(t, btffile, file, "GetCachedBTFFile() - want:'%s' - got:'%s'", btffile, file)
157
err = InitCachedBTF(defaults.DefaultTetragonLib, "")
158
assert.NoError(t, err)
160
btffile := GetCachedBTFFile()
161
assert.EqualValues(t, defaults.DefaultBTFFile, btffile, "GetCachedBTFFile() - want:'%s' - got:'%s'", defaults.DefaultBTFFile, btffile)