LinkPropertiesTest.java revision 64483947fdb03bf838e317ac0a4af5e0f53a5bbf
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
27import libcore.io.OsConstants;
28
29public class LinkPropertiesTest extends TestCase {
30    private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
31    private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
32            "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
33    private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
34    private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
35    private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
36    private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
37    private static String NAME = "qmi0";
38    private static int MTU = 1500;
39
40    private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
41    private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
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.addDns(DNS1);
93            source.addDns(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.addDns(DNS1);
106            target.addDns(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.addDns(DNS1);
119            target.addDns(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.addDns(DNS1);
132            target.addDns(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.addDns(NetworkUtils.numericToInetAddress("75.208.7.2"));
144            target.addDns(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.addDns(DNS1);
155            target.addDns(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.addDns(DNS1);
167            target.addDns(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.addDns(DNS1);
190            source.addDns(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.addDns(DNS2);
202            target.addDns(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        lp.addRoute(r);
250        assertEquals(1, lp.getRoutes().size());
251        assertAllRoutesHaveInterface(null, lp);
252
253        // Add a route with an interface. Except an exception.
254        r = new RouteInfo(prefix, address, "wlan0");
255        try {
256          lp.addRoute(r);
257          fail("Adding wlan0 route to LP with no interface, expect exception");
258        } catch (IllegalArgumentException expected) {}
259
260        // Change the interface name. All the routes should change their interface name too.
261        lp.setInterfaceName("rmnet0");
262        assertAllRoutesHaveInterface("rmnet0", lp);
263
264        // Now add a route with the wrong interface. This causes an exception too.
265        try {
266          lp.addRoute(r);
267          fail("Adding wlan0 route to rmnet0 LP, expect exception");
268        } catch (IllegalArgumentException expected) {}
269
270        // If the interface name matches, the route is added.
271        lp.setInterfaceName("wlan0");
272        lp.addRoute(r);
273        assertEquals(2, lp.getRoutes().size());
274        assertAllRoutesHaveInterface("wlan0", lp);
275
276        // Routes with null interfaces are converted to wlan0.
277        r = RouteInfo.makeHostRoute(ADDRV6, null);
278        lp.addRoute(r);
279        assertEquals(3, lp.getRoutes().size());
280        assertAllRoutesHaveInterface("wlan0", lp);
281
282        // Check comparisons work.
283        LinkProperties lp2 = new LinkProperties(lp);
284        assertAllRoutesHaveInterface("wlan0", lp);
285        assertEquals(0, lp.compareAllRoutes(lp2).added.size());
286        assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
287
288        lp2.setInterfaceName("p2p0");
289        assertAllRoutesHaveInterface("p2p0", lp2);
290        assertEquals(3, lp.compareAllRoutes(lp2).added.size());
291        assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
292    }
293
294    @SmallTest
295    public void testStackedInterfaces() {
296        LinkProperties rmnet0 = new LinkProperties();
297        rmnet0.setInterfaceName("rmnet0");
298        rmnet0.addLinkAddress(LINKADDRV6);
299
300        LinkProperties clat4 = new LinkProperties();
301        clat4.setInterfaceName("clat4");
302        clat4.addLinkAddress(LINKADDRV4);
303
304        assertEquals(0, rmnet0.getStackedLinks().size());
305        assertEquals(1, rmnet0.getAddresses().size());
306        assertEquals(1, rmnet0.getLinkAddresses().size());
307        assertEquals(1, rmnet0.getAllAddresses().size());
308        assertEquals(1, rmnet0.getAllLinkAddresses().size());
309
310        rmnet0.addStackedLink(clat4);
311        assertEquals(1, rmnet0.getStackedLinks().size());
312        assertEquals(1, rmnet0.getAddresses().size());
313        assertEquals(1, rmnet0.getLinkAddresses().size());
314        assertEquals(2, rmnet0.getAllAddresses().size());
315        assertEquals(2, rmnet0.getAllLinkAddresses().size());
316
317        rmnet0.addStackedLink(clat4);
318        assertEquals(1, rmnet0.getStackedLinks().size());
319        assertEquals(1, rmnet0.getAddresses().size());
320        assertEquals(1, rmnet0.getLinkAddresses().size());
321        assertEquals(2, rmnet0.getAllAddresses().size());
322        assertEquals(2, rmnet0.getAllLinkAddresses().size());
323
324        assertEquals(0, clat4.getStackedLinks().size());
325
326        // Modify an item in the returned collection to see what happens.
327        for (LinkProperties link : rmnet0.getStackedLinks()) {
328            if (link.getInterfaceName().equals("clat4")) {
329               link.setInterfaceName("newname");
330            }
331        }
332        for (LinkProperties link : rmnet0.getStackedLinks()) {
333            assertFalse("newname".equals(link.getInterfaceName()));
334        }
335
336        assertTrue(rmnet0.removeStackedLink(clat4));
337        assertEquals(0, rmnet0.getStackedLinks().size());
338        assertEquals(1, rmnet0.getAddresses().size());
339        assertEquals(1, rmnet0.getLinkAddresses().size());
340        assertEquals(1, rmnet0.getAllAddresses().size());
341        assertEquals(1, rmnet0.getAllLinkAddresses().size());
342
343        assertFalse(rmnet0.removeStackedLink(clat4));
344    }
345
346    private LinkAddress getFirstLinkAddress(LinkProperties lp) {
347        return lp.getLinkAddresses().iterator().next();
348    }
349
350    @SmallTest
351    public void testAddressMethods() {
352        LinkProperties lp = new LinkProperties();
353
354        // No addresses.
355        assertFalse(lp.hasIPv4Address());
356        assertFalse(lp.hasIPv6Address());
357
358        // Addresses on stacked links don't count.
359        LinkProperties stacked = new LinkProperties();
360        stacked.setInterfaceName("stacked");
361        lp.addStackedLink(stacked);
362        stacked.addLinkAddress(LINKADDRV4);
363        stacked.addLinkAddress(LINKADDRV6);
364        assertTrue(stacked.hasIPv4Address());
365        assertTrue(stacked.hasIPv6Address());
366        assertFalse(lp.hasIPv4Address());
367        assertFalse(lp.hasIPv6Address());
368        lp.removeStackedLink(stacked);
369        assertFalse(lp.hasIPv4Address());
370        assertFalse(lp.hasIPv6Address());
371
372        // Addresses on the base link.
373        // Check the return values of hasIPvXAddress and ensure the add/remove methods return true
374        // iff something changes.
375        assertEquals(0, lp.getLinkAddresses().size());
376        assertTrue(lp.addLinkAddress(LINKADDRV6));
377        assertEquals(1, lp.getLinkAddresses().size());
378        assertFalse(lp.hasIPv4Address());
379        assertTrue(lp.hasIPv6Address());
380
381        assertTrue(lp.removeLinkAddress(LINKADDRV6));
382        assertEquals(0, lp.getLinkAddresses().size());
383        assertTrue(lp.addLinkAddress(LINKADDRV4));
384        assertEquals(1, lp.getLinkAddresses().size());
385        assertTrue(lp.hasIPv4Address());
386        assertFalse(lp.hasIPv6Address());
387
388        assertTrue(lp.addLinkAddress(LINKADDRV6));
389        assertEquals(2, lp.getLinkAddresses().size());
390        assertTrue(lp.hasIPv4Address());
391        assertTrue(lp.hasIPv6Address());
392
393        // Adding an address twice has no effect.
394        // Removing an address that's not present has no effect.
395        assertFalse(lp.addLinkAddress(LINKADDRV4));
396        assertEquals(2, lp.getLinkAddresses().size());
397        assertTrue(lp.hasIPv4Address());
398        assertTrue(lp.removeLinkAddress(LINKADDRV4));
399        assertEquals(1, lp.getLinkAddresses().size());
400        assertFalse(lp.hasIPv4Address());
401        assertFalse(lp.removeLinkAddress(LINKADDRV4));
402        assertEquals(1, lp.getLinkAddresses().size());
403
404        // Adding an address that's already present but with different properties causes the
405        // existing address to be updated and returns true.
406        // Start with only LINKADDRV6.
407        assertEquals(1, lp.getLinkAddresses().size());
408        assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
409
410        // Create a LinkAddress object for the same address, but with different flags.
411        LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
412                OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
413        assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
414        assertFalse(deprecated.equals(LINKADDRV6));
415
416        // Check that adding it updates the existing address instead of adding a new one.
417        assertTrue(lp.addLinkAddress(deprecated));
418        assertEquals(1, lp.getLinkAddresses().size());
419        assertEquals(deprecated, getFirstLinkAddress(lp));
420        assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
421
422        // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
423        assertTrue(lp.removeLinkAddress(LINKADDRV6));
424        assertEquals(0, lp.getLinkAddresses().size());
425    }
426
427    @SmallTest
428    public void testSetLinkAddresses() {
429        LinkProperties lp = new LinkProperties();
430        lp.addLinkAddress(LINKADDRV4);
431        lp.addLinkAddress(LINKADDRV6);
432
433        LinkProperties lp2 = new LinkProperties();
434        lp2.addLinkAddress(LINKADDRV6);
435
436        assertFalse(lp.equals(lp2));
437
438        lp2.setLinkAddresses(lp.getLinkAddresses());
439        assertTrue(lp.equals(lp));
440    }
441}
442