blob: 34febcbae335e8f8359021eba5e8448075083fef [file] [log] [blame]
/*
* Copyright (C) 2018 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 android.telephony.ims;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.aidl.IImsMmTelFeature;
import android.telephony.ims.aidl.IImsServiceController;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsFeatureConfiguration;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.SparseArray;
import com.android.ims.ImsManager;
import com.android.ims.internal.IImsFeatureStatusCallback;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
/**
* Unit tests for ImsService
*/
@RunWith(AndroidJUnit4.class)
public class ImsServiceTest {
private static final int TEST_SLOT_0 = 0;
private static final int TEST_SLOT_1 = 1;
private TestImsService mTestImsService;
private IImsServiceController mTestImsServiceBinder;
private Context mMockContext;
private IImsFeatureStatusCallback mTestCallback;
@Before
public void setUp() throws Exception {
mMockContext = mock(Context.class);
mTestCallback = mock(IImsFeatureStatusCallback.class);
mTestImsService = new TestImsService(mMockContext);
mTestImsServiceBinder = (IImsServiceController) mTestImsService.onBind(
new Intent(ImsService.SERVICE_INTERFACE));
}
@After
public void tearDown() throws Exception {
mMockContext = null;
mTestCallback = null;
mTestImsService = null;
mTestImsServiceBinder = null;
}
@Test
@SmallTest
public void testCreateMMTelFeature() throws RemoteException {
IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
mTestImsService.mTestMmTelFeature.sendSetFeatureState(ImsFeature.STATE_READY);
SparseArray<ImsFeature> features = mTestImsService.getFeatures(TEST_SLOT_0);
ImsFeature featureToVerify = features.get(ImsFeature.FEATURE_MMTEL);
MmTelFeature testMMTelFeature = null;
if (featureToVerify instanceof MmTelFeature) {
testMMTelFeature = (MmTelFeature) featureToVerify;
} else {
fail();
}
assertEquals(mTestImsService.mSpyMmTelFeature, testMMTelFeature);
// Verify that upon creating a feature, we assign the callback and get the set feature state
// when querying it.
verify(mTestImsService.mSpyMmTelFeature).addImsFeatureStatusCallback(eq(mTestCallback));
assertEquals(ImsFeature.STATE_READY, f.getFeatureState());
}
@Test
@SmallTest
public void testRemoveMMTelFeature() throws RemoteException {
mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
mTestImsServiceBinder.removeImsFeature(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
mTestCallback);
verify(mTestImsService.mSpyMmTelFeature).onFeatureRemoved();
verify(mTestImsService.mSpyMmTelFeature).removeImsFeatureStatusCallback(mTestCallback);
SparseArray<ImsFeature> features = mTestImsService.getFeatures(TEST_SLOT_0);
assertNull(features.get(ImsFeature.FEATURE_MMTEL));
}
@Test
@SmallTest
public void testCallMethodOnCreatedFeature() throws RemoteException {
IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
f.getUtInterface();
assertTrue(mTestImsService.mTestMmTelFeature.isUtInterfaceCalled);
}
/**
* Tests that the new ImsService still sends the IMS_SERVICE_UP broadcast when the feature is
* set to ready.
*/
@Test
@SmallTest
public void testImsServiceUpSentCompat() throws RemoteException {
mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
mTestImsService.mSpyMmTelFeature.sendSetFeatureState(ImsFeature.STATE_READY);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mMockContext).sendBroadcast(intentCaptor.capture());
try {
// Verify IMS_SERVICE_UP is sent
assertNotNull(intentCaptor.getValue());
verifyServiceUpSent(intentCaptor.getValue());
} catch (IndexOutOfBoundsException e) {
fail("Did not receive all intents");
}
}
/**
* Tests that the new ImsService still sends the IMS_SERVICE_DOWN broadcast when the feature is
* set to initializing.
*/
@Test
@SmallTest
public void testImsServiceDownSentCompatInitializing() throws RemoteException {
mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
mTestImsService.mSpyMmTelFeature.sendSetFeatureState(ImsFeature.STATE_INITIALIZING);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mMockContext).sendBroadcast(intentCaptor.capture());
try {
// IMS_SERVICE_DOWN is sent when the service is STATE_INITIALIZING.
assertNotNull(intentCaptor.getValue());
verifyServiceDownSent(intentCaptor.getValue());
} catch (IndexOutOfBoundsException e) {
fail("Did not receive all intents");
}
}
/**
* Tests that the ImsService will return the correct ImsFeatureConfiguration when queried.
*/
@Test
@SmallTest
public void testQuerySupportedImsFeatures() throws RemoteException {
ImsFeatureConfiguration config = new ImsFeatureConfiguration.Builder()
.addFeature(0, ImsFeature.FEATURE_MMTEL)
.addFeature(0, ImsFeature.FEATURE_RCS)
.build();
mTestImsService.testFeatureConfig = config;
ImsFeatureConfiguration result = mTestImsServiceBinder.querySupportedImsFeatures();
assertEquals(config, result);
}
private void verifyServiceDownSent(Intent testIntent) {
assertEquals(ImsManager.ACTION_IMS_SERVICE_DOWN, testIntent.getAction());
assertEquals(TEST_SLOT_0, testIntent.getIntExtra(ImsManager.EXTRA_PHONE_ID, -1));
}
private void verifyServiceUpSent(Intent testIntent) {
assertEquals(ImsManager.ACTION_IMS_SERVICE_UP, testIntent.getAction());
assertEquals(TEST_SLOT_0, testIntent.getIntExtra(ImsManager.EXTRA_PHONE_ID, -1));
}
}