blob: 1ec4eec1bc646ad9d78c7d928bfd95446aeda8de [file] [log] [blame]
dalyk1fcb7392018-03-05 12:42:22 -05001/*
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 com.android.server.connectivity;
18
19import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
20import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
21import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
22
23import static org.junit.Assert.assertEquals;
24import static org.junit.Assert.assertFalse;
25import static org.junit.Assert.assertNull;
26import static org.junit.Assert.assertTrue;
27import static org.mockito.Mockito.when;
28
29import android.content.ContentResolver;
30import android.content.Context;
Chalard Jeanf0f364f2018-04-11 18:58:52 +090031import android.net.IpPrefix;
32import android.net.LinkAddress;
dalyk1fcb7392018-03-05 12:42:22 -050033import android.net.LinkProperties;
34import android.net.Network;
Chalard Jeanf0f364f2018-04-11 18:58:52 +090035import android.net.RouteInfo;
dalyk1fcb7392018-03-05 12:42:22 -050036import android.os.INetworkManagementService;
37import android.provider.Settings;
38import android.support.test.filters.SmallTest;
39import android.support.test.runner.AndroidJUnit4;
40import android.test.mock.MockContentResolver;
41
42import com.android.internal.util.test.FakeSettingsProvider;
43import com.android.server.connectivity.MockableSystemProperties;
44
45import java.net.InetAddress;
Chalard Jeanf0f364f2018-04-11 18:58:52 +090046import java.util.Arrays;
dalyk1fcb7392018-03-05 12:42:22 -050047
48import org.junit.runner.RunWith;
49import org.junit.Before;
50import org.junit.Test;
51import org.mockito.Mock;
52import org.mockito.MockitoAnnotations;
53
54/**
55 * Tests for {@link DnsManager}.
56 *
57 * Build, install and run with:
58 * runtest frameworks-net -c com.android.server.connectivity.DnsManagerTest
59 */
60@RunWith(AndroidJUnit4.class)
61@SmallTest
62public class DnsManagerTest {
Chalard Jeanf0f364f2018-04-11 18:58:52 +090063 static final String TEST_IFACENAME = "test_wlan0";
dalyk1fcb7392018-03-05 12:42:22 -050064 static final int TEST_NETID = 100;
65 static final int TEST_NETID_ALTERNATE = 101;
66 static final int TEST_NETID_UNTRACKED = 102;
67 final boolean IS_DEFAULT = true;
68 final boolean NOT_DEFAULT = false;
69
70 DnsManager mDnsManager;
71 MockContentResolver mContentResolver;
72
73 @Mock Context mCtx;
74 @Mock INetworkManagementService mNMService;
75 @Mock MockableSystemProperties mSystemProperties;
76
77 @Before
78 public void setUp() throws Exception {
79 MockitoAnnotations.initMocks(this);
80 mContentResolver = new MockContentResolver();
81 mContentResolver.addProvider(Settings.AUTHORITY,
82 new FakeSettingsProvider());
83 when(mCtx.getContentResolver()).thenReturn(mContentResolver);
84 mDnsManager = new DnsManager(mCtx, mNMService, mSystemProperties);
85
86 // Clear the private DNS settings
87 Settings.Global.putString(mContentResolver,
88 Settings.Global.PRIVATE_DNS_MODE, "");
89 Settings.Global.putString(mContentResolver,
90 Settings.Global.PRIVATE_DNS_SPECIFIER, "");
91 }
92
93 @Test
94 public void testTrackedValidationUpdates() throws Exception {
95 mDnsManager.updatePrivateDns(new Network(TEST_NETID),
96 mDnsManager.getPrivateDnsConfig());
97 mDnsManager.updatePrivateDns(new Network(TEST_NETID_ALTERNATE),
98 mDnsManager.getPrivateDnsConfig());
99 LinkProperties lp = new LinkProperties();
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900100 lp.setInterfaceName(TEST_IFACENAME);
dalyk1fcb7392018-03-05 12:42:22 -0500101 lp.addDnsServer(InetAddress.getByName("3.3.3.3"));
102 lp.addDnsServer(InetAddress.getByName("4.4.4.4"));
103
104 // Send a validation event that is tracked on the alternate netId
105 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
106 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID_ALTERNATE, lp, NOT_DEFAULT);
107 mDnsManager.updatePrivateDnsValidation(
108 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_ALTERNATE,
109 InetAddress.parseNumericAddress("4.4.4.4"), "", true));
110 LinkProperties fixedLp = new LinkProperties(lp);
111 mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
112 assertFalse(fixedLp.isPrivateDnsActive());
113 assertNull(fixedLp.getPrivateDnsServerName());
114 fixedLp = new LinkProperties(lp);
115 mDnsManager.updatePrivateDnsStatus(TEST_NETID_ALTERNATE, fixedLp);
116 assertTrue(fixedLp.isPrivateDnsActive());
117 assertNull(fixedLp.getPrivateDnsServerName());
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900118 assertEquals(Arrays.asList(InetAddress.getByName("4.4.4.4")),
119 fixedLp.getValidatedPrivateDnsServers());
dalyk1fcb7392018-03-05 12:42:22 -0500120
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900121 // Set up addresses for strict mode and switch to it.
122 lp.addLinkAddress(new LinkAddress("192.0.2.4/24"));
123 lp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"),
124 TEST_IFACENAME));
125 lp.addLinkAddress(new LinkAddress("2001:db8:1::1/64"));
126 lp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"),
127 TEST_IFACENAME));
128
dalyk1fcb7392018-03-05 12:42:22 -0500129 Settings.Global.putString(mContentResolver,
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900130 Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
dalyk1fcb7392018-03-05 12:42:22 -0500131 Settings.Global.putString(mContentResolver,
132 Settings.Global.PRIVATE_DNS_SPECIFIER, "strictmode.com");
133 mDnsManager.updatePrivateDns(new Network(TEST_NETID),
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900134 new DnsManager.PrivateDnsConfig("strictmode.com", new InetAddress[] {
135 InetAddress.parseNumericAddress("6.6.6.6"),
136 InetAddress.parseNumericAddress("2001:db8:66:66::1")
137 }));
dalyk1fcb7392018-03-05 12:42:22 -0500138 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
139 fixedLp = new LinkProperties(lp);
140 mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
141 assertTrue(fixedLp.isPrivateDnsActive());
142 assertEquals("strictmode.com", fixedLp.getPrivateDnsServerName());
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900143 // No validation events yet.
144 assertEquals(Arrays.asList(new InetAddress[0]), fixedLp.getValidatedPrivateDnsServers());
145 // Validate one.
146 mDnsManager.updatePrivateDnsValidation(
147 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
148 InetAddress.parseNumericAddress("6.6.6.6"), "strictmode.com", true));
dalyk1fcb7392018-03-05 12:42:22 -0500149 fixedLp = new LinkProperties(lp);
Chalard Jeanf0f364f2018-04-11 18:58:52 +0900150 mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
151 assertEquals(Arrays.asList(InetAddress.parseNumericAddress("6.6.6.6")),
152 fixedLp.getValidatedPrivateDnsServers());
153 // Validate the 2nd one.
154 mDnsManager.updatePrivateDnsValidation(
155 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
156 InetAddress.parseNumericAddress("2001:db8:66:66::1"), "strictmode.com", true));
157 fixedLp = new LinkProperties(lp);
158 mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
159 assertEquals(Arrays.asList(
160 InetAddress.parseNumericAddress("2001:db8:66:66::1"),
161 InetAddress.parseNumericAddress("6.6.6.6")),
162 fixedLp.getValidatedPrivateDnsServers());
dalyk1fcb7392018-03-05 12:42:22 -0500163 }
164
165 @Test
166 public void testIgnoreUntrackedValidationUpdates() throws Exception {
167 // The PrivateDnsConfig map is empty, so no validation events will
168 // be tracked.
169 LinkProperties lp = new LinkProperties();
170 lp.addDnsServer(InetAddress.getByName("3.3.3.3"));
171 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
172 mDnsManager.updatePrivateDnsValidation(
173 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
174 InetAddress.parseNumericAddress("3.3.3.3"), "", true));
175 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
176 assertFalse(lp.isPrivateDnsActive());
177 assertNull(lp.getPrivateDnsServerName());
178
179 // Validation event has untracked netId
180 mDnsManager.updatePrivateDns(new Network(TEST_NETID),
181 mDnsManager.getPrivateDnsConfig());
182 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
183 mDnsManager.updatePrivateDnsValidation(
184 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_UNTRACKED,
185 InetAddress.parseNumericAddress("3.3.3.3"), "", true));
186 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
187 assertFalse(lp.isPrivateDnsActive());
188 assertNull(lp.getPrivateDnsServerName());
189
190 // Validation event has untracked ipAddress
191 mDnsManager.updatePrivateDnsValidation(
192 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
193 InetAddress.parseNumericAddress("4.4.4.4"), "", true));
194 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
195 assertFalse(lp.isPrivateDnsActive());
196 assertNull(lp.getPrivateDnsServerName());
197
198 // Validation event has untracked hostname
199 mDnsManager.updatePrivateDnsValidation(
200 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
201 InetAddress.parseNumericAddress("3.3.3.3"), "hostname",
202 true));
203 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
204 assertFalse(lp.isPrivateDnsActive());
205 assertNull(lp.getPrivateDnsServerName());
206
207 // Validation event failed
208 mDnsManager.updatePrivateDnsValidation(
209 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
210 InetAddress.parseNumericAddress("3.3.3.3"), "", false));
211 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
212 assertFalse(lp.isPrivateDnsActive());
213 assertNull(lp.getPrivateDnsServerName());
214
215 // Network removed
216 mDnsManager.removeNetwork(new Network(TEST_NETID));
217 mDnsManager.updatePrivateDnsValidation(
218 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
219 InetAddress.parseNumericAddress("3.3.3.3"), "", true));
220 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
221 assertFalse(lp.isPrivateDnsActive());
222 assertNull(lp.getPrivateDnsServerName());
223
224 // Turn private DNS mode off
225 Settings.Global.putString(mContentResolver,
226 Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF);
227 mDnsManager.updatePrivateDns(new Network(TEST_NETID),
228 mDnsManager.getPrivateDnsConfig());
229 mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
230 mDnsManager.updatePrivateDnsValidation(
231 new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
232 InetAddress.parseNumericAddress("3.3.3.3"), "", true));
233 mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
234 assertFalse(lp.isPrivateDnsActive());
235 assertNull(lp.getPrivateDnsServerName());
236 }
237}