blob: 1004382b3adff4bc2a6995b71076cc82679ebbdf [file] [log] [blame]
Remi NGUYEN VANa420b572018-07-04 15:09:42 +09001/*
2 * Copyright (C) 2018 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.dhcp;
18
Remi NGUYEN VAN0e3d09232018-12-04 12:13:09 +090019import static android.net.InetAddresses.parseNumericAddress;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090020import static android.net.dhcp.DhcpServingParams.MTU_UNSET;
Remi NGUYEN VAN77dd54d2019-01-25 08:54:08 +090021import static android.net.shared.Inet4AddressUtils.inet4AddressToIntHTH;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090022
23import static junit.framework.Assert.assertEquals;
24import static junit.framework.Assert.assertFalse;
25import static junit.framework.Assert.assertTrue;
26
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090027import android.annotation.NonNull;
28import android.annotation.Nullable;
29import android.net.LinkAddress;
30import android.net.dhcp.DhcpServingParams.InvalidParameterException;
Remi NGUYEN VAN77dd54d2019-01-25 08:54:08 +090031import android.net.shared.Inet4AddressUtils;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090032import android.support.test.filters.SmallTest;
33import android.support.test.runner.AndroidJUnit4;
34
35import org.junit.Before;
36import org.junit.Test;
37import org.junit.runner.RunWith;
38
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +090039import java.lang.reflect.Modifier;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090040import java.net.Inet4Address;
41import java.util.Arrays;
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +090042import java.util.Collection;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090043import java.util.HashSet;
44import java.util.Set;
45
46@RunWith(AndroidJUnit4.class)
47@SmallTest
48public class DhcpServingParamsTest {
49 @NonNull
50 private DhcpServingParams.Builder mBuilder;
51
52 private static final Set<Inet4Address> TEST_DEFAULT_ROUTERS = new HashSet<>(
53 Arrays.asList(parseAddr("192.168.0.123"), parseAddr("192.168.0.124")));
54 private static final long TEST_LEASE_TIME_SECS = 3600L;
55 private static final Set<Inet4Address> TEST_DNS_SERVERS = new HashSet<>(
56 Arrays.asList(parseAddr("192.168.0.126"), parseAddr("192.168.0.127")));
57 private static final Inet4Address TEST_SERVER_ADDR = parseAddr("192.168.0.2");
58 private static final LinkAddress TEST_LINKADDR = new LinkAddress(TEST_SERVER_ADDR, 20);
59 private static final int TEST_MTU = 1500;
60 private static final Set<Inet4Address> TEST_EXCLUDED_ADDRS = new HashSet<>(
61 Arrays.asList(parseAddr("192.168.0.200"), parseAddr("192.168.0.201")));
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +090062 private static final boolean TEST_METERED = true;
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090063
64 @Before
65 public void setUp() {
66 mBuilder = new DhcpServingParams.Builder()
67 .setDefaultRouters(TEST_DEFAULT_ROUTERS)
68 .setDhcpLeaseTimeSecs(TEST_LEASE_TIME_SECS)
69 .setDnsServers(TEST_DNS_SERVERS)
70 .setServerAddr(TEST_LINKADDR)
71 .setLinkMtu(TEST_MTU)
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +090072 .setExcludedAddrs(TEST_EXCLUDED_ADDRS)
73 .setMetered(TEST_METERED);
Remi NGUYEN VANa420b572018-07-04 15:09:42 +090074 }
75
76 @Test
77 public void testBuild_Immutable() throws InvalidParameterException {
78 final Set<Inet4Address> routers = new HashSet<>(TEST_DEFAULT_ROUTERS);
79 final Set<Inet4Address> dnsServers = new HashSet<>(TEST_DNS_SERVERS);
80 final Set<Inet4Address> excludedAddrs = new HashSet<>(TEST_EXCLUDED_ADDRS);
81
82 final DhcpServingParams params = mBuilder
83 .setDefaultRouters(routers)
84 .setDnsServers(dnsServers)
85 .setExcludedAddrs(excludedAddrs)
86 .build();
87
88 // Modifications to source objects should not affect builder or final parameters
89 final Inet4Address addedAddr = parseAddr("192.168.0.223");
90 routers.add(addedAddr);
91 dnsServers.add(addedAddr);
92 excludedAddrs.add(addedAddr);
93
94 assertEquals(TEST_DEFAULT_ROUTERS, params.defaultRouters);
95 assertEquals(TEST_LEASE_TIME_SECS, params.dhcpLeaseTimeSecs);
96 assertEquals(TEST_DNS_SERVERS, params.dnsServers);
97 assertEquals(TEST_LINKADDR, params.serverAddr);
98 assertEquals(TEST_MTU, params.linkMtu);
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +090099 assertEquals(TEST_METERED, params.metered);
Remi NGUYEN VANa420b572018-07-04 15:09:42 +0900100
101 assertContains(params.excludedAddrs, TEST_EXCLUDED_ADDRS);
102 assertContains(params.excludedAddrs, TEST_DEFAULT_ROUTERS);
103 assertContains(params.excludedAddrs, TEST_DNS_SERVERS);
104 assertContains(params.excludedAddrs, TEST_SERVER_ADDR);
105
106 assertFalse("excludedAddrs should not contain " + addedAddr,
107 params.excludedAddrs.contains(addedAddr));
108 }
109
110 @Test(expected = InvalidParameterException.class)
111 public void testBuild_NegativeLeaseTime() throws InvalidParameterException {
112 mBuilder.setDhcpLeaseTimeSecs(-1).build();
113 }
114
115 @Test(expected = InvalidParameterException.class)
116 public void testBuild_LeaseTimeTooLarge() throws InvalidParameterException {
117 // Set lease time larger than max value for uint32
118 mBuilder.setDhcpLeaseTimeSecs(1L << 32).build();
119 }
120
121 @Test
122 public void testBuild_InfiniteLeaseTime() throws InvalidParameterException {
123 final long infiniteLeaseTime = 0xffffffffL;
124 final DhcpServingParams params = mBuilder
125 .setDhcpLeaseTimeSecs(infiniteLeaseTime).build();
126 assertEquals(infiniteLeaseTime, params.dhcpLeaseTimeSecs);
127 assertTrue(params.dhcpLeaseTimeSecs > 0L);
128 }
129
130 @Test
131 public void testBuild_UnsetMtu() throws InvalidParameterException {
132 final DhcpServingParams params = mBuilder.setLinkMtu(MTU_UNSET).build();
133 assertEquals(MTU_UNSET, params.linkMtu);
134 }
135
136 @Test(expected = InvalidParameterException.class)
137 public void testBuild_MtuTooSmall() throws InvalidParameterException {
138 mBuilder.setLinkMtu(20).build();
139 }
140
141 @Test(expected = InvalidParameterException.class)
142 public void testBuild_MtuTooLarge() throws InvalidParameterException {
143 mBuilder.setLinkMtu(65_536).build();
144 }
145
146 @Test(expected = InvalidParameterException.class)
147 public void testBuild_IPv6Addr() throws InvalidParameterException {
148 mBuilder.setServerAddr(new LinkAddress(parseNumericAddress("fe80::1111"), 120)).build();
149 }
150
151 @Test(expected = InvalidParameterException.class)
152 public void testBuild_PrefixTooLarge() throws InvalidParameterException {
153 mBuilder.setServerAddr(new LinkAddress(TEST_SERVER_ADDR, 15)).build();
154 }
155
156 @Test(expected = InvalidParameterException.class)
157 public void testBuild_PrefixTooSmall() throws InvalidParameterException {
Remi NGUYEN VANa7587202018-08-23 18:01:46 +0900158 mBuilder.setDefaultRouters(parseAddr("192.168.0.254"))
Remi NGUYEN VANa420b572018-07-04 15:09:42 +0900159 .setServerAddr(new LinkAddress(TEST_SERVER_ADDR, 31))
160 .build();
161 }
162
163 @Test(expected = InvalidParameterException.class)
164 public void testBuild_RouterNotInPrefix() throws InvalidParameterException {
Remi NGUYEN VANa7587202018-08-23 18:01:46 +0900165 mBuilder.setDefaultRouters(parseAddr("192.168.254.254")).build();
Remi NGUYEN VANa420b572018-07-04 15:09:42 +0900166 }
167
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +0900168 @Test
169 public void testFromParcelableObject() throws InvalidParameterException {
170 final DhcpServingParams params = mBuilder.build();
171 final DhcpServingParamsParcel parcel = new DhcpServingParamsParcel();
172 parcel.defaultRouters = toIntArray(TEST_DEFAULT_ROUTERS);
173 parcel.dhcpLeaseTimeSecs = TEST_LEASE_TIME_SECS;
174 parcel.dnsServers = toIntArray(TEST_DNS_SERVERS);
175 parcel.serverAddr = inet4AddressToIntHTH(TEST_SERVER_ADDR);
176 parcel.serverAddrPrefixLength = TEST_LINKADDR.getPrefixLength();
177 parcel.linkMtu = TEST_MTU;
178 parcel.excludedAddrs = toIntArray(TEST_EXCLUDED_ADDRS);
179 parcel.metered = TEST_METERED;
180 final DhcpServingParams parceled = DhcpServingParams.fromParcelableObject(parcel);
181
182 assertEquals(params.defaultRouters, parceled.defaultRouters);
183 assertEquals(params.dhcpLeaseTimeSecs, parceled.dhcpLeaseTimeSecs);
184 assertEquals(params.dnsServers, parceled.dnsServers);
185 assertEquals(params.serverAddr, parceled.serverAddr);
186 assertEquals(params.linkMtu, parceled.linkMtu);
187 assertEquals(params.excludedAddrs, parceled.excludedAddrs);
188 assertEquals(params.metered, parceled.metered);
189
190 // Ensure that we do not miss any field if added in the future
191 final long numFields = Arrays.stream(DhcpServingParams.class.getDeclaredFields())
192 .filter(f -> !Modifier.isStatic(f.getModifiers()))
193 .count();
194 assertEquals(7, numFields);
195 }
196
Remi NGUYEN VAN0e3d09232018-12-04 12:13:09 +0900197 @Test(expected = InvalidParameterException.class)
198 public void testFromParcelableObject_NullArgument() throws InvalidParameterException {
199 DhcpServingParams.fromParcelableObject(null);
200 }
201
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +0900202 private static int[] toIntArray(Collection<Inet4Address> addrs) {
Remi NGUYEN VAN77dd54d2019-01-25 08:54:08 +0900203 return addrs.stream().mapToInt(Inet4AddressUtils::inet4AddressToIntHTH).toArray();
Remi NGUYEN VAN761198a2018-12-10 16:35:30 +0900204 }
205
Remi NGUYEN VANa420b572018-07-04 15:09:42 +0900206 private static <T> void assertContains(@NonNull Set<T> set, @NonNull Set<T> subset) {
207 for (final T elem : subset) {
208 assertContains(set, elem);
209 }
210 }
211
212 private static <T> void assertContains(@NonNull Set<T> set, @Nullable T elem) {
213 assertTrue("Set does not contain " + elem, set.contains(elem));
214 }
215
216 @NonNull
217 private static Inet4Address parseAddr(@NonNull String inet4Addr) {
218 return (Inet4Address) parseNumericAddress(inet4Addr);
219 }
220}