blob: 00420e9e10050a2d347af5dc83d302f81b165792 [file] [log] [blame]
Erik Kline885a9092017-01-16 16:27:22 +09001/*
2 * Copyright (C) 2017 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.tethering;
18
Erik Klinedd8e8912017-01-18 16:08:06 +090019import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
20import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
Erik Kline885a9092017-01-16 16:27:22 +090021import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
22import static org.junit.Assert.assertEquals;
23import static org.junit.Assert.assertFalse;
24import static org.junit.Assert.assertTrue;
25import static org.mockito.Mockito.reset;
26
27import android.content.Context;
28import android.net.ConnectivityManager;
29import android.net.ConnectivityManager.NetworkCallback;
30import android.net.IConnectivityManager;
31import android.net.Network;
32import android.net.NetworkCapabilities;
33import android.net.NetworkRequest;
34
35import android.support.test.filters.SmallTest;
36import android.support.test.runner.AndroidJUnit4;
37
38import org.junit.Before;
39import org.junit.runner.RunWith;
40import org.junit.Test;
41import org.mockito.Mock;
42import org.mockito.MockitoAnnotations;
43
44import java.util.HashMap;
45import java.util.HashSet;
46import java.util.Map;
47import java.util.Set;
48
49
50@RunWith(AndroidJUnit4.class)
51@SmallTest
52public class UpstreamNetworkMonitorTest {
53 private static final int EVENT_UNM_UPDATE = 1;
54
55 @Mock private Context mContext;
56 @Mock private IConnectivityManager mCS;
57
58 private TestConnectivityManager mCM;
59 private UpstreamNetworkMonitor mUNM;
60
61 @Before public void setUp() throws Exception {
62 MockitoAnnotations.initMocks(this);
63 reset(mContext);
64 reset(mCS);
65
66 mCM = new TestConnectivityManager(mContext, mCS);
67 mUNM = new UpstreamNetworkMonitor(null, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
68 }
69
70 @Test
71 public void testDoesNothingBeforeStarted() {
72 UpstreamNetworkMonitor unm = new UpstreamNetworkMonitor(null, null, EVENT_UNM_UPDATE);
73 assertFalse(unm.mobileNetworkRequested());
74 // Given a null Context, and therefore a null ConnectivityManager,
75 // these would cause an exception, if they actually attempted anything.
76 unm.mobileUpstreamRequiresDun(true);
77 unm.mobileUpstreamRequiresDun(false);
78 }
79
80 @Test
81 public void testDefaultNetworkIsTracked() throws Exception {
82 assertEquals(0, mCM.trackingDefault.size());
83
84 mUNM.start();
85 assertEquals(1, mCM.trackingDefault.size());
86
87 mUNM.stop();
88 assertTrue(mCM.isEmpty());
89 }
90
91 @Test
92 public void testListensForDunNetworks() throws Exception {
93 assertTrue(mCM.listening.isEmpty());
94
95 mUNM.start();
96 assertFalse(mCM.listening.isEmpty());
97 assertTrue(mCM.isListeningForDun());
98
99 mUNM.stop();
100 assertTrue(mCM.isEmpty());
101 }
102
103 @Test
104 public void testCanRequestMobileNetwork() throws Exception {
105 assertFalse(mUNM.mobileNetworkRequested());
106 assertEquals(0, mCM.requested.size());
107
108 mUNM.start();
109 assertFalse(mUNM.mobileNetworkRequested());
110 assertEquals(0, mCM.requested.size());
111
112 mUNM.mobileUpstreamRequiresDun(false);
113 assertFalse(mUNM.mobileNetworkRequested());
114 assertEquals(0, mCM.requested.size());
115
116 mUNM.registerMobileNetworkRequest();
117 assertTrue(mUNM.mobileNetworkRequested());
118 assertEquals(1, mCM.requested.size());
Erik Klinedd8e8912017-01-18 16:08:06 +0900119 assertEquals(1, mCM.legacyTypeMap.size());
120 assertEquals(Integer.valueOf(TYPE_MOBILE_HIPRI),
121 mCM.legacyTypeMap.values().iterator().next());
Erik Kline885a9092017-01-16 16:27:22 +0900122 assertFalse(mCM.isDunRequested());
123
124 mUNM.stop();
125 assertFalse(mUNM.mobileNetworkRequested());
126 assertTrue(mCM.isEmpty());
127 }
128
129 @Test
130 public void testCanRequestDunNetwork() throws Exception {
131 assertFalse(mUNM.mobileNetworkRequested());
132 assertEquals(0, mCM.requested.size());
133
134 mUNM.start();
135 assertFalse(mUNM.mobileNetworkRequested());
136 assertEquals(0, mCM.requested.size());
137
138 mUNM.mobileUpstreamRequiresDun(true);
139 assertFalse(mUNM.mobileNetworkRequested());
140 assertEquals(0, mCM.requested.size());
141
142 mUNM.registerMobileNetworkRequest();
143 assertTrue(mUNM.mobileNetworkRequested());
144 assertEquals(1, mCM.requested.size());
Erik Klinedd8e8912017-01-18 16:08:06 +0900145 assertEquals(1, mCM.legacyTypeMap.size());
146 assertEquals(Integer.valueOf(TYPE_MOBILE_DUN),
147 mCM.legacyTypeMap.values().iterator().next());
Erik Kline885a9092017-01-16 16:27:22 +0900148 assertTrue(mCM.isDunRequested());
149
150 mUNM.stop();
151 assertFalse(mUNM.mobileNetworkRequested());
152 assertTrue(mCM.isEmpty());
153 }
154
155 private static class TestConnectivityManager extends ConnectivityManager {
156 public Set<NetworkCallback> trackingDefault = new HashSet<>();
157 public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>();
158 public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>();
Erik Klinedd8e8912017-01-18 16:08:06 +0900159 public Map<NetworkCallback, Integer> legacyTypeMap = new HashMap<>();
Erik Kline885a9092017-01-16 16:27:22 +0900160
161 public TestConnectivityManager(Context ctx, IConnectivityManager svc) {
162 super(ctx, svc);
163 }
164
165 boolean isEmpty() {
166 return trackingDefault.isEmpty() &&
167 listening.isEmpty() &&
Erik Klinedd8e8912017-01-18 16:08:06 +0900168 requested.isEmpty() &&
169 legacyTypeMap.isEmpty();
Erik Kline885a9092017-01-16 16:27:22 +0900170 }
171
172 boolean isListeningForDun() {
173 for (NetworkRequest req : listening.values()) {
174 if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
175 return true;
176 }
177 }
178 return false;
179 }
180
181 boolean isDunRequested() {
182 for (NetworkRequest req : requested.values()) {
183 if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
184 return true;
185 }
186 }
187 return false;
188 }
189
190 @Override
191 public void requestNetwork(NetworkRequest req, NetworkCallback cb) {
192 assertFalse(requested.containsKey(cb));
193 requested.put(cb, req);
194 }
195
196 @Override
Erik Klinedd8e8912017-01-18 16:08:06 +0900197 public void requestNetwork(NetworkRequest req, NetworkCallback cb,
198 int timeoutMs, int legacyType) {
199 assertFalse(requested.containsKey(cb));
200 requested.put(cb, req);
201 assertFalse(legacyTypeMap.containsKey(cb));
202 if (legacyType != ConnectivityManager.TYPE_NONE) {
203 legacyTypeMap.put(cb, legacyType);
204 }
205 }
206
207 @Override
Erik Kline885a9092017-01-16 16:27:22 +0900208 public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) {
209 assertFalse(listening.containsKey(cb));
210 listening.put(cb, req);
211 }
212
213 @Override
214 public void registerDefaultNetworkCallback(NetworkCallback cb) {
215 assertFalse(trackingDefault.contains(cb));
216 trackingDefault.add(cb);
217 }
218
219 @Override
220 public void unregisterNetworkCallback(NetworkCallback cb) {
221 if (trackingDefault.contains(cb)) {
222 trackingDefault.remove(cb);
223 } else if (listening.containsKey(cb)) {
224 listening.remove(cb);
225 } else if (requested.containsKey(cb)) {
226 requested.remove(cb);
Erik Klinedd8e8912017-01-18 16:08:06 +0900227 legacyTypeMap.remove(cb);
Erik Kline885a9092017-01-16 16:27:22 +0900228 }
229
230 assertFalse(trackingDefault.contains(cb));
231 assertFalse(listening.containsKey(cb));
232 assertFalse(requested.containsKey(cb));
233 }
234 }
235}