...
1 package testutils
2
3 import (
4 "errors"
5 "os"
6 "testing"
7
8 "github.com/cilium/ebpf/internal"
9 )
10
11 func MustKernelVersion() internal.Version {
12 v, err := internal.KernelVersion()
13 if err != nil {
14 panic(err)
15 }
16 return v
17 }
18
19 func CheckFeatureTest(t *testing.T, fn func() error) {
20 t.Helper()
21
22 err := fn()
23 if err == nil {
24 return
25 }
26
27 var ufe *internal.UnsupportedFeatureError
28 if errors.As(err, &ufe) {
29 checkKernelVersion(t, ufe)
30 } else {
31 t.Error("Feature test failed:", err)
32 }
33 }
34
35 func SkipIfNotSupported(tb testing.TB, err error) {
36 tb.Helper()
37
38 if err == internal.ErrNotSupported {
39 tb.Fatal("Unwrapped ErrNotSupported")
40 }
41
42 var ufe *internal.UnsupportedFeatureError
43 if errors.As(err, &ufe) {
44 checkKernelVersion(tb, ufe)
45 tb.Skip(ufe.Error())
46 }
47 if errors.Is(err, internal.ErrNotSupported) {
48 tb.Skip(err.Error())
49 }
50 }
51
52 func checkKernelVersion(tb testing.TB, ufe *internal.UnsupportedFeatureError) {
53 if ufe.MinimumVersion.Unspecified() {
54 return
55 }
56
57 kernelVersion := MustKernelVersion()
58 if ufe.MinimumVersion.Less(kernelVersion) {
59 tb.Helper()
60 tb.Fatalf("Feature '%s' isn't supported even though kernel %s is newer than %s",
61 ufe.Name, kernelVersion, ufe.MinimumVersion)
62 }
63 }
64
65 func SkipOnOldKernel(tb testing.TB, minVersion, feature string) {
66 tb.Helper()
67
68 minv, err := internal.NewVersion(minVersion)
69 if err != nil {
70 tb.Fatalf("Invalid version %s: %s", minVersion, err)
71 }
72
73 if max := os.Getenv("CI_MAX_KERNEL_VERSION"); max != "" {
74 maxv, err := internal.NewVersion(max)
75 if err != nil {
76 tb.Fatalf("Invalid version %q in CI_MAX_KERNEL_VERSION: %s", max, err)
77 }
78
79 if maxv.Less(minv) {
80 tb.Fatalf("Test for %s will never execute on CI since %s is the most recent kernel", minv, maxv)
81 }
82 }
83
84 if MustKernelVersion().Less(minv) {
85 tb.Skipf("Test requires at least kernel %s (due to missing %s)", minv, feature)
86 }
87 }
88
View as plain text