blob: 89c04c134ac6d91d8c4c35306553300383955a46 [file] [log] [blame]
/*
* 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;
}
}