| /* |
| * Copyright (C) 2011 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.mms.ui; |
| |
| import static com.android.mms.ui.MessageListAdapter.COLUMN_ID; |
| import static com.android.mms.ui.MessageListAdapter.COLUMN_MSG_TYPE; |
| |
| import com.android.mms.R; |
| import com.android.mms.ui.ComposeMessageActivity; |
| import com.android.mms.ui.RecipientsEditor; |
| import com.android.mms.SmsTestRunner; |
| |
| import android.database.Cursor; |
| import android.content.Context; |
| import android.test.ActivityInstrumentationTestCase2; |
| import android.view.View; |
| import android.view.ViewStub; |
| import android.widget.EditText; |
| import android.widget.ImageButton; |
| import android.util.Log; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.BufferedInputStream; |
| import java.io.IOException; |
| import java.util.List; |
| import java.util.ArrayList; |
| |
| /** |
| * Base class for sms tests. |
| */ |
| public class SmsTest |
| extends ActivityInstrumentationTestCase2<ComposeMessageActivity> { |
| |
| private final static String TAG = "SmsTest"; |
| protected ComposeMessageActivity mActivity; |
| protected RecipientsEditor mRecipientsEditor; |
| protected EditText mTextEditor; |
| protected SmsTestRunner mInst; |
| protected String mRecipient; |
| protected List mRecipientsList = null; |
| protected long mReceiveTimer = 5 * 60 * 1000 ; // 5 minutes |
| |
| // default message to sent |
| protected String mMessage = |
| "Is this a dagger which I see before me," |
| +" The handle toward my hand? Come, let me clutch thee." |
| +" I have thee not, and yet I see thee still." |
| +" Art thou not, fatal vision, sensible" |
| +" To feeling as to sight? or art thou but" |
| +" A dagger of the mind, a false creation," |
| +" Proceeding from the heat-oppressed brain?" |
| +" I see thee yet, in form as palpable" |
| +" As this which now I draw."; |
| |
| protected Long mThreadId; |
| |
| public SmsTest() { |
| super(ComposeMessageActivity.class); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| mActivity = getActivity(); |
| ViewStub stub = (ViewStub)mActivity.findViewById(R.id.recipients_editor_stub); |
| if (stub != null) { |
| View stubView = stub.inflate(); |
| mRecipientsEditor = (RecipientsEditor) stubView.findViewById(R.id.recipients_editor); |
| } else { |
| mRecipientsEditor = (RecipientsEditor) mActivity.findViewById(R.id.recipients_editor); |
| mRecipientsEditor.setVisibility(View.VISIBLE); |
| } |
| mTextEditor = (EditText)mActivity.findViewById(R.id.embedded_text_editor); |
| |
| // parse input argument |
| mInst = (SmsTestRunner)getInstrumentation(); |
| if (mInst.mRecipient != null) { |
| mRecipient = mInst.mRecipient; |
| } else { |
| mRecipient = getLocalNumber(); |
| } |
| if (mInst.mReceiveTimer > 0) { |
| mReceiveTimer = mInst.mReceiveTimer; |
| } |
| loadRecipientsList(); |
| loadMessage(); |
| Log.v(TAG, String.format("mReceiveTimer: %d, mRecipient: %s, mMessage: ", |
| mReceiveTimer, mRecipient, mMessage)); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| |
| /** |
| * Load recipients from a file |
| */ |
| private void loadRecipientsList() { |
| String recipientFileName = mInst.mRecipientFileName; |
| if (recipientFileName == null) { |
| return; |
| } |
| // Read recipients from a file |
| mRecipientsList = new ArrayList<String>(); |
| StringBuilder sb = new StringBuilder(); |
| try { |
| Log.v(TAG, "Loading recipients"); |
| FileInputStream f = mInst.getTargetContext().openFileInput(recipientFileName); |
| int c; |
| while ((c = f.read()) != -1) { |
| if (c == '\r' || c == '\n' || c == ',') { |
| String recipient = sb.toString().trim(); |
| if (recipient.length() > 0) { |
| mRecipientsList.add(recipient); |
| } |
| sb.setLength(0); |
| } else { |
| sb.append((char)c); |
| } |
| } |
| f.close(); |
| } catch (Exception e) { |
| Log.e(TAG, "can't open recipients file " + recipientFileName); |
| return; |
| } |
| } |
| |
| /** |
| * Load messages from a file, save the message in mMessage |
| */ |
| private void loadMessage() { |
| String messageFileName = mInst.mMessageFileName; |
| if (messageFileName == null) { |
| return; |
| } |
| |
| Context targetAppContext = mInst.getTargetContext().getApplicationContext(); |
| String filePath = String.format("%s/%s", targetAppContext.getFilesDir(), messageFileName); |
| Log.v(TAG, "filePath: " + filePath); |
| // Read messages from a file |
| byte[] buffer = new byte[(int) new File(filePath).length()]; |
| BufferedInputStream bf = null; |
| int numStrs = 0; |
| try { |
| Log.v(TAG, "Loading messages"); |
| bf = new BufferedInputStream( |
| mInst.getTargetContext().openFileInput(messageFileName)); |
| numStrs = bf.read(buffer); |
| } catch (Exception e) { |
| Log.e(TAG, "can't open message file at " + |
| targetAppContext.getFileStreamPath(messageFileName)); |
| } finally { |
| if (bf != null) { |
| try { bf.close(); } catch (IOException e) { |
| Log.v(TAG, "failed to close message file: " + |
| targetAppContext.getFileStreamPath(messageFileName)); |
| } |
| } |
| } |
| if (numStrs > 0) { |
| mMessage = new String(buffer); |
| } |
| } |
| |
| private abstract class MessageRunnable implements Runnable { |
| protected String mRecipient; |
| |
| public void setRecipient(String recipient) { |
| mRecipient = recipient; |
| } |
| } |
| |
| private MessageRunnable mSendSmsMessage = new MessageRunnable() { |
| public void run() { |
| // only on the first message will there be a recipients editor |
| if (mRecipientsEditor.getVisibility() == View.VISIBLE) { |
| mRecipientsEditor.setText(mRecipient); |
| } |
| mTextEditor.setText(mMessage); |
| ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms); |
| send.performClick(); |
| } |
| }; |
| |
| protected void sleep(long sleepTime) { |
| try { |
| Thread.sleep(sleepTime); |
| } catch (InterruptedException e) {} |
| } |
| |
| /** |
| * @return the local number for this test device |
| */ |
| protected String getLocalNumber() { |
| return MessageUtils.getLocalNumber(); |
| } |
| |
| /** |
| * send a message and verify the receiption using the local number and default timer |
| * @return |
| */ |
| protected boolean sendAndReceiveMessage() throws Throwable { |
| return sendAndReceiveMessage(mRecipient, mReceiveTimer); |
| } |
| |
| /** |
| * @param recipientNumber the recipient number for this sms |
| * @param receiveTimer timer to wait for the received message, if it is null, default timer |
| * is used. |
| * @return true if received message is equal to what sent, otherwise, return false |
| * @throws Throwable |
| */ |
| protected boolean sendAndReceiveMessage(String recipientNumber, long timer) |
| throws Throwable { |
| long receiveTimer = mReceiveTimer; |
| if (timer > 0) { |
| receiveTimer = timer; |
| } |
| int msgCount = mActivity.mMsgListAdapter.getCount(); |
| Log.v(TAG, "msgCount: " + msgCount); |
| mSendSmsMessage.setRecipient(recipientNumber); |
| runTestOnUiThread(mSendSmsMessage); |
| |
| // Wait for maximum 5 minutes to send the long message |
| // and then receive it. Make sure the sent and received messages are the same. |
| boolean received = false; |
| long startTime = System.currentTimeMillis(); |
| while ((System.currentTimeMillis() - startTime) <= receiveTimer) { |
| sleep( 5 * 1000); // wait 5 seconds between checks |
| Log.v(TAG, "Message Count: " + mActivity.mMsgListAdapter.getCount()); |
| if (msgCount + 2 == mActivity.mMsgListAdapter.getCount()) { |
| // The "msgCount + 2" is to account for the sent and received message. |
| // Other cases: 1) fail to send/receive sms message, test fail |
| // 2) another message could be received by the target phone during this time |
| // test will falsely fail |
| Cursor cursor = mActivity.mMsgListAdapter.getCursor(); |
| cursor.moveToLast(); |
| String type = cursor.getString(COLUMN_MSG_TYPE); |
| long msgId = cursor.getLong(COLUMN_ID); |
| MessageItem msgItem = |
| mActivity.mMsgListAdapter.getCachedMessageItem(type, msgId, cursor); |
| assertNotNull("got a null last MessageItem", msgItem); |
| assertEquals("The sent and received messages aren't the same", |
| mMessage, |
| msgItem.mBody); |
| received = true; |
| break; |
| } |
| } |
| assertTrue("Never received the sent message", received); |
| return received; |
| } |
| } |