• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.mms.ui;
18 
19 import com.android.mms.R;
20 import com.android.mms.ui.ComposeMessageActivity;
21 import com.android.mms.ui.RecipientsEditor;
22 import com.android.mms.data.ContactList;
23 import com.android.mms.data.Conversation;
24 import com.android.mms.data.WorkingMessage;
25 import com.android.mms.ui.MessageListAdapter.ColumnsMap;
26 
27 import android.content.Context;
28 import android.database.Cursor;
29 import android.test.ActivityInstrumentationTestCase2;
30 import android.test.suitebuilder.annotation.MediumTest;
31 import android.test.suitebuilder.annotation.SmallTest;
32 import android.test.suitebuilder.annotation.LargeTest;
33 import android.util.Log;
34 import android.view.View;
35 import android.view.ViewStub;
36 import android.widget.EditText;
37 import android.widget.TextView;
38 import android.widget.Button;
39 import android.widget.ImageButton;
40 
41 /**
42  * Various instrumentation tests for ComposeMessageActivity.
43  */
44 public class ComposeMessageActivityTests
45     extends ActivityInstrumentationTestCase2<ComposeMessageActivity> {
46 
47     private static final String TAG = "ComposeMessageActivityTests";
48     private Context mContext;
49     private RecipientsEditor mRecipientsEditor;
50     private EditText mTextEditor;
51     private MessageListView mMsgListView;
52     private MessageListAdapter mMsgListAdapter;
53     private ColumnsMap mColumnsMap;
54     private ComposeMessageActivity mActivity;
55 
ComposeMessageActivityTests()56     public ComposeMessageActivityTests() {
57         super(ComposeMessageActivity.class);
58     }
59 
60     @Override
setUp()61     protected void setUp() throws Exception {
62         super.setUp();
63         mContext = getInstrumentation().getTargetContext();
64 
65         mActivity = getActivity();
66 
67         ViewStub stub = (ViewStub)mActivity.findViewById(R.id.recipients_editor_stub);
68         if (stub != null) {
69             View stubView = stub.inflate();
70             mRecipientsEditor = (RecipientsEditor) stubView.findViewById(R.id.recipients_editor);
71         } else {
72             mRecipientsEditor = (RecipientsEditor)mActivity.findViewById(R.id.recipients_editor);
73             mRecipientsEditor.setVisibility(View.VISIBLE);
74         }
75         mTextEditor = (EditText)mActivity.findViewById(R.id.embedded_text_editor);
76         mMsgListView = (MessageListView)mActivity.findViewById(R.id.history);
77         mMsgListAdapter = (MessageListAdapter)mMsgListView.getAdapter();
78     }
79 
80     class BoxChecker {
81         private int[] mExpectedBoxStates;
82         private boolean mDone;
83         private String mError;
84 
BoxChecker(int[] expectedBoxStates)85         public BoxChecker(int[] expectedBoxStates) {
86             mExpectedBoxStates = expectedBoxStates;
87             mDone = false;
88             mError = null;
89             mMsgListAdapter.setOnDataSetChangedListener(mDataSetChangedListener);
90         }
91 
92         private final MessageListAdapter.OnDataSetChangedListener
93         mDataSetChangedListener = new MessageListAdapter.OnDataSetChangedListener() {
94             public void onDataSetChanged(MessageListAdapter adapter) {
95                 int count = adapter.getCount();
96                 if (count > 0) {
97                     MessageItem item = getMessageItem(count - 1);   // get most recent
98 
99                     int boxId = item.getBoxId();
100 
101                     // is boxId a valid box?
102                     boolean found = false;
103                     boolean isLast = false;
104                     for (int i = 0; i < mExpectedBoxStates.length; i++) {
105                         if (mExpectedBoxStates[i] == boxId) {
106                             found = true;
107                             isLast = i == mExpectedBoxStates.length - 1;
108                             break;
109                         }
110                     }
111                     if (!found) {
112                         setError("Unexpected box state");
113                         return;
114                     }
115                     if (isLast) {
116                         mDone = true;
117                     }
118                }
119             }
120 
121             public void onContentChanged(MessageListAdapter adapter) {
122             }
123         };
124 
setError(String error)125         private void setError(String error) {
126             mError = error;
127             mDone = true;
128         }
129 
getError()130         public String getError() {
131             return mError;
132         }
133 
isDone()134         public boolean isDone() {
135             return mDone;
136         }
137 
getMessageItem(int index)138         private MessageItem getMessageItem(int index) {
139             Cursor cursor = (Cursor)mMsgListAdapter.getItem(index);
140 
141             mColumnsMap = new MessageListAdapter.ColumnsMap(cursor);
142             String type = cursor.getString(mColumnsMap.mColumnMsgType);
143             long msgId = cursor.getLong(mColumnsMap.mColumnMsgId);
144 
145             MessageItem msgItem = mMsgListAdapter.getCachedMessageItem(type, msgId, cursor);
146 
147             return msgItem;
148         }
149 }
150 
151     /**
152      * Tests that a simple SMS message is successfully sent.
153      */
154     @LargeTest
testSendMessage()155     public void testSendMessage() throws Throwable {
156         runTestOnUiThread(new Runnable() {
157             public void run() {
158                 checkFocused(mRecipientsEditor);
159                 mRecipientsEditor.setText("2012130903");
160                 mTextEditor.setText("This is a test message");
161                 ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms);
162                 send.performClick();
163             }
164         });
165 
166         // Now poll while watching the adapter to see if the message got sent
167         BoxChecker boxChecker = new BoxChecker(new int[] {4, 2});    // outbox, sent
168         long now = System.currentTimeMillis();
169         boolean success = true;
170         while (!boxChecker.isDone()) {
171             Thread.sleep(1000);
172             if (System.currentTimeMillis() - now > 10000) {
173                 // Give up after ten seconds
174                 success = false;
175                 break;
176             }
177         }
178         assertTrue(success && boxChecker.getError() == null);
179     }
180 
181     /**
182      * Helper method to verify which field has the focus
183      * @param focused The view that should be focused (all others should not have focus)
184      */
185     @SmallTest
checkFocused(View focused)186     private void checkFocused(View focused) {
187         assertEquals(focused == mRecipientsEditor, mRecipientsEditor.isFocused());
188         assertEquals(focused == mTextEditor, mTextEditor.isFocused());
189     }
190 
191     // Here's how to execute just this one test:
192     //   runtest -m testCreateManyThreads mms -c com.android.mms.ui.ComposeMessageActivityTests
193     // This test intentionally uses the UI functions to create the threads rather than adding
194     // the threads directly to the mms provider's threads table.
195     @LargeTest
testCreateManyThreads()196     public void testCreateManyThreads() {
197         for (int i = 0; i < 10; i++) {
198             String phoneNum = String.format("424-123-%04d", i);
199             ContactList contactList = ContactList.getByNumbers(phoneNum, false, false);
200             Conversation conv = Conversation.get(mActivity, contactList, false);
201 
202             WorkingMessage workingMsg = WorkingMessage.loadDraft(mActivity, conv, null);
203             workingMsg.setConversation(conv);
204             workingMsg.setText("This is test #" + i + " thread id: " + conv.getThreadId());
205 
206 //            Log.i(TAG, "[testCreateManyThreads] workingMsg: ");
207 //            workingMsg.dump();
208 
209             workingMsg.saveDraft(false);
210         }
211     }
212 }
213