github.com/cilium/cilium@v1.16.2/pkg/hubble/parser/parser_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Hubble 3 4 package parser 5 6 import ( 7 "io" 8 "testing" 9 "time" 10 11 "github.com/google/uuid" 12 "github.com/sirupsen/logrus" 13 "github.com/stretchr/testify/assert" 14 "google.golang.org/protobuf/types/known/timestamppb" 15 "google.golang.org/protobuf/types/known/wrapperspb" 16 17 flowpb "github.com/cilium/cilium/api/v1/flow" 18 v1 "github.com/cilium/cilium/pkg/hubble/api/v1" 19 observerTypes "github.com/cilium/cilium/pkg/hubble/observer/types" 20 "github.com/cilium/cilium/pkg/hubble/parser/errors" 21 "github.com/cilium/cilium/pkg/hubble/testutils" 22 "github.com/cilium/cilium/pkg/monitor" 23 "github.com/cilium/cilium/pkg/monitor/api" 24 "github.com/cilium/cilium/pkg/proxy/accesslog" 25 ) 26 27 var log *logrus.Logger 28 29 func init() { 30 log = logrus.New() 31 log.SetOutput(io.Discard) 32 } 33 34 func Test_InvalidPayloads(t *testing.T) { 35 p, err := New(log, nil, nil, nil, nil, nil, nil, nil) 36 assert.NoError(t, err) 37 38 _, err = p.Decode(nil) 39 assert.Equal(t, err, errors.ErrEmptyData) 40 41 _, err = p.Decode(&observerTypes.MonitorEvent{ 42 Payload: nil, 43 }) 44 assert.Equal(t, err, errors.ErrEmptyData) 45 46 _, err = p.Decode(&observerTypes.MonitorEvent{ 47 Payload: &observerTypes.PerfEvent{ 48 Data: []byte{100}, 49 }, 50 }) 51 assert.Equal(t, err, errors.NewErrInvalidType(100)) 52 53 _, err = p.Decode(&observerTypes.MonitorEvent{ 54 Payload: "not valid", 55 }) 56 assert.Equal(t, err, errors.ErrUnknownEventType) 57 } 58 59 func Test_ParserDispatch(t *testing.T) { 60 p, err := New(log, nil, nil, nil, nil, nil, nil, nil) 61 assert.NoError(t, err) 62 63 // Test L3/L4 record 64 tn := monitor.TraceNotifyV0{ 65 Type: byte(api.MessageTypeTrace), 66 } 67 data, err := testutils.CreateL3L4Payload(tn) 68 assert.NoError(t, err) 69 70 id := uuid.New() 71 e, err := p.Decode(&observerTypes.MonitorEvent{ 72 UUID: id, 73 Payload: &observerTypes.PerfEvent{ 74 Data: data, 75 }, 76 }) 77 assert.NoError(t, err) 78 assert.Equal(t, flowpb.FlowType_L3_L4, e.GetFlow().GetType()) 79 assert.Equal(t, id.String(), e.GetFlow().GetUuid()) 80 81 // Test L7 dispatch 82 node := "k8s1" 83 e, err = p.Decode(&observerTypes.MonitorEvent{ 84 UUID: id, 85 NodeName: node, 86 Payload: &observerTypes.AgentEvent{ 87 Type: api.MessageTypeAccessLog, 88 Message: accesslog.LogRecord{ 89 Timestamp: "2006-01-02T15:04:05.999999999Z", 90 }, 91 }, 92 }) 93 assert.NoError(t, err) 94 assert.Equal(t, node, e.GetFlow().GetNodeName()) 95 assert.Equal(t, flowpb.FlowType_L7, e.GetFlow().GetType()) 96 assert.Equal(t, id.String(), e.GetFlow().GetUuid()) 97 } 98 99 func Test_EventType_RecordLost(t *testing.T) { 100 p, err := New(log, nil, nil, nil, nil, nil, nil, nil) 101 assert.NoError(t, err) 102 103 ts := time.Now() 104 ev, err := p.Decode(&observerTypes.MonitorEvent{ 105 Timestamp: ts, 106 Payload: &observerTypes.LostEvent{ 107 Source: observerTypes.LostEventSourcePerfRingBuffer, 108 NumLostEvents: 1001, 109 CPU: 3, 110 }, 111 }) 112 assert.NoError(t, err) 113 114 protoTimestamp := timestamppb.New(ts) 115 assert.NoError(t, protoTimestamp.CheckValid()) 116 assert.Equal(t, &v1.Event{ 117 Timestamp: protoTimestamp, 118 Event: &flowpb.LostEvent{ 119 NumEventsLost: 1001, 120 Cpu: &wrapperspb.Int32Value{Value: 3}, 121 Source: flowpb.LostEventSource_PERF_EVENT_RING_BUFFER, 122 }, 123 }, ev) 124 }