summaryrefslogtreecommitdiffhomepage
path: root/pkg/packet/bgp/sr_policy_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/packet/bgp/sr_policy_test.go')
-rw-r--r--pkg/packet/bgp/sr_policy_test.go219
1 files changed, 219 insertions, 0 deletions
diff --git a/pkg/packet/bgp/sr_policy_test.go b/pkg/packet/bgp/sr_policy_test.go
new file mode 100644
index 00000000..41849d90
--- /dev/null
+++ b/pkg/packet/bgp/sr_policy_test.go
@@ -0,0 +1,219 @@
+package bgp
+
+import (
+ "encoding/binary"
+ "net"
+ "reflect"
+ "testing"
+
+ "github.com/go-test/deep"
+)
+
+func TestBindingSIDRoundTrip(t *testing.T) {
+ b := make([]byte, 4)
+ binary.BigEndian.PutUint32(b, 24321)
+ bsid, _ := NewBSID(b)
+ tests := []struct {
+ name string
+ input *TunnelEncapSubTLVSRBSID
+ fail bool
+ }{
+ {
+ name: "no bsid",
+ input: &TunnelEncapSubTLVSRBSID{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: 1,
+ Length: 2,
+ },
+ Flags: 0x0,
+ BSID: nil,
+ },
+ fail: false,
+ },
+ {
+ name: "v4 bsid",
+ input: &TunnelEncapSubTLVSRBSID{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: 1,
+ Length: 6,
+ },
+ Flags: 0x0,
+ BSID: bsid,
+ },
+ fail: false,
+ },
+ {
+ name: "srv6 bsid",
+ input: &TunnelEncapSubTLVSRBSID{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: 1,
+ Length: 18,
+ },
+ Flags: 0x0,
+ BSID: &BSID{
+ Value: net.ParseIP("2001:1::1").To16(),
+ },
+ },
+ fail: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ b, err := tt.input.Serialize()
+ if err != nil && !tt.fail {
+ t.Fatalf("expected to succeed but failed with error: %+v", err)
+ }
+ if err == nil && tt.fail {
+ t.Fatal("Expected to fail but succeeded")
+ }
+ if err != nil {
+ return
+ }
+ result := &TunnelEncapSubTLVSRBSID{}
+ err = result.DecodeFromBytes(b)
+ if err != nil && !tt.fail {
+ t.Fatalf("expected to succeed but failed with error: %+v", err)
+ }
+ if err == nil && tt.fail {
+ t.Fatal("Expected to fail but succeeded")
+ }
+ if err != nil {
+ return
+ }
+ if !reflect.DeepEqual(tt.input, result) {
+ t.Logf("Diffs: %+v", deep.Equal(tt.input, result))
+ t.Fatalf("expected: %+v does not match result: %+v", tt.input, result)
+ }
+ })
+ }
+}
+
+func TestSegmentListRoundTrip(t *testing.T) {
+ tests := []struct {
+ name string
+ input *TunnelEncapSubTLVSRSegmentList
+ fail bool
+ }{
+ {
+ name: "empty Segment List Sub TLV",
+ input: &TunnelEncapSubTLVSRSegmentList{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: ENCAP_SUBTLV_TYPE_SRSEGMENT_LIST,
+ Length: 6, // Weight (6 bytes) + Length of each segment + 2
+ },
+ },
+ fail: false,
+ },
+ {
+ name: "only empty weight",
+ input: &TunnelEncapSubTLVSRSegmentList{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: ENCAP_SUBTLV_TYPE_SRSEGMENT_LIST,
+ Length: 6, // Weight (6 bytes) + Length of each segment + 2
+ },
+ Weight: &SegmentListWeight{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: 9,
+ Length: 6,
+ },
+ Flags: 0,
+ Weight: 100,
+ },
+ },
+ fail: false,
+ },
+ {
+ name: "weight and 1 type A segment",
+ input: &TunnelEncapSubTLVSRSegmentList{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: ENCAP_SUBTLV_TYPE_SRSEGMENT_LIST,
+ Length: 6, // Weight (6 bytes) + Length of each segment + 2
+ },
+ Weight: &SegmentListWeight{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: SegmentListSubTLVWeight,
+ Length: 6,
+ },
+ Flags: 0,
+ Weight: 100,
+ },
+ Segments: []TunnelEncapSubTLVInterface{
+ &SegmentTypeA{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: EncapSubTLVType(TypeA),
+ Length: 6,
+ },
+ Flags: 0,
+ Label: (21431 << 12),
+ },
+ },
+ },
+ fail: false,
+ },
+ {
+ name: "weight and 2 type A segment",
+ input: &TunnelEncapSubTLVSRSegmentList{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: ENCAP_SUBTLV_TYPE_SRSEGMENT_LIST,
+ Length: 6, // Weight (6 bytes) + Length of each segment + 2
+ },
+ Weight: &SegmentListWeight{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: SegmentListSubTLVWeight,
+ Length: 6,
+ },
+ Flags: 0,
+ Weight: 100,
+ },
+ Segments: []TunnelEncapSubTLVInterface{
+ &SegmentTypeA{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: EncapSubTLVType(TypeA),
+ Length: 6,
+ },
+ Flags: 0,
+ Label: (21431 << 12),
+ },
+ &SegmentTypeA{
+ TunnelEncapSubTLV: TunnelEncapSubTLV{
+ Type: EncapSubTLVType(TypeA),
+ Length: 6,
+ },
+ Flags: 0,
+ Label: (100001 << 12),
+ },
+ },
+ },
+ fail: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ b, err := tt.input.Serialize()
+ if err != nil && !tt.fail {
+ t.Fatalf("expected to succeed but failed with error: %+v", err)
+ }
+ if err == nil && tt.fail {
+ t.Fatal("Expected to fail but succeeded")
+ }
+ if err != nil {
+ return
+ }
+ result := &TunnelEncapSubTLVSRSegmentList{}
+ err = result.DecodeFromBytes(b)
+ if err != nil && !tt.fail {
+ t.Fatalf("expected to succeed but failed with error: %+v", err)
+ }
+ if err == nil && tt.fail {
+ t.Fatal("Expected to fail but succeeded")
+ }
+ if err != nil {
+ return
+ }
+ if !reflect.DeepEqual(tt.input, result) {
+ t.Logf("Diffs: %+v", deep.Equal(tt.input, result))
+ t.Fatalf("expected: %+v does not match result: %+v", tt.input, result)
+ }
+ })
+ }
+}