...

Source file src/github.com/cilium/ebpf/btf/core_reloc_test.go

Documentation: github.com/cilium/ebpf/btf

     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