blob: 03a9a800996e6c33dc7feaf119c26d8ceae9d786 [file] [log] [blame]
Cody Kestingbeb41b52019-12-17 08:51:32 -08001/*
2 * Copyright (C) 2020 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
Cody Kesting3e7fb382019-12-17 16:46:11 -080019import static android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsBinder;
20import static android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback;
Cody Kestingbeb41b52019-12-17 08:51:32 -080021import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport;
Cody Kesting3d97b5e2019-12-17 09:28:06 -080022import static android.net.ConnectivityDiagnosticsManager.DataStallReport;
Cody Kestingbeb41b52019-12-17 08:51:32 -080023
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +090024import static com.android.testutils.ParcelUtils.assertParcelingIsLossless;
Cody Kestingbeb41b52019-12-17 08:51:32 -080025
26import static org.junit.Assert.assertEquals;
27import static org.junit.Assert.assertFalse;
28import static org.junit.Assert.assertNotEquals;
29import static org.junit.Assert.assertTrue;
Cody Kesting73708bf2019-12-18 10:57:50 -080030import static org.junit.Assert.fail;
31import static org.mockito.ArgumentMatchers.any;
Cody Kesting3e7fb382019-12-17 16:46:11 -080032import static org.mockito.ArgumentMatchers.eq;
33import static org.mockito.Mockito.mock;
Cody Kesting73708bf2019-12-18 10:57:50 -080034import static org.mockito.Mockito.times;
Cody Kesting3e7fb382019-12-17 16:46:11 -080035import static org.mockito.Mockito.verify;
Cody Kesting73708bf2019-12-18 10:57:50 -080036import static org.mockito.Mockito.verifyNoMoreInteractions;
Cody Kestingbeb41b52019-12-17 08:51:32 -080037
Cody Kesting73708bf2019-12-18 10:57:50 -080038import android.content.Context;
Remi NGUYEN VAN7e23f182021-06-21 19:33:28 +090039import android.os.Build;
Cody Kestingbeb41b52019-12-17 08:51:32 -080040import android.os.PersistableBundle;
41
Cody Kesting83bb5fa2020-01-05 14:06:39 -080042import androidx.test.InstrumentationRegistry;
Remi NGUYEN VAN7e23f182021-06-21 19:33:28 +090043import androidx.test.filters.SdkSuppress;
Cody Kesting83bb5fa2020-01-05 14:06:39 -080044
Cody Kesting73708bf2019-12-18 10:57:50 -080045import org.junit.After;
Cody Kesting3e7fb382019-12-17 16:46:11 -080046import org.junit.Before;
Cody Kestingbeb41b52019-12-17 08:51:32 -080047import org.junit.Test;
48import org.junit.runner.RunWith;
49import org.junit.runners.JUnit4;
Cody Kesting3e7fb382019-12-17 16:46:11 -080050import org.mockito.Mock;
51
52import java.util.concurrent.Executor;
Cody Kestingbeb41b52019-12-17 08:51:32 -080053
54@RunWith(JUnit4.class)
Remi NGUYEN VAN7e23f182021-06-21 19:33:28 +090055@SdkSuppress(minSdkVersion = Build.VERSION_CODES.S, codeName = "S")
Cody Kestingbeb41b52019-12-17 08:51:32 -080056public class ConnectivityDiagnosticsManagerTest {
57 private static final int NET_ID = 1;
Cody Kesting3d97b5e2019-12-17 09:28:06 -080058 private static final int DETECTION_METHOD = 2;
Cody Kestingbeb41b52019-12-17 08:51:32 -080059 private static final long TIMESTAMP = 10L;
60 private static final String INTERFACE_NAME = "interface";
61 private static final String BUNDLE_KEY = "key";
62 private static final String BUNDLE_VALUE = "value";
63
Cody Kesting3e7fb382019-12-17 16:46:11 -080064 private static final Executor INLINE_EXECUTOR = x -> x.run();
65
Cody Kesting73708bf2019-12-18 10:57:50 -080066 @Mock private IConnectivityManager mService;
Cody Kesting3e7fb382019-12-17 16:46:11 -080067 @Mock private ConnectivityDiagnosticsCallback mCb;
68
Cody Kesting83bb5fa2020-01-05 14:06:39 -080069 private Context mContext;
Cody Kesting3e7fb382019-12-17 16:46:11 -080070 private ConnectivityDiagnosticsBinder mBinder;
Cody Kesting73708bf2019-12-18 10:57:50 -080071 private ConnectivityDiagnosticsManager mManager;
Cody Kesting3e7fb382019-12-17 16:46:11 -080072
Cody Kesting83bb5fa2020-01-05 14:06:39 -080073 private String mPackageName;
74
Cody Kesting3e7fb382019-12-17 16:46:11 -080075 @Before
76 public void setUp() {
Cody Kesting83bb5fa2020-01-05 14:06:39 -080077 mContext = InstrumentationRegistry.getContext();
78
Cody Kesting73708bf2019-12-18 10:57:50 -080079 mService = mock(IConnectivityManager.class);
Cody Kesting3e7fb382019-12-17 16:46:11 -080080 mCb = mock(ConnectivityDiagnosticsCallback.class);
81
82 mBinder = new ConnectivityDiagnosticsBinder(mCb, INLINE_EXECUTOR);
Cody Kesting73708bf2019-12-18 10:57:50 -080083 mManager = new ConnectivityDiagnosticsManager(mContext, mService);
Cody Kesting83bb5fa2020-01-05 14:06:39 -080084
85 mPackageName = mContext.getOpPackageName();
Cody Kesting73708bf2019-12-18 10:57:50 -080086 }
87
88 @After
89 public void tearDown() {
90 // clear ConnectivityDiagnosticsManager callbacks map
91 ConnectivityDiagnosticsManager.sCallbacks.clear();
Cody Kesting3e7fb382019-12-17 16:46:11 -080092 }
93
Cody Kestingbeb41b52019-12-17 08:51:32 -080094 private ConnectivityReport createSampleConnectivityReport() {
95 final LinkProperties linkProperties = new LinkProperties();
96 linkProperties.setInterfaceName(INTERFACE_NAME);
97
98 final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
99 networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
100
101 final PersistableBundle bundle = new PersistableBundle();
102 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
103
104 return new ConnectivityReport(
105 new Network(NET_ID), TIMESTAMP, linkProperties, networkCapabilities, bundle);
106 }
107
108 private ConnectivityReport createDefaultConnectivityReport() {
109 return new ConnectivityReport(
110 new Network(0),
111 0L,
112 new LinkProperties(),
113 new NetworkCapabilities(),
114 PersistableBundle.EMPTY);
115 }
116
117 @Test
118 public void testPersistableBundleEquals() {
119 assertFalse(
120 ConnectivityDiagnosticsManager.persistableBundleEquals(
121 null, PersistableBundle.EMPTY));
122 assertFalse(
123 ConnectivityDiagnosticsManager.persistableBundleEquals(
124 PersistableBundle.EMPTY, null));
125 assertTrue(
126 ConnectivityDiagnosticsManager.persistableBundleEquals(
127 PersistableBundle.EMPTY, PersistableBundle.EMPTY));
128
129 final PersistableBundle a = new PersistableBundle();
130 a.putString(BUNDLE_KEY, BUNDLE_VALUE);
131
132 final PersistableBundle b = new PersistableBundle();
133 b.putString(BUNDLE_KEY, BUNDLE_VALUE);
134
135 final PersistableBundle c = new PersistableBundle();
136 c.putString(BUNDLE_KEY, null);
137
138 assertFalse(
139 ConnectivityDiagnosticsManager.persistableBundleEquals(PersistableBundle.EMPTY, a));
140 assertFalse(
141 ConnectivityDiagnosticsManager.persistableBundleEquals(a, PersistableBundle.EMPTY));
142
143 assertTrue(ConnectivityDiagnosticsManager.persistableBundleEquals(a, b));
144 assertTrue(ConnectivityDiagnosticsManager.persistableBundleEquals(b, a));
145
146 assertFalse(ConnectivityDiagnosticsManager.persistableBundleEquals(a, c));
147 assertFalse(ConnectivityDiagnosticsManager.persistableBundleEquals(c, a));
148 }
149
150 @Test
151 public void testConnectivityReportEquals() {
Cody Kestingf2852482020-02-04 21:52:09 -0800152 final ConnectivityReport defaultReport = createDefaultConnectivityReport();
153 final ConnectivityReport sampleReport = createSampleConnectivityReport();
154 assertEquals(sampleReport, createSampleConnectivityReport());
155 assertEquals(defaultReport, createDefaultConnectivityReport());
Cody Kestingbeb41b52019-12-17 08:51:32 -0800156
Cody Kestingf2852482020-02-04 21:52:09 -0800157 final LinkProperties linkProperties = sampleReport.getLinkProperties();
158 final NetworkCapabilities networkCapabilities = sampleReport.getNetworkCapabilities();
159 final PersistableBundle bundle = sampleReport.getAdditionalInfo();
Cody Kestingbeb41b52019-12-17 08:51:32 -0800160
161 assertNotEquals(
162 createDefaultConnectivityReport(),
163 new ConnectivityReport(
164 new Network(NET_ID),
165 0L,
166 new LinkProperties(),
167 new NetworkCapabilities(),
168 PersistableBundle.EMPTY));
169 assertNotEquals(
170 createDefaultConnectivityReport(),
171 new ConnectivityReport(
172 new Network(0),
173 TIMESTAMP,
174 new LinkProperties(),
175 new NetworkCapabilities(),
176 PersistableBundle.EMPTY));
177 assertNotEquals(
178 createDefaultConnectivityReport(),
179 new ConnectivityReport(
180 new Network(0),
181 0L,
182 linkProperties,
183 new NetworkCapabilities(),
184 PersistableBundle.EMPTY));
185 assertNotEquals(
186 createDefaultConnectivityReport(),
187 new ConnectivityReport(
188 new Network(0),
189 TIMESTAMP,
190 new LinkProperties(),
191 networkCapabilities,
192 PersistableBundle.EMPTY));
193 assertNotEquals(
194 createDefaultConnectivityReport(),
195 new ConnectivityReport(
196 new Network(0),
197 TIMESTAMP,
198 new LinkProperties(),
199 new NetworkCapabilities(),
200 bundle));
201 }
202
203 @Test
204 public void testConnectivityReportParcelUnparcel() {
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +0900205 assertParcelingIsLossless(createSampleConnectivityReport());
Cody Kestingbeb41b52019-12-17 08:51:32 -0800206 }
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800207
208 private DataStallReport createSampleDataStallReport() {
Cody Kestingf2852482020-02-04 21:52:09 -0800209 final LinkProperties linkProperties = new LinkProperties();
210 linkProperties.setInterfaceName(INTERFACE_NAME);
211
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800212 final PersistableBundle bundle = new PersistableBundle();
213 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
Cody Kestingf2852482020-02-04 21:52:09 -0800214
215 final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
216 networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
217
218 return new DataStallReport(
219 new Network(NET_ID),
220 TIMESTAMP,
221 DETECTION_METHOD,
222 linkProperties,
223 networkCapabilities,
224 bundle);
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800225 }
226
227 private DataStallReport createDefaultDataStallReport() {
Cody Kestingf2852482020-02-04 21:52:09 -0800228 return new DataStallReport(
229 new Network(0),
230 0L,
231 0,
232 new LinkProperties(),
233 new NetworkCapabilities(),
234 PersistableBundle.EMPTY);
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800235 }
236
237 @Test
238 public void testDataStallReportEquals() {
Cody Kestingf2852482020-02-04 21:52:09 -0800239 final DataStallReport defaultReport = createDefaultDataStallReport();
240 final DataStallReport sampleReport = createSampleDataStallReport();
241 assertEquals(sampleReport, createSampleDataStallReport());
242 assertEquals(defaultReport, createDefaultDataStallReport());
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800243
Cody Kestingf2852482020-02-04 21:52:09 -0800244 final LinkProperties linkProperties = sampleReport.getLinkProperties();
245 final NetworkCapabilities networkCapabilities = sampleReport.getNetworkCapabilities();
246 final PersistableBundle bundle = sampleReport.getStallDetails();
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800247
248 assertNotEquals(
Cody Kestingf2852482020-02-04 21:52:09 -0800249 defaultReport,
250 new DataStallReport(
251 new Network(NET_ID),
252 0L,
253 0,
254 new LinkProperties(),
255 new NetworkCapabilities(),
256 PersistableBundle.EMPTY));
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800257 assertNotEquals(
Cody Kestingf2852482020-02-04 21:52:09 -0800258 defaultReport,
259 new DataStallReport(
260 new Network(0),
261 TIMESTAMP,
262 0,
263 new LinkProperties(),
264 new NetworkCapabilities(),
265 PersistableBundle.EMPTY));
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800266 assertNotEquals(
Cody Kestingf2852482020-02-04 21:52:09 -0800267 defaultReport,
268 new DataStallReport(
269 new Network(0),
270 0L,
271 DETECTION_METHOD,
272 new LinkProperties(),
273 new NetworkCapabilities(),
274 PersistableBundle.EMPTY));
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800275 assertNotEquals(
Cody Kestingf2852482020-02-04 21:52:09 -0800276 defaultReport,
277 new DataStallReport(
278 new Network(0),
279 0L,
280 0,
281 linkProperties,
282 new NetworkCapabilities(),
283 PersistableBundle.EMPTY));
284 assertNotEquals(
285 defaultReport,
286 new DataStallReport(
287 new Network(0),
288 0L,
289 0,
290 new LinkProperties(),
291 networkCapabilities,
292 PersistableBundle.EMPTY));
293 assertNotEquals(
294 defaultReport,
295 new DataStallReport(
296 new Network(0),
297 0L,
298 0,
299 new LinkProperties(),
300 new NetworkCapabilities(),
301 bundle));
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800302 }
303
304 @Test
305 public void testDataStallReportParcelUnparcel() {
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +0900306 assertParcelingIsLossless(createSampleDataStallReport());
Cody Kesting3d97b5e2019-12-17 09:28:06 -0800307 }
Cody Kesting3e7fb382019-12-17 16:46:11 -0800308
309 @Test
Cody Kestingfa1ef5e2020-03-05 15:19:48 -0800310 public void testConnectivityDiagnosticsCallbackOnConnectivityReportAvailable() {
311 mBinder.onConnectivityReportAvailable(createSampleConnectivityReport());
Cody Kesting3e7fb382019-12-17 16:46:11 -0800312
313 // The callback will be invoked synchronously by inline executor. Immediately check the
314 // latch without waiting.
Cody Kestingfa1ef5e2020-03-05 15:19:48 -0800315 verify(mCb).onConnectivityReportAvailable(eq(createSampleConnectivityReport()));
Cody Kesting3e7fb382019-12-17 16:46:11 -0800316 }
317
318 @Test
319 public void testConnectivityDiagnosticsCallbackOnDataStallSuspected() {
320 mBinder.onDataStallSuspected(createSampleDataStallReport());
321
322 // The callback will be invoked synchronously by inline executor. Immediately check the
323 // latch without waiting.
324 verify(mCb).onDataStallSuspected(eq(createSampleDataStallReport()));
325 }
326
327 @Test
328 public void testConnectivityDiagnosticsCallbackOnNetworkConnectivityReported() {
329 final Network n = new Network(NET_ID);
330 final boolean connectivity = true;
331
332 mBinder.onNetworkConnectivityReported(n, connectivity);
333
334 // The callback will be invoked synchronously by inline executor. Immediately check the
335 // latch without waiting.
336 verify(mCb).onNetworkConnectivityReported(eq(n), eq(connectivity));
337 }
Cody Kesting73708bf2019-12-18 10:57:50 -0800338
339 @Test
340 public void testRegisterConnectivityDiagnosticsCallback() throws Exception {
341 final NetworkRequest request = new NetworkRequest.Builder().build();
342
343 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
344
345 verify(mService).registerConnectivityDiagnosticsCallback(
Cody Kesting83bb5fa2020-01-05 14:06:39 -0800346 any(ConnectivityDiagnosticsBinder.class), eq(request), eq(mPackageName));
Cody Kesting73708bf2019-12-18 10:57:50 -0800347 assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
348 }
349
350 @Test
351 public void testRegisterDuplicateConnectivityDiagnosticsCallback() throws Exception {
352 final NetworkRequest request = new NetworkRequest.Builder().build();
353
354 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
355
356 try {
357 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
358 fail("Duplicate callback registration should fail");
359 } catch (IllegalArgumentException expected) {
360 }
361 }
362
363 @Test
364 public void testUnregisterConnectivityDiagnosticsCallback() throws Exception {
365 final NetworkRequest request = new NetworkRequest.Builder().build();
366 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
367
368 mManager.unregisterConnectivityDiagnosticsCallback(mCb);
369
370 verify(mService).unregisterConnectivityDiagnosticsCallback(
371 any(ConnectivityDiagnosticsBinder.class));
372 assertFalse(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
373
374 // verify that re-registering is successful
375 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
376 verify(mService, times(2)).registerConnectivityDiagnosticsCallback(
Cody Kesting83bb5fa2020-01-05 14:06:39 -0800377 any(ConnectivityDiagnosticsBinder.class), eq(request), eq(mPackageName));
Cody Kesting73708bf2019-12-18 10:57:50 -0800378 assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
379 }
380
381 @Test
382 public void testUnregisterUnknownConnectivityDiagnosticsCallback() throws Exception {
383 mManager.unregisterConnectivityDiagnosticsCallback(mCb);
384
385 verifyNoMoreInteractions(mService);
386 }
Cody Kestingbeb41b52019-12-17 08:51:32 -0800387}