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;
2350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.test.ActivityInstrumentationTestCase2;
2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log;
2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.EncodeException;
2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.GsmAlphabet;
2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.IccUtils;
2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/**
3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Various instrumentation tests for CellBroadcastReceiver.
3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * To run this test: runtest cellbroadcastreceiver
3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * or: adb shell am instrument -w \
3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *             com.android.cellbroadcastreceiver.tests/android.test.InstrumentationTestRunner
3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * TODO: write better test cases
3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */
4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class DialogSmsDisplayTests
4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        extends ActivityInstrumentationTestCase2<CellBroadcastListActivity> {
4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public static final String ACTION_SMS_SENT =
4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        "com.android.basicsmsreceiver.tests.SMS_SENT_ACTION";
4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static String TAG = "DialogSmsDisplayTests";
4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final int DCS_7BIT_ENGLISH = 0x01;
4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final int DCS_16BIT_UCS2 = 0x48;
4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    /* ETWS Test message including header */
5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final byte[] etwsMessageNormal = IccUtils.hexStringToBytes("000011001101" +
5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            //   Line 1                  CRLFLine 2
5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "EA307DCA602557309707901F58310D0A5BAE57CE770C531790E85C716CBF3044573065B930675730" +
5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "9707767A751F30025F37304463FA308C306B5099304830664E0B30553044FF086C178C615E81FF09");
5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final byte[] etwsMessageCancel = IccUtils.hexStringToBytes("000011001101" +
5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            //   Line 1                                  CRLFLine 2
5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "EA307DCA602557309707901F5831002853D66D8800290D0A5148307B3069002800310030003A0035" +
5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "00320029306E7DCA602557309707901F5831309253D66D883057307E3059FF086C178C615E81FF09");
6050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final byte[] etwsMessageTest = IccUtils.hexStringToBytes("000011031101" +
6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            //   Line 1                                  CRLFLine 2
6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "EA3030108A137DF430117DCA602557309707573058310D0A5BAE57CE770C531790E85C716CBF3044" +
6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            "573065B9306757309707300263FA308C306B5099304830664E0B30553044FF086C178C615E81FF09");
6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public DialogSmsDisplayTests() {
6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        super(CellBroadcastListActivity.class);
6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Log.i(TAG, "DialogSmsDisplayTests");
6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    @Override
7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    protected void setUp() throws Exception {
7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        super.setUp();
7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    @Override
7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    protected void tearDown() throws Exception {
7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        super.tearDown();
7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
8050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    byte[] encodeCellBroadcast(int serialNumber, int messageId, int dcs, String message) {
8250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[] pdu = new byte[88];
8350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[0] = (byte) ((serialNumber >> 8) & 0xff);
8450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[1] = (byte) (serialNumber & 0xff);
8550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[2] = (byte) ((messageId >> 8) & 0xff);
8650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[3] = (byte) (messageId & 0xff);
8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[4] = (byte) (dcs & 0xff);
8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdu[5] = 0x11;  // single page message
8950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        try {
9050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            byte[] encodedString;
9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            if (dcs == DCS_16BIT_UCS2) {
9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                encodedString = message.getBytes("UTF-16");
9350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                System.arraycopy(encodedString, 0, pdu, 6, encodedString.length);
9450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            } else {
9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                // byte 0 of encodedString is the length in septets (don't copy)
9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                encodedString = GsmAlphabet.stringToGsm7BitPacked(message);
9750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                System.arraycopy(encodedString, 1, pdu, 6, encodedString.length-1);
9850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
9950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            return pdu;
10050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } catch (EncodeException e) {
10150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.e(TAG, "Encode Exception");
10250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            return null;
10350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        } catch (UnsupportedEncodingException e) {
10450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            Log.e(TAG, "Unsupported encoding exception for UTF-16");
10550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            return null;
10650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
10750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
10850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
10950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void testSendMessage7bit() throws Exception {
11050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
11150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[][] pdus = new byte[1][];
11250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdus[0] = encodeCellBroadcast(0, 0, DCS_7BIT_ENGLISH, "Hello in GSM 7 bit");
11350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        intent.putExtra("pdus", pdus);
11450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
11550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
11650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
11750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void testSendMessageUCS2() throws Exception {
11850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
11950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[][] pdus = new byte[1][];
12050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdus[0] = encodeCellBroadcast(0, 0, DCS_16BIT_UCS2, "Hello in UCS2");
12150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        intent.putExtra("pdus", pdus);
12250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
12350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
12450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
12550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void testSendEtwsMessageNormal() throws Exception {
12650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
12750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[][] pdus = new byte[1][];
12850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdus[0] = etwsMessageNormal;
12950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        intent.putExtra("pdus", pdus);
13050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        getActivity().sendOrderedBroadcast(intent,
13150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                "android.permission.RECEIVE_EMERGENCY_BROADCAST");
13250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
13350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
13450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void testSendEtwsMessageCancel() throws Exception {
13550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
13650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[][] pdus = new byte[1][];
13750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdus[0] = etwsMessageCancel;
13850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        intent.putExtra("pdus", pdus);
13950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        getActivity().sendOrderedBroadcast(intent,
14050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                "android.permission.RECEIVE_EMERGENCY_BROADCAST");
14150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
14250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
14350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public void testSendEtwsMessageTest() throws Exception {
14450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
14550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        byte[][] pdus = new byte[1][];
14650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        pdus[0] = etwsMessageTest;
14750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        intent.putExtra("pdus", pdus);
14850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        getActivity().sendOrderedBroadcast(intent,
14950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                "android.permission.RECEIVE_EMERGENCY_BROADCAST");
15050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
15150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby}
152