10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2012 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cdma; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 19e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajanimport android.hardware.radio.V1_0.CdmaSmsMessage; 20e73ef117c8f5a7ea2feaa9ba8a15ec2de4137c7dJordan Liuimport android.support.test.filters.FlakyTest; 21cc940f429180765b6072a071becae8117e665954Amit Mahajanimport android.telephony.Rlog; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SmsCbCmasInfo; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SmsCbMessage; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.cdma.CdmaSmsCbProgramData; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.AndroidTestCase; 268fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajanimport android.test.suitebuilder.annotation.SmallTest; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.GsmAlphabet; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.BearerData; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.CdmaSmsAddress; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.SmsEnvelope; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.UserData; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.BitwiseOutputStream; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 35cc940f429180765b6072a071becae8117e665954Amit Mahajanimport org.junit.Ignore; 368fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajanimport org.junit.Test; 378fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Random; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test cases for basic SmsCbMessage operation for CDMA. 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CdmaSmsCbTest extends AndroidTestCase { 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* Copy of private subparameter identifier constants from BearerData class. */ 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte SUBPARAM_MESSAGE_IDENTIFIER = (byte) 0x00; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte SUBPARAM_USER_DATA = (byte) 0x01; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte SUBPARAM_PRIORITY_INDICATOR = (byte) 0x08; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte SUBPARAM_LANGUAGE_INDICATOR = (byte) 0x0D; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte SUBPARAM_SERVICE_CATEGORY_PROGRAM_DATA = 0x12; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initialize a Parcel for an incoming CDMA cell broadcast. The caller will write the 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * bearer data and then convert it to an SmsMessage. 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param serviceCategory the CDMA service category 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the initialized Parcel 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 60e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan private static CdmaSmsMessage createBroadcastParcel(int serviceCategory) { 61e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage msg = new CdmaSmsMessage(); 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 63e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.teleserviceId = SmsEnvelope.TELESERVICE_NOT_SET; 64e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.isServicePresent = true; 65e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.serviceCategory = serviceCategory; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // dummy address (RIL may generate a different dummy address for broadcasts) 68e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.digitMode = CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF; 69e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberMode = CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK; 70e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberType = CdmaSmsAddress.TON_UNKNOWN; 71e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberPlan = CdmaSmsAddress.NUMBERING_PLAN_ISDN_TELEPHONY; 72e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.subAddress.subaddressType = 0; 73e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.subAddress.odd = false; 74e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan return msg; 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initialize a BitwiseOutputStream with the CDMA bearer data subparameters except for 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * user data. The caller will append the user data and add it to the parcel. 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param messageId the 16-bit message identifier 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param priority message priority 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param language message language code 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the initialized BitwiseOutputStream 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static BitwiseOutputStream createBearerDataStream(int messageId, int priority, 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int language) throws BitwiseOutputStream.AccessException { 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = new BitwiseOutputStream(10); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_MESSAGE_IDENTIFIER); 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 3); // length: 3 bytes 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, BearerData.MESSAGE_TYPE_DELIVER); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, ((messageId >>> 8) & 0xff)); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (messageId & 0xff)); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(1, 0); // no User Data Header 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(3, 0); // reserved 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (priority != -1) { 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_PRIORITY_INDICATOR); 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 1); // length: 1 byte 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(2, (priority & 0x03)); 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(6, 0); // reserved 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (language != -1) { 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_LANGUAGE_INDICATOR); 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 1); // length: 1 byte 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (language & 0xff)); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return bos; 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Write the bearer data array to the parcel, then return a new SmsMessage from the parcel. 114e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan * @param msg CdmaSmsMessage containing the CDMA SMS headers 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param bearerData the bearer data byte array to append to the parcel 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the new SmsMessage created from the parcel 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 118e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan private static SmsMessage createMessageFromParcel(CdmaSmsMessage msg, byte[] bearerData) { 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (byte b : bearerData) { 120e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.bearerData.add(b); 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 122f7dc5ac00bf6b0a82ba7ba5711d394191392eb15Nathan Harold SmsMessage message = SmsMessageConverter.newCdmaSmsMessageFromRil(msg); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return message; 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Create a parcel for an incoming CMAS broadcast, then return a new SmsMessage created 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * from the parcel. 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param serviceCategory the CDMA service category 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param messageId the 16-bit message identifier 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param priority message priority 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param language message language code 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param body message body 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmasCategory CMAS category (or -1 to skip adding CMAS type 1 elements record) 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param responseType CMAS response type 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param severity CMAS severity 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param urgency CMAS urgency 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param certainty CMAS certainty 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the newly created SmsMessage object 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static SmsMessage createCmasSmsMessage(int serviceCategory, int messageId, int priority, 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int language, int encoding, String body, int cmasCategory, int responseType, 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int severity, int urgency, int certainty) throws Exception { 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream cmasBos = new BitwiseOutputStream(10); 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, 0); // CMAE protocol version 0 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (body != null) { 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, 0); // Type 0 elements (alert text) 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodeBody(encoding, body, true, cmasBos); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmasCategory != SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN) { 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, 1); // Type 1 elements 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, 4); // length: 4 bytes 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, (cmasCategory & 0xff)); 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(8, (responseType & 0xff)); 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(4, (severity & 0x0f)); 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(4, (urgency & 0x0f)); 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(4, (certainty & 0x0f)); 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmasBos.write(4, 0); // pad to octet boundary 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] cmasUserData = cmasBos.toByteArray(); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 165e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage msg = createBroadcastParcel(serviceCategory); 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = createBearerDataStream(messageId, priority, language); 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_USER_DATA); 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, cmasUserData.length + 2); // add 2 bytes for msg_encoding and num_fields 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, UserData.ENCODING_OCTET); 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, cmasUserData.length); 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.writeByteArray(cmasUserData.length * 8, cmasUserData); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(3, 0); // pad to byte boundary 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 175e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan return createMessageFromParcel(msg, bos.toByteArray()); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Create a parcel for an incoming CDMA cell broadcast, then return a new SmsMessage created 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * from the parcel. 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param serviceCategory the CDMA service category 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param messageId the 16-bit message identifier 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param priority message priority 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param language message language code 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param encoding user data encoding method 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param body the message body 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the newly created SmsMessage object 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static SmsMessage createBroadcastSmsMessage(int serviceCategory, int messageId, 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int priority, int language, int encoding, String body) throws Exception { 191e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage msg = createBroadcastParcel(serviceCategory); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = createBearerDataStream(messageId, priority, language); 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_USER_DATA); 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodeBody(encoding, body, false, bos); 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 197e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan return createMessageFromParcel(msg, bos.toByteArray()); 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Append the message length, encoding, and body to the BearerData output stream. 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is used for writing the User Data subparameter for non-CMAS broadcasts and for 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * writing the alert text for CMAS broadcasts. 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param encoding one of the CDMA UserData encoding values 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param body the message body 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param isCmasRecord true if this is a CMAS type 0 elements record; false for user data 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param bos the BitwiseOutputStream to write to 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws Exception on any encoding error 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static void encodeBody(int encoding, String body, boolean isCmasRecord, 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos) throws Exception { 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (encoding == UserData.ENCODING_7BIT_ASCII || encoding == UserData.ENCODING_IA5) { 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int charCount = body.length(); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordBits = (charCount * 7) + 5; // add 5 bits for char set field 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordOctets = (recordBits + 7) / 8; // round up to octet boundary 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int padBits = (recordOctets * 8) - recordBits; 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordOctets++; // add 8 bits for num_fields 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, recordOctets); 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, (encoding & 0x1f)); 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, charCount); 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < charCount; i++) { 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(7, body.charAt(i)); 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(padBits, 0); // pad to octet boundary 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (encoding == UserData.ENCODING_GSM_7BIT_ALPHABET 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville || encoding == UserData.ENCODING_GSM_DCS) { 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // convert to 7-bit packed encoding with septet count in index 0 of byte array 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] encodedBody = GsmAlphabet.stringToGsm7BitPacked(body); 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int charCount = encodedBody[0]; // septet count 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordBits = (charCount * 7) + 5; // add 5 bits for char set field 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordOctets = (recordBits + 7) / 8; // round up to octet boundary 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int padBits = (recordOctets * 8) - recordBits; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordOctets++; // add 8 bits for num_fields 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (encoding == UserData.ENCODING_GSM_DCS) { 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordOctets++; // add 8 bits for DCS (message type) 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, recordOctets); 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, (encoding & 0x1f)); 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord && encoding == UserData.ENCODING_GSM_DCS) { 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 0); // GSM DCS: 7 bit default alphabet, no msg class 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, charCount); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] bodySeptets = Arrays.copyOfRange(encodedBody, 1, encodedBody.length); 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.writeByteArray(charCount * 7, bodySeptets); 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(padBits, 0); // pad to octet boundary 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (encoding == UserData.ENCODING_IS91_EXTENDED_PROTOCOL) { 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 6 bit packed encoding with 0x20 offset (ASCII 0x20 - 0x60) 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int charCount = body.length(); 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordBits = (charCount * 6) + 21; // add 21 bits for header fields 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordOctets = (recordBits + 7) / 8; // round up to octet boundary 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int padBits = (recordOctets * 8) - recordBits; 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, recordOctets); 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, (encoding & 0x1f)); 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, UserData.IS91_MSG_TYPE_SHORT_MESSAGE); 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, charCount); 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < charCount; i++) { 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(6, ((int) body.charAt(i) - 0x20)); 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(padBits, 0); // pad to octet boundary 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] encodedBody; 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (encoding) { 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case UserData.ENCODING_UNICODE_16: 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodedBody = body.getBytes("UTF-16BE"); 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case UserData.ENCODING_SHIFT_JIS: 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodedBody = body.getBytes("Shift_JIS"); 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case UserData.ENCODING_KOREAN: 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodedBody = body.getBytes("KSC5601"); 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case UserData.ENCODING_LATIN_HEBREW: 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodedBody = body.getBytes("ISO-8859-8"); 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case UserData.ENCODING_LATIN: 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville encodedBody = body.getBytes("ISO-8859-1"); 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int charCount = body.length(); // use actual char count for num fields 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int recordOctets = encodedBody.length + 1; // add 1 byte for encoding and pad bits 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordOctets++; // add 8 bits for num_fields 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, recordOctets); 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, (encoding & 0x1f)); 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isCmasRecord) { 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, charCount); 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.writeByteArray(encodedBody.length * 8, encodedBody); 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(3, 0); // pad to octet boundary 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String TEST_TEXT = "This is a test CDMA cell broadcast message..." 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + "678901234567890123456789012345678901234567890"; 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String PRES_ALERT = 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "THE PRESIDENT HAS ISSUED AN EMERGENCY ALERT. CHECK LOCAL MEDIA FOR MORE DETAILS"; 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String EXTREME_ALERT = "FLASH FLOOD WARNING FOR SOUTH COCONINO COUNTY" 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " - NORTH CENTRAL ARIZONA UNTIL 415 PM MST"; 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String SEVERE_ALERT = "SEVERE WEATHER WARNING FOR SOMERSET COUNTY" 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " - NEW JERSEY UNTIL 415 PM MST"; 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String AMBER_ALERT = 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "AMBER ALERT:Mountain View,CA VEH'07 Blue Honda Civic CA LIC 5ABC123"; 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String MONTHLY_TEST_ALERT = "This is a test of the emergency alert system." 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " This is only a test. 89012345678901234567890"; 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String IS91_TEXT = "IS91 SHORT MSG"; // max length 14 chars 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Verify that the SmsCbMessage has the correct values for CDMA. 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cbMessage the message to test 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static void verifyCbValues(SmsCbMessage cbMessage) { 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_FORMAT_3GPP2, cbMessage.getMessageFormat()); 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.GEOGRAPHICAL_SCOPE_PLMN_WIDE, cbMessage.getGeographicalScope()); 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(false, cbMessage.isEtwsMessage()); // ETWS on CDMA not currently supported 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static void doTestNonEmergencyBroadcast(int encoding) throws Exception { 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createBroadcastSmsMessage(123, 456, BearerData.PRIORITY_NORMAL, 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BearerData.LANGUAGE_ENGLISH, encoding, TEST_TEXT); 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville verifyCbValues(cbMessage); 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(123, cbMessage.getServiceCategory()); 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(456, cbMessage.getSerialNumber()); 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_PRIORITY_NORMAL, cbMessage.getMessagePriority()); 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("en", cbMessage.getLanguageCode()); 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(TEST_TEXT, cbMessage.getMessageBody()); 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(false, cbMessage.isEmergencyMessage()); 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(false, cbMessage.isCmasMessage()); 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3668fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testNonEmergencyBroadcast7bitAscii() throws Exception { 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestNonEmergencyBroadcast(UserData.ENCODING_7BIT_ASCII); 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3718fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testNonEmergencyBroadcast7bitGsm() throws Exception { 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestNonEmergencyBroadcast(UserData.ENCODING_GSM_7BIT_ALPHABET); 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3768fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testNonEmergencyBroadcast16bitUnicode() throws Exception { 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestNonEmergencyBroadcast(UserData.ENCODING_UNICODE_16); 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3818fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testNonEmergencyBroadcastIs91Extended() throws Exception { 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // IS-91 doesn't support language or priority subparameters, max 14 chars text 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createBroadcastSmsMessage(987, 654, -1, -1, 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UserData.ENCODING_IS91_EXTENDED_PROTOCOL, IS91_TEXT); 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville verifyCbValues(cbMessage); 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(987, cbMessage.getServiceCategory()); 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(654, cbMessage.getSerialNumber()); 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_PRIORITY_NORMAL, cbMessage.getMessagePriority()); 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(null, cbMessage.getLanguageCode()); 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(IS91_TEXT, cbMessage.getMessageBody()); 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(false, cbMessage.isEmergencyMessage()); 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(false, cbMessage.isCmasMessage()); 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static void doTestCmasBroadcast(int serviceCategory, int messageClass, String body) 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws Exception { 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createCmasSmsMessage( 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville serviceCategory, 1234, BearerData.PRIORITY_EMERGENCY, BearerData.LANGUAGE_ENGLISH, 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UserData.ENCODING_7BIT_ASCII, body, -1, -1, -1, -1, -1); 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville verifyCbValues(cbMessage); 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(serviceCategory, cbMessage.getServiceCategory()); 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(1234, cbMessage.getSerialNumber()); 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, cbMessage.getMessagePriority()); 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("en", cbMessage.getLanguageCode()); 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(body, cbMessage.getMessageBody()); 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isEmergencyMessage()); 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isCmasMessage()); 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo cmasInfo = cbMessage.getCmasWarningInfo(); 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(messageClass, cmasInfo.getMessageClass()); 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN, cmasInfo.getCategory()); 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, cmasInfo.getResponseType()); 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN, cmasInfo.getSeverity()); 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, cmasInfo.getUrgency()); 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN, cmasInfo.getCertainty()); 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4228fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasPresidentialAlert() throws Exception { 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestCmasBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT, PRES_ALERT); 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4288fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasExtremeAlert() throws Exception { 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestCmasBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT, EXTREME_ALERT); 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4348fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasSevereAlert() throws Exception { 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestCmasBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT, SEVERE_ALERT); 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4408fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasAmberAlert() throws Exception { 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestCmasBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY, AMBER_ALERT); 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4468fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasTestMessage() throws Exception { 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville doTestCmasBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST, MONTHLY_TEST_ALERT); 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4528fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasExtremeAlertType1Elements() throws Exception { 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createCmasSmsMessage(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5678, BearerData.PRIORITY_EMERGENCY, BearerData.LANGUAGE_ENGLISH, 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UserData.ENCODING_7BIT_ASCII, EXTREME_ALERT, SmsCbCmasInfo.CMAS_CATEGORY_ENV, 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_RESPONSE_TYPE_MONITOR, SmsCbCmasInfo.CMAS_SEVERITY_SEVERE, 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY); 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville verifyCbValues(cbMessage); 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cbMessage.getServiceCategory()); 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(5678, cbMessage.getSerialNumber()); 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, cbMessage.getMessagePriority()); 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("en", cbMessage.getLanguageCode()); 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(EXTREME_ALERT, cbMessage.getMessageBody()); 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isEmergencyMessage()); 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isCmasMessage()); 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo cmasInfo = cbMessage.getCmasWarningInfo(); 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT, cmasInfo.getMessageClass()); 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CATEGORY_ENV, cmasInfo.getCategory()); 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_RESPONSE_TYPE_MONITOR, cmasInfo.getResponseType()); 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_SEVERITY_SEVERE, cmasInfo.getSeverity()); 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_URGENCY_EXPECTED, cmasInfo.getUrgency()); 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY, cmasInfo.getCertainty()); 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // VZW requirement is to discard message with unsupported charset. Verify that we return null 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for this unsupported character set. 48192428df50d736a3d1d0f32779a22c65fcec0efabJordan Liu @FlakyTest 482cc940f429180765b6072a071becae8117e665954Amit Mahajan @Ignore 483cc940f429180765b6072a071becae8117e665954Amit Mahajan @Test 484cc940f429180765b6072a071becae8117e665954Amit Mahajan @SmallTest 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasUnsupportedCharSet() throws Exception { 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createCmasSmsMessage(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12345, BearerData.PRIORITY_EMERGENCY, BearerData.LANGUAGE_ENGLISH, 48885a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla 0x1F, EXTREME_ALERT, -1, -1, -1, -1, -1); 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull("expected null for unsupported charset", cbMessage); 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // VZW requirement is to discard message with unsupported charset. Verify that we return null 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for this unsupported character set. 4968fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasUnsupportedCharSet2() throws Exception { 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createCmasSmsMessage(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 67890, BearerData.PRIORITY_EMERGENCY, BearerData.LANGUAGE_ENGLISH, 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UserData.ENCODING_KOREAN, EXTREME_ALERT, -1, -1, -1, -1, -1); 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull("expected null for unsupported charset", cbMessage); 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // VZW requirement is to discard message without record type 0. The framework will decode it 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // and the app will discard it. 5088fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testCmasNoRecordType0() throws Exception { 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage msg = createCmasSmsMessage( 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, 1234, 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BearerData.PRIORITY_EMERGENCY, BearerData.LANGUAGE_ENGLISH, 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UserData.ENCODING_7BIT_ASCII, null, -1, -1, -1, -1, -1); 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville verifyCbValues(cbMessage); 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, 5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cbMessage.getServiceCategory()); 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(1234, cbMessage.getSerialNumber()); 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, cbMessage.getMessagePriority()); 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("en", cbMessage.getLanguageCode()); 5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(null, cbMessage.getMessageBody()); 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isEmergencyMessage()); 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(true, cbMessage.isCmasMessage()); 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo cmasInfo = cbMessage.getCmasWarningInfo(); 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT, cmasInfo.getMessageClass()); 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN, cmasInfo.getCategory()); 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN, cmasInfo.getResponseType()); 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN, cmasInfo.getSeverity()); 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN, cmasInfo.getUrgency()); 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN, cmasInfo.getCertainty()); 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Make sure we don't throw an exception if we feed completely random data to BearerStream. 5358fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testRandomBearerStreamData() { 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Random r = new Random(54321); 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int run = 0; run < 1000; run++) { 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = r.nextInt(140); 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] data = new byte[len]; 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < len; i++) { 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville data[i] = (byte) r.nextInt(256); 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 544ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville // Rlog.d("CdmaSmsCbTest", "trying random bearer data run " + run + " length " + len); 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int category = 0x0ff0 + r.nextInt(32); // half CMAS, half non-CMAS 547e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage cdmaSmsMessage = createBroadcastParcel(category); 548e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan SmsMessage msg = createMessageFromParcel(cdmaSmsMessage, data); 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with random input, cbMessage will almost always be null (log when it isn't) 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cbMessage != null) { 552ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d("CdmaSmsCbTest", "success: " + cbMessage); 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (Exception e) { 555ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d("CdmaSmsCbTest", "exception thrown", e); 5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fail("Exception in decoder at run " + run + " length " + len + ": " + e); 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Make sure we don't throw an exception if we put random data in the UserData subparam. 5628fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testRandomUserData() { 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Random r = new Random(94040); 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int run = 0; run < 1000; run++) { 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int category = 0x0ff0 + r.nextInt(32); // half CMAS, half non-CMAS 567e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage cdmaSmsMessage = createBroadcastParcel(category); 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = r.nextInt(140); 569ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville // Rlog.d("CdmaSmsCbTest", "trying random user data run " + run + " length " + len); 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = createBearerDataStream(r.nextInt(65536), r.nextInt(4), 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r.nextInt(256)); 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_USER_DATA); 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, len); 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < len; i++) { 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, r.nextInt(256)); 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 582e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan SmsMessage msg = createMessageFromParcel(cdmaSmsMessage, bos.toByteArray()); 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (Exception e) { 585ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d("CdmaSmsCbTest", "exception thrown", e); 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fail("Exception in decoder at run " + run + " length " + len + ": " + e); 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initialize a Parcel for incoming Service Category Program Data teleservice. The caller will 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * write the bearer data and then convert it to an SmsMessage. 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the initialized Parcel 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 596e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan private static CdmaSmsMessage createServiceCategoryProgramDataParcel() { 597e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage msg = new CdmaSmsMessage(); 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 599e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.teleserviceId = SmsEnvelope.TELESERVICE_SCPT; 600e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.isServicePresent = false; 601e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.serviceCategory = 0; 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // dummy address (RIL may generate a different dummy address for broadcasts) 604e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.digitMode = CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF; 605e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberMode = CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK; 606e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberType = CdmaSmsAddress.TON_UNKNOWN; 607e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.address.numberPlan = CdmaSmsAddress.NUMBERING_PLAN_ISDN_TELEPHONY; 608e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.subAddress.subaddressType = 0; 609e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan msg.subAddress.odd = false; 610e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan return msg; 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String CAT_EXTREME_THREAT = "Extreme Threat to Life and Property"; 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String CAT_SEVERE_THREAT = "Severe Threat to Life and Property"; 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String CAT_AMBER_ALERTS = "AMBER Alerts"; 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6178fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testServiceCategoryProgramDataAddCategory() throws Exception { 619e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage cdmaSmsMessage = createServiceCategoryProgramDataParcel(); 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = createBearerDataStream(123, -1, -1); 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int categoryNameLength = CAT_EXTREME_THREAT.length(); 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamLengthBits = (53 + (categoryNameLength * 7)); 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamLengthBytes = (subparamLengthBits + 7) / 8; 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamPadBits = (subparamLengthBytes * 8) - subparamLengthBits; 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_SERVICE_CATEGORY_PROGRAM_DATA); 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, subparamLengthBytes); 6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, UserData.ENCODING_7BIT_ASCII); 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY); 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT >>> 8)); 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT & 0xff)); 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, BearerData.LANGUAGE_ENGLISH); 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 100); // max messages 6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.ALERT_OPTION_DEFAULT_ALERT); 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, categoryNameLength); 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < categoryNameLength; i++) { 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(7, CAT_EXTREME_THREAT.charAt(i)); 6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(subparamPadBits, 0); 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 644e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan SmsMessage msg = createMessageFromParcel(cdmaSmsMessage, bos.toByteArray()); 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull(msg); 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville msg.parseSms(); 6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<CdmaSmsCbProgramData> programDataList = msg.getSmsCbProgramData(); 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull(programDataList); 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(1, programDataList.size()); 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaSmsCbProgramData programData = programDataList.get(0); 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY, programData.getOperation()); 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, programData.getCategory()); 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CAT_EXTREME_THREAT, programData.getCategoryName()); 654b8a13d300b245e0080aa01275e232f54d5d0e09cJake Hamby assertEquals(BearerData.LANGUAGE_ENGLISH, programData.getLanguage()); 6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(100, programData.getMaxMessages()); 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.ALERT_OPTION_DEFAULT_ALERT, programData.getAlertOption()); 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6598fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testServiceCategoryProgramDataDeleteTwoCategories() throws Exception { 661e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage cdmaSmsMessage = createServiceCategoryProgramDataParcel(); 6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville BitwiseOutputStream bos = createBearerDataStream(456, -1, -1); 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int category1NameLength = CAT_SEVERE_THREAT.length(); 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int category2NameLength = CAT_AMBER_ALERTS.length(); 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamLengthBits = (101 + (category1NameLength * 7) + (category2NameLength * 7)); 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamLengthBytes = (subparamLengthBits + 7) / 8; 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subparamPadBits = (subparamLengthBytes * 8) - subparamLengthBits; 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, SUBPARAM_SERVICE_CATEGORY_PROGRAM_DATA); 6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, subparamLengthBytes); 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(5, UserData.ENCODING_7BIT_ASCII); 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY); 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT >>> 8)); 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT & 0xff)); 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, BearerData.LANGUAGE_ENGLISH); 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 0); // max messages 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.ALERT_OPTION_NO_ALERT); 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, category1NameLength); 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < category1NameLength; i++) { 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(7, CAT_SEVERE_THREAT.charAt(i)); 6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY); 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY >>> 8)); 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, (SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY & 0xff)); 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, BearerData.LANGUAGE_ENGLISH); 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, 0); // max messages 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(4, CdmaSmsCbProgramData.ALERT_OPTION_NO_ALERT); 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(8, category2NameLength); 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < category2NameLength; i++) { 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(7, CAT_AMBER_ALERTS.charAt(i)); 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bos.write(subparamPadBits, 0); 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 701e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan SmsMessage msg = createMessageFromParcel(cdmaSmsMessage, bos.toByteArray()); 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull(msg); 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville msg.parseSms(); 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<CdmaSmsCbProgramData> programDataList = msg.getSmsCbProgramData(); 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull(programDataList); 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(2, programDataList.size()); 7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaSmsCbProgramData programData = programDataList.get(0); 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY, programData.getOperation()); 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, programData.getCategory()); 7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CAT_SEVERE_THREAT, programData.getCategoryName()); 712b8a13d300b245e0080aa01275e232f54d5d0e09cJake Hamby assertEquals(BearerData.LANGUAGE_ENGLISH, programData.getLanguage()); 7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, programData.getMaxMessages()); 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.ALERT_OPTION_NO_ALERT, programData.getAlertOption()); 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville programData = programDataList.get(1); 7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY, programData.getOperation()); 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville programData.getCategory()); 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CAT_AMBER_ALERTS, programData.getCategoryName()); 721b8a13d300b245e0080aa01275e232f54d5d0e09cJake Hamby assertEquals(BearerData.LANGUAGE_ENGLISH, programData.getLanguage()); 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, programData.getMaxMessages()); 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(CdmaSmsCbProgramData.ALERT_OPTION_NO_ALERT, programData.getAlertOption()); 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte[] CMAS_TEST_BEARER_DATA = { 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x00, 0x03, 0x1C, 0x78, 0x00, 0x01, 0x59, 0x02, (byte) 0xB8, 0x00, 0x02, 0x10, (byte) 0xAA, 7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x68, (byte) 0xD3, (byte) 0xCD, 0x06, (byte) 0x9E, 0x68, 0x30, (byte) 0xA0, (byte) 0xE9, 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0x97, (byte) 0x9F, 0x44, 0x1B, (byte) 0xF3, 0x20, (byte) 0xE9, (byte) 0xA3, 7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x2A, 0x08, 0x7B, (byte) 0xF6, (byte) 0xED, (byte) 0xCB, (byte) 0xCB, 0x1E, (byte) 0x9C, 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x3B, 0x10, 0x4D, (byte) 0xDF, (byte) 0x8B, 0x4E, 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0xCC, (byte) 0xA8, 0x20, (byte) 0xEC, (byte) 0xCB, (byte) 0xCB, (byte) 0xA2, 0x0A, 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x7E, 0x79, (byte) 0xF4, (byte) 0xCB, (byte) 0xB5, 0x72, 0x0A, (byte) 0x9A, 0x34, 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0xF3, 0x41, (byte) 0xA7, (byte) 0x9A, 0x0D, (byte) 0xFB, (byte) 0xB6, 0x79, 0x41, 7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0x85, 0x07, 0x4C, (byte) 0xBC, (byte) 0xFA, 0x2E, 0x00, 0x08, 0x20, 0x58, 0x38, 7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0x88, (byte) 0x80, 0x10, 0x54, 0x06, 0x38, 0x20, 0x60, 7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x30, (byte) 0xA8, (byte) 0x81, (byte) 0x90, 0x20, 0x08 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Test case for CMAS test message received on the Sprint network. 7418fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testDecodeRawBearerData() throws Exception { 743e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan CdmaSmsMessage cdmaSmsMessage = createBroadcastParcel(SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE); 744e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan SmsMessage msg = createMessageFromParcel(cdmaSmsMessage, CMAS_TEST_BEARER_DATA); 7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbMessage cbMessage = msg.parseBroadcastSms(); 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull("expected non-null for bearer data", cbMessage); 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("geoScope", cbMessage.getGeographicalScope(), 1); 7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("serialNumber", cbMessage.getSerialNumber(), 51072); 7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("serviceCategory", cbMessage.getServiceCategory(), 7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE); 7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("payload", cbMessage.getMessageBody(), 7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "This is a test of the Commercial Mobile Alert System. This is only a test."); 7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo cmasInfo = cbMessage.getCmasWarningInfo(); 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNotNull("expected non-null for CMAS info", cmasInfo); 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("category", cmasInfo.getCategory(), SmsCbCmasInfo.CMAS_CATEGORY_OTHER); 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("responseType", cmasInfo.getResponseType(), 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbCmasInfo.CMAS_RESPONSE_TYPE_NONE); 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("severity", cmasInfo.getSeverity(), SmsCbCmasInfo.CMAS_SEVERITY_SEVERE); 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("urgency", cmasInfo.getUrgency(), SmsCbCmasInfo.CMAS_URGENCY_EXPECTED); 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals("certainty", cmasInfo.getCertainty(), SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY); 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 765