blob: 0dedf703f3bb61dda1948d2198fa15564f1cf4a1 [file] [log] [blame]
Erik Kline92c4db02017-05-31 10:21:32 +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
19import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
Erik Kline7990aef2017-06-01 20:11:25 +090020import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.assertTrue;
Erik Kline92c4db02017-05-31 10:21:32 +090022import static org.junit.Assert.fail;
23import static org.mockito.Matchers.any;
24import static org.mockito.Matchers.anyObject;
Erik Kline7990aef2017-06-01 20:11:25 +090025import static org.mockito.Matchers.eq;
Erik Kline92c4db02017-05-31 10:21:32 +090026import static org.mockito.Mockito.inOrder;
27import static org.mockito.Mockito.never;
Erik Kline7990aef2017-06-01 20:11:25 +090028import static org.mockito.Mockito.reset;
Erik Kline92c4db02017-05-31 10:21:32 +090029import static org.mockito.Mockito.times;
30import static org.mockito.Mockito.when;
31
32import android.content.Context;
Erik Klinef3a08b42017-06-07 16:33:19 +090033import android.content.pm.ApplicationInfo;
Erik Kline7990aef2017-06-01 20:11:25 +090034import android.net.LinkAddress;
35import android.net.LinkProperties;
36import android.net.RouteInfo;
Erik Kline92c4db02017-05-31 10:21:32 +090037import android.net.util.SharedLog;
38import android.provider.Settings;
39import android.provider.Settings.SettingNotFoundException;
40
41import android.support.test.filters.SmallTest;
42import android.support.test.runner.AndroidJUnit4;
43import android.test.mock.MockContentResolver;
44import com.android.internal.util.test.FakeSettingsProvider;
45
Erik Kline7990aef2017-06-01 20:11:25 +090046import java.net.InetAddress;
47import java.util.ArrayList;
48
Erik Klinec87cd412017-07-07 17:38:30 +090049import org.junit.After;
Erik Kline92c4db02017-05-31 10:21:32 +090050import org.junit.Before;
51import org.junit.runner.RunWith;
52import org.junit.Test;
Erik Kline7990aef2017-06-01 20:11:25 +090053import org.mockito.ArgumentCaptor;
Erik Kline92c4db02017-05-31 10:21:32 +090054import org.mockito.InOrder;
55import org.mockito.Mock;
56import org.mockito.MockitoAnnotations;
57
58
59@RunWith(AndroidJUnit4.class)
60@SmallTest
61public class OffloadControllerTest {
62
63 @Mock private OffloadHardwareInterface mHardware;
Erik Klinef3a08b42017-06-07 16:33:19 +090064 @Mock private ApplicationInfo mApplicationInfo;
Erik Kline92c4db02017-05-31 10:21:32 +090065 @Mock private Context mContext;
Erik Kline7fd696c2017-06-12 18:20:08 +090066 private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
67 ArgumentCaptor.forClass(ArrayList.class);
Erik Kline92c4db02017-05-31 10:21:32 +090068 private MockContentResolver mContentResolver;
69
70 @Before public void setUp() throws Exception {
71 MockitoAnnotations.initMocks(this);
Erik Klinef3a08b42017-06-07 16:33:19 +090072 when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
73 when(mContext.getPackageName()).thenReturn("OffloadControllerTest");
Erik Kline92c4db02017-05-31 10:21:32 +090074 mContentResolver = new MockContentResolver(mContext);
75 mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
Erik Kline92c4db02017-05-31 10:21:32 +090076 when(mContext.getContentResolver()).thenReturn(mContentResolver);
Erik Klinec87cd412017-07-07 17:38:30 +090077 FakeSettingsProvider.clearSettingsProvider();
78 }
79
80 @After public void tearDown() throws Exception {
81 FakeSettingsProvider.clearSettingsProvider();
Erik Kline92c4db02017-05-31 10:21:32 +090082 }
83
84 private void setupFunctioningHardwareInterface() {
85 when(mHardware.initOffloadConfig()).thenReturn(true);
86 when(mHardware.initOffloadControl(any(OffloadHardwareInterface.ControlCallback.class)))
87 .thenReturn(true);
88 }
89
Erik Klinec87cd412017-07-07 17:38:30 +090090 private void enableOffload() {
91 Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
92 }
93
Erik Kline92c4db02017-05-31 10:21:32 +090094 @Test
Erik Klinec87cd412017-07-07 17:38:30 +090095 public void testNoSettingsValueDefaultDisabledDoesNotStart() {
Erik Kline92c4db02017-05-31 10:21:32 +090096 setupFunctioningHardwareInterface();
Erik Klinec87cd412017-07-07 17:38:30 +090097 when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1);
Erik Kline92c4db02017-05-31 10:21:32 +090098 try {
99 Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED);
100 fail();
101 } catch (SettingNotFoundException expected) {}
102
103 final OffloadController offload =
104 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
105 offload.start();
106
107 final InOrder inOrder = inOrder(mHardware);
Erik Klinec87cd412017-07-07 17:38:30 +0900108 inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
109 inOrder.verify(mHardware, never()).initOffloadConfig();
110 inOrder.verify(mHardware, never()).initOffloadControl(
111 any(OffloadHardwareInterface.ControlCallback.class));
112 inOrder.verifyNoMoreInteractions();
113 }
114
115 @Test
116 public void testNoSettingsValueDefaultEnabledDoesStart() {
117 setupFunctioningHardwareInterface();
118 when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0);
119 try {
120 Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED);
121 fail();
122 } catch (SettingNotFoundException expected) {}
123
124 final OffloadController offload =
125 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
126 offload.start();
127
128 final InOrder inOrder = inOrder(mHardware);
129 inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
Erik Kline92c4db02017-05-31 10:21:32 +0900130 inOrder.verify(mHardware, times(1)).initOffloadConfig();
131 inOrder.verify(mHardware, times(1)).initOffloadControl(
132 any(OffloadHardwareInterface.ControlCallback.class));
133 inOrder.verifyNoMoreInteractions();
134 }
135
136 @Test
137 public void testSettingsAllowsStart() {
138 setupFunctioningHardwareInterface();
139 Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
140
141 final OffloadController offload =
142 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
143 offload.start();
144
145 final InOrder inOrder = inOrder(mHardware);
Erik Klinec87cd412017-07-07 17:38:30 +0900146 inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
Erik Kline92c4db02017-05-31 10:21:32 +0900147 inOrder.verify(mHardware, times(1)).initOffloadConfig();
148 inOrder.verify(mHardware, times(1)).initOffloadControl(
149 any(OffloadHardwareInterface.ControlCallback.class));
150 inOrder.verifyNoMoreInteractions();
151 }
152
153 @Test
154 public void testSettingsDisablesStart() {
155 setupFunctioningHardwareInterface();
156 Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
157
158 final OffloadController offload =
159 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
160 offload.start();
161
162 final InOrder inOrder = inOrder(mHardware);
Erik Klinec87cd412017-07-07 17:38:30 +0900163 inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
Erik Kline92c4db02017-05-31 10:21:32 +0900164 inOrder.verify(mHardware, never()).initOffloadConfig();
165 inOrder.verify(mHardware, never()).initOffloadControl(anyObject());
166 inOrder.verifyNoMoreInteractions();
167 }
Erik Kline7990aef2017-06-01 20:11:25 +0900168
169 @Test
170 public void testSetUpstreamLinkPropertiesWorking() throws Exception {
171 setupFunctioningHardwareInterface();
Erik Klinec87cd412017-07-07 17:38:30 +0900172 enableOffload();
173
Erik Kline7990aef2017-06-01 20:11:25 +0900174 final OffloadController offload =
175 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
176 offload.start();
177
178 final InOrder inOrder = inOrder(mHardware);
Erik Klinec87cd412017-07-07 17:38:30 +0900179 inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
Erik Kline7990aef2017-06-01 20:11:25 +0900180 inOrder.verify(mHardware, times(1)).initOffloadConfig();
181 inOrder.verify(mHardware, times(1)).initOffloadControl(
182 any(OffloadHardwareInterface.ControlCallback.class));
183 inOrder.verifyNoMoreInteractions();
184
185 offload.setUpstreamLinkProperties(null);
186 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
187 eq(null), eq(null), eq(null), eq(null));
188 inOrder.verifyNoMoreInteractions();
189 reset(mHardware);
190
191 final LinkProperties lp = new LinkProperties();
192
193 final String testIfName = "rmnet_data17";
194 lp.setInterfaceName(testIfName);
195 offload.setUpstreamLinkProperties(lp);
196 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900197 eq(testIfName), eq(null), eq(null), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900198 inOrder.verifyNoMoreInteractions();
199
200 final String ipv4Addr = "192.0.2.5";
201 final String linkAddr = ipv4Addr + "/24";
202 lp.addLinkAddress(new LinkAddress(linkAddr));
203 offload.setUpstreamLinkProperties(lp);
204 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900205 eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900206 inOrder.verifyNoMoreInteractions();
207
208 final String ipv4Gateway = "192.0.2.1";
209 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv4Gateway)));
210 offload.setUpstreamLinkProperties(lp);
211 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900212 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900213 inOrder.verifyNoMoreInteractions();
214
215 final String ipv6Gw1 = "fe80::cafe";
216 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv6Gw1)));
217 offload.setUpstreamLinkProperties(lp);
218 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
219 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
220 ArrayList<String> v6gws = mStringArrayCaptor.getValue();
221 assertEquals(1, v6gws.size());
222 assertTrue(v6gws.contains(ipv6Gw1));
223 inOrder.verifyNoMoreInteractions();
224
225 final String ipv6Gw2 = "fe80::d00d";
226 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv6Gw2)));
227 offload.setUpstreamLinkProperties(lp);
228 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
229 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
230 v6gws = mStringArrayCaptor.getValue();
231 assertEquals(2, v6gws.size());
232 assertTrue(v6gws.contains(ipv6Gw1));
233 assertTrue(v6gws.contains(ipv6Gw2));
234 inOrder.verifyNoMoreInteractions();
235
236 final LinkProperties stacked = new LinkProperties();
237 stacked.setInterfaceName("stacked");
238 stacked.addLinkAddress(new LinkAddress("192.0.2.129/25"));
239 stacked.addRoute(new RouteInfo(InetAddress.getByName("192.0.2.254")));
240 stacked.addRoute(new RouteInfo(InetAddress.getByName("fe80::bad:f00")));
241 assertTrue(lp.addStackedLink(stacked));
242 offload.setUpstreamLinkProperties(lp);
243 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
244 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
245 v6gws = mStringArrayCaptor.getValue();
246 assertEquals(2, v6gws.size());
247 assertTrue(v6gws.contains(ipv6Gw1));
248 assertTrue(v6gws.contains(ipv6Gw2));
249 inOrder.verifyNoMoreInteractions();
250 }
Erik Kline92c4db02017-05-31 10:21:32 +0900251}