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