1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.cellbroadcastreceiver;
18 
19 import java.io.UnsupportedEncodingException;
20 
21 import android.content.Intent;
22 import android.provider.Telephony.Sms.Intents;
23 import android.telephony.SmsCbLocation;
24 import android.telephony.SmsCbMessage;
25 import android.test.ActivityInstrumentationTestCase2;
26 import android.util.Log;
27 
28 import com.android.internal.telephony.EncodeException;
29 import com.android.internal.telephony.GsmAlphabet;
30 import com.android.internal.telephony.gsm.GsmSmsCbMessage;
31 import com.android.internal.telephony.uicc.IccUtils;
32 
33 /**
34  * Various instrumentation tests for CellBroadcastReceiver.
35  *
36  * To run this test: runtest cellbroadcastreceiver
37  * or: adb shell am instrument -w \
38  *             com.android.cellbroadcastreceiver.tests/android.test.InstrumentationTestRunner
39  *
40  * TODO: write better test cases
41  *
42  */
43 public class DialogSmsDisplayTests
44         extends ActivityInstrumentationTestCase2<CellBroadcastListActivity> {
45 
46     public static final String ACTION_SMS_SENT =
47         "com.android.basicsmsreceiver.tests.SMS_SENT_ACTION";
48     private static String TAG = "DialogSmsDisplayTests";
49 
50     private static final int DCS_7BIT_ENGLISH = 0x01;
51     private static final int DCS_16BIT_UCS2 = 0x48;
52 
53     /* ETWS Test message including header */
54     private static final byte[] etwsMessageNormal = IccUtils.hexStringToBytes("000011001101" +
55             //   Line 1                  CRLFLine 2
56             "EA307DCA602557309707901F58310D0A5BAE57CE770C531790E85C716CBF3044573065B930675730" +
57             "9707767A751F30025F37304463FA308C306B5099304830664E0B30553044FF086C178C615E81FF09");
58 
59     private static final byte[] etwsMessageCancel = IccUtils.hexStringToBytes("000011001101" +
60             //   Line 1                                  CRLFLine 2
61             "EA307DCA602557309707901F5831002853D66D8800290D0A5148307B3069002800310030003A0035" +
62             "00320029306E7DCA602557309707901F5831309253D66D883057307E3059FF086C178C615E81FF09");
63 
64     private static final byte[] etwsMessageTest = IccUtils.hexStringToBytes("000011031101" +
65             //   Line 1                                  CRLFLine 2
66             "EA3030108A137DF430117DCA602557309707573058310D0A5BAE57CE770C531790E85C716CBF3044" +
67             "573065B9306757309707300263FA308C306B5099304830664E0B30553044FF086C178C615E81FF09");
68 
DialogSmsDisplayTests()69     public DialogSmsDisplayTests() {
70         super(CellBroadcastListActivity.class);
71         Log.i(TAG, "DialogSmsDisplayTests");
72     }
73 
74     @Override
setUp()75     protected void setUp() throws Exception {
76         super.setUp();
77     }
78 
79     @Override
tearDown()80     protected void tearDown() throws Exception {
81         super.tearDown();
82     }
83 
encodeCellBroadcast(int serialNumber, int messageId, int dcs, String message)84     byte[] encodeCellBroadcast(int serialNumber, int messageId, int dcs, String message) {
85         byte[] pdu = new byte[88];
86         pdu[0] = (byte) ((serialNumber >> 8) & 0xff);
87         pdu[1] = (byte) (serialNumber & 0xff);
88         pdu[2] = (byte) ((messageId >> 8) & 0xff);
89         pdu[3] = (byte) (messageId & 0xff);
90         pdu[4] = (byte) (dcs & 0xff);
91         pdu[5] = 0x11;  // single page message
92         try {
93             byte[] encodedString;
94             if (dcs == DCS_16BIT_UCS2) {
95                 encodedString = message.getBytes("UTF-16");
96                 System.arraycopy(encodedString, 0, pdu, 6, encodedString.length);
97             } else {
98                 // byte 0 of encodedString is the length in septets (don't copy)
99                 encodedString = GsmAlphabet.stringToGsm7BitPacked(message);
100                 System.arraycopy(encodedString, 1, pdu, 6, encodedString.length-1);
101             }
102             return pdu;
103         } catch (EncodeException e) {
104             Log.e(TAG, "Encode Exception");
105             return null;
106         } catch (UnsupportedEncodingException e) {
107             Log.e(TAG, "Unsupported encoding exception for UTF-16");
108             return null;
109         }
110     }
111 
112     private static final SmsCbLocation sEmptyLocation = new SmsCbLocation();
113 
createFromPdu(byte[] pdu)114     private static SmsCbMessage createFromPdu(byte[] pdu) {
115         try {
116             byte[][] pdus = new byte[1][];
117             pdus[0] = pdu;
118             return GsmSmsCbMessage.createSmsCbMessage(sEmptyLocation, pdus);
119         } catch (IllegalArgumentException e) {
120             return null;
121         }
122     }
123 
testSendMessage7bit()124     public void testSendMessage7bit() throws Exception {
125         Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
126         byte[] pdu = encodeCellBroadcast(0, 0, DCS_7BIT_ENGLISH, "Hello in GSM 7 bit");
127         intent.putExtra("message", createFromPdu(pdu));
128         getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
129     }
130 
testSendMessageUCS2()131     public void testSendMessageUCS2() throws Exception {
132         Intent intent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
133         byte[] pdu = encodeCellBroadcast(0, 0, DCS_16BIT_UCS2, "Hello in UCS2");
134         intent.putExtra("message", createFromPdu(pdu));
135         getActivity().sendOrderedBroadcast(intent, "android.permission.RECEIVE_SMS");
136     }
137 
testSendEtwsMessageNormal()138     public void testSendEtwsMessageNormal() throws Exception {
139         Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
140         intent.putExtra("message", createFromPdu(etwsMessageNormal));
141         getActivity().sendOrderedBroadcast(intent,
142                 "android.permission.RECEIVE_EMERGENCY_BROADCAST");
143     }
144 
testSendEtwsMessageCancel()145     public void testSendEtwsMessageCancel() throws Exception {
146         Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
147         intent.putExtra("message", createFromPdu(etwsMessageCancel));
148         getActivity().sendOrderedBroadcast(intent,
149                 "android.permission.RECEIVE_EMERGENCY_BROADCAST");
150     }
151 
testSendEtwsMessageTest()152     public void testSendEtwsMessageTest() throws Exception {
153         Intent intent = new Intent(Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION);
154         intent.putExtra("message", createFromPdu(etwsMessageTest));
155         getActivity().sendOrderedBroadcast(intent,
156                 "android.permission.RECEIVE_EMERGENCY_BROADCAST");
157     }
158 }
159