/*
* 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 com.android.internal.telephony.ContextFixture;
import com.android.internal.telephony.dataconnection.TelephonyNetworkFactory;
import com.android.internal.telephony.mocks.ConnectivityServiceMock;
import com.android.internal.telephony.mocks.DcTrackerMock;
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 com.android.internal.telephony.test.SimulatedCommands;
import android.content.Context;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.platform.test.annotations.Postsubmit;
import android.net.ConnectivityManager;
import android.net.IConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.telephony.Rlog;
public class TelephonyNetworkFactoryTest extends AndroidTestCase {
private final static String LOG_TAG = "TelephonyNetworkFactoryTest";
private void waitABit() {
try {
Thread.sleep(250);
} catch (Exception e) {}
}
private String mTestName = "";
private void log(String str) {
Rlog.d(LOG_TAG + " " + mTestName, str);
}
private class TestSetup {
final TelephonyRegistryMock telephonyRegistryMock;
final PhoneSwitcherMock phoneSwitcherMock;
final SubscriptionControllerMock subscriptionControllerMock;
final SubscriptionMonitorMock subscriptionMonitorMock;
final HandlerThread handlerThread;
final ConnectivityServiceMock connectivityServiceMock;
final Looper looper;
DcTrackerMock dcTrackerMock;
final Context contextMock;
TestSetup(int numPhones) {
handlerThread = new HandlerThread("TelephonyNetworkFactoryTest");
handlerThread.start();
looper = handlerThread.getLooper();
Handler myHandler = new Handler(looper) {
public void handleMessage(Message msg) {
if (dcTrackerMock == null) dcTrackerMock = new DcTrackerMock();
}
};
myHandler.obtainMessage(0).sendToTarget();
final ContextFixture contextFixture = new ContextFixture();
String[] networkConfigString = getContext().getResources().getStringArray(
com.android.internal.R.array.networkAttributes);
contextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes,
networkConfigString);
contextMock = contextFixture.getTestDouble();
connectivityServiceMock = new ConnectivityServiceMock(contextMock);
ConnectivityManager cm =
new ConnectivityManager(contextMock, connectivityServiceMock);
contextFixture.setSystemService(Context.CONNECTIVITY_SERVICE, cm);
telephonyRegistryMock = new TelephonyRegistryMock();
phoneSwitcherMock = new PhoneSwitcherMock(numPhones, looper);
subscriptionControllerMock =
new SubscriptionControllerMock(contextMock, telephonyRegistryMock, numPhones);
subscriptionMonitorMock = new SubscriptionMonitorMock(numPhones);
}
void die() {
looper.quit();
handlerThread.quit();
}
}
private TelephonyNetworkFactory makeTnf(int phoneId, TestSetup ts) {
return new TelephonyNetworkFactory(ts.phoneSwitcherMock, ts.subscriptionControllerMock,
ts.subscriptionMonitorMock, ts.looper, ts.contextMock, phoneId, ts.dcTrackerMock);
}
private NetworkRequest makeSubSpecificDefaultRequest(TestSetup ts, int subId) {
NetworkCapabilities netCap = (new NetworkCapabilities()).
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED).
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
netCap.setNetworkSpecifier(Integer.toString(subId));
return ts.connectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1);
}
private NetworkRequest makeSubSpecificMmsRequest(TestSetup ts, int subId) {
NetworkCapabilities netCap = (new NetworkCapabilities()).
addCapability(NetworkCapabilities.NET_CAPABILITY_MMS).
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED).
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
netCap.setNetworkSpecifier(Integer.toString(subId));
return ts.connectivityServiceMock.requestNetwork(netCap, null, 0, new Binder(), -1);
}
/**
* Test that phone active changes cause the DcTracker to get poked.
*/
@Postsubmit
@SmallTest
public void testActive() throws Exception {
mTestName = "testActive";
final int numberOfPhones = 1;
final int phoneId = 0;
final int subId = 0;
TestSetup ts = new TestSetup(numberOfPhones);
TelephonyNetworkFactory tnf = makeTnf(phoneId, ts);
ts.subscriptionControllerMock.setDefaultDataSubId(subId);
ts.subscriptionControllerMock.setSlotSubId(phoneId, subId);
ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId);
ts.connectivityServiceMock.addDefaultRequest();
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("pretest of LiveRequests != 0");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, true);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) {
fail("post-active test of LiveRequests != 1");
}
NetworkRequest subSpecificDefault = makeSubSpecificDefaultRequest(ts, subId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) {
fail("post-second-request test of LiveRequests != 2");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, false);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("post-inactive test of LiveRequests != 0");
}
NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(ts, subId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("post-mms-add test of LiveRequests != 0");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, true);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 3) {
fail("post-active-mms-add test of LiveRequests != 3");
}
ts.connectivityServiceMock.releaseNetworkRequest(subSpecificDefault);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) {
fail("post-remove-default test of LiveRequests != 2");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, false);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 8, LiveRequests != 0");
}
ts.connectivityServiceMock.releaseNetworkRequest(subSpecificMms);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 9, LiveRequests != 0");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, true);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) {
fail("test 10, LiveRequests != 1," + ts.dcTrackerMock.getNumberOfLiveRequests());
}
ts.die();
}
/**
* Test that network request changes cause the DcTracker to get poked.
*/
@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;
TestSetup ts = new TestSetup(numberOfPhones);
TelephonyNetworkFactory tnf = makeTnf(phoneId, ts);
ts.subscriptionControllerMock.setDefaultDataSubId(subId);
ts.subscriptionControllerMock.setSlotSubId(phoneId, subId);
ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 1, LiveRequests != 0");
}
ts.phoneSwitcherMock.setPhoneActive(phoneId, true);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 2, LiveRequests != 0");
}
ts.connectivityServiceMock.addDefaultRequest();
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) {
fail("test 3, LiveRequests != 1");
}
ts.subscriptionControllerMock.setSlotSubId(altPhoneId, altSubId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) {
fail("test 4, LiveRequests != 1");
}
ts.subscriptionControllerMock.setDefaultDataSubId(altSubId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(altPhoneId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 5, LiveRequests != 0");
}
NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(ts, subId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 1) {
fail("test 6, LiveRequests != 1");
}
ts.subscriptionControllerMock.setSlotSubId(phoneId, unusedSubId);
ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 7, LiveRequests != 0");
}
NetworkRequest subSpecificDefault = makeSubSpecificDefaultRequest(ts, subId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 0) {
fail("test 8, LiveRequests != 0");
}
ts.subscriptionControllerMock.setSlotSubId(phoneId, subId);
ts.subscriptionMonitorMock.notifySubscriptionChanged(phoneId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 2) {
fail("test 9, LiveRequests != 2");
}
ts.subscriptionControllerMock.setDefaultDataSubId(subId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(altPhoneId);
ts.subscriptionMonitorMock.notifyDefaultSubscriptionChanged(phoneId);
waitABit();
if (ts.dcTrackerMock.getNumberOfLiveRequests() != 3) {
fail("test 10, LiveRequests != 3");
}
ts.die();
}
}