@@ -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+ expected := true // These are equal
719+ m := & []uint32 {0xFFFFFFFF }[0 ]
720+ cases := []Rule {
721+ {Mark : 1 , Mask : nil },
722+ {Mark : 1 , Mask : m },
723+ {Mark : 1 , Mask : & []uint32 {0xFFFFFFFF }[0 ]},
724+ }
725+ for i1 := range cases {
726+ for i2 := range cases {
727+ got := cases [i1 ].Equal (cases [i2 ])
728+ if got != expected {
729+ t .Errorf ("Equal(%q,%q) == %s but expected %s" ,
730+ cases [i1 ], cases [i2 ],
731+ strconv .FormatBool (got ),
732+ strconv .FormatBool (expected ))
733+ }
734+ }
735+ }
736+ }
737+
738+ func TestRulePortRangeEqual (t * testing.T ) {
739+ cases := []RulePortRange {
740+ {Start : 10 , End : 10 },
741+ {Start : 11 , End : 22 },
742+ }
743+ for i1 := range cases {
744+ for i2 := range cases {
745+ got := cases [i1 ].Equal (cases [i2 ])
746+ expected := i1 == i2
747+ if got != expected {
748+ t .Errorf ("Equal(%q,%q) == %s but expected %s" ,
749+ cases [i1 ], cases [i2 ],
750+ strconv .FormatBool (got ),
751+ strconv .FormatBool (expected ))
752+ }
753+ }
754+ }
755+ }
756+
757+ func TestRuleUIDRangeEqual (t * testing.T ) {
758+ cases := []RuleUIDRange {
759+ {Start : 10 , End : 10 },
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