blob: 14284d661744d434a610f183908255718285985f [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 Kline92c4db02017-05-31 10:21:32 +090049import org.junit.Before;
50import org.junit.runner.RunWith;
51import org.junit.Test;
Erik Kline7990aef2017-06-01 20:11:25 +090052import org.mockito.ArgumentCaptor;
Erik Kline92c4db02017-05-31 10:21:32 +090053import org.mockito.InOrder;
54import org.mockito.Mock;
55import org.mockito.MockitoAnnotations;
56
57
58@RunWith(AndroidJUnit4.class)
59@SmallTest
60public class OffloadControllerTest {
61
62 @Mock private OffloadHardwareInterface mHardware;
Erik Klinef3a08b42017-06-07 16:33:19 +090063 @Mock private ApplicationInfo mApplicationInfo;
Erik Kline92c4db02017-05-31 10:21:32 +090064 @Mock private Context mContext;
Erik Kline7990aef2017-06-01 20:11:25 +090065 final ArgumentCaptor<ArrayList> mStringArrayCaptor = ArgumentCaptor.forClass(ArrayList.class);
Erik Kline92c4db02017-05-31 10:21:32 +090066 private MockContentResolver mContentResolver;
67
68 @Before public void setUp() throws Exception {
69 MockitoAnnotations.initMocks(this);
Erik Klinef3a08b42017-06-07 16:33:19 +090070 when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
71 when(mContext.getPackageName()).thenReturn("OffloadControllerTest");
Erik Kline92c4db02017-05-31 10:21:32 +090072 mContentResolver = new MockContentResolver(mContext);
73 mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
Erik Kline92c4db02017-05-31 10:21:32 +090074 when(mContext.getContentResolver()).thenReturn(mContentResolver);
75 }
76
77 private void setupFunctioningHardwareInterface() {
78 when(mHardware.initOffloadConfig()).thenReturn(true);
79 when(mHardware.initOffloadControl(any(OffloadHardwareInterface.ControlCallback.class)))
80 .thenReturn(true);
81 }
82
83 @Test
84 public void testNoSettingsValueAllowsStart() {
85 setupFunctioningHardwareInterface();
86 try {
87 Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED);
88 fail();
89 } catch (SettingNotFoundException expected) {}
90
91 final OffloadController offload =
92 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
93 offload.start();
94
95 final InOrder inOrder = inOrder(mHardware);
96 inOrder.verify(mHardware, times(1)).initOffloadConfig();
97 inOrder.verify(mHardware, times(1)).initOffloadControl(
98 any(OffloadHardwareInterface.ControlCallback.class));
99 inOrder.verifyNoMoreInteractions();
100 }
101
102 @Test
103 public void testSettingsAllowsStart() {
104 setupFunctioningHardwareInterface();
105 Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
106
107 final OffloadController offload =
108 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
109 offload.start();
110
111 final InOrder inOrder = inOrder(mHardware);
112 inOrder.verify(mHardware, times(1)).initOffloadConfig();
113 inOrder.verify(mHardware, times(1)).initOffloadControl(
114 any(OffloadHardwareInterface.ControlCallback.class));
115 inOrder.verifyNoMoreInteractions();
116 }
117
118 @Test
119 public void testSettingsDisablesStart() {
120 setupFunctioningHardwareInterface();
121 Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
122
123 final OffloadController offload =
124 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
125 offload.start();
126
127 final InOrder inOrder = inOrder(mHardware);
128 inOrder.verify(mHardware, never()).initOffloadConfig();
129 inOrder.verify(mHardware, never()).initOffloadControl(anyObject());
130 inOrder.verifyNoMoreInteractions();
131 }
Erik Kline7990aef2017-06-01 20:11:25 +0900132
133 @Test
134 public void testSetUpstreamLinkPropertiesWorking() throws Exception {
135 setupFunctioningHardwareInterface();
136 final OffloadController offload =
137 new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
138 offload.start();
139
140 final InOrder inOrder = inOrder(mHardware);
141 inOrder.verify(mHardware, times(1)).initOffloadConfig();
142 inOrder.verify(mHardware, times(1)).initOffloadControl(
143 any(OffloadHardwareInterface.ControlCallback.class));
144 inOrder.verifyNoMoreInteractions();
145
146 offload.setUpstreamLinkProperties(null);
147 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
148 eq(null), eq(null), eq(null), eq(null));
149 inOrder.verifyNoMoreInteractions();
150 reset(mHardware);
151
152 final LinkProperties lp = new LinkProperties();
153
154 final String testIfName = "rmnet_data17";
155 lp.setInterfaceName(testIfName);
156 offload.setUpstreamLinkProperties(lp);
157 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900158 eq(testIfName), eq(null), eq(null), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900159 inOrder.verifyNoMoreInteractions();
160
161 final String ipv4Addr = "192.0.2.5";
162 final String linkAddr = ipv4Addr + "/24";
163 lp.addLinkAddress(new LinkAddress(linkAddr));
164 offload.setUpstreamLinkProperties(lp);
165 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900166 eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900167 inOrder.verifyNoMoreInteractions();
168
169 final String ipv4Gateway = "192.0.2.1";
170 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv4Gateway)));
171 offload.setUpstreamLinkProperties(lp);
172 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
Erik Kline11854592017-06-15 18:06:34 +0900173 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
Erik Kline7990aef2017-06-01 20:11:25 +0900174 inOrder.verifyNoMoreInteractions();
175
176 final String ipv6Gw1 = "fe80::cafe";
177 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv6Gw1)));
178 offload.setUpstreamLinkProperties(lp);
179 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
180 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
181 ArrayList<String> v6gws = mStringArrayCaptor.getValue();
182 assertEquals(1, v6gws.size());
183 assertTrue(v6gws.contains(ipv6Gw1));
184 inOrder.verifyNoMoreInteractions();
185
186 final String ipv6Gw2 = "fe80::d00d";
187 lp.addRoute(new RouteInfo(InetAddress.getByName(ipv6Gw2)));
188 offload.setUpstreamLinkProperties(lp);
189 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
190 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
191 v6gws = mStringArrayCaptor.getValue();
192 assertEquals(2, v6gws.size());
193 assertTrue(v6gws.contains(ipv6Gw1));
194 assertTrue(v6gws.contains(ipv6Gw2));
195 inOrder.verifyNoMoreInteractions();
196
197 final LinkProperties stacked = new LinkProperties();
198 stacked.setInterfaceName("stacked");
199 stacked.addLinkAddress(new LinkAddress("192.0.2.129/25"));
200 stacked.addRoute(new RouteInfo(InetAddress.getByName("192.0.2.254")));
201 stacked.addRoute(new RouteInfo(InetAddress.getByName("fe80::bad:f00")));
202 assertTrue(lp.addStackedLink(stacked));
203 offload.setUpstreamLinkProperties(lp);
204 inOrder.verify(mHardware, times(1)).setUpstreamParameters(
205 eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
206 v6gws = mStringArrayCaptor.getValue();
207 assertEquals(2, v6gws.size());
208 assertTrue(v6gws.contains(ipv6Gw1));
209 assertTrue(v6gws.contains(ipv6Gw2));
210 inOrder.verifyNoMoreInteractions();
211 }
Erik Kline92c4db02017-05-31 10:21:32 +0900212}