diff --git a/e2e/basic/flow_test.go b/e2e/basic/flow_test.go index 8086ae1cfac1e6bf4686afa4dc76a2140a480ce0..3b890e5fe050b446031b7a31c20cfdd4eb26ee05 100644 --- a/e2e/basic/flow_test.go +++ b/e2e/basic/flow_test.go @@ -5,6 +5,7 @@ package basic import ( "context" "path" + "strconv" "testing" "time" @@ -57,7 +58,6 @@ func TestBasicFlowCapture(t *testing.T) { // (2) once packets are evicted, no more flows are aggregated on top of them. func TestSinglePacketFlows(t *testing.T) { var pingerIP, serverPodIP string - var latestFlowMS time.Time testCluster.TestEnv().Test(t, features.New("single-packet flow capture").Setup( func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { kclient, err := kubernetes.NewForConfig(cfg.Client().RESTConfig()) @@ -82,54 +82,34 @@ func TestSinglePacketFlows(t *testing.T) { }, test.Interval(time.Second)) return ctx }, - ).Assess("correctness of single, small ICMP packet from pinger to server", + ).Assess("correctness of single, sequential small ICMP packets from pinger to server", func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { pods, err := tester.NewPods(cfg) require.NoError(t, err) - logrus.WithField("destinationIP", serverPodIP).Info("Sending ICMP packet") - stdOut, stdErr, err := pods.Execute(ctx, namespace, "pinger", - "ping", "-c", "1", serverPodIP) - require.NoError(t, err) - logrus.WithFields(logrus.Fields{"stdOut": stdOut, "stdErr": stdErr}).Info("ping sent") - - sent, recv := getPingFlows(t, time.Now().Add(-time.Minute)) - - assert.Equal(t, pingerIP, sent["SrcAddr"]) - assert.Equal(t, serverPodIP, sent["DstAddr"]) - assert.EqualValues(t, 98, sent["Bytes"]) // default ping data size + IP+ICMP headers - assert.EqualValues(t, 1, sent["Packets"]) - assert.Equal(t, pingerIP, recv["DstAddr"]) - assert.Equal(t, serverPodIP, recv["SrcAddr"]) - assert.EqualValues(t, 98, recv["Bytes"]) // default ping data size + IP+ICMP headers - assert.EqualValues(t, 1, recv["Packets"]) + const ipIcmpHeadersLen = 42 + latestFlowMS := time.Now().Add(-time.Minute) + for pktLen := 50; pktLen <= 60; pktLen++ { + logrus.WithField("destinationIP", serverPodIP).Info("Sending ICMP packet") + stdOut, stdErr, err := pods.Execute(ctx, namespace, "pinger", + "ping", "-s", strconv.Itoa(pktLen), "-c", "1", serverPodIP) + require.NoError(t, err) + logrus.WithFields(logrus.Fields{"stdOut": stdOut, "stdErr": stdErr}).Info("ping sent") - latestFlowMS = asTime(recv["TimeFlowEndMs"]) + sent, recv := getPingFlows(t, latestFlowMS) - return ctx - }, - ).Assess("correctness of another ICMP packet contained in another flow", - func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context { - pods, err := tester.NewPods(cfg) - require.NoError(t, err) - - logrus.WithField("destinationIP", serverPodIP).Info("Sending ICMP packet") - stdOut, stdErr, err := pods.Execute(ctx, namespace, "pinger", - "ping", "-s", "100", "-c", "1", serverPodIP) - require.NoError(t, err) - logrus.WithFields(logrus.Fields{"stdOut": stdOut, "stdErr": stdErr}).Info("ping sent") + assert.Equal(t, pingerIP, sent["SrcAddr"]) + assert.Equal(t, serverPodIP, sent["DstAddr"]) + assert.EqualValues(t, pktLen+ipIcmpHeadersLen, sent["Bytes"]) + assert.EqualValues(t, 1, sent["Packets"]) + assert.Equal(t, pingerIP, recv["DstAddr"]) + assert.Equal(t, serverPodIP, recv["SrcAddr"]) + assert.EqualValues(t, pktLen+ipIcmpHeadersLen, recv["Bytes"]) + assert.EqualValues(t, 1, recv["Packets"]) - // We filter by time to avoid getting twice the same flows - sent, recv := getPingFlows(t, latestFlowMS) + latestFlowMS = asTime(recv["TimeFlowEndMs"]) + } - assert.Equal(t, pingerIP, sent["SrcAddr"]) - assert.Equal(t, serverPodIP, sent["DstAddr"]) - assert.EqualValues(t, 142, sent["Bytes"]) // 100-byte data size + IP+ICMP headers - assert.EqualValues(t, 1, sent["Packets"]) - assert.Equal(t, pingerIP, recv["DstAddr"]) - assert.Equal(t, serverPodIP, recv["SrcAddr"]) - assert.EqualValues(t, 142, recv["Bytes"]) // 100-byte data size + IP+ICMP headers - assert.EqualValues(t, 1, recv["Packets"]) return ctx }, ).Feature())