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