LinkPropertiesTest.java revision 22f407b11e11cfdb336e06e8c0d4a7ef1eafc783
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
19import android.net.LinkProperties;
20import android.net.RouteInfo;
21import android.test.suitebuilder.annotation.SmallTest;
22import junit.framework.TestCase;
23
24import java.net.InetAddress;
25import java.util.ArrayList;
26
27public class LinkPropertiesTest extends TestCase {
28    private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
29    private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
30            "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
31    private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
32    private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
33    private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
34    private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
35    private static String NAME = "qmi0";
36
37    private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
38    private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
39
40    public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
41        // Check implementation of equals(), element by element.
42        assertTrue(source.isIdenticalInterfaceName(target));
43        assertTrue(target.isIdenticalInterfaceName(source));
44
45        assertTrue(source.isIdenticalAddresses(target));
46        assertTrue(target.isIdenticalAddresses(source));
47
48        assertTrue(source.isIdenticalDnses(target));
49        assertTrue(target.isIdenticalDnses(source));
50
51        assertTrue(source.isIdenticalRoutes(target));
52        assertTrue(target.isIdenticalRoutes(source));
53
54        assertTrue(source.isIdenticalHttpProxy(target));
55        assertTrue(target.isIdenticalHttpProxy(source));
56
57        assertTrue(source.isIdenticalStackedLinks(target));
58        assertTrue(target.isIdenticalStackedLinks(source));
59
60        // Check result of equals().
61        assertTrue(source.equals(target));
62        assertTrue(target.equals(source));
63
64        // Check hashCode.
65        assertEquals(source.hashCode(), target.hashCode());
66    }
67
68    @SmallTest
69    public void testEqualsNull() {
70        LinkProperties source = new LinkProperties();
71        LinkProperties target = new LinkProperties();
72
73        assertFalse(source == target);
74        assertLinkPropertiesEqual(source, target);
75    }
76
77    @SmallTest
78    public void testEqualsSameOrder() {
79        try {
80            LinkProperties source = new LinkProperties();
81            source.setInterfaceName(NAME);
82            // set 2 link addresses
83            source.addLinkAddress(LINKADDRV4);
84            source.addLinkAddress(LINKADDRV6);
85            // set 2 dnses
86            source.addDns(DNS1);
87            source.addDns(DNS2);
88            // set 2 gateways
89            source.addRoute(new RouteInfo(GATEWAY1));
90            source.addRoute(new RouteInfo(GATEWAY2));
91
92            LinkProperties target = new LinkProperties();
93
94            // All fields are same
95            target.setInterfaceName(NAME);
96            target.addLinkAddress(LINKADDRV4);
97            target.addLinkAddress(LINKADDRV6);
98            target.addDns(DNS1);
99            target.addDns(DNS2);
100            target.addRoute(new RouteInfo(GATEWAY1));
101            target.addRoute(new RouteInfo(GATEWAY2));
102
103            assertLinkPropertiesEqual(source, target);
104
105            target.clear();
106            // change Interface Name
107            target.setInterfaceName("qmi1");
108            target.addLinkAddress(LINKADDRV4);
109            target.addLinkAddress(LINKADDRV6);
110            target.addDns(DNS1);
111            target.addDns(DNS2);
112            target.addRoute(new RouteInfo(GATEWAY1));
113            target.addRoute(new RouteInfo(GATEWAY2));
114            assertFalse(source.equals(target));
115
116            target.clear();
117            target.setInterfaceName(NAME);
118            // change link addresses
119            target.addLinkAddress(new LinkAddress(
120                    NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
121            target.addLinkAddress(LINKADDRV6);
122            target.addDns(DNS1);
123            target.addDns(DNS2);
124            target.addRoute(new RouteInfo(GATEWAY1));
125            target.addRoute(new RouteInfo(GATEWAY2));
126            assertFalse(source.equals(target));
127
128            target.clear();
129            target.setInterfaceName(NAME);
130            target.addLinkAddress(LINKADDRV4);
131            target.addLinkAddress(LINKADDRV6);
132            // change dnses
133            target.addDns(NetworkUtils.numericToInetAddress("75.208.7.2"));
134            target.addDns(DNS2);
135            target.addRoute(new RouteInfo(GATEWAY1));
136            target.addRoute(new RouteInfo(GATEWAY2));
137            assertFalse(source.equals(target));
138
139            target.clear();
140            target.setInterfaceName(NAME);
141            target.addLinkAddress(LINKADDRV4);
142            target.addLinkAddress(LINKADDRV6);
143            target.addDns(DNS1);
144            target.addDns(DNS2);
145            // change gateway
146            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
147            target.addRoute(new RouteInfo(GATEWAY2));
148            assertFalse(source.equals(target));
149
150        } catch (Exception e) {
151            throw new RuntimeException(e.toString());
152            //fail();
153        }
154    }
155
156    @SmallTest
157    public void testEqualsDifferentOrder() {
158        try {
159            LinkProperties source = new LinkProperties();
160            source.setInterfaceName(NAME);
161            // set 2 link addresses
162            source.addLinkAddress(LINKADDRV4);
163            source.addLinkAddress(LINKADDRV6);
164            // set 2 dnses
165            source.addDns(DNS1);
166            source.addDns(DNS2);
167            // set 2 gateways
168            source.addRoute(new RouteInfo(GATEWAY1));
169            source.addRoute(new RouteInfo(GATEWAY2));
170
171            LinkProperties target = new LinkProperties();
172            // Exchange order
173            target.setInterfaceName(NAME);
174            target.addLinkAddress(LINKADDRV6);
175            target.addLinkAddress(LINKADDRV4);
176            target.addDns(DNS2);
177            target.addDns(DNS1);
178            target.addRoute(new RouteInfo(GATEWAY2));
179            target.addRoute(new RouteInfo(GATEWAY1));
180
181            assertLinkPropertiesEqual(source, target);
182        } catch (Exception e) {
183            fail();
184        }
185    }
186
187    @SmallTest
188    public void testEqualsDuplicated() {
189        try {
190            LinkProperties source = new LinkProperties();
191            // set 3 link addresses, eg, [A, A, B]
192            source.addLinkAddress(LINKADDRV4);
193            source.addLinkAddress(LINKADDRV4);
194            source.addLinkAddress(LINKADDRV6);
195
196            LinkProperties target = new LinkProperties();
197            // set 3 link addresses, eg, [A, B, B]
198            target.addLinkAddress(LINKADDRV4);
199            target.addLinkAddress(LINKADDRV6);
200            target.addLinkAddress(LINKADDRV6);
201
202            assertLinkPropertiesEqual(source, target);
203        } catch (Exception e) {
204            fail();
205        }
206    }
207
208    private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
209        for (RouteInfo r : lp.getRoutes()) {
210            assertEquals(iface, r.getInterface());
211        }
212    }
213
214    @SmallTest
215    public void testRouteInterfaces() {
216        LinkAddress prefix = new LinkAddress(
217            NetworkUtils.numericToInetAddress("2001:db8::"), 32);
218        InetAddress address = ADDRV6;
219
220        // Add a route with no interface to a LinkProperties with no interface. No errors.
221        LinkProperties lp = new LinkProperties();
222        RouteInfo r = new RouteInfo(prefix, address, null);
223        lp.addRoute(r);
224        assertEquals(1, lp.getRoutes().size());
225        assertAllRoutesHaveInterface(null, lp);
226
227        // Add a route with an interface. Except an exception.
228        r = new RouteInfo(prefix, address, "wlan0");
229        try {
230          lp.addRoute(r);
231          fail("Adding wlan0 route to LP with no interface, expect exception");
232        } catch (IllegalArgumentException expected) {}
233
234        // Change the interface name. All the routes should change their interface name too.
235        lp.setInterfaceName("rmnet0");
236        assertAllRoutesHaveInterface("rmnet0", lp);
237
238        // Now add a route with the wrong interface. This causes an exception too.
239        try {
240          lp.addRoute(r);
241          fail("Adding wlan0 route to rmnet0 LP, expect exception");
242        } catch (IllegalArgumentException expected) {}
243
244        // If the interface name matches, the route is added.
245        lp.setInterfaceName("wlan0");
246        lp.addRoute(r);
247        assertEquals(2, lp.getRoutes().size());
248        assertAllRoutesHaveInterface("wlan0", lp);
249
250        // Routes with null interfaces are converted to wlan0.
251        r = RouteInfo.makeHostRoute(ADDRV6, null);
252        lp.addRoute(r);
253        assertEquals(3, lp.getRoutes().size());
254        assertAllRoutesHaveInterface("wlan0", lp);
255
256        // Check comparisons work.
257        LinkProperties lp2 = new LinkProperties(lp);
258        assertAllRoutesHaveInterface("wlan0", lp);
259        assertEquals(0, lp.compareAllRoutes(lp2).added.size());
260        assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
261
262        lp2.setInterfaceName("p2p0");
263        assertAllRoutesHaveInterface("p2p0", lp2);
264        assertEquals(3, lp.compareAllRoutes(lp2).added.size());
265        assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
266    }
267
268    @SmallTest
269    public void testStackedInterfaces() {
270        LinkProperties rmnet0 = new LinkProperties();
271        rmnet0.setInterfaceName("rmnet0");
272        rmnet0.addLinkAddress(LINKADDRV6);
273
274        LinkProperties clat4 = new LinkProperties();
275        clat4.setInterfaceName("clat4");
276        clat4.addLinkAddress(LINKADDRV4);
277
278        assertEquals(0, rmnet0.getStackedLinks().size());
279        assertEquals(1, rmnet0.getAddresses().size());
280        assertEquals(1, rmnet0.getLinkAddresses().size());
281        assertEquals(1, rmnet0.getAllAddresses().size());
282        assertEquals(1, rmnet0.getAllLinkAddresses().size());
283
284        rmnet0.addStackedLink(clat4);
285        assertEquals(1, rmnet0.getStackedLinks().size());
286        assertEquals(1, rmnet0.getAddresses().size());
287        assertEquals(1, rmnet0.getLinkAddresses().size());
288        assertEquals(2, rmnet0.getAllAddresses().size());
289        assertEquals(2, rmnet0.getAllLinkAddresses().size());
290
291        rmnet0.addStackedLink(clat4);
292        assertEquals(1, rmnet0.getStackedLinks().size());
293        assertEquals(1, rmnet0.getAddresses().size());
294        assertEquals(1, rmnet0.getLinkAddresses().size());
295        assertEquals(2, rmnet0.getAllAddresses().size());
296        assertEquals(2, rmnet0.getAllLinkAddresses().size());
297
298        assertEquals(0, clat4.getStackedLinks().size());
299
300        // Modify an item in the returned collection to see what happens.
301        for (LinkProperties link : rmnet0.getStackedLinks()) {
302            if (link.getInterfaceName().equals("clat4")) {
303               link.setInterfaceName("newname");
304            }
305        }
306        for (LinkProperties link : rmnet0.getStackedLinks()) {
307            assertFalse("newname".equals(link.getInterfaceName()));
308        }
309
310        assertTrue(rmnet0.removeStackedLink(clat4));
311        assertEquals(0, rmnet0.getStackedLinks().size());
312        assertEquals(1, rmnet0.getAddresses().size());
313        assertEquals(1, rmnet0.getLinkAddresses().size());
314        assertEquals(1, rmnet0.getAllAddresses().size());
315        assertEquals(1, rmnet0.getAllLinkAddresses().size());
316
317        assertFalse(rmnet0.removeStackedLink(clat4));
318    }
319
320    @SmallTest
321    public void testAddressMethods() {
322        LinkProperties lp = new LinkProperties();
323
324        // No addresses.
325        assertFalse(lp.hasIPv4Address());
326        assertFalse(lp.hasIPv6Address());
327
328        // Addresses on stacked links don't count.
329        LinkProperties stacked = new LinkProperties();
330        stacked.setInterfaceName("stacked");
331        lp.addStackedLink(stacked);
332        stacked.addLinkAddress(LINKADDRV4);
333        stacked.addLinkAddress(LINKADDRV6);
334        assertTrue(stacked.hasIPv4Address());
335        assertTrue(stacked.hasIPv6Address());
336        assertFalse(lp.hasIPv4Address());
337        assertFalse(lp.hasIPv6Address());
338        lp.removeStackedLink(stacked);
339        assertFalse(lp.hasIPv4Address());
340        assertFalse(lp.hasIPv6Address());
341
342        // Addresses on the base link.
343        // Check the return values of hasIPvXAddress and ensure the add/remove methods return true
344        // iff something changes.
345        assertTrue(lp.addLinkAddress(LINKADDRV6));
346        assertFalse(lp.hasIPv4Address());
347        assertTrue(lp.hasIPv6Address());
348
349        assertTrue(lp.removeLinkAddress(LINKADDRV6));
350        assertTrue(lp.addLinkAddress(LINKADDRV4));
351        assertTrue(lp.hasIPv4Address());
352        assertFalse(lp.hasIPv6Address());
353
354        assertTrue(lp.addLinkAddress(LINKADDRV6));
355        assertTrue(lp.hasIPv4Address());
356        assertTrue(lp.hasIPv6Address());
357
358        // Adding an address twice has no effect.
359        // Removing an address that's not present has no effect.
360        assertFalse(lp.addLinkAddress(LINKADDRV4));
361        assertTrue(lp.hasIPv4Address());
362        assertTrue(lp.removeLinkAddress(LINKADDRV4));
363        assertFalse(lp.hasIPv4Address());
364        assertFalse(lp.removeLinkAddress(LINKADDRV4));
365    }
366
367    @SmallTest
368    public void testSetLinkAddresses() {
369        LinkProperties lp = new LinkProperties();
370        lp.addLinkAddress(LINKADDRV4);
371        lp.addLinkAddress(LINKADDRV6);
372
373        LinkProperties lp2 = new LinkProperties();
374        lp2.addLinkAddress(LINKADDRV6);
375
376        assertFalse(lp.equals(lp2));
377
378        lp2.setLinkAddresses(lp.getLinkAddresses());
379        assertTrue(lp.equals(lp));
380    }
381}
382