diff --git a/pkg/observer/observertesthelper/observer_test_helper.go b/pkg/observer/observertesthelper/observer_test_helper.go index 4e90506c90a..6c044c0af21 100644 --- a/pkg/observer/observertesthelper/observer_test_helper.go +++ b/pkg/observer/observertesthelper/observer_test_helper.go @@ -58,10 +58,9 @@ var ( ) type testObserverOptions struct { - crd bool - config string - lib string - notestfail bool + crd bool + config string + lib string } type testExporterOptions struct { @@ -123,12 +122,6 @@ func WithLib(lib string) TestOption { } } -func withNotestfail(notestfail bool) TestOption { - return func(o *TestOptions) { - o.observer.notestfail = notestfail - } -} - func testDone(tb testing.TB, obs *observer.Observer) { if tb.Failed() { bugtoolFname := "/tmp/tetragon-bugtool.tar.gz" @@ -219,9 +212,8 @@ func newDefaultObserver(oo *testObserverOptions) *observer.Observer { return observer.NewObserver(oo.config) } -func getDefaultObserverSensors(tb testing.TB, ctx context.Context, base *sensors.Sensor, opts ...TestOption) (*observer.Observer, []*sensors.Sensor, error) { +func getDefaultObserver(tb testing.TB, ctx context.Context, base *sensors.Sensor, opts ...TestOption) (*observer.Observer, error) { var cnfSensor *sensors.Sensor - var ret []*sensors.Sensor testutils.CaptureLog(tb, logger.GetLogger().(*logrus.Logger)) @@ -242,7 +234,7 @@ func getDefaultObserverSensors(tb testing.TB, ctx context.Context, base *sensors } if err := loadExporter(tb, ctx, obs, &o.exporter, &o.observer); err != nil { - return nil, ret, err + return nil, err } var tp tracingpolicy.TracingPolicy @@ -250,25 +242,24 @@ func getDefaultObserverSensors(tb testing.TB, ctx context.Context, base *sensors var err error tp, err = tracingpolicy.PolicyFromYAMLFilename(o.observer.config) if err != nil { - return nil, ret, fmt.Errorf("failed to parse tracingpolicy: %w", err) + return nil, fmt.Errorf("failed to parse tracingpolicy: %w", err) } } if tp != nil { var err error cnfSensor, err = sensors.GetMergedSensorFromParserPolicy(tp) if err != nil { - return nil, ret, err + return nil, err } - ret = append(ret, cnfSensor) } - if err := loadObserver(tb, base, cnfSensor, o.observer.notestfail); err != nil { - return nil, ret, err + if err := loadSensor(tb, base, cnfSensor); err != nil { + return nil, err } exportFname, err := testutils.GetExportFilename(tb) if err != nil { - return nil, ret, err + return nil, err } saveInitInfo(o, exportFname) @@ -290,16 +281,9 @@ func getDefaultObserverSensors(tb testing.TB, ctx context.Context, base *sensors testDone(tb, obs) }) - ret = append(ret, base) - obs.PerfConfig = bpf.DefaultPerfEventConfig() obs.PerfConfig.MapName = filepath.Join(bpf.MapPrefixPath(), "tcpmon_map") - return obs, ret, nil -} - -func getDefaultObserver(tb testing.TB, ctx context.Context, base *sensors.Sensor, opts ...TestOption) (*observer.Observer, error) { - obs, _, err := getDefaultObserverSensors(tb, ctx, base, opts...) - return obs, err + return obs, nil } func GetDefaultObserverWithWatchers(tb testing.TB, ctx context.Context, base *sensors.Sensor, opts ...TestOption) (*observer.Observer, error) { @@ -331,22 +315,57 @@ func GetDefaultObserverWithFile(tb testing.TB, ctx context.Context, file, lib st return GetDefaultObserverWithWatchers(tb, ctx, b, opts...) } -func GetDefaultSensorsWithFile(tb testing.TB, ctx context.Context, file, lib string, opts ...TestOption) ([]*sensors.Sensor, error) { +func GetDefaultSensorsWithFile(tb testing.TB, file, lib string, opts ...TestOption) ([]*sensors.Sensor, error) { opts = append(opts, WithConfig(file)) opts = append(opts, WithLib(lib)) - b := base.GetInitialSensor() - _, sens, err := getDefaultObserverSensors(tb, ctx, b, opts...) - return sens, err -} + option.Config.BpfDir = bpf.MapPrefixPath() + option.Config.MapDir = bpf.MapPrefixPath() -func GetDefaultObserverWithFileNoTest(tb testing.TB, ctx context.Context, file, lib string, fail bool, opts ...TestOption) (*observer.Observer, error) { - opts = append(opts, WithConfig(file)) - opts = append(opts, WithLib(lib)) - opts = append(opts, withNotestfail(fail)) + testutils.CaptureLog(tb, logger.GetLogger().(*logrus.Logger)) - b := base.GetInitialSensor() - return GetDefaultObserverWithWatchers(tb, ctx, b, opts...) + o := newDefaultTestOptions(opts...) + + option.Config.HubbleLib = os.Getenv("TETRAGON_LIB") + if option.Config.HubbleLib == "" { + option.Config.HubbleLib = o.observer.lib + } + + procfs := os.Getenv("TETRAGON_PROCFS") + if procfs != "" { + option.Config.ProcFS = procfs + } + + if testing.Verbose() { + option.Config.Verbosity = 1 + } + + var tp tracingpolicy.TracingPolicy + var err error + + if o.observer.config != "" { + tp, err = tracingpolicy.PolicyFromYAMLFilename(o.observer.config) + if err != nil { + return nil, fmt.Errorf("failed to parse tracingpolicy: %w", err) + } + } + + var sensor *sensors.Sensor + + if tp != nil { + sensor, err = sensors.GetMergedSensorFromParserPolicy(tp) + if err != nil { + return nil, err + } + } + + base := base.GetInitialSensor() + + if err = loadSensor(tb, base, sensor); err != nil { + return nil, err + } + + return []*sensors.Sensor{sensor, base}, nil } func loadExporter(tb testing.TB, ctx context.Context, obs *observer.Observer, opts *testExporterOptions, oo *testObserverOptions) error { @@ -419,15 +438,12 @@ func loadExporter(tb testing.TB, ctx context.Context, obs *observer.Observer, op return nil } -func loadObserver(tb testing.TB, base *sensors.Sensor, sens *sensors.Sensor, notestfail bool) error { +func loadSensor(tb testing.TB, base *sensors.Sensor, sens *sensors.Sensor) error { if err := base.Load(option.Config.BpfDir, option.Config.MapDir); err != nil { tb.Fatalf("Load base error: %s\n", err) } if err := sens.Load(option.Config.BpfDir, option.Config.MapDir); err != nil { - if notestfail { - return err - } tb.Fatalf("LoadConfig error: %s\n", err) } return nil diff --git a/pkg/sensors/tracing/kprobe_test.go b/pkg/sensors/tracing/kprobe_test.go index 739eb6caa7f..72baf3ac153 100644 --- a/pkg/sensors/tracing/kprobe_test.go +++ b/pkg/sensors/tracing/kprobe_test.go @@ -2239,37 +2239,6 @@ spec: runKprobeOverride(t, openAtHook, checker, file.Name(), syscall.ENOENT, true) } -func TestKprobeOverrideNonSyscall(t *testing.T) { - closeFdHook := ` -apiVersion: cilium.io/v1alpha1 -metadata: - name: "close-fd-override" -spec: - kprobes: - - call: "close_fd" - syscall: false - args: - - index: 0 - type: "int" - selectors: - - matchActions: - - action: Override - argError: -2 -` - - configHook := []byte(closeFdHook) - err := os.WriteFile(testConfigFile, configHook, 0644) - if err != nil { - t.Fatalf("writeFile(%s): err %s", testConfigFile, err) - } - - _, err = observertesthelper.GetDefaultObserverWithFileNoTest(t, context.Background(), testConfigFile, tus.Conf().TetragonLib, true, observertesthelper.WithMyPid()) - if err == nil { - t.Fatalf("GetDefaultObserverWithFileNoTest ok, should fail\n") - } - assert.Error(t, err) -} - func runKprobeOverrideSignal(t *testing.T, hook string, checker ec.MultiEventChecker, testFile string, testErr error, nopost bool, expectedSig syscall.Signal) { var doneWG, readyWG sync.WaitGroup @@ -3764,7 +3733,7 @@ spec: if err != nil { t.Fatalf("writeFile(%s): err %s", testConfigFile, err) } - sens, err = observertesthelper.GetDefaultSensorsWithFile(t, context.TODO(), testConfigFile, tus.Conf().TetragonLib, observertesthelper.WithMyPid()) + sens, err = observertesthelper.GetDefaultSensorsWithFile(t, testConfigFile, tus.Conf().TetragonLib, observertesthelper.WithMyPid()) if err != nil { t.Fatalf("GetDefaultObserverWithFile error: %s", err) } diff --git a/pkg/sensors/tracing/kprobe_validation_test.go b/pkg/sensors/tracing/kprobe_validation_test.go index 388549d1666..1146fe289ae 100644 --- a/pkg/sensors/tracing/kprobe_validation_test.go +++ b/pkg/sensors/tracing/kprobe_validation_test.go @@ -4,21 +4,20 @@ package tracing import ( - "context" "testing" - "github.com/cilium/tetragon/pkg/observer/observertesthelper" - tus "github.com/cilium/tetragon/pkg/testutils/sensors" + "github.com/cilium/tetragon/pkg/sensors" + "github.com/cilium/tetragon/pkg/tracingpolicy" "github.com/stretchr/testify/assert" ) -func runObserver(t *testing.T, crd string) error { - ctx, cancel := context.WithTimeout(context.Background(), tus.Conf().CmdWaitTime) - defer cancel() +func checkCrd(t *testing.T, crd string) error { + tp, err := tracingpolicy.PolicyFromYAML(crd) + if err != nil { + t.Fatalf("failed to parse tracingpolicy: %s", err) + } - createCrdFile(t, crd) - - _, err := observertesthelper.GetDefaultObserverWithFile(t, ctx, testConfigFile, tus.Conf().TetragonLib) + _, err = sensors.GetMergedSensorFromParserPolicy(tp) return err } @@ -41,7 +40,7 @@ spec: - call: "list:syscalls" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -69,7 +68,7 @@ spec: argError: -1 ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -93,7 +92,7 @@ spec: - call: "list:wrongname" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -117,7 +116,7 @@ spec: - call: "list:syscalls" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -141,7 +140,7 @@ spec: - call: "list:ftrace" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -162,7 +161,7 @@ spec: - call: "list:ftrace" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } func TestKprobeValidationWrongSyscallName(t *testing.T) { @@ -179,7 +178,7 @@ spec: - call: "sys_dupXXX" ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } @@ -201,6 +200,32 @@ spec: argError: -1 ` - err := runObserver(t, crd) + err := checkCrd(t, crd) assert.Error(t, err) } + +func TestKprobeValidationNonSyscallOverride(t *testing.T) { + + // override on non syscall (non override-able) function + + crd := ` +apiVersion: cilium.io/v1alpha1 +metadata: + name: "override-non-syscall" +spec: + kprobes: + - call: "close_fd" + syscall: false + args: + - index: 0 + type: "int" + selectors: + - matchActions: + - action: Override + argError: -2 +` + + err := checkCrd(t, crd) + assert.Error(t, err) + +} diff --git a/pkg/sensors/tracing/tracepoint_test.go b/pkg/sensors/tracing/tracepoint_test.go index dd6e4fb22bb..cc6da6e3bbd 100644 --- a/pkg/sensors/tracing/tracepoint_test.go +++ b/pkg/sensors/tracing/tracepoint_test.go @@ -484,7 +484,7 @@ spec: if err != nil { t.Fatalf("writeFile(%s): err %s", testConfigFile, err) } - sens, err = observertesthelper.GetDefaultSensorsWithFile(t, context.TODO(), testConfigFile, tus.Conf().TetragonLib) + sens, err = observertesthelper.GetDefaultSensorsWithFile(t, testConfigFile, tus.Conf().TetragonLib) if err != nil { t.Fatalf("GetDefaultObserverWithFile error: %s", err) } diff --git a/pkg/sensors/tracing/uprobe_test.go b/pkg/sensors/tracing/uprobe_test.go index 32b7ca71e7e..ff4e8eca42a 100644 --- a/pkg/sensors/tracing/uprobe_test.go +++ b/pkg/sensors/tracing/uprobe_test.go @@ -84,7 +84,7 @@ spec: if err != nil { t.Fatalf("writeFile(%s): err %s", testConfigFile, err) } - sens, err = observertesthelper.GetDefaultSensorsWithFile(t, context.TODO(), testConfigFile, tus.Conf().TetragonLib, observertesthelper.WithMyPid()) + sens, err = observertesthelper.GetDefaultSensorsWithFile(t, testConfigFile, tus.Conf().TetragonLib, observertesthelper.WithMyPid()) if err != nil { t.Fatalf("GetDefaultObserverWithFile error: %s", err) }