...
1 package btf_test
2
3 import (
4 "fmt"
5 "io"
6 "os"
7 "strings"
8 "testing"
9
10 "github.com/cilium/ebpf"
11 "github.com/cilium/ebpf/btf"
12 "github.com/cilium/ebpf/internal"
13 "github.com/cilium/ebpf/internal/testutils"
14 )
15
16 func TestCORERelocationLoad(t *testing.T) {
17 testutils.Files(t, testutils.Glob(t, "testdata/relocs-*.elf"), func(t *testing.T, file string) {
18 fh, err := os.Open(file)
19 if err != nil {
20 t.Fatal(err)
21 }
22 defer fh.Close()
23
24 spec, err := ebpf.LoadCollectionSpecFromReader(fh)
25 if err != nil {
26 t.Fatal(err)
27 }
28
29 if spec.ByteOrder != internal.NativeEndian {
30 return
31 }
32
33 for _, progSpec := range spec.Programs {
34 t.Run(progSpec.Name, func(t *testing.T) {
35 if _, err := fh.Seek(0, io.SeekStart); err != nil {
36 t.Fatal(err)
37 }
38
39 prog, err := ebpf.NewProgramWithOptions(progSpec, ebpf.ProgramOptions{
40 KernelTypes: progSpec.BTF,
41 })
42
43 if strings.HasPrefix(progSpec.Name, "err_") {
44 if err == nil {
45 prog.Close()
46 t.Fatal("Expected an error")
47 }
48 t.Log("Got expected error:", err)
49 return
50 }
51
52 if err != nil {
53 t.Fatal("Load program:", err)
54 }
55 defer prog.Close()
56
57 ret, _, err := prog.Test(make([]byte, 14))
58 testutils.SkipIfNotSupported(t, err)
59 if err != nil {
60 t.Fatal("Error when running:", err)
61 }
62
63 if ret != 0 {
64 t.Error("Assertion failed on line", ret)
65 }
66 })
67 }
68 })
69 }
70
71 func TestCORERelocationRead(t *testing.T) {
72 testutils.Files(t, testutils.Glob(t, "testdata/relocs_read-*.elf"), func(t *testing.T, file string) {
73 spec, err := ebpf.LoadCollectionSpec(file)
74 if err != nil {
75 t.Fatal(err)
76 }
77
78 if spec.ByteOrder != internal.NativeEndian {
79 return
80 }
81
82 targetFile := fmt.Sprintf("testdata/relocs_read_tgt-%s.elf", internal.ClangEndian)
83 targetSpec, err := btf.LoadSpec(targetFile)
84 if err != nil {
85 t.Fatal(err)
86 }
87
88 for _, progSpec := range spec.Programs {
89 t.Run(progSpec.Name, func(t *testing.T) {
90 prog, err := ebpf.NewProgramWithOptions(progSpec, ebpf.ProgramOptions{
91 KernelTypes: targetSpec,
92 })
93 testutils.SkipIfNotSupported(t, err)
94 if err != nil {
95 t.Fatal("Load program:", err)
96 }
97 defer prog.Close()
98
99 ret, _, err := prog.Test(make([]byte, 14))
100 testutils.SkipIfNotSupported(t, err)
101 if err != nil {
102 t.Fatal("Error when running:", err)
103 }
104
105 if ret != 0 {
106 t.Error("Assertion failed on line", ret)
107 }
108 })
109 }
110 })
111 }
112
View as plain text