| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.basicsmsreceiver; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import android.app.Activity; |
| import android.app.PendingIntent; |
| import android.content.BroadcastReceiver; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.IntentFilter; |
| import android.database.Cursor; |
| import android.graphics.Color; |
| import android.os.Bundle; |
| import android.provider.Telephony; |
| import android.provider.Telephony.Sms.Intents; |
| import android.telephony.SmsManager; |
| import android.telephony.SmsMessage; |
| import android.telephony.TelephonyManager; |
| import android.test.ActivityInstrumentationTestCase2; |
| import android.test.suitebuilder.annotation.MediumTest; |
| import android.test.suitebuilder.annotation.SmallTest; |
| import android.test.suitebuilder.annotation.LargeTest; |
| import android.util.Log; |
| |
| /** |
| * Various instrumentation tests for BasicSmsReceiver. |
| * |
| * To run this test: runtest basicsmsreceiver |
| * |
| * TODO: write tests that verify that notifications get created. As of now, I don't see a way |
| * to query the NotificationManager for what notifications are there. I only see methods to |
| * post and cancel notifications. |
| * |
| */ |
| public class DialogSmsDisplayTests |
| extends ActivityInstrumentationTestCase2<DialogSmsDisplay> { |
| |
| private boolean mHasSms; |
| private String mMyNumber; // phone number of this device |
| public static final String ACTION_SMS_SENT = |
| "com.android.basicsmsreceiver.tests.SMS_SENT_ACTION"; |
| private static String TAG = "DialogSmsDisplayTests"; |
| private List<String> mReceivedMessages = new ArrayList<String>(); |
| private String mReceivedSender; |
| private DialogSmsDisplay dialogSmsDisplayActivity; |
| private int mMessageReceivedCount; |
| private BroadcastReceiver mSmsSenderReceiver; |
| private BroadcastReceiver mSmsReceiverReceiver; |
| |
| public DialogSmsDisplayTests() { |
| super("com.android.basicsmsreceiver", DialogSmsDisplay.class); |
| Log.i(TAG, "DialogSmsDisplayTests"); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| dialogSmsDisplayActivity = (DialogSmsDisplay)getActivity(); |
| |
| TelephonyManager telephonyManager = ((TelephonyManager)dialogSmsDisplayActivity |
| .getSystemService(Context.TELEPHONY_SERVICE)); |
| mHasSms = true; //telephonyManager.isSmsCapable(); |
| mMyNumber = telephonyManager.getLine1Number(); |
| |
| Log.i(TAG, "hasSms: " + mHasSms + " my number: " + mMyNumber); |
| |
| assertTrue("SMS must be enabled on the device", mHasSms); |
| assertNotNull("Device does not have a phone number", mMyNumber); |
| |
| if (mHasSms) { |
| // Register broadcast receivers for SMS sent and delivered intents |
| mSmsSenderReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| String message = null; |
| boolean error = true; |
| switch (getResultCode()) { |
| case Activity.RESULT_OK: |
| message = "Message sent!"; |
| error = false; |
| break; |
| case SmsManager.RESULT_ERROR_GENERIC_FAILURE: |
| message = "Error."; |
| break; |
| case SmsManager.RESULT_ERROR_NO_SERVICE: |
| message = "Error: No SMS service."; |
| break; |
| case SmsManager.RESULT_ERROR_NULL_PDU: |
| message = "Error: Null PDU."; |
| break; |
| case SmsManager.RESULT_ERROR_RADIO_OFF: |
| message = "Error: Radio off."; |
| break; |
| } |
| assertFalse(message, error); |
| } |
| }; |
| dialogSmsDisplayActivity.registerReceiver(mSmsSenderReceiver, |
| new IntentFilter(ACTION_SMS_SENT)); |
| |
| // Register broadcast receivers for received SMS |
| mSmsReceiverReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| Bundle extras = intent.getExtras(); |
| Log.i(TAG, "onReceive"); |
| if (extras == null) |
| return; |
| |
| Object[] pdus = (Object[]) extras.get("pdus"); |
| |
| for (int i = 0; i < pdus.length; i++) { |
| SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); |
| String sender = message.getOriginatingAddress(); |
| if (mReceivedSender != null) { |
| assertEquals(mReceivedSender, sender); |
| } else { |
| mReceivedSender = sender; |
| } |
| mReceivedMessages.add(message.getMessageBody().toString()); |
| |
| Log.i(TAG, "From: " + mReceivedSender + " message: " + |
| mReceivedMessages.get(mReceivedMessages.size() - 1)); |
| } |
| } |
| }; |
| dialogSmsDisplayActivity.registerReceiver(mSmsReceiverReceiver, |
| new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)); |
| } |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| if (mSmsSenderReceiver != null) { |
| dialogSmsDisplayActivity.unregisterReceiver(mSmsSenderReceiver); |
| mSmsSenderReceiver = null; |
| } |
| if (mSmsReceiverReceiver != null) { |
| dialogSmsDisplayActivity.unregisterReceiver(mSmsReceiverReceiver); |
| mSmsReceiverReceiver = null; |
| } |
| super.tearDown(); |
| } |
| |
| // Returns the broken up list of messages for long messages or the original message in |
| // element 0. |
| private List<String> sendSmsMessageInternal(String messageOut) { |
| if (!mHasSms) { |
| fail("no sms on device"); |
| return null; |
| } |
| SmsManager sms = SmsManager.getDefault(); |
| |
| List<String> messages = sms.divideMessage(messageOut); |
| mMessageReceivedCount = 0; |
| mReceivedSender = null; |
| mReceivedMessages.clear(); |
| |
| for (String message : messages) { |
| Log.i(TAG, "sendSmsMessage: " + messageOut + " to: " + mMyNumber); |
| sms.sendTextMessage(mMyNumber, null, message, PendingIntent.getBroadcast( |
| dialogSmsDisplayActivity, 0, new Intent(ACTION_SMS_SENT), 0), null); |
| } |
| return messages; |
| } |
| |
| // returns true if "messageCount" sms messages are received, false if timeout |
| private boolean waitForSms(int messageCount) { |
| // wait up to two minutes for the sent message to be received |
| long now = System.currentTimeMillis(); |
| boolean success = true; |
| Log.i(TAG, "waitForSms -- waiting for: " + messageCount + " parts"); |
| while (mReceivedMessages.size() < messageCount) { |
| try { |
| Thread.sleep(1000); |
| } catch (Exception e) { |
| } |
| if (System.currentTimeMillis() - now > 1000 * 2 * 60) { |
| // Give up after two minutes |
| success = false; |
| break; |
| } |
| } |
| if (success) { |
| // Wait 5 seconds for the dialog to launch and update |
| try { |
| Thread.sleep(5000); |
| } catch (Exception e) { |
| } |
| } |
| return success; |
| } |
| |
| private void sendMessageTest(String message) { |
| List<String> messages = sendSmsMessageInternal(message); |
| Log.i(TAG, "sendMessageTest -- message broken into " + messages.size() + "parts"); |
| |
| boolean receivedSms = waitForSms(messages.size()); |
| assertTrue("sms not received after two minutes", receivedSms); |
| |
| // Check to see if message/# matches |
| assertEquals(mMyNumber, mReceivedSender); |
| assertEquals(messages.size(), mReceivedMessages.size()); |
| int i = 0; |
| for (String messageFrag : messages) { |
| assertEquals(messageFrag, mReceivedMessages.get(i++)); |
| } |
| } |
| |
| public void testSendingSmallSmsMessage() { |
| sendMessageTest("This is a regular size message that might be sent"); |
| } |
| |
| public void testSendingLargeSmsMessage() { |
| sendMessageTest("This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. " + |
| "This is a long long message. "); |
| } |
| |
| public void testOnNewIntentSmall() { |
| // Test a small message and a non-numeric phone number |
| sendOnNewIntent("this is a big fat test", "xyzzy", 2000); |
| } |
| |
| public void testOnNewIntentLarge() { |
| // A long message like this should never really happen because SMS messages are limited |
| // to about 140 characters. |
| sendOnNewIntent("now is the time for all good men to come to the aid of their country1" + |
| "now is the time for all good men to come to the aid of their country2" + |
| "now is the time for all good men to come to the aid of their country3", |
| "513-891-7823", 2001); |
| } |
| |
| public void sendOnNewIntent(String message, String dest, int notificationId) { |
| Intent di = new Intent(); |
| di.setClass(dialogSmsDisplayActivity, DialogSmsDisplay.class); |
| di.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | |
| Intent.FLAG_ACTIVITY_CLEAR_TOP); |
| di.putExtra(DialogSmsDisplay.SMS_FROM_ADDRESS_EXTRA, dest); |
| di.putExtra(DialogSmsDisplay.SMS_MESSAGE_EXTRA, message); |
| di.putExtra(DialogSmsDisplay.SMS_NOTIFICATION_ID_EXTRA, notificationId); |
| dialogSmsDisplayActivity.onNewIntent(di); |
| |
| // Check to see if message/# matches |
| assertEquals(dest, dialogSmsDisplayActivity.mFromAddress); |
| assertEquals(message, dialogSmsDisplayActivity.mMessage); |
| } |
| } |