| /* |
| * 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.mms.ui; |
| |
| import com.android.mms.R; |
| import com.android.mms.ui.ComposeMessageActivity; |
| import com.android.mms.ui.RecipientsEditor; |
| import com.android.mms.data.ContactList; |
| import com.android.mms.data.Conversation; |
| import com.android.mms.data.WorkingMessage; |
| import com.android.mms.ui.MessageListAdapter.ColumnsMap; |
| |
| import android.content.Context; |
| import android.database.Cursor; |
| 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; |
| import android.view.View; |
| import android.view.ViewStub; |
| import android.widget.EditText; |
| import android.widget.TextView; |
| import android.widget.Button; |
| import android.widget.ImageButton; |
| |
| /** |
| * Various instrumentation tests for ComposeMessageActivity. |
| */ |
| public class ComposeMessageActivityTests |
| extends ActivityInstrumentationTestCase2<ComposeMessageActivity> { |
| |
| private static final String TAG = "ComposeMessageActivityTests"; |
| private Context mContext; |
| private RecipientsEditor mRecipientsEditor; |
| private EditText mTextEditor; |
| private MessageListView mMsgListView; |
| private MessageListAdapter mMsgListAdapter; |
| private ColumnsMap mColumnsMap; |
| private ComposeMessageActivity mActivity; |
| |
| public ComposeMessageActivityTests() { |
| super(ComposeMessageActivity.class); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| mContext = getInstrumentation().getTargetContext(); |
| |
| 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); |
| mMsgListView = (MessageListView)mActivity.findViewById(R.id.history); |
| mMsgListAdapter = (MessageListAdapter)mMsgListView.getAdapter(); |
| } |
| |
| class BoxChecker { |
| private int[] mExpectedBoxStates; |
| private boolean mDone; |
| private String mError; |
| |
| public BoxChecker(int[] expectedBoxStates) { |
| mExpectedBoxStates = expectedBoxStates; |
| mDone = false; |
| mError = null; |
| mMsgListAdapter.setOnDataSetChangedListener(mDataSetChangedListener); |
| } |
| |
| private final MessageListAdapter.OnDataSetChangedListener |
| mDataSetChangedListener = new MessageListAdapter.OnDataSetChangedListener() { |
| public void onDataSetChanged(MessageListAdapter adapter) { |
| int count = adapter.getCount(); |
| if (count > 0) { |
| MessageItem item = getMessageItem(count - 1); // get most recent |
| |
| int boxId = item.getBoxId(); |
| |
| // is boxId a valid box? |
| boolean found = false; |
| boolean isLast = false; |
| for (int i = 0; i < mExpectedBoxStates.length; i++) { |
| if (mExpectedBoxStates[i] == boxId) { |
| found = true; |
| isLast = i == mExpectedBoxStates.length - 1; |
| break; |
| } |
| } |
| if (!found) { |
| setError("Unexpected box state"); |
| return; |
| } |
| if (isLast) { |
| mDone = true; |
| } |
| } |
| } |
| |
| public void onContentChanged(MessageListAdapter adapter) { |
| } |
| }; |
| |
| private void setError(String error) { |
| mError = error; |
| mDone = true; |
| } |
| |
| public String getError() { |
| return mError; |
| } |
| |
| public boolean isDone() { |
| return mDone; |
| } |
| |
| private MessageItem getMessageItem(int index) { |
| Cursor cursor = (Cursor)mMsgListAdapter.getItem(index); |
| |
| mColumnsMap = new MessageListAdapter.ColumnsMap(cursor); |
| String type = cursor.getString(mColumnsMap.mColumnMsgType); |
| long msgId = cursor.getLong(mColumnsMap.mColumnMsgId); |
| |
| MessageItem msgItem = mMsgListAdapter.getCachedMessageItem(type, msgId, cursor); |
| |
| return msgItem; |
| } |
| } |
| |
| /** |
| * Tests that a simple SMS message is successfully sent. |
| */ |
| @LargeTest |
| public void testSendMessage() throws Throwable { |
| runTestOnUiThread(new Runnable() { |
| public void run() { |
| checkFocused(mRecipientsEditor); |
| mRecipientsEditor.setText("2012130903"); |
| mTextEditor.setText("This is a test message"); |
| ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms); |
| send.performClick(); |
| } |
| }); |
| |
| // Now poll while watching the adapter to see if the message got sent |
| BoxChecker boxChecker = new BoxChecker(new int[] {4, 2}); // outbox, sent |
| long now = System.currentTimeMillis(); |
| boolean success = true; |
| while (!boxChecker.isDone()) { |
| Thread.sleep(1000); |
| if (System.currentTimeMillis() - now > 10000) { |
| // Give up after ten seconds |
| success = false; |
| break; |
| } |
| } |
| assertTrue(success && boxChecker.getError() == null); |
| } |
| |
| /** |
| * Helper method to verify which field has the focus |
| * @param focused The view that should be focused (all others should not have focus) |
| */ |
| @SmallTest |
| private void checkFocused(View focused) { |
| assertEquals(focused == mRecipientsEditor, mRecipientsEditor.isFocused()); |
| assertEquals(focused == mTextEditor, mTextEditor.isFocused()); |
| } |
| |
| // Here's how to execute just this one test: |
| // runtest -m testCreateManyThreads mms -c com.android.mms.ui.ComposeMessageActivityTests |
| // This test intentionally uses the UI functions to create the threads rather than adding |
| // the threads directly to the mms provider's threads table. |
| @LargeTest |
| public void testCreateManyThreads() { |
| for (int i = 0; i < 10; i++) { |
| String phoneNum = String.format("424-123-%04d", i); |
| ContactList contactList = ContactList.getByNumbers(phoneNum, false, false); |
| Conversation conv = Conversation.get(mActivity, contactList, false); |
| |
| WorkingMessage workingMsg = WorkingMessage.loadDraft(mActivity, conv, null); |
| workingMsg.setConversation(conv); |
| workingMsg.setText("This is test #" + i + " thread id: " + conv.getThreadId()); |
| |
| // Log.i(TAG, "[testCreateManyThreads] workingMsg: "); |
| // workingMsg.dump(); |
| |
| workingMsg.saveDraft(false); |
| } |
| } |
| } |