1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements.  See the NOTICE file distributed with
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership.
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License.  You may obtain a copy of the License at
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License.
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.net;
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.NetworkInterface;
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Enumeration;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Please note that this case can only be passed on Linux with the user is
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 'root'.
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class UnixNetworkInterfaceTest extends TestCase {
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private Enumeration<NetworkInterface> netifs = null;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private boolean valid = false;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#isUp()
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isUp() throws Exception {
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String name = netif.getName();
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean up = netif.isUp();
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Down network interface will bring side effect on the
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // platform. So chooses the already-down interface to up it.
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (!up && valid) {
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String cmd = "ifconfig " + name + " up";
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Process proc = Runtime.getRuntime().exec(cmd);
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " up should be " + !up, !up, netif.isUp());
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                cmd = "ifconfig " + name + " down";
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc = Runtime.getRuntime().exec(cmd);
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " up should be " + up, up, netif.isUp());
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#supportsMulticast()
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_supportsMulticast() throws Exception {
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String name = netif.getName();
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean multicast = netif.supportsMulticast();
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (valid) {
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String cmd = multicast ? "ifconfig " + name + " -multicast"
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        : "ifconfig " + name + " multicast";
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Process proc = Runtime.getRuntime().exec(cmd);
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " multicast should be " + !multicast,
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        !multicast, netif.supportsMulticast());
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                cmd = multicast ? "ifconfig " + name + " multicast"
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        : "ifconfig " + name + " -multicast";
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc = Runtime.getRuntime().exec(cmd);
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " multicast should be " + multicast,
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        multicast, netif.supportsMulticast());
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#getHardwareAddress()
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getHardwareAddress() throws Exception {
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String name = netif.getName();
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] hardAddr = netif.getHardwareAddress();
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (hardAddr != null && valid) {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String hardwareAddress = toHardwareAddress(hardAddr);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String newHardwareAddr = "0:11:25:1B:BD:FF";
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String cmd = "ifconfig " + name + " hw ether "
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + newHardwareAddr;
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Process proc = Runtime.getRuntime().exec(cmd);
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + "'s hardware address should be"
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + newHardwareAddr, newHardwareAddr,
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        toHardwareAddress(netif.getHardwareAddress()));
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                cmd = "ifconfig " + name + " hw ether " + hardwareAddress;
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc = Runtime.getRuntime().exec(cmd);
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + "'s hardware address should be"
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + hardwareAddress, hardwareAddress,
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        toHardwareAddress(netif.getHardwareAddress()));
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#getMTU()
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getMTU() throws Exception {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String name = netif.getName();
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int mtu = netif.getMTU();
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (valid) {
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String cmd = "ifconfig " + name + " mtu 1000";
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Process proc = Runtime.getRuntime().exec(cmd);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " MTU should be 1000", 1000, netif.getMTU());
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                cmd = "ifconfig " + name + " mtu " + mtu;
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc = Runtime.getRuntime().exec(cmd);
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                proc.waitFor();
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(name + " MTU should be " + mtu, mtu, netif
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        .getMTU());
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#getSubInterfaces()
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getSubInterfaces() throws Exception {
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Enumeration<NetworkInterface> subInterfaces1 = netif
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getSubInterfaces();
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Enumeration<NetworkInterface> subInterfaces2 = netif
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getSubInterfaces();
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (subInterfaces1.hasMoreElements()
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    && subInterfaces2.hasMoreElements() && valid) {
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NetworkInterface sub1 = subInterfaces1.nextElement();
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NetworkInterface sub2 = subInterfaces2.nextElement();
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertSame(sub1, sub2);
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertSame(netif, sub1.getParent());
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#getParent()
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getParent() {
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Enumeration<NetworkInterface> subInterfaces = netif
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getSubInterfaces();
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean contains = false;
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean hasSubInterfaces = false;
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (subInterfaces.hasMoreElements() && valid) {
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                hasSubInterfaces = true;
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NetworkInterface sub = subInterfaces.nextElement();
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NetworkInterface parent1 = sub.getParent();
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NetworkInterface parent2 = sub.getParent();
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertSame(parent1, parent2);
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (netif.equals(parent1)) {
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    contains = true;
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    break;
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals(hasSubInterfaces, contains);
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.NetworkInterface#isVirtual()
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @since 1.6
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isVirtual() {
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (netifs.hasMoreElements()) {
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            NetworkInterface netif = netifs.nextElement();
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean virtual = netif.getParent() != null;
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals(netif.getName() + " isVirtual() is" + !virtual,
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    virtual, netif.isVirtual());
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Enumeration<NetworkInterface> subInterfaces = netif
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getSubInterfaces();
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (subInterfaces.hasMoreElements()) {
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue(subInterfaces.nextElement().isVirtual());
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        netifs = NetworkInterface.getNetworkInterfaces();
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        valid = (netifs != null)
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                && System.getProperty("user.name").equals("root");
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() throws Exception {
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        netifs = null;
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        valid = false;
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.tearDown();
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String toHardwareAddress(byte[] hardAddr) {
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        StringBuilder builder = new StringBuilder();
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (byte b : hardAddr) {
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            builder.append(Integer.toHexString(b >= 0 ? b : b + 256)
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .toUpperCase());
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (hardAddr[hardAddr.length - 1] != b) {
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                builder.append(":");
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return builder.toString();
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
241