CdmaInboundSmsHandlerTest.java revision 217d4d9562a9476cf579dfc409b1278a02b18b87
1/* 2 * Copyright (C) 2016 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 17package com.android.internal.telephony.cdma; 18 19import android.content.Intent; 20import android.os.AsyncResult; 21import android.os.HandlerThread; 22import android.os.RemoteException; 23import android.os.UserHandle; 24import android.provider.Telephony; 25import android.telephony.*; 26import android.test.suitebuilder.annotation.SmallTest; 27 28import com.android.internal.telephony.InboundSmsHandler; 29import com.android.internal.telephony.SmsStorageMonitor; 30import com.android.internal.telephony.TelephonyTest; 31import com.android.internal.telephony.cdma.sms.SmsEnvelope; 32import com.android.internal.util.IState; 33import com.android.internal.util.StateMachine; 34 35import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; 36import static org.junit.Assert.*; 37import static org.mockito.Mockito.*; 38 39import org.junit.After; 40import org.junit.Before; 41import org.junit.Test; 42import org.mockito.ArgumentCaptor; 43import org.mockito.Mock; 44 45import java.lang.reflect.Field; 46import java.lang.reflect.Method; 47 48public class CdmaInboundSmsHandlerTest extends TelephonyTest { 49 @Mock 50 private SmsStorageMonitor mSmsStorageMonitor; 51 @Mock 52 private android.telephony.SmsMessage mSmsMessage; 53 @Mock 54 private SmsMessage mCdmaSmsMessage; 55 56 private CdmaInboundSmsHandler mCdmaInboundSmsHandler; 57 private TelephonyManager mTelephonyManager; 58 private SmsEnvelope mSmsEnvelope = new SmsEnvelope(); 59 60 private class CdmaInboundSmsHandlerTestHandler extends HandlerThread { 61 62 private CdmaInboundSmsHandlerTestHandler(String name) { 63 super(name); 64 } 65 66 @Override 67 public void onLooperPrepared() { 68 mCdmaInboundSmsHandler = CdmaInboundSmsHandler.makeInboundSmsHandler(mContext, 69 mSmsStorageMonitor, mPhone, null); 70 setReady(true); 71 } 72 } 73 74 private IState getCurrentState() { 75 try { 76 Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); 77 method.setAccessible(true); 78 return (IState) method.invoke(mCdmaInboundSmsHandler); 79 } catch (Exception e) { 80 fail(e.toString()); 81 return null; 82 } 83 } 84 85 @Before 86 public void setUp() throws Exception { 87 super.setUp("CdmaInboundSmsHandlerTest"); 88 89 Field field = SmsMessage.class.getDeclaredField("mEnvelope"); 90 field.setAccessible(true); 91 field.set(mCdmaSmsMessage, mSmsEnvelope); 92 93 mTelephonyManager = TelephonyManager.from(mContext); 94 doReturn(true).when(mTelephonyManager).getSmsReceiveCapableForPhone(anyInt(), anyBoolean()); 95 doReturn(true).when(mSmsStorageMonitor).isStorageAvailable(); 96 doReturn(mIDeviceIdleController).when(mTelephonyComponentFactory). 97 getIDeviceIdleController(); 98 99 new CdmaInboundSmsHandlerTestHandler(TAG).start(); 100 waitUntilReady(); 101 } 102 103 @After 104 public void tearDown() throws Exception { 105 mCdmaInboundSmsHandler = null; 106 super.tearDown(); 107 } 108 109 private void transitionFromStartupToIdle() { 110 // verify initially in StartupState 111 assertEquals("StartupState", getCurrentState().getName()); 112 113 // trigger transition to IdleState 114 mCdmaInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_START_ACCEPTING_SMS); 115 waitForMs(50); 116 117 assertEquals("IdleState", getCurrentState().getName()); 118 } 119 120 @Test 121 @SmallTest 122 public void testNewSms() { 123 transitionFromStartupToIdle(); 124 125 // send new SMS to state machine and verify that triggers SMS_DELIVER_ACTION 126 byte[] smsPdu = new byte[]{(byte)0xFF, (byte)0xFF, (byte)0xFF}; 127 mSmsMessage.mWrappedSmsMessage = mCdmaSmsMessage; 128 doReturn(smsPdu).when(mCdmaSmsMessage).getPdu(); 129 doReturn(SmsEnvelope.TELESERVICE_WMT).when(mCdmaSmsMessage).getTeleService(); 130 mCdmaInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_NEW_SMS, 131 new AsyncResult(null, mSmsMessage, null)); 132 waitForMs(50); 133 134 ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); 135 verify(mContext).sendBroadcast(intentArgumentCaptor.capture()); 136 assertEquals(Telephony.Sms.Intents.SMS_DELIVER_ACTION, 137 intentArgumentCaptor.getValue().getAction()); 138 assertEquals("WaitingState", getCurrentState().getName()); 139 140 try { 141 doReturn(new int[]{UserHandle.USER_SYSTEM}).when(mIActivityManager).getRunningUserIds(); 142 } catch (RemoteException re) { 143 fail("Unexpected RemoteException: " + re.getStackTrace()); 144 } 145 mContextFixture.sendBroadcastToOrderedBroadcastReceivers(); 146 waitForMs(50); 147 148 intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); 149 verify(mContext, times(2)).sendBroadcast(intentArgumentCaptor.capture()); 150 assertEquals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION, 151 intentArgumentCaptor.getAllValues().get(1).getAction()); 152 assertEquals("WaitingState", getCurrentState().getName()); 153 154 mContextFixture.sendBroadcastToOrderedBroadcastReceivers(); 155 waitForMs(50); 156 157 assertEquals("IdleState", getCurrentState().getName()); 158 } 159} 160