...

Source file src/github.com/cilium/ebpf/link/tracepoint_test.go

Documentation: github.com/cilium/ebpf/link

     1  package link
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/cilium/ebpf"
     9  	"github.com/cilium/ebpf/internal/testutils"
    10  	"github.com/cilium/ebpf/internal/unix"
    11  
    12  	qt "github.com/frankban/quicktest"
    13  )
    14  
    15  func TestTracepoint(t *testing.T) {
    16  	// Requires at least 4.7 (98b5c2c65c29 "perf, bpf: allow bpf programs attach to tracepoints")
    17  	testutils.SkipOnOldKernel(t, "4.7", "tracepoint support")
    18  
    19  	prog := mustLoadProgram(t, ebpf.TracePoint, 0, "")
    20  
    21  	// printk is guaranteed to be present.
    22  	// Kernels before 4.14 don't support attaching to syscall tracepoints.
    23  	tp, err := Tracepoint("printk", "console", prog, nil)
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  
    28  	if err := tp.Close(); err != nil {
    29  		t.Error("closing tracepoint:", err)
    30  	}
    31  }
    32  
    33  func TestTracepointMissing(t *testing.T) {
    34  	// Requires at least 4.7 (98b5c2c65c29 "perf, bpf: allow bpf programs attach to tracepoints")
    35  	testutils.SkipOnOldKernel(t, "4.7", "tracepoint support")
    36  
    37  	prog := mustLoadProgram(t, ebpf.TracePoint, 0, "")
    38  
    39  	_, err := Tracepoint("missing", "foobazbar", prog, nil)
    40  	if !errors.Is(err, os.ErrNotExist) {
    41  		t.Error("Expected os.ErrNotExist, got", err)
    42  	}
    43  }
    44  
    45  func TestTracepointErrors(t *testing.T) {
    46  	c := qt.New(t)
    47  
    48  	// Invalid Tracepoint incantations.
    49  	_, err := Tracepoint("", "", nil, nil) // empty names
    50  	c.Assert(errors.Is(err, errInvalidInput), qt.IsTrue)
    51  
    52  	_, err = Tracepoint("_", "_", nil, nil) // empty prog
    53  	c.Assert(errors.Is(err, errInvalidInput), qt.IsTrue)
    54  
    55  	_, err = Tracepoint(".", "+", &ebpf.Program{}, nil) // illegal chars in group/name
    56  	c.Assert(errors.Is(err, errInvalidInput), qt.IsTrue)
    57  
    58  	_, err = Tracepoint("foo", "bar", &ebpf.Program{}, nil) // wrong prog type
    59  	c.Assert(errors.Is(err, errInvalidInput), qt.IsTrue)
    60  }
    61  
    62  func TestTraceGetEventID(t *testing.T) {
    63  	_, err := getTraceEventID("syscalls", "sys_enter_openat")
    64  	if err != nil {
    65  		t.Fatal("Can't read trace event ID:", err)
    66  	}
    67  
    68  	_, err = getTraceEventID("totally", "bogus")
    69  	if !errors.Is(err, os.ErrNotExist) {
    70  		t.Fatal("Expected os.ErrNotExist, got", err)
    71  	}
    72  }
    73  
    74  func TestTracepointProgramCall(t *testing.T) {
    75  	// Kernels before 4.14 don't support attaching to syscall tracepoints.
    76  	testutils.SkipOnOldKernel(t, "4.14", "syscalls tracepoint support")
    77  
    78  	m, p := newUpdaterMapProg(t, ebpf.TracePoint)
    79  
    80  	// Open Tracepoint at /sys/kernel/debug/tracing/events/syscalls/sys_enter_getpid
    81  	// and attach it to the ebpf program created above.
    82  	tp, err := Tracepoint("syscalls", "sys_enter_getpid", p, nil)
    83  	if err != nil {
    84  		t.Fatal(err)
    85  	}
    86  
    87  	// Trigger ebpf program call.
    88  	unix.Getpid()
    89  
    90  	// Assert that the value at index 0 has been updated to 1.
    91  	assertMapValue(t, m, 0, 1)
    92  
    93  	// Detach the Tracepoint.
    94  	if err := tp.Close(); err != nil {
    95  		t.Fatal(err)
    96  	}
    97  
    98  	// Reset map value to 0 at index 0.
    99  	if err := m.Update(uint32(0), uint32(0), ebpf.UpdateExist); err != nil {
   100  		t.Fatal(err)
   101  	}
   102  
   103  	// Retrigger the ebpf program call.
   104  	unix.Getpid()
   105  
   106  	// Assert that this time the value has not been updated.
   107  	assertMapValue(t, m, 0, 0)
   108  }
   109  

View as plain text