LinkPropertiesTest.java revision d1e0fae2bc5c98b1f00b185d7be7219dc7e1d0f7
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 String ADDRV4 = "75.208.6.1";
29    private static String ADDRV6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
30    private static String DNS1 = "75.208.7.1";
31    private static String DNS2 = "69.78.7.1";
32    private static String GATEWAY1 = "75.208.8.1";
33    private static String GATEWAY2 = "69.78.8.1";
34    private static String NAME = "qmi0";
35
36    public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
37        // Check implementation of equals(), element by element.
38        assertTrue(source.isIdenticalInterfaceName(target));
39        assertTrue(target.isIdenticalInterfaceName(source));
40
41        assertTrue(source.isIdenticalAddresses(target));
42        assertTrue(target.isIdenticalAddresses(source));
43
44        assertTrue(source.isIdenticalDnses(target));
45        assertTrue(target.isIdenticalDnses(source));
46
47        assertTrue(source.isIdenticalRoutes(target));
48        assertTrue(target.isIdenticalRoutes(source));
49
50        assertTrue(source.isIdenticalHttpProxy(target));
51        assertTrue(target.isIdenticalHttpProxy(source));
52
53        assertTrue(source.isIdenticalStackedLinks(target));
54        assertTrue(target.isIdenticalStackedLinks(source));
55
56        // Check result of equals().
57        assertTrue(source.equals(target));
58        assertTrue(target.equals(source));
59
60        // Check hashCode.
61        assertEquals(source.hashCode(), target.hashCode());
62    }
63
64    @SmallTest
65    public void testEqualsNull() {
66        LinkProperties source = new LinkProperties();
67        LinkProperties target = new LinkProperties();
68
69        assertFalse(source == target);
70        assertLinkPropertiesEqual(source, target);
71    }
72
73    @SmallTest
74    public void testEqualsSameOrder() {
75        try {
76            LinkProperties source = new LinkProperties();
77            source.setInterfaceName(NAME);
78            // set 2 link addresses
79            source.addLinkAddress(new LinkAddress(
80                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
81            source.addLinkAddress(new LinkAddress(
82                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
83            // set 2 dnses
84            source.addDns(NetworkUtils.numericToInetAddress(DNS1));
85            source.addDns(NetworkUtils.numericToInetAddress(DNS2));
86            // set 2 gateways
87            source.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
88            source.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
89
90            LinkProperties target = new LinkProperties();
91
92            // All fields are same
93            target.setInterfaceName(NAME);
94            target.addLinkAddress(new LinkAddress(
95                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
96            target.addLinkAddress(new LinkAddress(
97                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
98            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
99            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
100            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
101            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
102
103            assertLinkPropertiesEqual(source, target);
104
105            target.clear();
106            // change Interface Name
107            target.setInterfaceName("qmi1");
108            target.addLinkAddress(new LinkAddress(
109                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
110            target.addLinkAddress(new LinkAddress(
111                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
112            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
113            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
114            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
115            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
116            assertFalse(source.equals(target));
117
118            target.clear();
119            target.setInterfaceName(NAME);
120            // change link addresses
121            target.addLinkAddress(new LinkAddress(
122                    NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
123            target.addLinkAddress(new LinkAddress(
124                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
125            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
126            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
127            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
128            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
129            assertFalse(source.equals(target));
130
131            target.clear();
132            target.setInterfaceName(NAME);
133            target.addLinkAddress(new LinkAddress(
134                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
135            target.addLinkAddress(new LinkAddress(
136                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
137            // change dnses
138            target.addDns(NetworkUtils.numericToInetAddress("75.208.7.2"));
139            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
140            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
141            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
142            assertFalse(source.equals(target));
143
144            target.clear();
145            target.setInterfaceName(NAME);
146            target.addLinkAddress(new LinkAddress(
147                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
148            target.addLinkAddress(new LinkAddress(
149                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
150            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
151            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
152            // change gateway
153            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
154            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
155            assertFalse(source.equals(target));
156
157        } catch (Exception e) {
158            throw new RuntimeException(e.toString());
159            //fail();
160        }
161    }
162
163    @SmallTest
164    public void testEqualsDifferentOrder() {
165        try {
166            LinkProperties source = new LinkProperties();
167            source.setInterfaceName(NAME);
168            // set 2 link addresses
169            source.addLinkAddress(new LinkAddress(
170                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
171            source.addLinkAddress(new LinkAddress(
172                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
173            // set 2 dnses
174            source.addDns(NetworkUtils.numericToInetAddress(DNS1));
175            source.addDns(NetworkUtils.numericToInetAddress(DNS2));
176            // set 2 gateways
177            source.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
178            source.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
179
180            LinkProperties target = new LinkProperties();
181            // Exchange order
182            target.setInterfaceName(NAME);
183            target.addLinkAddress(new LinkAddress(
184                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
185            target.addLinkAddress(new LinkAddress(
186                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
187            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
188            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
189            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY2)));
190            target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress(GATEWAY1)));
191
192            assertLinkPropertiesEqual(source, target);
193        } catch (Exception e) {
194            fail();
195        }
196    }
197
198    @SmallTest
199    public void testEqualsDuplicated() {
200        try {
201            LinkProperties source = new LinkProperties();
202            // set 3 link addresses, eg, [A, A, B]
203            source.addLinkAddress(new LinkAddress(
204                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
205            source.addLinkAddress(new LinkAddress(
206                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
207            source.addLinkAddress(new LinkAddress(
208                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
209
210            LinkProperties target = new LinkProperties();
211            // set 3 link addresses, eg, [A, B, B]
212            target.addLinkAddress(new LinkAddress(
213                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
214            target.addLinkAddress(new LinkAddress(
215                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
216            target.addLinkAddress(new LinkAddress(
217                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
218
219            assertLinkPropertiesEqual(source, target);
220        } catch (Exception e) {
221            fail();
222        }
223    }
224
225    private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
226        for (RouteInfo r : lp.getRoutes()) {
227            assertEquals(iface, r.getInterface());
228        }
229    }
230
231    @SmallTest
232    public void testRouteInterfaces() {
233        LinkAddress prefix = new LinkAddress(
234            NetworkUtils.numericToInetAddress("2001:db8::"), 32);
235        InetAddress address = NetworkUtils.numericToInetAddress(ADDRV6);
236
237        // Add a route with no interface to a LinkProperties with no interface. No errors.
238        LinkProperties lp = new LinkProperties();
239        RouteInfo r = new RouteInfo(prefix, address, null);
240        lp.addRoute(r);
241        assertEquals(1, lp.getRoutes().size());
242        assertAllRoutesHaveInterface(null, lp);
243
244        // Add a route with an interface. Except an exception.
245        r = new RouteInfo(prefix, address, "wlan0");
246        try {
247          lp.addRoute(r);
248          fail("Adding wlan0 route to LP with no interface, expect exception");
249        } catch (IllegalArgumentException expected) {}
250
251        // Change the interface name. All the routes should change their interface name too.
252        lp.setInterfaceName("rmnet0");
253        assertAllRoutesHaveInterface("rmnet0", lp);
254
255        // Now add a route with the wrong interface. This causes an exception too.
256        try {
257          lp.addRoute(r);
258          fail("Adding wlan0 route to rmnet0 LP, expect exception");
259        } catch (IllegalArgumentException expected) {}
260
261        // If the interface name matches, the route is added.
262        lp.setInterfaceName("wlan0");
263        lp.addRoute(r);
264        assertEquals(2, lp.getRoutes().size());
265        assertAllRoutesHaveInterface("wlan0", lp);
266
267        // Routes with null interfaces are converted to wlan0.
268        r = RouteInfo.makeHostRoute(NetworkUtils.numericToInetAddress(ADDRV6), null);
269        lp.addRoute(r);
270        assertEquals(3, lp.getRoutes().size());
271        assertAllRoutesHaveInterface("wlan0", lp);
272
273        // Check comparisons work.
274        LinkProperties lp2 = new LinkProperties(lp);
275        assertAllRoutesHaveInterface("wlan0", lp);
276        assertEquals(0, lp.compareAllRoutes(lp2).added.size());
277        assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
278
279        lp2.setInterfaceName("p2p0");
280        assertAllRoutesHaveInterface("p2p0", lp2);
281        assertEquals(3, lp.compareAllRoutes(lp2).added.size());
282        assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
283    }
284
285    @SmallTest
286    public void testStackedInterfaces() {
287        LinkProperties rmnet0 = new LinkProperties();
288        rmnet0.setInterfaceName("rmnet0");
289        rmnet0.addLinkAddress(new LinkAddress(
290                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
291
292        LinkProperties clat4 = new LinkProperties();
293        clat4.setInterfaceName("clat4");
294        clat4.addLinkAddress(new LinkAddress(
295                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
296
297        assertEquals(0, rmnet0.getStackedLinks().size());
298        assertEquals(1, rmnet0.getAddresses().size());
299        assertEquals(1, rmnet0.getLinkAddresses().size());
300        assertEquals(1, rmnet0.getAllAddresses().size());
301        assertEquals(1, rmnet0.getAllLinkAddresses().size());
302
303        rmnet0.addStackedLink(clat4);
304        assertEquals(1, rmnet0.getStackedLinks().size());
305        assertEquals(1, rmnet0.getAddresses().size());
306        assertEquals(1, rmnet0.getLinkAddresses().size());
307        assertEquals(2, rmnet0.getAllAddresses().size());
308        assertEquals(2, 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        assertEquals(0, clat4.getStackedLinks().size());
318
319        // Modify an item in the returned collection to see what happens.
320        for (LinkProperties link : rmnet0.getStackedLinks()) {
321            if (link.getInterfaceName().equals("clat4")) {
322               link.setInterfaceName("newname");
323            }
324        }
325        for (LinkProperties link : rmnet0.getStackedLinks()) {
326            assertFalse("newname".equals(link.getInterfaceName()));
327        }
328    }
329}
330