blob: 0a11a5bcf20a1c57d8135c0ed1b259b2b4eb15c2 [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.dataconnection;
import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.StringNetworkSpecifier;
import android.os.Binder;
import android.os.HandlerThread;
import android.os.Looper;
import android.support.test.filters.FlakyTest;
import android.telephony.Rlog;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.telephony.PhoneSwitcher;
import com.android.internal.telephony.RadioConfig;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.mocks.ConnectivityServiceMock;
import com.android.internal.telephony.mocks.PhoneSwitcherMock;
import com.android.internal.telephony.mocks.SubscriptionControllerMock;
import com.android.internal.telephony.mocks.SubscriptionMonitorMock;
import com.android.internal.telephony.mocks.TelephonyRegistryMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.util.ArrayList;
public class TelephonyNetworkFactoryTest extends TelephonyTest {
private final static String LOG_TAG = "TelephonyNetworkFactoryTest";
@Mock
private RadioConfig mMockRadioConfig;
private String mTestName = "";
private TelephonyRegistryMock mTelephonyRegistryMock;
private PhoneSwitcherMock mPhoneSwitcherMock;
private SubscriptionControllerMock mSubscriptionControllerMock;
private SubscriptionMonitorMock mSubscriptionMonitorMock;
private HandlerThread mHandlerThread;
private ConnectivityServiceMock mConnectivityServiceMock;
private Looper mLooper;
private final ArrayList<NetworkRequest> mNetworkRequestList = new ArrayList<>();
private TelephonyNetworkFactory mTelephonyNetworkFactoryUT;
private void log(String str) {
Rlog.d(LOG_TAG + " " + mTestName, str);
}
private NetworkRequest makeSubSpecificDefaultRequest(int subId) {
NetworkCapabilities netCap = (new NetworkCapabilities()).
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED).
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
netCap.setNetworkSpecifier(new StringNetworkSpecifier(Integer.toString(subId)));
return mConnectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1);
}
private NetworkRequest makeSubSpecificMmsRequest(int subId) {
NetworkCapabilities netCap = (new NetworkCapabilities()).
addCapability(NetworkCapabilities.NET_CAPABILITY_MMS).
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED).
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
netCap.setNetworkSpecifier(new StringNetworkSpecifier(Integer.toString(subId)));
return mConnectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1);
}
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
replaceInstance(RadioConfig.class, "sRadioConfig", null, mMockRadioConfig);
mHandlerThread = new HandlerThread("TelephonyNetworkFactoryTest");
mHandlerThread.start();
mLooper = mHandlerThread.getLooper();
mContextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes,
new String[]{"wifi,1,1,1,-1,true", "mobile,0,0,0,-1,true",
"mobile_mms,2,0,2,60000,true", "mobile_supl,3,0,2,60000,true",
"mobile_dun,4,0,2,60000,true", "mobile_hipri,5,0,3,60000,true",
"mobile_fota,10,0,2,60000,true", "mobile_ims,11,0,2,60000,true",
"mobile_cbs,12,0,2,60000,true", "wifi_p2p,13,1,0,-1,true",
"mobile_ia,14,0,2,-1,true", "mobile_emergency,15,0,2,-1,true"});
doAnswer(invocation -> {
mNetworkRequestList.add((NetworkRequest) invocation.getArguments()[0]);
return null;
}).when(mDcTracker).requestNetwork(any(), any());
doAnswer(invocation -> {
mNetworkRequestList.remove((NetworkRequest) invocation.getArguments()[0]);
return null;
}).when(mDcTracker).releaseNetwork(any(), any());
}
@After
public void tearDown() throws Exception {
mConnectivityServiceMock.die();
mLooper.quit();
mHandlerThread.quit();
super.tearDown();
}
private void createMockedTelephonyComponents(int numberOfPhones) throws Exception {
mConnectivityServiceMock = new ConnectivityServiceMock(mContext);
mContextFixture.setSystemService(Context.CONNECTIVITY_SERVICE,
new ConnectivityManager(mContext, mConnectivityServiceMock));
mTelephonyRegistryMock = new TelephonyRegistryMock();
mPhoneSwitcherMock = new PhoneSwitcherMock(numberOfPhones, mLooper);
mSubscriptionControllerMock = new SubscriptionControllerMock(mContext,
mTelephonyRegistryMock, numberOfPhones);
mSubscriptionMonitorMock = new SubscriptionMonitorMock(numberOfPhones);
mPhoneSwitcherMock = new PhoneSwitcherMock(numberOfPhones, mLooper);
mSubscriptionControllerMock = new SubscriptionControllerMock(mContext,
mTelephonyRegistryMock, numberOfPhones);
mSubscriptionMonitorMock = new SubscriptionMonitorMock(numberOfPhones);
replaceInstance(SubscriptionController.class, "sInstance", null,
mSubscriptionControllerMock);
replaceInstance(PhoneSwitcher.class, "sPhoneSwitcher", null, mPhoneSwitcherMock);
mTelephonyNetworkFactoryUT = new TelephonyNetworkFactory(mSubscriptionMonitorMock, mLooper,
mPhone);
replaceInstance(TelephonyNetworkFactory.class, "mDcTracker",
mTelephonyNetworkFactoryUT, mDcTracker);
}
/**
* Test that phone active changes cause the DcTracker to get poked.
*/
@FlakyTest
@Test
@SmallTest
public void testActive() throws Exception {
mTestName = "testActive";
final int numberOfPhones = 1;
final int phoneId = 0;
final int subId = 0;
createMockedTelephonyComponents(numberOfPhones);
mPhoneSwitcherMock.setPreferredDataPhoneId(phoneId);
mSubscriptionControllerMock.setDefaultDataSubId(subId);
mSubscriptionControllerMock.setSlotSubId(phoneId, subId);
mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
log("addDefaultRequest");
mConnectivityServiceMock.addDefaultRequest();
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
log("setPhoneActive true: phoneId = " + phoneId);
mPhoneSwitcherMock.setPhoneActive(phoneId, true);
waitForMs(250);
assertEquals(1, mNetworkRequestList.size());
log("makeSubSpecificDefaultRequest: subId = " + subId);
NetworkRequest subSpecificDefault = makeSubSpecificDefaultRequest(subId);
waitForMs(250);
assertEquals(2, mNetworkRequestList.size());
log("setPhoneActive false: phoneId = " + phoneId);
mPhoneSwitcherMock.setPhoneActive(phoneId, false);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
log("makeSubSpecificDefaultRequest: subId = " + subId);
NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(subId);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
log("setPhoneActive true: phoneId = " + phoneId);
mPhoneSwitcherMock.setPhoneActive(phoneId, true);
waitForMs(250);
assertEquals(3, mNetworkRequestList.size());
log("releaseNetworkRequest: subSpecificDefault = " + subSpecificDefault);
mConnectivityServiceMock.releaseNetworkRequest(subSpecificDefault);
waitForMs(250);
assertEquals(2, mNetworkRequestList.size());
log("setPhoneActive false: phoneId = " + phoneId);
mPhoneSwitcherMock.setPhoneActive(phoneId, false);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
log("releaseNetworkRequest: subSpecificMms = " + subSpecificMms);
mConnectivityServiceMock.releaseNetworkRequest(subSpecificMms);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
log("setPhoneActive true: phoneId = " + phoneId);
mPhoneSwitcherMock.setPhoneActive(phoneId, true);
waitForMs(250);
assertEquals(1, mNetworkRequestList.size());
}
/**
* Test that network request changes cause the DcTracker to get poked.
*/
@Test
@SmallTest
public void testRequests() throws Exception {
mTestName = "testActive";
final int numberOfPhones = 2;
final int phoneId = 0;
final int altPhoneId = 1;
final int subId = 0;
final int altSubId = 1;
final int unusedSubId = 2;
createMockedTelephonyComponents(numberOfPhones);
mPhoneSwitcherMock.setPreferredDataPhoneId(phoneId);
mSubscriptionControllerMock.setDefaultDataSubId(subId);
mSubscriptionControllerMock.setSlotSubId(phoneId, subId);
mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
mPhoneSwitcherMock.setPhoneActive(phoneId, true);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
mConnectivityServiceMock.addDefaultRequest();
waitForMs(250);
assertEquals(1, mNetworkRequestList.size());
mSubscriptionControllerMock.setSlotSubId(altPhoneId, altSubId);
waitForMs(250);
assertEquals(1, mNetworkRequestList.size());
mPhoneSwitcherMock.setPreferredDataPhoneId(altPhoneId);
mSubscriptionControllerMock.setDefaultDataSubId(altSubId);
mPhoneSwitcherMock.notifyActivePhoneChange(phoneId);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
makeSubSpecificMmsRequest(subId);
waitForMs(250);
assertEquals(1, mNetworkRequestList.size());
mSubscriptionControllerMock.setSlotSubId(phoneId, unusedSubId);
mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
makeSubSpecificDefaultRequest(subId);
waitForMs(250);
assertEquals(0, mNetworkRequestList.size());
mSubscriptionControllerMock.setSlotSubId(phoneId, subId);
mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
waitForMs(250);
assertEquals(2, mNetworkRequestList.size());
mSubscriptionControllerMock.setDefaultDataSubId(subId);
mPhoneSwitcherMock.setPreferredDataPhoneId(phoneId);
mPhoneSwitcherMock.notifyActivePhoneChange(phoneId);
waitForMs(250);
assertEquals(3, mNetworkRequestList.size());
}
}