blob: 0633900899c8de34d31df793ace7fc63bf1450fe [file] [log] [blame]
/*
* Copyright 2020 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.google.android.iwlan;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import android.annotation.Nullable;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.TelephonyNetworkSpecifier;
import android.net.vcn.VcnTransportInfo;
import android.telephony.AccessNetworkConstants;
import android.telephony.INetworkService;
import android.telephony.INetworkServiceCallback;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkServiceCallback;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
import com.google.android.iwlan.IwlanNetworkService.IwlanNetworkServiceProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
import java.util.Arrays;
public class IwlanNetworkServiceTest {
private static final String TAG = IwlanNetworkServiceTest.class.getSimpleName();
private static final int DEFAULT_SLOT_INDEX = 0;
private static final int DEFAULT_SUB_INDEX = 0;
@Mock private Context mMockContext;
@Mock private ConnectivityManager mMockConnectivityManager;
@Mock private SubscriptionManager mMockSubscriptionManager;
@Mock private SubscriptionInfo mMockSubscriptionInfo;
@Mock private ImsManager mMockImsManager;
@Mock private ImsMmTelManager mMockImsMmTelManager;
@Mock private INetworkServiceCallback mCallback;
@Mock private Network mMockNetwork;
MockitoSession mStaticMockSession;
IwlanNetworkService mIwlanNetworkService;
INetworkService mBinder;
IwlanNetworkServiceProvider mIwlanNetworkServiceProvider;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mStaticMockSession =
mockitoSession()
.mockStatic(SubscriptionManager.class)
.strictness(Strictness.LENIENT)
.startMocking();
when(mMockContext.getSystemService(eq(ConnectivityManager.class)))
.thenReturn(mMockConnectivityManager);
when(mMockContext.getSystemService(eq(SubscriptionManager.class)))
.thenReturn(mMockSubscriptionManager);
when(mMockSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(
eq(DEFAULT_SLOT_INDEX)))
.thenReturn(mMockSubscriptionInfo);
when(mMockSubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(DEFAULT_SUB_INDEX);
when(mMockSubscriptionManager.getSlotIndex(DEFAULT_SUB_INDEX))
.thenReturn(DEFAULT_SLOT_INDEX);
when(mMockSubscriptionManager.getSlotIndex(DEFAULT_SUB_INDEX + 1))
.thenReturn(DEFAULT_SLOT_INDEX + 1);
when(mMockSubscriptionInfo.getSubscriptionId()).thenReturn(DEFAULT_SUB_INDEX);
when(mMockContext.getSystemService(eq(ImsManager.class))).thenReturn(mMockImsManager);
when(mMockImsManager.getImsMmTelManager(anyInt())).thenReturn(mMockImsMmTelManager);
mIwlanNetworkService = new IwlanNetworkService();
mIwlanNetworkService.setAppContext(mMockContext);
mIwlanNetworkServiceProvider = null;
mBinder = mIwlanNetworkService.mBinder;
mBinder.createNetworkServiceProvider(DEFAULT_SLOT_INDEX);
mBinder.registerForNetworkRegistrationInfoChanged(DEFAULT_SLOT_INDEX, mCallback);
}
@After
public void cleanUp() throws Exception {
mBinder.removeNetworkServiceProvider(DEFAULT_SLOT_INDEX);
mStaticMockSession.finishMocking();
}
@Nullable
IwlanNetworkServiceProvider initNSP() {
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
long startTime = System.currentTimeMillis();
IwlanNetworkServiceProvider nsp = null;
while (System.currentTimeMillis() - startTime < 1000) {
nsp = mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (nsp != null) {
break;
}
}
return nsp;
}
@Test
public void testRequestNetworkRegistrationInfo() throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
// Set Wifi on and verify mCallback should receive onNetworkStateChanged.
mIwlanNetworkService.setNetworkConnected(true, IwlanNetworkService.Transport.WIFI);
verify(mCallback, timeout(1000).times(1)).onNetworkStateChanged();
// Set Sub active and verify mCallback should receive onNetworkStateChanged.
mIwlanNetworkServiceProvider.subscriptionChanged();
verify(mCallback, timeout(1000).times(2)).onNetworkStateChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
private NetworkCapabilities prepareCellularNetworkCapabilitiesForTest(
int subId, boolean isVcn) {
NetworkCapabilities.Builder builder =
new NetworkCapabilities.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
if (isVcn) {
builder.setTransportInfo(new VcnTransportInfo(subId));
} else {
builder.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId));
}
return builder.build();
}
private NetworkCapabilities prepareWifiNetworkCapabilitiesForTest() {
return new NetworkCapabilities.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
}
@Test
public void testNetworkRegistrationInfoSearchingForCellularAndCstDisabled() throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(false);
NetworkCapabilities nc =
prepareCellularNetworkCapabilitiesForTest(DEFAULT_SUB_INDEX, false /* is Vcn */);
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
@Test
public void testNetworkRegistrationInfoSearchingForCellularOnSameSubAndCstEnabled()
throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(true);
NetworkCapabilities nc =
prepareCellularNetworkCapabilitiesForTest(DEFAULT_SUB_INDEX, false /* is Vcn */);
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* mIsSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
@Test
public void testNetworkRegistrationInfoHomeForCellularOnDifferentSubAndCstEnabled()
throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(true);
// Cellular data is on the other sub
NetworkCapabilities nc =
prepareCellularNetworkCapabilitiesForTest(
DEFAULT_SUB_INDEX + 1, false /* is Vcn */);
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
@Test
public void testNetworkRegistrationInfoHomeForCellularVcnOnDifferentSubAndCstEnabled()
throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(true);
// Cellular data as a VCN network is on the other sub
NetworkCapabilities nc =
prepareCellularNetworkCapabilitiesForTest(DEFAULT_SUB_INDEX + 1, true /* is Vcn */);
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
@Test
public void testNetworkRegistrationInfoHomeForWiFiAndCstEnabled() throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(true);
NetworkCapabilities nc = prepareWifiNetworkCapabilitiesForTest();
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
@Test
public void testNetworkRegistrationInfoHomeForWiFiAndCstDisabled() throws Exception {
mIwlanNetworkServiceProvider = initNSP();
assertTrue(mIwlanNetworkServiceProvider != null);
when(mMockImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(false);
NetworkCapabilities nc = prepareWifiNetworkCapabilitiesForTest();
mIwlanNetworkService.getNetworkMonitorCallback().onCapabilitiesChanged(mMockNetwork, nc);
mIwlanNetworkServiceProvider.subscriptionChanged();
// Create expected NetworkRegistrationInfo
NetworkRegistrationInfo.Builder expectedStateBuilder =
generateStateBuilder(
NetworkRegistrationInfo.DOMAIN_PS,
true /* isSubActive */,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, NetworkRegistrationInfo.DOMAIN_PS, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
}
private NetworkRegistrationInfo.Builder generateStateBuilder(
int domain, boolean isSubActive, int registrationState) {
NetworkRegistrationInfo.Builder expectedStateBuilder =
new NetworkRegistrationInfo.Builder();
expectedStateBuilder
.setAccessNetworkTechnology(
(registrationState
== NetworkRegistrationInfo
.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING)
? TelephonyManager.NETWORK_TYPE_UNKNOWN
: TelephonyManager.NETWORK_TYPE_IWLAN)
.setAvailableServices(Arrays.asList(NetworkRegistrationInfo.SERVICE_TYPE_DATA))
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)
.setEmergencyOnly(!isSubActive)
.setDomain(domain)
.setRegistrationState(registrationState);
return expectedStateBuilder;
}
}