13c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan/*
29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 The Android Open Source Project
33c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan *
43c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
53c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * you may not use this file except in compliance with the License.
63c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * You may obtain a copy of the License at
73c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan *
83c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
93c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan *
103c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * Unless required by applicable law or agreed to in writing, software
113c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
123c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * See the License for the specific language governing permissions and
143c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan * limitations under the License.
153c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan */
163c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
173c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanpackage com.android.internal.telephony.gsm;
183c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
19252459db4495ac41719866035698ae9af152298cJack Yuimport static android.provider.Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG;
20252459db4495ac41719866035698ae9af152298cJack Yu
21252459db4495ac41719866035698ae9af152298cJack Yuimport static org.junit.Assert.assertEquals;
22cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yuimport static org.mockito.Matchers.nullable;
23252459db4495ac41719866035698ae9af152298cJack Yuimport static org.mockito.Mockito.any;
24b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yuimport static org.mockito.Mockito.anyBoolean;
25b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yuimport static org.mockito.Mockito.anyInt;
26b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yuimport static org.mockito.Mockito.doReturn;
27252459db4495ac41719866035698ae9af152298cJack Yuimport static org.mockito.Mockito.eq;
28252459db4495ac41719866035698ae9af152298cJack Yuimport static org.mockito.Mockito.times;
29b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yuimport static org.mockito.Mockito.verify;
30b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yu
31252459db4495ac41719866035698ae9af152298cJack Yuimport android.Manifest;
32252459db4495ac41719866035698ae9af152298cJack Yuimport android.app.Activity;
33252459db4495ac41719866035698ae9af152298cJack Yuimport android.app.AppOpsManager;
34252459db4495ac41719866035698ae9af152298cJack Yuimport android.content.BroadcastReceiver;
353c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport android.content.Intent;
36252459db4495ac41719866035698ae9af152298cJack Yuimport android.os.Handler;
373c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport android.os.HandlerThread;
38252459db4495ac41719866035698ae9af152298cJack Yuimport android.os.UserHandle;
39252459db4495ac41719866035698ae9af152298cJack Yuimport android.provider.Settings;
403c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport android.provider.Telephony;
41516010d13181808ca8205316a419b615e5a9fe5eShuoqimport android.support.test.filters.FlakyTest;
429c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
433c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport com.android.internal.telephony.SmsStorageMonitor;
449c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport com.android.internal.telephony.TelephonyTest;
453c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport com.android.internal.telephony.TelephonyTestUtils;
463c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
473c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport org.junit.After;
483c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport org.junit.Before;
49802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport org.junit.Ignore;
503c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport org.mockito.ArgumentCaptor;
513c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajanimport org.mockito.Mock;
523c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
53252459db4495ac41719866035698ae9af152298cJack Yuimport java.util.List;
54252459db4495ac41719866035698ae9af152298cJack Yu
55802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan@Ignore
569c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yupublic class GsmCellBroadcastHandlerTest extends TelephonyTest {
573c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    @Mock
583c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    private SmsStorageMonitor mSmsStorageMonitor;
593c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    @Mock
603c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    private android.telephony.SmsMessage mSmsMessage;
613c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    @Mock
623c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    private SmsMessage mGsmSmsMessage;
633c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
643c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    private GsmCellBroadcastHandler mGsmCellBroadcastHandler;
657e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private GsmCellBroadcastHandlerTestHandler mGsmCellBroadcastHandlerTestHandler;
663c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
673c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    private class GsmCellBroadcastHandlerTestHandler extends HandlerThread {
683c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
693c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        private GsmCellBroadcastHandlerTestHandler(String name) {
703c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            super(name);
713c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        }
723c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
733c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        @Override
743c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        public void onLooperPrepared() {
759c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mGsmCellBroadcastHandler = GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(
769c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                    mContextFixture.getTestDouble(), mPhone);
779c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            setReady(true);
783c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        }
793c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    }
803c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
813c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    @Before
823c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    public void setUp() throws Exception {
833c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
849c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        super.setUp(getClass().getSimpleName());
853c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
863c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        doReturn(true).when(mTelephonyManager).getSmsReceiveCapableForPhone(anyInt(), anyBoolean());
873c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        doReturn(true).when(mSmsStorageMonitor).isStorageAvailable();
883c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
897e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCellBroadcastHandlerTestHandler =
907e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan                new GsmCellBroadcastHandlerTestHandler(getClass().getSimpleName());
917e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCellBroadcastHandlerTestHandler.start();
925d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan        waitUntilReady();
933c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    }
943c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
953c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    @After
963c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    public void tearDown() throws Exception {
973c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        mGsmCellBroadcastHandler = null;
98ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mGsmCellBroadcastHandlerTestHandler.quit();
999c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        super.tearDown();
1003c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    }
1013c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
102516010d13181808ca8205316a419b615e5a9fe5eShuoq    @FlakyTest
1035d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public void testBroadcastSms() {
104b6e1d01effda7b82b6b539c053f812031cfbbcf1Jack Yu        mContextFixture.putResource(
105252459db4495ac41719866035698ae9af152298cJack Yu                com.android.internal.R.string.config_defaultCellBroadcastReceiverPkg,
106252459db4495ac41719866035698ae9af152298cJack Yu                "fake.cellbroadcastreceiver");
107252459db4495ac41719866035698ae9af152298cJack Yu
108252459db4495ac41719866035698ae9af152298cJack Yu        Settings.Secure.putString(mContext.getContentResolver(),
109252459db4495ac41719866035698ae9af152298cJack Yu                CMAS_ADDITIONAL_BROADCAST_PKG, "another.fake.pkg");
1103c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        mSimulatedCommands.notifyGsmBroadcastSms(new byte[] {
1113c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0xc0, //geographical scope
1123c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0x01, //serial number
1133c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0x01, //serial number
1143c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0x01, //message identifier
1153c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0x01, //message identifier
1163c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan                (byte)0x01
1173c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        });
118252459db4495ac41719866035698ae9af152298cJack Yu        TelephonyTestUtils.waitForMs(100);
1193c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
120252459db4495ac41719866035698ae9af152298cJack Yu        verify(mContextFixture.getTestDouble(), times(2)).sendOrderedBroadcastAsUser(
121252459db4495ac41719866035698ae9af152298cJack Yu                intentArgumentCaptor.capture(), eq(UserHandle.ALL),
122252459db4495ac41719866035698ae9af152298cJack Yu                eq(Manifest.permission.RECEIVE_SMS), eq(AppOpsManager.OP_RECEIVE_SMS),
123cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu                nullable(BroadcastReceiver.class), any(Handler.class), eq(Activity.RESULT_OK),
124cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu                eq(null), eq(null));
125252459db4495ac41719866035698ae9af152298cJack Yu
126252459db4495ac41719866035698ae9af152298cJack Yu        List<Intent> intentList = intentArgumentCaptor.getAllValues();
127252459db4495ac41719866035698ae9af152298cJack Yu
128252459db4495ac41719866035698ae9af152298cJack Yu        assertEquals(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION,
129252459db4495ac41719866035698ae9af152298cJack Yu                intentList.get(0).getAction());
130cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu        assertEquals("another.fake.pkg", intentList.get(0).getPackage());
131252459db4495ac41719866035698ae9af152298cJack Yu
132252459db4495ac41719866035698ae9af152298cJack Yu        assertEquals(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION,
133252459db4495ac41719866035698ae9af152298cJack Yu                intentList.get(1).getAction());
134cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu        assertEquals("fake.cellbroadcastreceiver", intentList.get(1).getPackage());
1353c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    }
1363c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan}
137