blob: 000190a16ce28f55d2741b0b0557b9b99bb3d950 [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.content.Context;
import android.net.ConnectivityManager;
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 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 java.util.Arrays;
public class IwlanNetworkServiceTest {
private static final String TAG = IwlanNetworkServiceTest.class.getSimpleName();
private static final int DEFAULT_SLOT_INDEX = 0;
@Mock private Context mMockContext;
@Mock private ConnectivityManager mMockConnectivityManager;
@Mock private SubscriptionManager mMockSubscriptionManager;
@Mock private SubscriptionInfo mMockSubscriptionInfo;
@Mock private INetworkServiceCallback mCallback;
MockitoSession mStaticMockSession;
IwlanNetworkService mIwlanNetworkService;
INetworkService mBinder;
IwlanNetworkServiceProvider mIwlanNetworkServiceProvider;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mStaticMockSession =
mockitoSession()
.mockStatic(IwlanHelper.class)
.mockStatic(SubscriptionManager.class)
.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);
lenient()
.when(SubscriptionManager.from(eq(mMockContext)))
.thenReturn(mMockSubscriptionManager);
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();
}
@Test
public void testRequestNetworkRegistrationInfo() throws Exception {
int domain = NetworkRegistrationInfo.DOMAIN_PS;
boolean mIsSubActive = true;
long startTime;
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 1000) {
mIwlanNetworkServiceProvider =
mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (mIwlanNetworkServiceProvider != null) {
break;
}
}
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(
domain, mIsSubActive, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, domain, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
IwlanNetworkService.setNetworkConnected(
false, IwlanNetworkService.Transport.UNSPECIFIED_NETWORK);
}
@Test
public void testNetworkRegistrationInfoForCellularAndCstDisabled() throws Exception {
int domain = NetworkRegistrationInfo.DOMAIN_PS;
boolean mIsSubActive = true;
long startTime;
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 1000) {
mIwlanNetworkServiceProvider =
mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (mIwlanNetworkServiceProvider != null) {
break;
}
}
lenient()
.when(
IwlanHelper.isCrossSimCallingEnabled(
eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(false);
lenient()
.when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(true);
assertTrue(mIwlanNetworkServiceProvider != null);
// Set Network on and verify mCallback should receive onNetworkStateChanged.
mIwlanNetworkService.setNetworkConnected(true, IwlanNetworkService.Transport.MOBILE);
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(
domain,
mIsSubActive,
NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING);
mBinder.requestNetworkRegistrationInfo(0, domain, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
IwlanNetworkService.setNetworkConnected(
false, IwlanNetworkService.Transport.UNSPECIFIED_NETWORK);
}
@Test
public void testNetworkRegistrationInfoForCellularAndCstEnabled() throws Exception {
int domain = NetworkRegistrationInfo.DOMAIN_PS;
boolean mIsSubActive = true;
long startTime;
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 1000) {
mIwlanNetworkServiceProvider =
mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (mIwlanNetworkServiceProvider != null) {
break;
}
}
lenient()
.when(
IwlanHelper.isCrossSimCallingEnabled(
eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(true);
lenient()
.when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(false);
assertTrue(mIwlanNetworkServiceProvider != null);
// Set Network on and verify mCallback should receive onNetworkStateChanged.
mIwlanNetworkService.setNetworkConnected(true, IwlanNetworkService.Transport.MOBILE);
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(
domain, mIsSubActive, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, domain, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
IwlanNetworkService.setNetworkConnected(
false, IwlanNetworkService.Transport.UNSPECIFIED_NETWORK);
}
@Test
public void testNetworkRegistrationInfoForWiFiAndCstEnabled() throws Exception {
int domain = NetworkRegistrationInfo.DOMAIN_PS;
boolean mIsSubActive = true;
long startTime;
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 1000) {
mIwlanNetworkServiceProvider =
mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (mIwlanNetworkServiceProvider != null) {
break;
}
}
lenient()
.when(
IwlanHelper.isCrossSimCallingEnabled(
eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(true);
lenient()
.when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(true);
assertTrue(mIwlanNetworkServiceProvider != null);
// Set Network 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(
domain, mIsSubActive, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, domain, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
IwlanNetworkService.setNetworkConnected(
false, IwlanNetworkService.Transport.UNSPECIFIED_NETWORK);
}
@Test
public void testNetworkRegistrationInfoForWiFiAndCstDisabled() throws Exception {
int domain = NetworkRegistrationInfo.DOMAIN_PS;
boolean mIsSubActive = true;
long startTime;
// Wait for IwlanNetworkServiceProvider created and timeout is 1 second.
startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 1000) {
mIwlanNetworkServiceProvider =
mIwlanNetworkService.getNetworkServiceProvider(DEFAULT_SLOT_INDEX);
if (mIwlanNetworkServiceProvider != null) {
break;
}
}
lenient()
.when(
IwlanHelper.isCrossSimCallingEnabled(
eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(false);
lenient()
.when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
.thenReturn(true);
assertTrue(mIwlanNetworkServiceProvider != null);
// Set Network 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(
domain, mIsSubActive, NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mBinder.requestNetworkRegistrationInfo(0, domain, mCallback);
verify(mCallback, timeout(1000).times(1))
.onRequestNetworkRegistrationInfoComplete(
eq(NetworkServiceCallback.RESULT_SUCCESS),
eq(expectedStateBuilder.build()));
IwlanNetworkService.setNetworkConnected(
false, IwlanNetworkService.Transport.UNSPECIFIED_NETWORK);
}
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;
}
}