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  }