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 17 package com.android.cellbroadcastreceiver.unit; 18 19 import static com.android.internal.telephony.cdma.sms.SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY; 20 import static com.android.internal.telephony.cdma.sms.SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT; 21 import static com.android.internal.telephony.cdma.sms.SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT; 22 import static com.android.internal.telephony.cdma.sms.SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT; 23 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY; 24 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE; 25 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED; 26 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE; 27 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY; 28 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE; 29 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED; 30 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE; 31 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL; 32 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE; 33 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY; 34 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE; 35 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING; 36 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING; 37 import static com.android.internal.telephony.gsm.SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE; 38 39 import static org.mockito.Matchers.anyInt; 40 import static org.mockito.Matchers.anyString; 41 import static org.mockito.Mockito.doReturn; 42 import static org.mockito.Mockito.timeout; 43 import static org.mockito.Mockito.verify; 44 45 import android.content.Intent; 46 import android.os.IBinder; 47 import android.telephony.SmsCbMessage; 48 49 import androidx.test.filters.FlakyTest; 50 51 import com.android.cellbroadcastreceiver.CellBroadcastConfigService; 52 import com.android.cellbroadcastreceiver.CellBroadcastSettings; 53 import com.android.internal.telephony.ISms; 54 55 import org.junit.After; 56 import org.junit.Before; 57 import org.mockito.ArgumentCaptor; 58 import org.mockito.Captor; 59 import org.mockito.Mock; 60 61 public class CellBroadcastBootupConfigTest extends 62 CellBroadcastServiceTestCase<CellBroadcastConfigService> { 63 64 @Mock 65 ISms.Stub mSmsService; 66 @Mock 67 IBinder mIBinder; 68 69 @Captor 70 private ArgumentCaptor<Integer> mStartIds; 71 72 @Captor 73 private ArgumentCaptor<Integer> mEndIds; 74 75 @Captor 76 private ArgumentCaptor<Integer> mTypes; 77 CellBroadcastBootupConfigTest()78 public CellBroadcastBootupConfigTest() { 79 super(CellBroadcastConfigService.class); 80 } 81 82 @Before setUp()83 public void setUp() throws Exception { 84 super.setUp(); 85 86 doReturn(mSmsService).when(mSmsService).queryLocalInterface(anyString()); 87 doReturn(mIBinder).when(mSmsService).asBinder(); 88 mMockedServiceManager.replaceService("isms", mSmsService); 89 putResources(com.android.cellbroadcastreceiver.R.array 90 .cmas_presidential_alerts_channels_range_strings, new String[]{ 91 "0x1112-0x1112:rat=gsm", 92 "0x1000-0x1000:rat=cdma", 93 "0x111F-0x111F:rat=gsm", 94 }); 95 putResources(com.android.cellbroadcastreceiver.R.array 96 .cmas_alert_extreme_channels_range_strings, new String[]{ 97 "0x1113-0x1114:rat=gsm", 98 "0x1001-0x1001:rat=cdma", 99 "0x1120-0x1121:rat=gsm", 100 }); 101 putResources(com.android.cellbroadcastreceiver.R.array 102 .cmas_alerts_severe_range_strings, new String[]{ 103 "0x1115-0x111A:rat=gsm", 104 "0x1002-0x1002:rat=cdma", 105 "0x1122-0x1127:rat=gsm", 106 }); 107 putResources(com.android.cellbroadcastreceiver.R.array 108 .cmas_amber_alerts_channels_range_strings, new String[]{ 109 "0x111B-0x111B:rat=gsm", 110 "0x1003-0x1003:rat=cdma", 111 "0x1128-0x1128:rat=gsm", 112 }); 113 putResources(com.android.cellbroadcastreceiver.R.array 114 .etws_alerts_range_strings, new String[]{ 115 "0x1100-0x1102:rat=gsm", 116 "0x1104-0x1104:rat=gsm", 117 }); 118 } 119 120 @After tearDown()121 public void tearDown() throws Exception { 122 super.tearDown(); 123 } 124 125 private static class CbConfig { 126 final int startId; 127 final int endId; 128 final int type; 129 CbConfig(int startId, int endId, int type)130 CbConfig(int startId, int endId, int type) { 131 this.startId = startId; 132 this.endId = endId; 133 this.type = type; 134 } 135 } 136 137 // Test if CellbroadcastConfigService properly configure all the required channels. 138 139 @FlakyTest testConfiguration()140 public void testConfiguration() throws Exception { 141 String[] preferenceKeys = { 142 CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, 143 CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, 144 CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, 145 CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, 146 CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES, 147 CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, 148 }; 149 for (String key : preferenceKeys) { 150 enablePreference(key); 151 } 152 153 Intent intent = new Intent(mContext, CellBroadcastConfigService.class); 154 intent.setAction(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS); 155 156 startService(intent); 157 158 CbConfig[] configs = new CbConfig[] { 159 new CbConfig(MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL, 160 MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL, 161 SmsCbMessage.MESSAGE_FORMAT_3GPP), 162 new CbConfig(SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, 163 SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, 164 SmsCbMessage.MESSAGE_FORMAT_3GPP2), 165 new CbConfig(MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE, 166 MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE, 167 SmsCbMessage.MESSAGE_FORMAT_3GPP), 168 new CbConfig(MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED, 169 MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY, 170 SmsCbMessage.MESSAGE_FORMAT_3GPP), 171 new CbConfig(SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 172 SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 173 SmsCbMessage.MESSAGE_FORMAT_3GPP2), 174 new CbConfig(MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE, 175 MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE, 176 SmsCbMessage.MESSAGE_FORMAT_3GPP), 177 new CbConfig(MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED, 178 MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY, 179 SmsCbMessage.MESSAGE_FORMAT_3GPP), 180 new CbConfig(SERVICE_CATEGORY_CMAS_SEVERE_THREAT, 181 SERVICE_CATEGORY_CMAS_SEVERE_THREAT, 182 SmsCbMessage.MESSAGE_FORMAT_3GPP2), 183 new CbConfig(MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE, 184 MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE, 185 SmsCbMessage.MESSAGE_FORMAT_3GPP), 186 new CbConfig(MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY, 187 MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY, 188 SmsCbMessage.MESSAGE_FORMAT_3GPP), 189 new CbConfig(SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, 190 SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, 191 SmsCbMessage.MESSAGE_FORMAT_3GPP2), 192 new CbConfig(MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE, 193 MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE, 194 SmsCbMessage.MESSAGE_FORMAT_3GPP), 195 new CbConfig(MESSAGE_ID_ETWS_EARTHQUAKE_WARNING, 196 MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING, 197 SmsCbMessage.MESSAGE_FORMAT_3GPP), 198 new CbConfig(MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE, 199 MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE, 200 SmsCbMessage.MESSAGE_FORMAT_3GPP), 201 }; 202 203 verify(mSmsService, timeout(10000).times(configs.length)) 204 .enableCellBroadcastRangeForSubscriber( 205 anyInt(), mStartIds.capture(), mEndIds.capture(), mTypes.capture()); 206 207 for (int i = 0; i < configs.length; i++) { 208 assertEquals("i=" + i, configs[i].startId, mStartIds.getAllValues().get(i).intValue()); 209 assertEquals("i=" + i, configs[i].endId, mEndIds.getAllValues().get(i).intValue()); 210 assertEquals("i=" + i, configs[i].type, mTypes.getAllValues().get(i).intValue()); 211 } 212 } 213 }