LinkPropertiesTest.java revision f3cab63ef2248aebf2c931cd1e84d5739791fa50
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.system.OsConstants;
22import android.test.suitebuilder.annotation.SmallTest;
23import junit.framework.TestCase;
24
25import java.net.InetAddress;
26import java.util.ArrayList;
27
28public class LinkPropertiesTest extends TestCase {
29    private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
30    private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
31            "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
32    private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
33    private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
34    private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
35    private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
36    private static String NAME = "qmi0";
37    private static int MTU = 1500;
38
39    private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
40    private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
41    private static LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
42
43    public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
44        // Check implementation of equals(), element by element.
45        assertTrue(source.isIdenticalInterfaceName(target));
46        assertTrue(target.isIdenticalInterfaceName(source));
47
48        assertTrue(source.isIdenticalAddresses(target));
49        assertTrue(target.isIdenticalAddresses(source));
50
51        assertTrue(source.isIdenticalDnses(target));
52        assertTrue(target.isIdenticalDnses(source));
53
54        assertTrue(source.isIdenticalRoutes(target));
55        assertTrue(target.isIdenticalRoutes(source));
56
57        assertTrue(source.isIdenticalHttpProxy(target));
58        assertTrue(target.isIdenticalHttpProxy(source));
59
60        assertTrue(source.isIdenticalStackedLinks(target));
61        assertTrue(target.isIdenticalStackedLinks(source));
62
63        assertTrue(source.isIdenticalMtu(target));
64        assertTrue(target.isIdenticalMtu(source));
65
66        // Check result of equals().
67        assertTrue(source.equals(target));
68        assertTrue(target.equals(source));
69
70        // Check hashCode.
71        assertEquals(source.hashCode(), target.hashCode());
72    }
73
74    @SmallTest
75    public void testEqualsNull() {
76        LinkProperties source = new LinkProperties();
77        LinkProperties target = new LinkProperties();
78
79        assertFalse(source == target);
80        assertLinkPropertiesEqual(source, target);
81    }
82
83    @SmallTest
84    public void testEqualsSameOrder() {
85        try {
86            LinkProperties source = new LinkProperties();
87            source.setInterfaceName(NAME);
88            // set 2 link addresses
89            source.addLinkAddress(LINKADDRV4);
90            source.addLinkAddress(LINKADDRV6);
91            // set 2 dnses
92            source.addDnsServer(DNS1);
93            source.addDnsServer(DNS2);
94            // set 2 gateways
95            source.addRoute(new RouteInfo(GATEWAY1));
96            source.addRoute(new RouteInfo(GATEWAY2));
97            source.setMtu(MTU);
98
99            LinkProperties target = new LinkProperties();
100
101            // All fields are same
102            target.setInterfaceName(NAME);
103            target.addLinkAddress(LINKADDRV4);
104            target.addLinkAddress(LINKADDRV6);
105            target.addDnsServer(DNS1);
106            target.addDnsServer(DNS2);
107            target.addRoute(new RouteInfo(GATEWAY1));
108            target.addRoute(new RouteInfo(GATEWAY2));
109            target.setMtu(MTU);
110
111            assertLinkPropertiesEqual(source, target);
112
113            target.clear();
114            // change Interface Name
115            target.setInterfaceName("qmi1");
116            target.addLinkAddress(LINKADDRV4);
117            target.addLinkAddress(LINKADDRV6);
118            target.addDnsServer(DNS1);
119            target.addDnsServer(DNS2);
120            target.addRoute(new RouteInfo(GATEWAY1));
121            target.addRoute(new RouteInfo(GATEWAY2));
122            target.setMtu(MTU);
123            assertFalse(source.equals(target));
124
125            target.clear();
126            target.setInterfaceName(NAME);
127            // change link addresses
128            target.addLinkAddress(new LinkAddress(
129                    NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
130            target.addLinkAddress(LINKADDRV6);
131            target.addDnsServer(DNS1);
132            target.addDnsServer(DNS2);
133            target.addRoute(new RouteInfo(GATEWAY1));
134            target.addRoute(new RouteInfo(GATEWAY2));
135            target.setMtu(MTU);
136            assertFalse(source.equals(target));
137
138            target.clear();
139            target.setInterfaceName(NAME);
140            target.addLinkAddress(LINKADDRV4);
141            target.addLinkAddress(LINKADDRV6);
142            // change dnses
143            target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
144            target.addDnsServer(DNS2);
145            target.addRoute(new RouteInfo(GATEWAY1));
146            target.addRoute(new RouteInfo(GATEWAY2));
147            target.setMtu(MTU);
148            assertFalse(source.equals(target));
149
150            target.clear();
151            target.setInterfaceName(NAME);
152            target.addLinkAddress(LINKADDRV4);
153            target.addLinkAddress(LINKADDRV6);
154            target.addDnsServer(DNS1);
155            target.addDnsServer(DNS2);
156            // change gateway
157            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
158            target.addRoute(new RouteInfo(GATEWAY2));
159            target.setMtu(MTU);
160            assertFalse(source.equals(target));
161
162            target.clear();
163            target.setInterfaceName(NAME);
164            target.addLinkAddress(LINKADDRV4);
165            target.addLinkAddress(LINKADDRV6);
166            target.addDnsServer(DNS1);
167            target.addDnsServer(DNS2);
168            target.addRoute(new RouteInfo(GATEWAY1));
169            target.addRoute(new RouteInfo(GATEWAY2));
170            // change mtu
171            target.setMtu(1440);
172            assertFalse(source.equals(target));
173
174        } catch (Exception e) {
175            throw new RuntimeException(e.toString());
176            //fail();
177        }
178    }
179
180    @SmallTest
181    public void testEqualsDifferentOrder() {
182        try {
183            LinkProperties source = new LinkProperties();
184            source.setInterfaceName(NAME);
185            // set 2 link addresses
186            source.addLinkAddress(LINKADDRV4);
187            source.addLinkAddress(LINKADDRV6);
188            // set 2 dnses
189            source.addDnsServer(DNS1);
190            source.addDnsServer(DNS2);
191            // set 2 gateways
192            source.addRoute(new RouteInfo(GATEWAY1));
193            source.addRoute(new RouteInfo(GATEWAY2));
194            source.setMtu(MTU);
195
196            LinkProperties target = new LinkProperties();
197            // Exchange order
198            target.setInterfaceName(NAME);
199            target.addLinkAddress(LINKADDRV6);
200            target.addLinkAddress(LINKADDRV4);
201            target.addDnsServer(DNS2);
202            target.addDnsServer(DNS1);
203            target.addRoute(new RouteInfo(GATEWAY2));
204            target.addRoute(new RouteInfo(GATEWAY1));
205            target.setMtu(MTU);
206
207            assertLinkPropertiesEqual(source, target);
208        } catch (Exception e) {
209            fail();
210        }
211    }
212
213    @SmallTest
214    public void testEqualsDuplicated() {
215        try {
216            LinkProperties source = new LinkProperties();
217            // set 3 link addresses, eg, [A, A, B]
218            source.addLinkAddress(LINKADDRV4);
219            source.addLinkAddress(LINKADDRV4);
220            source.addLinkAddress(LINKADDRV6);
221
222            LinkProperties target = new LinkProperties();
223            // set 3 link addresses, eg, [A, B, B]
224            target.addLinkAddress(LINKADDRV4);
225            target.addLinkAddress(LINKADDRV6);
226            target.addLinkAddress(LINKADDRV6);
227
228            assertLinkPropertiesEqual(source, target);
229        } catch (Exception e) {
230            fail();
231        }
232    }
233
234    private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
235        for (RouteInfo r : lp.getRoutes()) {
236            assertEquals(iface, r.getInterface());
237        }
238    }
239
240    @SmallTest
241    public void testRouteInterfaces() {
242        LinkAddress prefix = new LinkAddress(
243            NetworkUtils.numericToInetAddress("2001:db8::"), 32);
244        InetAddress address = ADDRV6;
245
246        // Add a route with no interface to a LinkProperties with no interface. No errors.
247        LinkProperties lp = new LinkProperties();
248        RouteInfo r = new RouteInfo(prefix, address, null);
249        assertTrue(lp.addRoute(r));
250        assertEquals(1, lp.getRoutes().size());
251        assertAllRoutesHaveInterface(null, lp);
252
253        // Adding the same route twice has no effect.
254        assertFalse(lp.addRoute(r));
255        assertEquals(1, lp.getRoutes().size());
256
257        // Add a route with an interface. Expect an exception.
258        r = new RouteInfo(prefix, address, "wlan0");
259        try {
260          lp.addRoute(r);
261          fail("Adding wlan0 route to LP with no interface, expect exception");
262        } catch (IllegalArgumentException expected) {}
263
264        // Change the interface name. All the routes should change their interface name too.
265        lp.setInterfaceName("rmnet0");
266        assertAllRoutesHaveInterface("rmnet0", lp);
267
268        // Now add a route with the wrong interface. This causes an exception too.
269        try {
270          lp.addRoute(r);
271          fail("Adding wlan0 route to rmnet0 LP, expect exception");
272        } catch (IllegalArgumentException expected) {}
273
274        // If the interface name matches, the route is added.
275        r = new RouteInfo(prefix, null, "wlan0");
276        lp.setInterfaceName("wlan0");
277        lp.addRoute(r);
278        assertEquals(2, lp.getRoutes().size());
279        assertAllRoutesHaveInterface("wlan0", lp);
280
281        // Routes with null interfaces are converted to wlan0.
282        r = RouteInfo.makeHostRoute(ADDRV6, null);
283        lp.addRoute(r);
284        assertEquals(3, lp.getRoutes().size());
285        assertAllRoutesHaveInterface("wlan0", lp);
286
287        // Check comparisons work.
288        LinkProperties lp2 = new LinkProperties(lp);
289        assertAllRoutesHaveInterface("wlan0", lp);
290        assertEquals(0, lp.compareAllRoutes(lp2).added.size());
291        assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
292
293        lp2.setInterfaceName("p2p0");
294        assertAllRoutesHaveInterface("p2p0", lp2);
295        assertEquals(3, lp.compareAllRoutes(lp2).added.size());
296        assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
297    }
298
299    @SmallTest
300    public void testStackedInterfaces() {
301        LinkProperties rmnet0 = new LinkProperties();
302        rmnet0.setInterfaceName("rmnet0");
303        rmnet0.addLinkAddress(LINKADDRV6);
304
305        LinkProperties clat4 = new LinkProperties();
306        clat4.setInterfaceName("clat4");
307        clat4.addLinkAddress(LINKADDRV4);
308
309        assertEquals(0, rmnet0.getStackedLinks().size());
310        assertEquals(1, rmnet0.getAddresses().size());
311        assertEquals(1, rmnet0.getLinkAddresses().size());
312        assertEquals(1, rmnet0.getAllAddresses().size());
313        assertEquals(1, rmnet0.getAllLinkAddresses().size());
314
315        rmnet0.addStackedLink(clat4);
316        assertEquals(1, rmnet0.getStackedLinks().size());
317        assertEquals(1, rmnet0.getAddresses().size());
318        assertEquals(1, rmnet0.getLinkAddresses().size());
319        assertEquals(2, rmnet0.getAllAddresses().size());
320        assertEquals(2, rmnet0.getAllLinkAddresses().size());
321
322        rmnet0.addStackedLink(clat4);
323        assertEquals(1, rmnet0.getStackedLinks().size());
324        assertEquals(1, rmnet0.getAddresses().size());
325        assertEquals(1, rmnet0.getLinkAddresses().size());
326        assertEquals(2, rmnet0.getAllAddresses().size());
327        assertEquals(2, rmnet0.getAllLinkAddresses().size());
328
329        assertEquals(0, clat4.getStackedLinks().size());
330
331        // Modify an item in the returned collection to see what happens.
332        for (LinkProperties link : rmnet0.getStackedLinks()) {
333            if (link.getInterfaceName().equals("clat4")) {
334               link.setInterfaceName("newname");
335            }
336        }
337        for (LinkProperties link : rmnet0.getStackedLinks()) {
338            assertFalse("newname".equals(link.getInterfaceName()));
339        }
340
341        assertTrue(rmnet0.removeStackedLink("clat4"));
342        assertEquals(0, rmnet0.getStackedLinks().size());
343        assertEquals(1, rmnet0.getAddresses().size());
344        assertEquals(1, rmnet0.getLinkAddresses().size());
345        assertEquals(1, rmnet0.getAllAddresses().size());
346        assertEquals(1, rmnet0.getAllLinkAddresses().size());
347
348        assertFalse(rmnet0.removeStackedLink("clat4"));
349    }
350
351    private LinkAddress getFirstLinkAddress(LinkProperties lp) {
352        return lp.getLinkAddresses().iterator().next();
353    }
354
355    @SmallTest
356    public void testAddressMethods() {
357        LinkProperties lp = new LinkProperties();
358
359        // No addresses.
360        assertFalse(lp.hasIPv4Address());
361        assertFalse(lp.hasGlobalIPv6Address());
362
363        // Addresses on stacked links don't count.
364        LinkProperties stacked = new LinkProperties();
365        stacked.setInterfaceName("stacked");
366        lp.addStackedLink(stacked);
367        stacked.addLinkAddress(LINKADDRV4);
368        stacked.addLinkAddress(LINKADDRV6);
369        assertTrue(stacked.hasIPv4Address());
370        assertTrue(stacked.hasGlobalIPv6Address());
371        assertFalse(lp.hasIPv4Address());
372        assertFalse(lp.hasGlobalIPv6Address());
373        lp.removeStackedLink("stacked");
374        assertFalse(lp.hasIPv4Address());
375        assertFalse(lp.hasGlobalIPv6Address());
376
377        // Addresses on the base link.
378        // Check the return values of hasIPvXAddress and ensure the add/remove methods return true
379        // iff something changes.
380        assertEquals(0, lp.getLinkAddresses().size());
381        assertTrue(lp.addLinkAddress(LINKADDRV6));
382        assertEquals(1, lp.getLinkAddresses().size());
383        assertFalse(lp.hasIPv4Address());
384        assertTrue(lp.hasGlobalIPv6Address());
385
386        assertTrue(lp.removeLinkAddress(LINKADDRV6));
387        assertEquals(0, lp.getLinkAddresses().size());
388
389        assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
390        assertEquals(1, lp.getLinkAddresses().size());
391        assertFalse(lp.hasGlobalIPv6Address());
392
393        assertTrue(lp.addLinkAddress(LINKADDRV4));
394        assertEquals(2, lp.getLinkAddresses().size());
395        assertTrue(lp.hasIPv4Address());
396        assertFalse(lp.hasGlobalIPv6Address());
397
398        assertTrue(lp.addLinkAddress(LINKADDRV6));
399        assertEquals(3, lp.getLinkAddresses().size());
400        assertTrue(lp.hasIPv4Address());
401        assertTrue(lp.hasGlobalIPv6Address());
402
403        assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
404        assertEquals(2, lp.getLinkAddresses().size());
405        assertTrue(lp.hasIPv4Address());
406        assertTrue(lp.hasGlobalIPv6Address());
407
408        // Adding an address twice has no effect.
409        // Removing an address that's not present has no effect.
410        assertFalse(lp.addLinkAddress(LINKADDRV4));
411        assertEquals(2, lp.getLinkAddresses().size());
412        assertTrue(lp.hasIPv4Address());
413        assertTrue(lp.removeLinkAddress(LINKADDRV4));
414        assertEquals(1, lp.getLinkAddresses().size());
415        assertFalse(lp.hasIPv4Address());
416        assertFalse(lp.removeLinkAddress(LINKADDRV4));
417        assertEquals(1, lp.getLinkAddresses().size());
418
419        // Adding an address that's already present but with different properties causes the
420        // existing address to be updated and returns true.
421        // Start with only LINKADDRV6.
422        assertEquals(1, lp.getLinkAddresses().size());
423        assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
424
425        // Create a LinkAddress object for the same address, but with different flags.
426        LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
427                OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
428        assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
429        assertFalse(deprecated.equals(LINKADDRV6));
430
431        // Check that adding it updates the existing address instead of adding a new one.
432        assertTrue(lp.addLinkAddress(deprecated));
433        assertEquals(1, lp.getLinkAddresses().size());
434        assertEquals(deprecated, getFirstLinkAddress(lp));
435        assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
436
437        // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
438        assertTrue(lp.removeLinkAddress(LINKADDRV6));
439        assertEquals(0, lp.getLinkAddresses().size());
440    }
441
442    @SmallTest
443    public void testSetLinkAddresses() {
444        LinkProperties lp = new LinkProperties();
445        lp.addLinkAddress(LINKADDRV4);
446        lp.addLinkAddress(LINKADDRV6);
447
448        LinkProperties lp2 = new LinkProperties();
449        lp2.addLinkAddress(LINKADDRV6);
450
451        assertFalse(lp.equals(lp2));
452
453        lp2.setLinkAddresses(lp.getLinkAddresses());
454        assertTrue(lp.equals(lp));
455    }
456}
457