blob: 2d5df4f47e002de98ed1e037f189bc38c85d47be [file] [log] [blame]
Cody Kesting73328662019-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 Kesting8a5f7c92019-12-17 16:46:11 -080019import static android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsBinder;
20import static android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback;
Cody Kesting73328662019-12-17 08:51:32 -080021import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport;
Cody Kestingfc199ca2019-12-17 09:28:06 -080022import static android.net.ConnectivityDiagnosticsManager.DataStallReport;
Cody Kesting73328662019-12-17 08:51:32 -080023
24import static com.android.testutils.ParcelUtilsKt.assertParcelSane;
25
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 Kesting63e4e002019-12-18 10:57:50 -080030import static org.junit.Assert.fail;
31import static org.mockito.ArgumentMatchers.any;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080032import static org.mockito.ArgumentMatchers.eq;
33import static org.mockito.Mockito.mock;
Cody Kesting63e4e002019-12-18 10:57:50 -080034import static org.mockito.Mockito.times;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080035import static org.mockito.Mockito.verify;
Cody Kesting63e4e002019-12-18 10:57:50 -080036import static org.mockito.Mockito.verifyNoMoreInteractions;
Cody Kesting73328662019-12-17 08:51:32 -080037
Cody Kesting63e4e002019-12-18 10:57:50 -080038import android.content.Context;
Cody Kesting73328662019-12-17 08:51:32 -080039import android.os.PersistableBundle;
40
Cody Kesting63e4e002019-12-18 10:57:50 -080041import org.junit.After;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080042import org.junit.Before;
Cody Kesting73328662019-12-17 08:51:32 -080043import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.junit.runners.JUnit4;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080046import org.mockito.Mock;
47
48import java.util.concurrent.Executor;
Cody Kesting73328662019-12-17 08:51:32 -080049
50@RunWith(JUnit4.class)
51public class ConnectivityDiagnosticsManagerTest {
52 private static final int NET_ID = 1;
Cody Kestingfc199ca2019-12-17 09:28:06 -080053 private static final int DETECTION_METHOD = 2;
Cody Kesting73328662019-12-17 08:51:32 -080054 private static final long TIMESTAMP = 10L;
55 private static final String INTERFACE_NAME = "interface";
56 private static final String BUNDLE_KEY = "key";
57 private static final String BUNDLE_VALUE = "value";
58
Cody Kesting8a5f7c92019-12-17 16:46:11 -080059 private static final Executor INLINE_EXECUTOR = x -> x.run();
60
Cody Kesting63e4e002019-12-18 10:57:50 -080061 @Mock private Context mContext;
62 @Mock private IConnectivityManager mService;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080063 @Mock private ConnectivityDiagnosticsCallback mCb;
64
65 private ConnectivityDiagnosticsBinder mBinder;
Cody Kesting63e4e002019-12-18 10:57:50 -080066 private ConnectivityDiagnosticsManager mManager;
Cody Kesting8a5f7c92019-12-17 16:46:11 -080067
68 @Before
69 public void setUp() {
Cody Kesting63e4e002019-12-18 10:57:50 -080070 mContext = mock(Context.class);
71 mService = mock(IConnectivityManager.class);
Cody Kesting8a5f7c92019-12-17 16:46:11 -080072 mCb = mock(ConnectivityDiagnosticsCallback.class);
73
74 mBinder = new ConnectivityDiagnosticsBinder(mCb, INLINE_EXECUTOR);
Cody Kesting63e4e002019-12-18 10:57:50 -080075 mManager = new ConnectivityDiagnosticsManager(mContext, mService);
76 }
77
78 @After
79 public void tearDown() {
80 // clear ConnectivityDiagnosticsManager callbacks map
81 ConnectivityDiagnosticsManager.sCallbacks.clear();
Cody Kesting8a5f7c92019-12-17 16:46:11 -080082 }
83
Cody Kesting73328662019-12-17 08:51:32 -080084 private ConnectivityReport createSampleConnectivityReport() {
85 final LinkProperties linkProperties = new LinkProperties();
86 linkProperties.setInterfaceName(INTERFACE_NAME);
87
88 final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
89 networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
90
91 final PersistableBundle bundle = new PersistableBundle();
92 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
93
94 return new ConnectivityReport(
95 new Network(NET_ID), TIMESTAMP, linkProperties, networkCapabilities, bundle);
96 }
97
98 private ConnectivityReport createDefaultConnectivityReport() {
99 return new ConnectivityReport(
100 new Network(0),
101 0L,
102 new LinkProperties(),
103 new NetworkCapabilities(),
104 PersistableBundle.EMPTY);
105 }
106
107 @Test
108 public void testPersistableBundleEquals() {
109 assertFalse(
110 ConnectivityDiagnosticsManager.persistableBundleEquals(
111 null, PersistableBundle.EMPTY));
112 assertFalse(
113 ConnectivityDiagnosticsManager.persistableBundleEquals(
114 PersistableBundle.EMPTY, null));
115 assertTrue(
116 ConnectivityDiagnosticsManager.persistableBundleEquals(
117 PersistableBundle.EMPTY, PersistableBundle.EMPTY));
118
119 final PersistableBundle a = new PersistableBundle();
120 a.putString(BUNDLE_KEY, BUNDLE_VALUE);
121
122 final PersistableBundle b = new PersistableBundle();
123 b.putString(BUNDLE_KEY, BUNDLE_VALUE);
124
125 final PersistableBundle c = new PersistableBundle();
126 c.putString(BUNDLE_KEY, null);
127
128 assertFalse(
129 ConnectivityDiagnosticsManager.persistableBundleEquals(PersistableBundle.EMPTY, a));
130 assertFalse(
131 ConnectivityDiagnosticsManager.persistableBundleEquals(a, PersistableBundle.EMPTY));
132
133 assertTrue(ConnectivityDiagnosticsManager.persistableBundleEquals(a, b));
134 assertTrue(ConnectivityDiagnosticsManager.persistableBundleEquals(b, a));
135
136 assertFalse(ConnectivityDiagnosticsManager.persistableBundleEquals(a, c));
137 assertFalse(ConnectivityDiagnosticsManager.persistableBundleEquals(c, a));
138 }
139
140 @Test
141 public void testConnectivityReportEquals() {
142 assertEquals(createSampleConnectivityReport(), createSampleConnectivityReport());
143 assertEquals(createDefaultConnectivityReport(), createDefaultConnectivityReport());
144
145 final LinkProperties linkProperties = new LinkProperties();
146 linkProperties.setInterfaceName(INTERFACE_NAME);
147
148 final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
149 networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
150
151 final PersistableBundle bundle = new PersistableBundle();
152 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
153
154 assertNotEquals(
155 createDefaultConnectivityReport(),
156 new ConnectivityReport(
157 new Network(NET_ID),
158 0L,
159 new LinkProperties(),
160 new NetworkCapabilities(),
161 PersistableBundle.EMPTY));
162 assertNotEquals(
163 createDefaultConnectivityReport(),
164 new ConnectivityReport(
165 new Network(0),
166 TIMESTAMP,
167 new LinkProperties(),
168 new NetworkCapabilities(),
169 PersistableBundle.EMPTY));
170 assertNotEquals(
171 createDefaultConnectivityReport(),
172 new ConnectivityReport(
173 new Network(0),
174 0L,
175 linkProperties,
176 new NetworkCapabilities(),
177 PersistableBundle.EMPTY));
178 assertNotEquals(
179 createDefaultConnectivityReport(),
180 new ConnectivityReport(
181 new Network(0),
182 TIMESTAMP,
183 new LinkProperties(),
184 networkCapabilities,
185 PersistableBundle.EMPTY));
186 assertNotEquals(
187 createDefaultConnectivityReport(),
188 new ConnectivityReport(
189 new Network(0),
190 TIMESTAMP,
191 new LinkProperties(),
192 new NetworkCapabilities(),
193 bundle));
194 }
195
196 @Test
197 public void testConnectivityReportParcelUnparcel() {
198 assertParcelSane(createSampleConnectivityReport(), 5);
199 }
Cody Kestingfc199ca2019-12-17 09:28:06 -0800200
201 private DataStallReport createSampleDataStallReport() {
202 final PersistableBundle bundle = new PersistableBundle();
203 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
204 return new DataStallReport(new Network(NET_ID), TIMESTAMP, DETECTION_METHOD, bundle);
205 }
206
207 private DataStallReport createDefaultDataStallReport() {
208 return new DataStallReport(new Network(0), 0L, 0, PersistableBundle.EMPTY);
209 }
210
211 @Test
212 public void testDataStallReportEquals() {
213 assertEquals(createSampleDataStallReport(), createSampleDataStallReport());
214 assertEquals(createDefaultDataStallReport(), createDefaultDataStallReport());
215
216 final PersistableBundle bundle = new PersistableBundle();
217 bundle.putString(BUNDLE_KEY, BUNDLE_VALUE);
218
219 assertNotEquals(
220 createDefaultDataStallReport(),
221 new DataStallReport(new Network(NET_ID), 0L, 0, PersistableBundle.EMPTY));
222 assertNotEquals(
223 createDefaultDataStallReport(),
224 new DataStallReport(new Network(0), TIMESTAMP, 0, PersistableBundle.EMPTY));
225 assertNotEquals(
226 createDefaultDataStallReport(),
227 new DataStallReport(new Network(0), 0L, DETECTION_METHOD, PersistableBundle.EMPTY));
228 assertNotEquals(
229 createDefaultDataStallReport(), new DataStallReport(new Network(0), 0L, 0, bundle));
230 }
231
232 @Test
233 public void testDataStallReportParcelUnparcel() {
234 assertParcelSane(createSampleDataStallReport(), 4);
235 }
Cody Kesting8a5f7c92019-12-17 16:46:11 -0800236
237 @Test
238 public void testConnectivityDiagnosticsCallbackOnConnectivityReport() {
239 mBinder.onConnectivityReport(createSampleConnectivityReport());
240
241 // The callback will be invoked synchronously by inline executor. Immediately check the
242 // latch without waiting.
243 verify(mCb).onConnectivityReport(eq(createSampleConnectivityReport()));
244 }
245
246 @Test
247 public void testConnectivityDiagnosticsCallbackOnDataStallSuspected() {
248 mBinder.onDataStallSuspected(createSampleDataStallReport());
249
250 // The callback will be invoked synchronously by inline executor. Immediately check the
251 // latch without waiting.
252 verify(mCb).onDataStallSuspected(eq(createSampleDataStallReport()));
253 }
254
255 @Test
256 public void testConnectivityDiagnosticsCallbackOnNetworkConnectivityReported() {
257 final Network n = new Network(NET_ID);
258 final boolean connectivity = true;
259
260 mBinder.onNetworkConnectivityReported(n, connectivity);
261
262 // The callback will be invoked synchronously by inline executor. Immediately check the
263 // latch without waiting.
264 verify(mCb).onNetworkConnectivityReported(eq(n), eq(connectivity));
265 }
Cody Kesting63e4e002019-12-18 10:57:50 -0800266
267 @Test
268 public void testRegisterConnectivityDiagnosticsCallback() throws Exception {
269 final NetworkRequest request = new NetworkRequest.Builder().build();
270
271 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
272
273 verify(mService).registerConnectivityDiagnosticsCallback(
274 any(ConnectivityDiagnosticsBinder.class), eq(request));
275 assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
276 }
277
278 @Test
279 public void testRegisterDuplicateConnectivityDiagnosticsCallback() throws Exception {
280 final NetworkRequest request = new NetworkRequest.Builder().build();
281
282 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
283
284 try {
285 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
286 fail("Duplicate callback registration should fail");
287 } catch (IllegalArgumentException expected) {
288 }
289 }
290
291 @Test
292 public void testUnregisterConnectivityDiagnosticsCallback() throws Exception {
293 final NetworkRequest request = new NetworkRequest.Builder().build();
294 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
295
296 mManager.unregisterConnectivityDiagnosticsCallback(mCb);
297
298 verify(mService).unregisterConnectivityDiagnosticsCallback(
299 any(ConnectivityDiagnosticsBinder.class));
300 assertFalse(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
301
302 // verify that re-registering is successful
303 mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
304 verify(mService, times(2)).registerConnectivityDiagnosticsCallback(
305 any(ConnectivityDiagnosticsBinder.class), eq(request));
306 assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
307 }
308
309 @Test
310 public void testUnregisterUnknownConnectivityDiagnosticsCallback() throws Exception {
311 mManager.unregisterConnectivityDiagnosticsCallback(mCb);
312
313 verifyNoMoreInteractions(mService);
314 }
Cody Kesting73328662019-12-17 08:51:32 -0800315}