blob: fb45b88f9974aeec9f3ed5c19177285016d00cba [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.cellbroadcastreceiver.unit;
import static com.android.cellbroadcastreceiver.CellBroadcastAlertAudio.ALERT_AUDIO_TONE_TYPE;
import static com.android.cellbroadcastreceiver.CellBroadcastAlertService.SHOW_NEW_ALERT_ACTION;
import static org.junit.Assert.assertArrayEquals;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import android.content.Intent;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SmsCbCmasInfo;
import android.telephony.SmsCbEtwsInfo;
import android.telephony.SmsCbLocation;
import android.telephony.SmsCbMessage;
import com.android.cellbroadcastreceiver.CellBroadcastAlertAudio;
import com.android.cellbroadcastreceiver.CellBroadcastAlertService;
import com.android.cellbroadcastreceiver.CellBroadcastSettings;
import com.android.internal.telephony.gsm.SmsCbConstants;
import org.junit.After;
import org.junit.Before;
import org.mockito.Mock;
import java.util.ArrayList;
public class CellBroadcastAlertServiceTest extends
CellBroadcastServiceTestCase<CellBroadcastAlertService> {
@Mock
ServiceState mockSS;
public CellBroadcastAlertServiceTest() {
super(CellBroadcastAlertService.class);
}
static SmsCbMessage createMessage(int serialNumber) {
return createMessageForCmasMessageClass(serialNumber,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL, 0);
}
static SmsCbMessage createMessageForCmasMessageClass(int serialNumber,
int serviceCategory, int cmasMessageClass) {
return new SmsCbMessage(1, 2, serialNumber, new SmsCbLocation(), serviceCategory,
"language", "body",
SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, null,
new SmsCbCmasInfo(cmasMessageClass, 2, 3, 4, 5, 6),
0, 1);
}
static SmsCbMessage createCmasMessageWithLanguage(int serialNumber, int serviceCategory,
int cmasMessageClass, String language) {
return new SmsCbMessage(1, 2, serialNumber, new SmsCbLocation(),
serviceCategory, language, "body",
SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, null,
new SmsCbCmasInfo(cmasMessageClass, 2, 3, 4, 5, 6),
0, 1);
}
@Before
public void setUp() throws Exception {
super.setUp();
// No roaming supported by default
doReturn("").when(mMockedSharedPreferences).getString(anyString(), anyString());
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
private static void compareEtwsWarningInfo(SmsCbEtwsInfo info1, SmsCbEtwsInfo info2) {
if (info1 == info2) return;
assertEquals(info1.toString(), info2.toString());
assertArrayEquals(info1.getPrimaryNotificationSignature(),
info2.getPrimaryNotificationSignature());
assertEquals(info1.isPrimary(), info2.isPrimary());
}
private static void compareCmasWarningInfo(SmsCbCmasInfo info1, SmsCbCmasInfo info2) {
if (info1 == info2) return;
assertEquals(info1.getCategory(), info2.getCategory());
assertEquals(info1.getCertainty(), info2.getCertainty());
assertEquals(info1.getMessageClass(), info2.getMessageClass());
assertEquals(info1.getResponseType(), info2.getResponseType());
assertEquals(info1.getSeverity(), info2.getSeverity());
assertEquals(info1.getUrgency(), info2.getUrgency());
}
private static void compareCellBroadCastMessage(SmsCbMessage m1, SmsCbMessage m2) {
if (m1 == m2) return;
assertEquals(m1.getCmasWarningInfo().getMessageClass(),
m2.getCmasWarningInfo().getMessageClass());
compareCmasWarningInfo(m1.getCmasWarningInfo(), m2.getCmasWarningInfo());
compareEtwsWarningInfo(m1.getEtwsWarningInfo(), m2.getEtwsWarningInfo());
assertEquals(m1.getLanguageCode(), m2.getLanguageCode());
assertEquals(m1.getMessageBody(), m2.getMessageBody());
assertEquals(m1.getServiceCategory(), m2.getServiceCategory());
assertEquals(m1.getSerialNumber(), m2.getSerialNumber());
}
private void sendMessage(int serialNumber) {
Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
intent.setAction(Telephony.Sms.Intents.ACTION_SMS_EMERGENCY_CB_RECEIVED);
SmsCbMessage m = createMessage(serialNumber);
sendMessage(m, intent);
}
private void sendMessageForCmasMessageClass(int serialNumber, int cmasMessageClass) {
Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
intent.setAction(Telephony.Sms.Intents.ACTION_SMS_EMERGENCY_CB_RECEIVED);
SmsCbMessage m = createMessageForCmasMessageClass(serialNumber, cmasMessageClass,
cmasMessageClass);
sendMessage(m, intent);
}
private void sendMessageForCmasMessageClassAndLanguage(int serialNumber, int cmasMessageClass,
String language) {
Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
intent.setAction(Telephony.Sms.Intents.ACTION_SMS_EMERGENCY_CB_RECEIVED);
SmsCbMessage m = createCmasMessageWithLanguage(serialNumber, cmasMessageClass,
cmasMessageClass, language);
sendMessage(m, intent);
}
private void sendMessage(SmsCbMessage m, Intent intent) {
intent.putExtra("message", m);
startService(intent);
}
private void waitForServiceIntent() {
waitFor(() -> mServiceIntentToVerify != null);
}
// Test handleCellBroadcastIntent method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testHandleCellBroadcastIntent() {
doReturn(new String[]{"0x1112:rat=gsm, emergency=true"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
sendMessage(987654321);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createMessage(987654321);
compareCellBroadCastMessage(cbm, cbmTest);
}
// Test testHandleCellBroadcastIntentDomesticRoaming method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testHandleCellBroadcastIntentDomesticRoaming() throws Exception {
doReturn(mockSS).when(mMockedTelephonyManager).getServiceState();
NetworkRegistrationInfo mockNeRegInfo = new NetworkRegistrationInfo(
NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING, 0, 0, false,
null, null, "", true, 0, 0, 0);
mockNeRegInfo.setRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC);
doReturn(mockNeRegInfo).when(mockSS).getNetworkRegistrationInfo(anyInt(), anyInt());
doReturn(new String[]{"0x1112:rat=gsm, emergency=true, scope=domestic"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
sendMessage(987654321);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createMessage(987654321);
compareCellBroadCastMessage(cbm, cbmTest);
}
// Test testHandleCellBroadcastIntentInternationalRoaming method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testHandleCellBroadcastIntentInternationalRoaming() throws Exception {
doReturn(mockSS).when(mMockedTelephonyManager).getServiceState();
NetworkRegistrationInfo mockNeRegInfo = new NetworkRegistrationInfo(
NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING, 0, 0, false,
null, null, "", true, 0, 0, 0);
mockNeRegInfo.setRoamingType(ServiceState.ROAMING_TYPE_INTERNATIONAL);
doReturn(mockNeRegInfo).when(mockSS).getNetworkRegistrationInfo(anyInt(), anyInt());
doReturn(new String[]{"0x1112:rat=gsm, emergency=true, scope=international"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
sendMessage(987654321);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createMessage(987654321);
compareCellBroadCastMessage(cbm, cbmTest);
}
// Test testHandleCellBroadcastIntentNonRoaming method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testHandleCellBroadcastIntentNonRoaming() throws Exception {
doReturn(mockSS).when(mMockedTelephonyManager).getServiceState();
NetworkRegistrationInfo mockNeRegInfo = new NetworkRegistrationInfo(
NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME, 0, 0, false,
null, null, "", true, 0, 0, 0);
mockNeRegInfo.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
doReturn(mockNeRegInfo).when(mockSS).getNetworkRegistrationInfo(anyInt(), anyInt());
doReturn(new String[]{"0x1112:rat=gsm, emergency=true, scope=international"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
sendMessage(987654321);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createMessage(987654321);
compareCellBroadCastMessage(cbm, cbmTest);
}
// Test testHandleCellBroadcastIntentNonMatchedScope method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testHandleCellBroadcastIntentNonMatchedScope() throws Exception {
doReturn(mockSS).when(mMockedTelephonyManager).getServiceState();
NetworkRegistrationInfo mockNeRegInfo = new NetworkRegistrationInfo(
NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME, 0, 0, false,
null, null, "", true, 0, 0, 0);
mockNeRegInfo.setRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC);
doReturn(mockNeRegInfo).when(mockSS).getNetworkRegistrationInfo(anyInt(), anyInt());
doReturn(new String[]{"0x1112:rat=gsm, emergency=true, scope=international"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
sendMessage(987654321);
waitForServiceIntent();
assertNull(mServiceIntentToVerify);
}
// Test showNewAlert method
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testShowNewAlert() {
Intent intent = new Intent(mContext, CellBroadcastAlertService.class);
intent.setAction(SHOW_NEW_ALERT_ACTION);
SmsCbMessage message = createMessage(34788612);
intent.putExtra("message", message);
startService(intent);
waitForServiceIntent();
// verify audio service intent
assertEquals(CellBroadcastAlertAudio.ACTION_START_ALERT_AUDIO,
mServiceIntentToVerify.getAction());
assertEquals(CellBroadcastAlertService.AlertType.DEFAULT,
mServiceIntentToVerify.getSerializableExtra(ALERT_AUDIO_TONE_TYPE));
assertEquals(message.getMessageBody(),
mServiceIntentToVerify.getStringExtra(
CellBroadcastAlertAudio.ALERT_AUDIO_MESSAGE_BODY));
// verify alert dialog activity intent
ArrayList<SmsCbMessage> newMessageList = mActivityIntentToVerify
.getParcelableArrayListExtra(CellBroadcastAlertService.SMS_CB_MESSAGE_EXTRA);
assertEquals(1, newMessageList.size());
assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK,
(mActivityIntentToVerify.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK));
compareCellBroadCastMessage(message, newMessageList.get(0));
}
// Test showNewAlert method with a CMAS child abduction alert, using the default language code
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testShowNewAlertChildAbductionWithDefaultLanguage() {
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
doReturn(new String[]{"0x111B:rat=gsm, emergency=true"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
doReturn("").when(mResources).getString(anyInt());
sendMessageForCmasMessageClass(34788613,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createMessageForCmasMessageClass(34788613,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY);
compareCellBroadCastMessage(cbm, cbmTest);
}
// Test showNewAlert method with a CMAS child abduction alert
@InstrumentationTest
// This test has a module dependency, so it is disabled for OEM testing because it is not a true
// unit test
public void testShowNewAlertChildAbduction() {
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
enablePreference(CellBroadcastSettings.KEY_RECEIVE_CMAS_IN_SECOND_LANGUAGE);
final String language = "es";
doReturn(new String[]{"0x111B:rat=gsm, emergency=true, filter_language=true"})
.when(mResources).getStringArray(
eq(com.android.cellbroadcastreceiver.R.array.etws_alerts_range_strings));
doReturn(language).when(mResources).getString(anyInt());
sendMessageForCmasMessageClassAndLanguage(34788614,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY, language);
waitForServiceIntent();
assertEquals(SHOW_NEW_ALERT_ACTION, mServiceIntentToVerify.getAction());
SmsCbMessage cbmTest = (SmsCbMessage) mServiceIntentToVerify.getExtras().get("message");
SmsCbMessage cbm = createCmasMessageWithLanguage(34788614,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY,
SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY, language);
compareCellBroadCastMessage(cbm, cbmTest);
}
public void testShouldDisplayMessage() {
sendMessage(1);
waitForServiceIntent();
CellBroadcastAlertService cellBroadcastAlertService =
(CellBroadcastAlertService) getService();
// shouldDisplayMessage should return true for ETWS message
SmsCbEtwsInfo etwsInfo = new SmsCbEtwsInfo(SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE, true,
true, true, null);
SmsCbMessage message = new SmsCbMessage(1, 2, 3, new SmsCbLocation(),
SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE,
"language", "body",
SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, etwsInfo,
null, 0, 1);
enablePreference(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE);
assertNotNull("Message should have non-null ETWS info", message.getEtwsWarningInfo());
assertTrue("Message should be ETWS message", message.isEtwsMessage());
assertTrue("Should display ETWS message",
cellBroadcastAlertService.shouldDisplayMessage(message));
}
}