From bcb6d5ebe7a45fa9dcc516613a81a3d00f44a9ec Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Tue, 7 May 2024 08:21:25 +0000 Subject: [PATCH 1/3] test: add testcase for ParseFlowDesc and NewFlowDesc --- internal/forwarder/flowdesc_test.go | 17 +++++++++ internal/forwarder/gtp5g_test.go | 55 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/internal/forwarder/flowdesc_test.go b/internal/forwarder/flowdesc_test.go index 2838a4b..d720419 100644 --- a/internal/forwarder/flowdesc_test.go +++ b/internal/forwarder/flowdesc_test.go @@ -125,6 +125,23 @@ func TestParseFlowDesc(t *testing.T) { }, }, }, + { + name: "any to assign", + s: "permit out ip from any to assigned", + fd: FlowDesc{ + Action: "permit", + Dir: "out", + Proto: 0xff, + Src: &net.IPNet{ + IP: net.IPv6zero, + Mask: net.CIDRMask(0, 128), + }, + Dst: &net.IPNet{ + IP: net.IPv6zero, + Mask: net.CIDRMask(0, 128), + }, + }, + }, } for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/forwarder/gtp5g_test.go b/internal/forwarder/gtp5g_test.go index 606f942..de46c52 100644 --- a/internal/forwarder/gtp5g_test.go +++ b/internal/forwarder/gtp5g_test.go @@ -8,9 +8,12 @@ import ( "testing" "time" + "github.com/khirono/go-nl" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/wmnsk/go-pfcp/ie" + "github.com/free5gc/go-gtp5gnl" "github.com/free5gc/go-upf/internal/report" "github.com/free5gc/go-upf/pkg/factory" ) @@ -278,3 +281,55 @@ func TestGtp5g_CreateRules(t *testing.T) { g.log.Infof("Receive final reports from URR(%d)", rs[0].URRID) }) } + +func TestNewFlowDesc(t *testing.T) { + if testing.Short() { + t.Skip("skipping testing in short mode") + } + + var wg sync.WaitGroup + g, err := OpenGtp5g(&wg, ":"+strconv.Itoa(factory.UpfGtpDefaultPort), 1400) + if err != nil { + t.Fatal(err) + } + defer g.Close() + + cases := []struct { + name string + s string + swapSrcDst bool + attrs nl.AttrList + err error + }{ + { + name: "permit out any to assigned", + s: "permit out ip from any to assigned", + swapSrcDst: false, + attrs: nl.AttrList{ + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_ACTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_PERMIT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DIRECTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_OUT), + }, + }, + err: nil, + }, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + attrs, err := g.newFlowDesc(tt.s, tt.swapSrcDst) + if tt.err == nil { + if err != nil { + t.Fatal(err) + } + assert.Equal(t, &tt.attrs, attrs) + } else if err != tt.err { + t.Errorf("wantErr %v; but got %v", tt.err, err) + } + }) + } +} From b6d376dc55de8ad068cfa7d4f05b08b27f1b8998 Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Tue, 7 May 2024 08:48:24 +0000 Subject: [PATCH 2/3] fix: use subset to check TestNewFlowDesc attrs --- internal/forwarder/gtp5g_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/forwarder/gtp5g_test.go b/internal/forwarder/gtp5g_test.go index de46c52..35fc3b9 100644 --- a/internal/forwarder/gtp5g_test.go +++ b/internal/forwarder/gtp5g_test.go @@ -326,7 +326,7 @@ func TestNewFlowDesc(t *testing.T) { if err != nil { t.Fatal(err) } - assert.Equal(t, &tt.attrs, attrs) + assert.Subset(t, attrs, tt.attrs) } else if err != tt.err { t.Errorf("wantErr %v; but got %v", tt.err, err) } From d4a0417b6bbcad516bb10f70f6cdefb45b4796ea Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Wed, 8 May 2024 03:23:26 +0000 Subject: [PATCH 3/3] test: add more testcases in TestNewFlowDesc --- internal/forwarder/gtp5g_test.go | 136 ++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/internal/forwarder/gtp5g_test.go b/internal/forwarder/gtp5g_test.go index 35fc3b9..d0771c8 100644 --- a/internal/forwarder/gtp5g_test.go +++ b/internal/forwarder/gtp5g_test.go @@ -292,7 +292,10 @@ func TestNewFlowDesc(t *testing.T) { if err != nil { t.Fatal(err) } - defer g.Close() + defer func() { + g.Close() + wg.Wait() + }() cases := []struct { name string @@ -317,6 +320,134 @@ func TestNewFlowDesc(t *testing.T) { }, err: nil, }, + { + name: "network addr (UL)", + s: "permit out ip from 10.20.30.40/24 to 50.60.70.80/16", + swapSrcDst: false, + attrs: nl.AttrList{ + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_ACTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_PERMIT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DIRECTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_OUT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_IPV4, + Value: nl.AttrBytes(net.IPv4(10, 20, 30, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_IPV4, + Value: nl.AttrBytes(net.IPv4(50, 60, 0, 0).To4()), + }, + }, + err: nil, + }, + { + name: "network addr (DL)", + s: "permit out ip from 10.20.30.40/24 to 50.60.70.80/16", + swapSrcDst: true, + attrs: nl.AttrList{ + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_ACTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_PERMIT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DIRECTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_OUT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_IPV4, + Value: nl.AttrBytes(net.IPv4(50, 60, 0, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_IPV4, + Value: nl.AttrBytes(net.IPv4(10, 20, 30, 0).To4()), + }, + }, + err: nil, + }, + { + name: "source port (DL)", + s: "permit out ip from 10.20.30.40/24 345,789-792,1023-1026 to 50.60.70.80/16 456-458,1088,1089", + swapSrcDst: false, + attrs: nl.AttrList{ + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_ACTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_PERMIT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DIRECTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_OUT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_IPV4, + Value: nl.AttrBytes(net.IPv4(10, 20, 30, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_IPV4, + Value: nl.AttrBytes(net.IPv4(50, 60, 0, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_PORT, + Value: nl.AttrBytes(convertSlice([][]uint16{ + {345}, + {789, 792}, + {1023, 1026}, + })), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_PORT, + Value: nl.AttrBytes(convertSlice([][]uint16{ + {456, 458}, + {1088}, + {1089}, + })), + }, + }, + err: nil, + }, + { + name: "source port (UL)", + s: "permit out ip from 10.20.30.40/24 345,789-792,1023-1026 to 50.60.70.80/16 456-458,1088,1089", + swapSrcDst: true, + attrs: nl.AttrList{ + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_ACTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_PERMIT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DIRECTION, + Value: nl.AttrU8(gtp5gnl.SDF_FILTER_OUT), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_IPV4, + Value: nl.AttrBytes(net.IPv4(50, 60, 0, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_IPV4, + Value: nl.AttrBytes(net.IPv4(10, 20, 30, 0).To4()), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_SRC_PORT, + Value: nl.AttrBytes(convertSlice([][]uint16{ + {456, 458}, + {1088}, + {1089}, + })), + }, + nl.Attr{ + Type: gtp5gnl.FLOW_DESCRIPTION_DEST_PORT, + Value: nl.AttrBytes(convertSlice([][]uint16{ + {345}, + {789, 792}, + {1023, 1026}, + })), + }, + }, + err: nil, + }, } for _, tt := range cases { @@ -333,3 +464,6 @@ func TestNewFlowDesc(t *testing.T) { }) } } + +// TODO +// Test on newSdfFilter()