ebpf_exporter
95 строк · 2.3 Кб
1package decoder2
3import (4"bytes"5"os"6"testing"7
8"github.com/cloudflare/ebpf_exporter/v2/config"9"github.com/cloudflare/ebpf_exporter/v2/kallsyms"10)
11
12func TestKStackDecoder(t *testing.T) {13cases := []struct {14in []byte15out []byte16}{17{18in: []byte{190x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,21},22out: []byte(""),23},24{25in: []byte{260x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,270x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,280x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,30},31out: []byte("one\none\ntwo"),32},33{34in: []byte{350xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,360x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,370x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,380x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,39},40out: []byte("three\ntwo\ntwo"),41},42{43in: []byte{440xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,450x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,460x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,47},48out: []byte("three\nzero"),49},50{51in: []byte{520x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,530xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,540x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,550x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,56},57out: []byte("??\nthree\n??"),58},59}60
61fd, err := os.CreateTemp("", "kallsyms")62if err != nil {63t.Fatalf("Error creating temporary file for kallsyms: %v", err)64}65
66defer os.Remove(fd.Name())67
68_, err = fd.WriteString("0000000000000004 T one\n0000000000000006 T two\n00000000000000aa T three\n")69if err != nil {70t.Fatalf("Error writing fake kallsyms data to %q: %v", fd.Name(), err)71}72
73decoder, err := kallsyms.NewDecoder(fd.Name())74if err != nil {75t.Fatalf("Error creating ksym decoder for %q: %v", fd.Name(), err)76}77
78_, err = fd.WriteString("0000000000000002 T zero\n")79if err != nil {80t.Fatalf("Error writing additional fake kallsyms data to %q: %v", fd.Name(), err)81}82
83d := KStack{decoder}84
85for _, c := range cases {86out, err := d.Decode(c.in, config.Decoder{})87if err != nil {88t.Errorf("Error decoding %#v: %s", c.in, err)89}90
91if !bytes.Equal(out, c.out) {92t.Errorf("Expected %q, got %q", c.out, out)93}94}95}
96