11f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang/*
21f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * Copyright (C) 2011 The Android Open Source Project
31f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang *
41f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * Licensed under the Apache License, Version 2.0 (the "License");
51f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * you may not use this file except in compliance with the License.
61f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * You may obtain a copy of the License at
71f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang *
81f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang *      http://www.apache.org/licenses/LICENSE-2.0
91f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang *
101f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * Unless required by applicable law or agreed to in writing, software
111f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * distributed under the License is distributed on an "AS IS" BASIS,
121f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * See the License for the specific language governing permissions and
141f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * limitations under the License.
151f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang */
161f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
171f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangpackage com.android.mms.ui;
181f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
191f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport static com.android.mms.ui.MessageListAdapter.COLUMN_ID;
201f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport static com.android.mms.ui.MessageListAdapter.COLUMN_MSG_TYPE;
211f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
221f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport com.android.mms.R;
231f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport com.android.mms.ui.ComposeMessageActivity;
241f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport com.android.mms.ui.RecipientsEditor;
251f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport com.android.mms.SmsTestRunner;
261f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
271f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.database.Cursor;
281f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.content.Context;
291f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.test.ActivityInstrumentationTestCase2;
301f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.view.View;
311f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.view.ViewStub;
321f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.widget.EditText;
331f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.widget.ImageButton;
341f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport android.util.Log;
351f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
361f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.io.File;
371f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.io.FileInputStream;
381f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.io.BufferedInputStream;
391f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.io.IOException;
401f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.util.List;
411f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangimport java.util.ArrayList;
421f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
431f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang/**
441f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang * Base class for sms tests.
451f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang */
461f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wangpublic class SmsTest
471f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    extends ActivityInstrumentationTestCase2<ComposeMessageActivity> {
481f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
491f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    private final static String TAG = "SmsTest";
501f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected ComposeMessageActivity mActivity;
511f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected RecipientsEditor mRecipientsEditor;
521f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected EditText mTextEditor;
531f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected SmsTestRunner mInst;
541f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected String mRecipient;
551f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected List mRecipientsList = null;
561f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected long mReceiveTimer = 5 * 60 * 1000 ; // 5 minutes
571f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
581f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    // default message to sent
591f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected String mMessage =
601f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        "Is this a dagger which I see before me,"
611f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" The handle toward my hand? Come, let me clutch thee."
621f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" I have thee not, and yet I see thee still."
631f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" Art thou not, fatal vision, sensible"
641f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" To feeling as to sight? or art thou but"
651f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" A dagger of the mind, a false creation,"
661f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" Proceeding from the heat-oppressed brain?"
671f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" I see thee yet, in form as palpable"
681f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        +" As this which now I draw.";
691f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
701f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected Long mThreadId;
711f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
721f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    public SmsTest() {
731f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang       super(ComposeMessageActivity.class);
741f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
751f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
761f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    @Override
771f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected void setUp() throws Exception {
781f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        super.setUp();
791f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
801f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        mActivity = getActivity();
811f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        ViewStub stub = (ViewStub)mActivity.findViewById(R.id.recipients_editor_stub);
821f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (stub != null) {
831f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            View stubView = stub.inflate();
841f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipientsEditor = (RecipientsEditor) stubView.findViewById(R.id.recipients_editor);
851f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } else {
861f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipientsEditor = (RecipientsEditor) mActivity.findViewById(R.id.recipients_editor);
871f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipientsEditor.setVisibility(View.VISIBLE);
881f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
891f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        mTextEditor = (EditText)mActivity.findViewById(R.id.embedded_text_editor);
901f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
911f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        // parse input argument
921f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        mInst = (SmsTestRunner)getInstrumentation();
931f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (mInst.mRecipient != null) {
941f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipient = mInst.mRecipient;
951f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } else {
961f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipient = getLocalNumber();
971f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
981f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (mInst.mReceiveTimer > 0) {
991f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mReceiveTimer = mInst.mReceiveTimer;
1001f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1011f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        loadRecipientsList();
1021f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        loadMessage();
10317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang        Log.v(TAG, String.format("mReceiveTimer: %d, mRecipient: %s, mMessage: ",
10417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang                                 mReceiveTimer, mRecipient, mMessage));
1051f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
1061f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1071f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    @Override
1081f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected void tearDown() throws Exception {
1091f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        super.tearDown();
1101f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
1111f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1121f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    /**
1131f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * Load recipients from a file
1141f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     */
1151f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    private void loadRecipientsList() {
1161f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        String recipientFileName = mInst.mRecipientFileName;
1171f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (recipientFileName == null) {
1181f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            return;
1191f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1201f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        // Read recipients from a file
1211f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        mRecipientsList = new ArrayList<String>();
1221f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        StringBuilder sb = new StringBuilder();
1231f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        try {
1241f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Log.v(TAG, "Loading recipients");
1251f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            FileInputStream f = mInst.getTargetContext().openFileInput(recipientFileName);
1261f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            int c;
1271f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            while ((c = f.read()) != -1) {
1281f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                if (c == '\r' || c == '\n' || c == ',') {
1291f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    String recipient = sb.toString().trim();
1301f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    if (recipient.length() > 0) {
1311f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                        mRecipientsList.add(recipient);
1321f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    }
1331f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    sb.setLength(0);
1341f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                } else {
1351f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    sb.append((char)c);
1361f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                }
1371f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            }
1381f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            f.close();
1391f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } catch (Exception e) {
1401f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Log.e(TAG, "can't open recipients file " + recipientFileName);
1411f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            return;
1421f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1431f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
1441f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1451f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    /**
1461f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * Load messages from a file, save the message in mMessage
1471f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     */
1481f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    private void loadMessage() {
1491f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        String messageFileName = mInst.mMessageFileName;
1501f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (messageFileName == null) {
1511f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            return;
1521f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1531f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1541f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        Context targetAppContext = mInst.getTargetContext().getApplicationContext();
1551f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        String filePath = String.format("%s/%s", targetAppContext.getFilesDir(), messageFileName);
15617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang        Log.v(TAG, "filePath: " + filePath);
1571f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        // Read messages from a file
1581f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        byte[] buffer = new byte[(int) new File(filePath).length()];
1591f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        BufferedInputStream bf = null;
1601f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        int numStrs = 0;
1611f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        try {
1621f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Log.v(TAG, "Loading messages");
1631f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            bf = new BufferedInputStream(
1641f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    mInst.getTargetContext().openFileInput(messageFileName));
1651f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            numStrs = bf.read(buffer);
1661f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } catch (Exception e) {
1671f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Log.e(TAG, "can't open message file at " +
1681f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    targetAppContext.getFileStreamPath(messageFileName));
1691f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } finally {
1701f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            if (bf != null) {
1711f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                try { bf.close(); } catch (IOException e) {
1721f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    Log.v(TAG, "failed to close message file: " +
1731f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                            targetAppContext.getFileStreamPath(messageFileName));
1741f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                }
1751f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            }
1761f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1771f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (numStrs > 0) {
1781f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mMessage = new String(buffer);
1791f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1801f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
1811f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1821f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    private abstract class MessageRunnable implements Runnable {
1831f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        protected String mRecipient;
1841f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1851f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        public void setRecipient(String recipient) {
1861f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mRecipient = recipient;
1871f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
1881f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
1891f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
1901f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    private MessageRunnable mSendSmsMessage = new MessageRunnable() {
1911f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        public void run() {
1921f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            // only on the first message will there be a recipients editor
1931f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            if (mRecipientsEditor.getVisibility() == View.VISIBLE) {
1941f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                mRecipientsEditor.setText(mRecipient);
1951f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            }
1961f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            mTextEditor.setText(mMessage);
1971f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms);
1981f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            send.performClick();
1991f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
2001f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    };
2011f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
2021f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected void sleep(long sleepTime) {
2031f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        try {
2041f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Thread.sleep(sleepTime);
2051f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        } catch (InterruptedException e) {}
2061f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
2071f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
2081f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    /**
2091f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @return the local number for this test device
2101f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     */
2111f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected String getLocalNumber() {
2121f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        return MessageUtils.getLocalNumber();
2131f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
2141f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
2151f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    /**
2161f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * send a message and verify the receiption using the local number and default timer
2171f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @return
2181f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     */
2191f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected boolean sendAndReceiveMessage() throws Throwable {
2201f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        return sendAndReceiveMessage(mRecipient, mReceiveTimer);
2211f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
2221f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
2231f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    /**
2241f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @param recipientNumber the recipient number for this sms
2251f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @param receiveTimer timer to wait for the received message, if it is null, default timer
2261f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     *        is used.
2271f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @return true if received message is equal to what sent, otherwise, return false
2281f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     * @throws Throwable
2291f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang     */
2301f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    protected boolean sendAndReceiveMessage(String recipientNumber, long timer)
2311f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        throws Throwable {
2321f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        long receiveTimer = mReceiveTimer;
2331f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        if (timer > 0) {
2341f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            receiveTimer = timer;
2351f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
2361f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        int msgCount = mActivity.mMsgListAdapter.getCount();
2371f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        Log.v(TAG, "msgCount: " + msgCount);
2381f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang          mSendSmsMessage.setRecipient(recipientNumber);
2391f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        runTestOnUiThread(mSendSmsMessage);
2401f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang
2411f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        // Wait for maximum 5 minutes to send the long message
2421f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        // and then receive it. Make sure the sent and received messages are the same.
2431f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        boolean received = false;
2441f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        long startTime = System.currentTimeMillis();
2451f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        while ((System.currentTimeMillis() - startTime) <= receiveTimer) {
2461f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            sleep( 5 * 1000);     // wait 5 seconds between checks
2471f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            Log.v(TAG, "Message Count: " + mActivity.mMsgListAdapter.getCount());
2481f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            if (msgCount + 2 == mActivity.mMsgListAdapter.getCount()) {
2491f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                // The "msgCount + 2" is to account for the sent and received message.
2501f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                // Other cases: 1) fail to send/receive sms message, test fail
2511f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                // 2) another message could be received by the target phone during this time
2521f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                //    test will falsely fail
2531f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                Cursor cursor = mActivity.mMsgListAdapter.getCursor();
2541f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                cursor.moveToLast();
2551f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                String type = cursor.getString(COLUMN_MSG_TYPE);
2561f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                long msgId = cursor.getLong(COLUMN_ID);
2571f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                MessageItem msgItem =
2581f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                    mActivity.mMsgListAdapter.getCachedMessageItem(type, msgId, cursor);
2591f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                assertNotNull("got a null last MessageItem", msgItem);
2601f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                assertEquals("The sent and received messages aren't the same",
2611f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                        mMessage,
2621f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                        msgItem.mBody);
2631f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                received = true;
2641f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang                break;
2651f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang            }
2661f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        }
2671f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        assertTrue("Never received the sent message", received);
2681f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang        return received;
2691f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang    }
2701f530d377f9ec84723d9658a9ec8c9a396a32474Xia Wang}
271