@@ -5,6 +5,7 @@ package netlink
55
66import (
77 "net"
8+ "strconv"
89 "testing"
910 "time"
1011
@@ -600,7 +601,7 @@ func runRuleListFiltered(t *testing.T, family int, srcNet, dstNet *net.IPNet) {
600601 t .Errorf ("Expected len: %d, got: %d" , len (wantRules ), len (rules ))
601602 } else {
602603 for i := range wantRules {
603- if ! ruleEquals ( wantRules [i ], rules [i ]) {
604+ if ! wantRules [i ]. Equal ( rules [i ]) {
604605 t .Errorf ("Rules mismatch, want %v, got %v" , wantRules [i ], rules [i ])
605606 }
606607 }
@@ -666,30 +667,108 @@ func TestRuleString(t *testing.T) {
666667
667668func ruleExists (rules []Rule , rule Rule ) bool {
668669 for i := range rules {
669- if ruleEquals ( rules [i ], rule ) {
670+ if rules [i ]. Equal ( rule ) {
670671 return true
671672 }
672673 }
673674
674675 return false
675676}
676677
677- func ruleEquals (a , b Rule ) bool {
678- return a .Table == b .Table &&
679- ((a .Src == nil && b .Src == nil ) ||
680- (a .Src != nil && b .Src != nil && a .Src .String () == b .Src .String ())) &&
681- ((a .Dst == nil && b .Dst == nil ) ||
682- (a .Dst != nil && b .Dst != nil && a .Dst .String () == b .Dst .String ())) &&
683- a .OifName == b .OifName &&
684- a .Priority == b .Priority &&
685- a .Family == b .Family &&
686- a .IifName == b .IifName &&
687- a .Invert == b .Invert &&
688- a .Tos == b .Tos &&
689- a .Type == b .Type &&
690- a .IPProto == b .IPProto &&
691- a .Protocol == b .Protocol &&
692- a .Mark == b .Mark &&
693- (ptrEqual (a .Mask , b .Mask ) || (a .Mark != 0 &&
694- (a .Mask == nil && * b .Mask == 0xFFFFFFFF || b .Mask == nil && * a .Mask == 0xFFFFFFFF )))
678+ func TestRuleEqual (t * testing.T ) {
679+ cases := []Rule {
680+ {Priority : 1000 },
681+ {Family : FAMILY_V6 },
682+ {Table : 10 },
683+ {Mark : 1 },
684+ {Mask : & []uint32 {0x1 }[0 ]},
685+ {Tos : 1 },
686+ {TunID : 3 },
687+ {Goto : 10 },
688+ {Src : & net.IPNet {IP : net .IPv4 (172 , 16 , 0 , 1 ), Mask : net .CIDRMask (16 , 32 )}},
689+ {Dst : & net.IPNet {IP : net .IPv4 (172 , 16 , 1 , 1 ), Mask : net .CIDRMask (24 , 32 )}},
690+ {Flow : 3 },
691+ {IifName : "IifName" },
692+ {OifName : "OifName" },
693+ {SuppressIfgroup : 7 },
694+ {SuppressPrefixlen : 16 },
695+ {Invert : true },
696+ {Dport : & RulePortRange {Start : 10 , End : 20 }},
697+ {Sport : & RulePortRange {Start : 1 , End : 2 }},
698+ {IPProto : unix .IPPROTO_TCP },
699+ {UIDRange : & RuleUIDRange {Start : 3 , End : 5 }},
700+ {Protocol : FAMILY_V6 },
701+ {Type : unix .RTN_UNREACHABLE },
702+ }
703+ for i1 := range cases {
704+ for i2 := range cases {
705+ got := cases [i1 ].Equal (cases [i2 ])
706+ expected := i1 == i2
707+ if got != expected {
708+ t .Errorf ("Equal(%q,%q) == %s but expected %s" ,
709+ cases [i1 ], cases [i2 ],
710+ strconv .FormatBool (got ),
711+ strconv .FormatBool (expected ))
712+ }
713+ }
714+ }
715+ }
716+
717+ func TestRuleEqualMaskMark (t * testing.T ) {
718+ a := Rule {Mark : 1 , Mask : nil }
719+ b := Rule {Mark : 1 , Mask : & []uint32 {0xFFFFFFFF }[0 ]}
720+ if ! a .Equal (b ) || ! b .Equal (a ) {
721+ t .Errorf ("Rules are expected to be equal" )
722+ }
723+
724+ b = Rule {Mark : 2 , Mask : & []uint32 {0xFFFFFFFF }[0 ]}
725+ if a .Equal (b ) || b .Equal (a ) {
726+ t .Errorf ("Rules are not expected to be equal" )
727+ }
728+
729+ a = Rule {Mark : 0 , Mask : nil }
730+ b = Rule {Mark : 0 , Mask : & []uint32 {0xFFFFFFFF }[0 ]}
731+ if a .Equal (b ) || b .Equal (a ) {
732+ t .Errorf ("Rules are not expected to be equal" )
733+ }
734+ }
735+
736+ func TestRulePortRangeEqual (t * testing.T ) {
737+ cases := []RulePortRange {
738+ {Start : 10 , End : 10 },
739+ {Start : 10 , End : 22 },
740+ {Start : 11 , End : 22 },
741+ }
742+ for i1 := range cases {
743+ for i2 := range cases {
744+ got := cases [i1 ].Equal (cases [i2 ])
745+ expected := i1 == i2
746+ if got != expected {
747+ t .Errorf ("Equal(%q,%q) == %s but expected %s" ,
748+ cases [i1 ], cases [i2 ],
749+ strconv .FormatBool (got ),
750+ strconv .FormatBool (expected ))
751+ }
752+ }
753+ }
754+ }
755+
756+ func TestRuleUIDRangeEqual (t * testing.T ) {
757+ cases := []RuleUIDRange {
758+ {Start : 10 , End : 10 },
759+ {Start : 10 , End : 22 },
760+ {Start : 11 , End : 22 },
761+ }
762+ for i1 := range cases {
763+ for i2 := range cases {
764+ got := cases [i1 ].Equal (cases [i2 ])
765+ expected := i1 == i2
766+ if got != expected {
767+ t .Errorf ("Equal(%q,%q) == %s but expected %s" ,
768+ cases [i1 ], cases [i2 ],
769+ strconv .FormatBool (got ),
770+ strconv .FormatBool (expected ))
771+ }
772+ }
773+ }
695774}
0 commit comments