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