1// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package net
6
7import (
8	"fmt"
9	"os/exec"
10	"testing"
11)
12
13func (ti *testInterface) setBroadcast(suffix int) error {
14	ti.name = fmt.Sprintf("gotest%d", suffix)
15	xname, err := exec.LookPath("ip")
16	if err != nil {
17		return err
18	}
19	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
20		Path: xname,
21		Args: []string{"ip", "link", "add", ti.name, "type", "dummy"},
22	})
23	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
24		Path: xname,
25		Args: []string{"ip", "address", "add", ti.local, "peer", ti.remote, "dev", ti.name},
26	})
27	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
28		Path: xname,
29		Args: []string{"ip", "address", "del", ti.local, "peer", ti.remote, "dev", ti.name},
30	})
31	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
32		Path: xname,
33		Args: []string{"ip", "link", "delete", ti.name, "type", "dummy"},
34	})
35	return nil
36}
37
38func (ti *testInterface) setLinkLocal(suffix int) error {
39	ti.name = fmt.Sprintf("gotest%d", suffix)
40	xname, err := exec.LookPath("ip")
41	if err != nil {
42		return err
43	}
44	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
45		Path: xname,
46		Args: []string{"ip", "link", "add", ti.name, "type", "dummy"},
47	})
48	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
49		Path: xname,
50		Args: []string{"ip", "address", "add", ti.local, "dev", ti.name},
51	})
52	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
53		Path: xname,
54		Args: []string{"ip", "address", "del", ti.local, "dev", ti.name},
55	})
56	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
57		Path: xname,
58		Args: []string{"ip", "link", "delete", ti.name, "type", "dummy"},
59	})
60	return nil
61}
62
63func (ti *testInterface) setPointToPoint(suffix int) error {
64	ti.name = fmt.Sprintf("gotest%d", suffix)
65	xname, err := exec.LookPath("ip")
66	if err != nil {
67		return err
68	}
69	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
70		Path: xname,
71		Args: []string{"ip", "tunnel", "add", ti.name, "mode", "gre", "local", ti.local, "remote", ti.remote},
72	})
73	ti.setupCmds = append(ti.setupCmds, &exec.Cmd{
74		Path: xname,
75		Args: []string{"ip", "address", "add", ti.local, "peer", ti.remote, "dev", ti.name},
76	})
77	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
78		Path: xname,
79		Args: []string{"ip", "address", "del", ti.local, "peer", ti.remote, "dev", ti.name},
80	})
81	ti.teardownCmds = append(ti.teardownCmds, &exec.Cmd{
82		Path: xname,
83		Args: []string{"ip", "tunnel", "del", ti.name, "mode", "gre", "local", ti.local, "remote", ti.remote},
84	})
85	return nil
86}
87
88const (
89	numOfTestIPv4MCAddrs = 14
90	numOfTestIPv6MCAddrs = 18
91)
92
93var (
94	igmpInterfaceTable = []Interface{
95		{Name: "lo"},
96		{Name: "eth0"}, {Name: "eth1"}, {Name: "eth2"},
97		{Name: "eth0.100"}, {Name: "eth0.101"}, {Name: "eth0.102"}, {Name: "eth0.103"},
98		{Name: "device1tap2"},
99	}
100	igmp6InterfaceTable = []Interface{
101		{Name: "lo"},
102		{Name: "eth0"}, {Name: "eth1"}, {Name: "eth2"},
103		{Name: "eth0.100"}, {Name: "eth0.101"}, {Name: "eth0.102"}, {Name: "eth0.103"},
104		{Name: "device1tap2"},
105		{Name: "pan0"},
106	}
107)
108
109func TestParseProcNet(t *testing.T) {
110	defer func() {
111		if p := recover(); p != nil {
112			t.Fatalf("panicked: %v", p)
113		}
114	}()
115
116	var ifmat4 []Addr
117	for _, ifi := range igmpInterfaceTable {
118		ifmat := parseProcNetIGMP("testdata/igmp", &ifi)
119		ifmat4 = append(ifmat4, ifmat...)
120	}
121	if len(ifmat4) != numOfTestIPv4MCAddrs {
122		t.Fatalf("got %d; want %d", len(ifmat4), numOfTestIPv4MCAddrs)
123	}
124
125	var ifmat6 []Addr
126	for _, ifi := range igmp6InterfaceTable {
127		ifmat := parseProcNetIGMP6("testdata/igmp6", &ifi)
128		ifmat6 = append(ifmat6, ifmat...)
129	}
130	if len(ifmat6) != numOfTestIPv6MCAddrs {
131		t.Fatalf("got %d; want %d", len(ifmat6), numOfTestIPv6MCAddrs)
132	}
133}
134