150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/* 250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Copyright (C) 2008 The Android Open Source Project 350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * you may not use this file except in compliance with the License. 650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * You may obtain a copy of the License at 750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 1050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Unless required by applicable law or agreed to in writing, software 1150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 1250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * See the License for the specific language governing permissions and 1450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * limitations under the License. 1550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 1650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypackage com.android.cellbroadcastreceiver; 1850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport java.io.UnsupportedEncodingException; 2050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 2150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent; 2250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.provider.Telephony.Sms.Intents; 2300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.SmsCbLocation; 2400b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.telephony.SmsCbMessage; 2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.test.ActivityInstrumentationTestCase2; 2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log; 2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.EncodeException; 2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.GsmAlphabet; 3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.IccUtils; 3100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.gsm.GsmSmsCbMessage; 3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/** 3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Various instrumentation tests for CellBroadcastReceiver. 3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * To run this test: runtest cellbroadcastreceiver 3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * or: adb shell am instrument -w \ 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * com.android.cellbroadcastreceiver.tests/android.test.InstrumentationTestRunner 3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * TODO: write better test cases 4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class DialogSmsDisplayTests 4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby extends ActivityInstrumentationTestCase2<CellBroadcastListActivity> { 4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public static final String ACTION_SMS_SENT = 4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "com.android.basicsmsreceiver.tests.SMS_SENT_ACTION"; 4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static String TAG = "DialogSmsDisplayTests"; 4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final int DCS_7BIT_ENGLISH = 0x01; 5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final int DCS_16BIT_UCS2 = 0x48; 5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby /* ETWS Test message including header */ 5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final byte[] etwsMessageNormal = IccUtils.hexStringToBytes("000011001101" + 5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // Line 1 CRLFLine 2 5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "EA307DCA602557309707901F58310D0A5BAE57CE770C531790E85C716CBF3044573065B930675730" + 5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "9707767A751F30025F37304463FA308C306B5099304830664E0B30553044FF086C178C615E81FF09"); 5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final byte[] etwsMessageCancel = IccUtils.hexStringToBytes("000011001101" + 6050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // Line 1 CRLFLine 2 6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "EA307DCA602557309707901F5831002853D66D8800290D0A5148307B3069002800310030003A0035" + 6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "00320029306E7DCA602557309707901F5831309253D66D883057307E3059FF086C178C615E81FF09"); 6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final byte[] etwsMessageTest = IccUtils.hexStringToBytes("000011031101" + 6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // Line 1 CRLFLine 2 6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "EA3030108A137DF430117DCA602557309707573058310D0A5BAE57CE770C531790E85C716CBF3044" + 6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "573065B9306757309707300263FA308C306B5099304830664E0B30553044FF086C178C615E81FF09"); 6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public DialogSmsDisplayTests() { 7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby super(CellBroadcastListActivity.class); 7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.i(TAG, "DialogSmsDisplayTests"); 7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby @Override 7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby protected void setUp() throws Exception { 7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby super.setUp(); 7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby @Override 8050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby protected void tearDown() throws Exception { 8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby super.tearDown(); 8250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 8350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 8450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby byte[] encodeCellBroadcast(int serialNumber, int messageId, int dcs, String message) { 8550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby byte[] pdu = new byte[88]; 8650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[0] = (byte) ((serialNumber >> 8) & 0xff); 8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[1] = (byte) (serialNumber & 0xff); 8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[2] = (byte) ((messageId >> 8) & 0xff); 8950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[3] = (byte) (messageId & 0xff); 9050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[4] = (byte) (dcs & 0xff); 9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby pdu[5] = 0x11; // single page message 9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby try { 9350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby byte[] encodedString; 9450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (dcs == DCS_16BIT_UCS2) { 9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby encodedString = message.getBytes("UTF-16"); 9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby System.arraycopy(encodedString, 0, pdu, 6, encodedString.length); 9750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 9850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // byte 0 of encodedString is the length in septets (don't copy) 9950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby encodedString = GsmAlphabet.stringToGsm7BitPacked(message); 10050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby System.arraycopy(encodedString, 1, pdu, 6, encodedString.length-1); 10150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 10250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return pdu; 10350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } catch (EncodeException e) { 10450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.e(TAG, "Encode Exception"); 10550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return null; 10650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } catch (UnsupportedEncodingException e) { 10750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.e(TAG, "Unsupported encoding exception for UTF-16"); 10850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return null; 10950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 11050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 11150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 11200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static final SmsCbLocation sEmptyLocation = new SmsCbLocation(); 11300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 11400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static SmsCbMessage createFromPdu(byte[] pdu) { 11500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby try { 11600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby byte[][] pdus = new byte[1][]; 11700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby pdus[0] = pdu; 11800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return GsmSmsCbMessage.createSmsCbMessage(sEmptyLocation, pdus); 11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } catch (IllegalArgumentException e) { 12000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return null; 12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 12200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 12450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void testSendMessage7bit() throws Exception { 12550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION); 12600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby byte[] pdu = encodeCellBroadcast(0, 0, DCS_7BIT_ENGLISH, "Hello in GSM 7 bit"); 12700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby intent.putExtra("message", createFromPdu(pdu)); 12850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 12950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 13050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 13150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void testSendMessageUCS2() throws Exception { 13250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION); 13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby byte[] pdu = encodeCellBroadcast(0, 0, DCS_16BIT_UCS2, "Hello in UCS2"); 13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby intent.putExtra("message", createFromPdu(pdu)); 13550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS"); 13650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 13750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 13850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void testSendEtwsMessageNormal() throws Exception { 13950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 14000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby intent.putExtra("message", createFromPdu(etwsMessageNormal)); 14150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby getActivity().sendOrderedBroadcast(intent, 14250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "android.permission.RECEIVE_EMERGENCY_BROADCAST"); 14350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 14450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 14550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void testSendEtwsMessageCancel() throws Exception { 14650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 14700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby intent.putExtra("message", createFromPdu(etwsMessageCancel)); 14850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby getActivity().sendOrderedBroadcast(intent, 14950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "android.permission.RECEIVE_EMERGENCY_BROADCAST"); 15050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 15150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 15250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void testSendEtwsMessageTest() throws Exception { 15350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION); 15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby intent.putExtra("message", createFromPdu(etwsMessageTest)); 15550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby getActivity().sendOrderedBroadcast(intent, 15650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby "android.permission.RECEIVE_EMERGENCY_BROADCAST"); 15750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 15850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 159