@@ -20,123 +20,152 @@ func TestAddrReplace(t *testing.T) {
2020 DoTestAddr (t , AddrReplace )
2121}
2222
23+ type addrTest struct {
24+ name string
25+ addr * Addr
26+ expected * Addr
27+ canFail bool
28+ t * testing.T
29+ }
30+
31+ func (at * addrTest ) Fatal (a interface {}) {
32+ at .t .Helper ()
33+ if ! at .canFail {
34+ at .t .Fatal (a )
35+ return
36+ }
37+ at .t .Skipf ("Non-fatal: %v" , a )
38+ }
39+
40+ func (at * addrTest ) Fatalf (fmt string , a ... interface {}) {
41+ at .t .Helper ()
42+ if ! at .canFail {
43+ at .t .Fatalf (fmt , a ... )
44+ return
45+ }
46+ at .t .Skipf ("Non-fatal: " + fmt , a ... )
47+ }
48+
2349func DoTestAddr (t * testing.T , FunctionUndertest func (Link , * Addr ) error ) {
2450 if os .Getenv ("CI" ) == "true" {
2551 t .Skipf ("Fails in CI with: addr_test.go:*: Address flags not set properly, got=128, expected=132" )
2652 }
53+
2754 // TODO: IFA_F_PERMANENT does not seem to be set by default on older kernels?
2855 // TODO: IFA_F_OPTIMISTIC failing in CI. should we just skip that one check?
2956 var address = & net.IPNet {IP : net .IPv4 (127 , 0 , 0 , 2 ), Mask : net .CIDRMask (32 , 32 )}
3057 var peer = & net.IPNet {IP : net .IPv4 (127 , 0 , 0 , 3 ), Mask : net .CIDRMask (24 , 32 )}
31- var addrTests = []struct {
32- addr * Addr
33- expected * Addr
34- }{
58+ var addrTests = []addrTest {
3559 {
36- & Addr {IPNet : address },
37- & Addr {IPNet : address , Label : "lo" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
60+ name : "lo_uni_perm" , addr : & Addr {IPNet : address },
61+ expected : & Addr {IPNet : address , Label : "lo" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
3862 },
3963 {
40- & Addr {IPNet : address , Label : "local" },
41- & Addr {IPNet : address , Label : "local" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
64+ name : "local_uni_perm" , addr : & Addr {IPNet : address , Label : "local" },
65+ expected : & Addr {IPNet : address , Label : "local" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
4266 },
4367 {
44- & Addr {IPNet : address , Flags : unix .IFA_F_OPTIMISTIC },
45- & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_UNIVERSE },
68+ name : "lo_uni_optimistic_perm" , addr : & Addr {IPNet : address , Flags : unix .IFA_F_OPTIMISTIC }, canFail : true ,
69+ expected : & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_UNIVERSE },
4670 },
4771 {
48- & Addr {IPNet : address , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_DADFAILED },
49- & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_DADFAILED | unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_UNIVERSE },
72+ // Is this a valid scenario for IPv4?
73+ name : "lo_uni_optimistic_perm_dupe" , addr : & Addr {IPNet : address , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_DADFAILED }, canFail : true ,
74+ expected : & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_OPTIMISTIC | unix .IFA_F_DADFAILED | unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_UNIVERSE },
5075 },
5176 {
52- & Addr {IPNet : address , Scope : unix .RT_SCOPE_NOWHERE },
53- & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_NOWHERE },
77+ name : "lo_nullroute_perm" , addr : & Addr {IPNet : address , Scope : unix .RT_SCOPE_NOWHERE },
78+ expected : & Addr {IPNet : address , Label : "lo" , Flags : unix .IFA_F_PERMANENT , Scope : unix .RT_SCOPE_NOWHERE },
5479 },
5580 {
56- & Addr {IPNet : address , Peer : peer },
57- & Addr {IPNet : address , Peer : peer , Label : "lo" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
81+ name : "lo_uni_perm_with_peer" , addr : & Addr {IPNet : address , Peer : peer },
82+ expected : & Addr {IPNet : address , Peer : peer , Label : "lo" , Scope : unix .RT_SCOPE_UNIVERSE , Flags : unix .IFA_F_PERMANENT },
5883 },
5984 }
6085
61- tearDown := setUpNetlinkTest (t )
62- defer tearDown ()
86+ for _ , tt := range addrTests {
87+ t .Run (tt .name , func (t * testing.T ) {
88+ tt .t = t
6389
64- link , err := LinkByName ("lo" )
65- if err != nil {
66- t .Fatal (err )
67- }
90+ tearDown := setUpNetlinkTest (t )
91+ defer tearDown ()
6892
69- for _ , tt := range addrTests {
70- if err = FunctionUndertest ( link , tt . addr ); err != nil {
71- t .Fatal (err )
72- }
93+ link , err := LinkByName ( "lo" )
94+ if err != nil {
95+ tt .Fatal (err )
96+ }
7397
74- addrs , err := AddrList (link , FAMILY_ALL )
75- if err != nil {
76- t .Fatal (err )
77- }
98+ if err = FunctionUndertest (link , tt .addr ); err != nil {
99+ tt .Fatal (err )
100+ }
78101
79- if len (addrs ) != 1 {
80- t .Fatal ("Address not added properly" )
81- }
102+ addrs , err := AddrList (link , FAMILY_ALL )
103+ if err != nil {
104+ tt .Fatal (err )
105+ }
82106
83- if ! addrs [ 0 ]. Equal ( * tt . expected ) {
84- t . Fatalf ("Address ip no set properly, got=%s, expected=%s" , addrs [ 0 ], tt . expected )
85- }
107+ if len ( addrs ) != 1 {
108+ tt . Fatal ("Address not added properly" )
109+ }
86110
87- if addrs [0 ].Label != tt .expected . Label {
88- t .Fatalf ("Address label not set properly, got=%s, expected=%s" , addrs [0 ]. Label , tt .expected . Label )
89- }
111+ if ! addrs [0 ].Equal ( * tt .expected ) {
112+ tt .Fatalf ("Address ip not set properly, got=%s, expected=%s" , addrs [0 ], tt .expected )
113+ }
90114
91- if addrs [0 ].Flags != tt .expected .Flags {
92- t .Fatalf ("Address flags not set properly, got=%d , expected=%d " , addrs [0 ].Flags , tt .expected .Flags )
93- }
115+ if addrs [0 ].Label != tt .expected .Label {
116+ tt .Fatalf ("Address label not set properly, got=%s , expected=%s " , addrs [0 ].Label , tt .expected .Label )
117+ }
94118
95- if addrs [0 ].Scope != tt .expected .Scope {
96- t .Fatalf ("Address scope not set properly, got=%d, expected=%d" , addrs [0 ].Scope , tt .expected .Scope )
97- }
119+ if addrs [0 ].Flags != tt .expected .Flags {
120+ tt .Fatalf ("Address flags not set properly, got=%d, expected=%d" , addrs [0 ].Flags , tt .expected .Flags )
121+ }
98122
99- if ifindex := link . Attrs (). Index ; ifindex != addrs [ 0 ]. LinkIndex {
100- t .Fatalf ("Address ifindex not set properly, got=%d, expected=%d" , addrs [0 ].LinkIndex , ifindex )
101- }
123+ if addrs [ 0 ]. Scope != tt . expected . Scope {
124+ tt .Fatalf ("Address scope not set properly, got=%d, expected=%d" , addrs [0 ].Scope , tt . expected . Scope )
125+ }
102126
103- if tt .expected .Peer != nil {
104- if ! addrs [0 ].PeerEqual (* tt .expected ) {
105- t .Fatalf ("Peer Address ip no set properly, got=%s, expected=%s" , addrs [0 ].Peer , tt .expected .Peer )
127+ if ifindex := link .Attrs ().Index ; ifindex != addrs [0 ].LinkIndex {
128+ tt .Fatalf ("Address ifindex not set properly, got=%d, expected=%d" , addrs [0 ].LinkIndex , ifindex )
106129 }
107- }
108130
109- // Pass FAMILY_V4, we should get the same results as FAMILY_ALL
110- addrs , err = AddrList (link , FAMILY_V4 )
111- if err != nil {
112- t .Fatal (err )
113- }
114- if len (addrs ) != 1 {
115- t .Fatal ("Address not added properly" )
116- }
131+ if tt .expected .Peer != nil {
132+ if ! addrs [0 ].PeerEqual (* tt .expected ) {
133+ tt .Fatalf ("Peer Address ip not set properly, got=%s, expected=%s" , addrs [0 ].Peer , tt .expected .Peer )
134+ }
135+ }
117136
118- // Pass a wrong family number, we should get nil list
119- addrs , err = AddrList (link , 0x8 )
120- if err != nil {
121- t .Fatal (err )
122- }
137+ // Pass FAMILY_V4, we should get the same results as FAMILY_ALL
138+ addrs , err = AddrList (link , FAMILY_V4 )
139+ if err != nil {
140+ tt .Fatal (err )
141+ }
142+ if len (addrs ) != 1 {
143+ tt .Fatal ("Address not added properly" )
144+ }
123145
124- if len (addrs ) != 0 {
125- t .Fatal ("Address not expected" )
126- }
146+ // Pass a wrong family number, we should get nil list
147+ addrs , err = AddrList (link , 0x8 )
148+ if err != nil {
149+ tt .Fatal (err )
150+ }
127151
128- if err = AddrDel ( link , tt . addr ); err != nil {
129- t .Fatal (err )
130- }
152+ if len ( addrs ) != 0 {
153+ tt .Fatal ("Address not expected" )
154+ }
131155
132- addrs , err = AddrList (link , FAMILY_ALL )
133- if err != nil {
134- t .Fatal (err )
135- }
156+ if err = AddrDel (link , tt .addr ); err != nil {
157+ tt .Fatal (err )
158+ }
136159
137- if len (addrs ) != 0 {
138- t .Fatal ("Address not removed properly" )
139- }
160+ addrs , err = AddrList (link , FAMILY_ALL )
161+ if err != nil {
162+ tt .Fatal (err )
163+ }
164+
165+ if len (addrs ) != 0 {
166+ tt .Fatal ("Address not removed properly" )
167+ }
168+ })
140169 }
141170
142171}
0 commit comments