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