1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.telephony.ims; 18 19 import static junit.framework.Assert.assertEquals; 20 import static junit.framework.Assert.assertTrue; 21 22 import static org.mockito.ArgumentMatchers.any; 23 import static org.mockito.ArgumentMatchers.eq; 24 import static org.mockito.Mockito.spy; 25 import static org.mockito.Mockito.verify; 26 27 import android.os.Handler; 28 import android.os.Looper; 29 import android.os.Message; 30 import android.os.Messenger; 31 import android.telecom.TelecomManager; 32 import android.telephony.ims.aidl.IImsCapabilityCallback; 33 import android.telephony.ims.aidl.IImsMmTelFeature; 34 import android.telephony.ims.feature.MmTelFeature; 35 import android.telephony.ims.stub.ImsCallSessionImplBase; 36 import android.test.suitebuilder.annotation.SmallTest; 37 38 import androidx.test.runner.AndroidJUnit4; 39 40 import com.android.ims.internal.IImsCallSession; 41 import com.android.internal.telephony.ims.ImsTestBase; 42 43 import org.junit.After; 44 import org.junit.Before; 45 import org.junit.Test; 46 import org.junit.runner.RunWith; 47 import org.mockito.ArgumentCaptor; 48 import org.mockito.Mockito; 49 50 @RunWith(AndroidJUnit4.class) 51 public class MmTelFeatureTests extends ImsTestBase { 52 53 // Public for Mockito testing 54 public class CapabilityCallback extends IImsCapabilityCallback.Stub { 55 56 @Override onQueryCapabilityConfiguration(int capability, int radioTech, boolean enabled)57 public void onQueryCapabilityConfiguration(int capability, int radioTech, boolean enabled) { 58 59 } 60 61 @Override onChangeCapabilityConfigurationError(int capability, int radioTech, int reason)62 public void onChangeCapabilityConfigurationError(int capability, int radioTech, 63 int reason) { 64 65 } 66 67 @Override onCapabilitiesStatusChanged(int config)68 public void onCapabilitiesStatusChanged(int config) { 69 70 } 71 } 72 73 private static final int TEST_CAPABILITY = 1; 74 private static final int TEST_RADIO_TECH = 0; 75 76 private static final int TEST_TTY_RESULT = 0; 77 private static final int TEST_SEND_DTMF_RESULT = 1; 78 private static final int TEST_RESULT_MAX = 2; 79 80 private static final int TEST_RESULT_DELAY_MS = 5000; 81 82 private android.telephony.ims.TestMmTelFeature mFeature; 83 private IImsMmTelFeature mFeatureBinder; 84 private CapabilityCallback mCapabilityCallback; 85 private MmTelFeature.Listener mListener; 86 87 // set to true when the handler receives a message back from the Feature. 88 private boolean[] mHandlerResults; 89 90 private class TestHandler extends Handler { 91 TestHandler(Looper looper)92 TestHandler(Looper looper) { 93 super(looper); 94 } 95 96 @Override handleMessage(Message msg)97 public void handleMessage(Message msg) { 98 switch (msg.what) { 99 case TEST_TTY_RESULT: 100 mHandlerResults[TEST_TTY_RESULT] = true; 101 break; 102 case TEST_SEND_DTMF_RESULT: 103 mHandlerResults[TEST_SEND_DTMF_RESULT] = true; 104 break; 105 } 106 } 107 } 108 private final Handler mHandler = new TestHandler(Looper.getMainLooper()); 109 private final Messenger mHandlerMessenger = new Messenger(mHandler); 110 111 @Before setup()112 public void setup() throws Exception { 113 super.setUp(); 114 mFeature = new TestMmTelFeature(); 115 mFeatureBinder = mFeature.getBinder(); 116 mCapabilityCallback = spy(new CapabilityCallback()); 117 mListener = spy(new MmTelFeature.Listener()); 118 mFeatureBinder.setListener(mListener); 119 mHandlerResults = new boolean[TEST_RESULT_MAX]; 120 } 121 122 @After tearDown()123 public void tearDown() { 124 mFeature = null; 125 mFeatureBinder = null; 126 } 127 128 @SmallTest 129 @Test testQueryCapabilityConfiguration()130 public void testQueryCapabilityConfiguration() throws Exception { 131 mFeature.queryConfigurationResult = true; 132 133 mFeatureBinder.queryCapabilityConfiguration(TEST_CAPABILITY, TEST_RADIO_TECH, 134 mCapabilityCallback); 135 136 verify(mCapabilityCallback).onQueryCapabilityConfiguration(eq(TEST_CAPABILITY), 137 eq(TEST_RADIO_TECH), eq(true)); 138 } 139 140 @SmallTest 141 @Test testNewIncomingCall()142 public void testNewIncomingCall() throws Exception { 143 IImsCallSession sessionBinder = Mockito.mock(IImsCallSession.class); 144 ImsCallSessionImplBase session = new ImsCallSessionImplBase(); 145 session.setServiceImpl(sessionBinder); 146 147 mFeature.incomingCall(session); 148 ArgumentCaptor<IImsCallSession> captor = ArgumentCaptor.forClass(IImsCallSession.class); 149 verify(mListener).onIncomingCall(captor.capture(), any()); 150 151 assertEquals(sessionBinder, captor.getValue()); 152 } 153 154 @SmallTest 155 @Test testSetTtyMessageMessenger()156 public void testSetTtyMessageMessenger() throws Exception { 157 Message resultMessage = Message.obtain(mHandler, TEST_TTY_RESULT); 158 resultMessage.replyTo = mHandlerMessenger; 159 mFeatureBinder.setUiTtyMode(TelecomManager.TTY_MODE_FULL, resultMessage); 160 waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); 161 assertTrue(mHandlerResults[TEST_TTY_RESULT]); 162 } 163 164 @SmallTest 165 @Test testSendDtmfMessageMessenger()166 public void testSendDtmfMessageMessenger() throws Exception { 167 Message resultMessage = Message.obtain(mHandler, TEST_SEND_DTMF_RESULT); 168 resultMessage.replyTo = mHandlerMessenger; 169 IImsCallSession callSession = mFeatureBinder.createCallSession(null); 170 callSession.sendDtmf('0', resultMessage); 171 waitForHandlerAction(mHandler, TEST_RESULT_DELAY_MS); 172 assertTrue(mHandlerResults[TEST_SEND_DTMF_RESULT]); 173 } 174 } 175