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