1// +build linux 2 3package netlink 4 5import ( 6 "net" 7 "testing" 8 9 "golang.org/x/sys/unix" 10) 11 12func TestRuleAddDel(t *testing.T) { 13 skipUnlessRoot(t) 14 defer setUpNetlinkTest(t)() 15 16 srcNet := &net.IPNet{IP: net.IPv4(172, 16, 0, 1), Mask: net.CIDRMask(16, 32)} 17 dstNet := &net.IPNet{IP: net.IPv4(172, 16, 1, 1), Mask: net.CIDRMask(24, 32)} 18 19 rulesBegin, err := RuleList(unix.AF_INET) 20 if err != nil { 21 t.Fatal(err) 22 } 23 24 rule := NewRule() 25 rule.Table = unix.RT_TABLE_MAIN 26 rule.Src = srcNet 27 rule.Dst = dstNet 28 rule.Priority = 5 29 rule.OifName = "lo" 30 rule.IifName = "lo" 31 rule.Invert = true 32 if err := RuleAdd(rule); err != nil { 33 t.Fatal(err) 34 } 35 36 rules, err := RuleList(unix.AF_INET) 37 if err != nil { 38 t.Fatal(err) 39 } 40 41 if len(rules) != len(rulesBegin)+1 { 42 t.Fatal("Rule not added properly") 43 } 44 45 // find this rule 46 var found bool 47 for i := range rules { 48 if rules[i].Table == rule.Table && 49 rules[i].Src != nil && rules[i].Src.String() == srcNet.String() && 50 rules[i].Dst != nil && rules[i].Dst.String() == dstNet.String() && 51 rules[i].OifName == rule.OifName && 52 rules[i].Priority == rule.Priority && 53 rules[i].IifName == rule.IifName && 54 rules[i].Invert == rule.Invert { 55 found = true 56 break 57 } 58 } 59 if !found { 60 t.Fatal("Rule has diffrent options than one added") 61 } 62 63 if err := RuleDel(rule); err != nil { 64 t.Fatal(err) 65 } 66 67 rulesEnd, err := RuleList(unix.AF_INET) 68 if err != nil { 69 t.Fatal(err) 70 } 71 72 if len(rulesEnd) != len(rulesBegin) { 73 t.Fatal("Rule not removed properly") 74 } 75} 76