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