66 "testing"
77 "time"
88
9+ test2 "github.com/netobserv/netobserv-ebpf-agent/pkg/test"
10+
911 "github.com/mariomac/guara/pkg/test"
1012 "github.com/netobserv/netobserv-ebpf-agent/pkg/flow"
1113 "github.com/netobserv/netobserv-ebpf-agent/pkg/grpc"
@@ -21,11 +23,12 @@ func TestGRPCProto_ExportFlows_AgentIP(t *testing.T) {
2123 port , err := test .FreeTCPPort ()
2224 require .NoError (t , err )
2325 serverOut := make (chan * pbflow.Records )
24- _ , err = grpc .StartCollector (port , serverOut )
26+ coll , err : = grpc .StartCollector (port , serverOut )
2527 require .NoError (t , err )
28+ defer coll .Close ()
2629
2730 // Start GRPCProto exporter stage
28- exporter , err := StartGRPCProto (fmt .Sprintf ("127.0.0.1:%d" , port ))
31+ exporter , err := StartGRPCProto (fmt .Sprintf ("127.0.0.1:%d" , port ), 1000 )
2932 require .NoError (t , err )
3033
3134 // Send some flows to the input of the exporter stage
@@ -37,23 +40,14 @@ func TestGRPCProto_ExportFlows_AgentIP(t *testing.T) {
3740 {RawRecord : flow.RawRecord {RecordKey : flow.RecordKey {EthProtocol : flow .IPv6Type }},
3841 AgentIP : net .ParseIP ("8888::1111" )},
3942 }
40- close (flows )
4143 go exporter .ExportFlows (flows )
4244
43- var rs * pbflow.Records
44- select {
45- case rs = <- serverOut :
46- case <- time .After (timeout ):
47- require .Fail (t , "timeout waiting for flows" )
48- }
45+ rs := test2 .ReceiveTimeout (t , serverOut , timeout )
4946 assert .Len (t , rs .Entries , 1 )
5047 r := rs .Entries [0 ]
5148 assert .EqualValues (t , 0x0a090807 , r .GetAgentIp ().GetIpv4 ())
52- select {
53- case rs = <- serverOut :
54- case <- time .After (timeout ):
55- require .Fail (t , "timeout waiting for flows" )
56- }
49+
50+ rs = test2 .ReceiveTimeout (t , serverOut , timeout )
5751 assert .Len (t , rs .Entries , 1 )
5852 r = rs .Entries [0 ]
5953 assert .EqualValues (t , net .ParseIP ("8888::1111" ), r .GetAgentIp ().GetIpv6 ())
@@ -65,3 +59,45 @@ func TestGRPCProto_ExportFlows_AgentIP(t *testing.T) {
6559 //ok!
6660 }
6761}
62+
63+ func TestGRPCProto_SplitLargeMessages (t * testing.T ) {
64+ // start remote ingestor
65+ port , err := test .FreeTCPPort ()
66+ require .NoError (t , err )
67+ serverOut := make (chan * pbflow.Records )
68+ coll , err := grpc .StartCollector (port , serverOut )
69+ require .NoError (t , err )
70+ defer coll .Close ()
71+
72+ const msgMaxLen = 10000
73+ // Start GRPCProto exporter stage
74+ exporter , err := StartGRPCProto (fmt .Sprintf ("127.0.0.1:%d" , port ), msgMaxLen )
75+ require .NoError (t , err )
76+
77+ // Send a message much longer than the limit length
78+ flows := make (chan []* flow.Record , 10 )
79+ var input []* flow.Record
80+ for i := 0 ; i < 25000 ; i ++ {
81+ input = append (input , & flow.Record {RawRecord : flow.RawRecord {RecordKey : flow.RecordKey {
82+ EthProtocol : flow .IPv6Type ,
83+ }}, AgentIP : net .ParseIP ("1111::1111" ), Interface : "12345678" })
84+ }
85+ flows <- input
86+ go exporter .ExportFlows (flows )
87+
88+ // expect that the submitted message is split in chunks no longer than msgMaxLen
89+ rs := test2 .ReceiveTimeout (t , serverOut , timeout )
90+ assert .Len (t , rs .Entries , msgMaxLen )
91+ rs = test2 .ReceiveTimeout (t , serverOut , timeout )
92+ assert .Len (t , rs .Entries , msgMaxLen )
93+ rs = test2 .ReceiveTimeout (t , serverOut , timeout )
94+ assert .Len (t , rs .Entries , 5000 )
95+
96+ // after all the operation, no more flows are sent
97+ select {
98+ case rs = <- serverOut :
99+ assert .Failf (t , "shouldn't have received any flow" , "Got: %#v" , rs )
100+ default :
101+ //ok!
102+ }
103+ }
0 commit comments