/* * 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 android.content.Intent; import android.graphics.drawable.Drawable; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.LargeTest; import android.util.Log; import android.view.ActionProvider; import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ViewStub; import android.widget.Button; import android.widget.ImageButton; import android.widget.EditText; import android.widget.TextView; import com.android.mms.R; import com.android.mms.ui.ComposeMessageActivity; import com.android.mms.ui.RecipientsEditor; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Random; /** * Test threads with thousands of messages * NOTE: you first have to put the unix words file on the device: * example: adb push ~/words /data/data/com.android.mms/files * and then push a file that contains a comma separated list of numbers to send to. * example: adb push ~/recipients /data/data/com.android.mms/files * */ public class LongThreadTest extends ActivityInstrumentationTestCase2<ComposeMessageActivity> { private RecipientsEditor mRecipientsEditor; private EditText mTextEditor; private EditText mSubjectTextEditor; // Text editor for MMS subject static final String TAG = "LongThreadTest"; private ArrayList<String> mWords; private ArrayList<String> mRecipients; private int mWordCount; private Random mRandom = new Random(); private ComposeMessageActivity mActivity; public LongThreadTest() { 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); mSubjectTextEditor = (EditText)mActivity.findViewById(R.id.subject); // Read in dictionary of words mWords = new ArrayList<String>(98568); // count of words in words file StringBuilder sb = new StringBuilder(); try { Log.v(TAG, "Loading dictionary of words"); FileInputStream words = mActivity.openFileInput("words"); int c; while ((c = words.read()) != -1) { if (c == '\r' || c == '\n') { String word = sb.toString().trim(); if (word.length() > 0) { mWords.add(word); } sb.setLength(0); } else { sb.append((char)c); } } words.close(); mWordCount = mWords.size(); Log.v(TAG, "Loaded dictionary word count: " + mWordCount); } catch (Exception e) { Log.e(TAG, "can't open words file at /data/data/com.android.mms/files/words"); return; } // Read in list of recipients mRecipients = new ArrayList<String>(); try { Log.v(TAG, "Loading recipients"); FileInputStream recipients = mActivity.openFileInput("recipients"); int c; while ((c = recipients.read()) != -1) { if (c == '\r' || c == '\n' || c == ',') { String recipient = sb.toString().trim(); if (recipient.length() > 0) { mRecipients.add(recipient); } sb.setLength(0); } else { sb.append((char)c); } } recipients.close(); Log.v(TAG, "Loaded recipients: " + mRecipients.size()); } catch (Exception e) { Log.e(TAG, "can't open recipients file at /data/data/com.android.mms/files/recipients"); return; } } private String generateMessage() { int wordsInMessage = mRandom.nextInt(9) + 1; // up to 10 words in the message StringBuilder msg = new StringBuilder(); for (int i = 0; i < wordsInMessage; i++) { msg.append(mWords.get(mRandom.nextInt(mWordCount)) + " "); } return msg.toString(); } private class AddSubjectMenuItem implements MenuItem { private static final int MENU_ADD_SUBJECT = 0; public char getAlphabeticShortcut() { // TODO Auto-generated method stub return 0; } public int getGroupId() { // TODO Auto-generated method stub return 0; } public Drawable getIcon() { // TODO Auto-generated method stub return null; } public Intent getIntent() { // TODO Auto-generated method stub return null; } public int getItemId() { return MENU_ADD_SUBJECT; } public ContextMenuInfo getMenuInfo() { // TODO Auto-generated method stub return null; } public char getNumericShortcut() { // TODO Auto-generated method stub return 0; } public int getOrder() { // TODO Auto-generated method stub return 0; } public SubMenu getSubMenu() { // TODO Auto-generated method stub return null; } public CharSequence getTitle() { // TODO Auto-generated method stub return null; } public CharSequence getTitleCondensed() { // TODO Auto-generated method stub return null; } public boolean hasSubMenu() { // TODO Auto-generated method stub return false; } public boolean isCheckable() { // TODO Auto-generated method stub return false; } public boolean isChecked() { // TODO Auto-generated method stub return false; } public boolean isEnabled() { // TODO Auto-generated method stub return false; } public boolean isVisible() { // TODO Auto-generated method stub return false; } public MenuItem setAlphabeticShortcut(char alphaChar) { // TODO Auto-generated method stub return null; } public MenuItem setCheckable(boolean checkable) { // TODO Auto-generated method stub return null; } public MenuItem setChecked(boolean checked) { // TODO Auto-generated method stub return null; } public MenuItem setEnabled(boolean enabled) { // TODO Auto-generated method stub return null; } public MenuItem setIcon(Drawable icon) { // TODO Auto-generated method stub return null; } public MenuItem setIcon(int iconRes) { // TODO Auto-generated method stub return null; } public MenuItem setIntent(Intent intent) { // TODO Auto-generated method stub return null; } public MenuItem setNumericShortcut(char numericChar) { // TODO Auto-generated method stub return null; } public MenuItem setOnMenuItemClickListener( OnMenuItemClickListener menuItemClickListener) { // TODO Auto-generated method stub return null; } public MenuItem setShortcut(char numericChar, char alphaChar) { // TODO Auto-generated method stub return null; } public MenuItem setTitle(CharSequence title) { // TODO Auto-generated method stub return null; } public MenuItem setTitle(int title) { // TODO Auto-generated method stub return null; } public MenuItem setTitleCondensed(CharSequence title) { // TODO Auto-generated method stub return null; } public MenuItem setVisible(boolean visible) { // TODO Auto-generated method stub return null; } public void setShowAsAction(int actionEnum) { // TODO Auto-generated method stub } @Override public MenuItem setActionView(View view) { // TODO Auto-generated method stub return null; } @Override public View getActionView() { // TODO Auto-generated method stub return null; } @Override public MenuItem setActionView(int resId) { // TODO Auto-generated method stub return null; } @Override public MenuItem setShowAsActionFlags(int actionEnum) { // TODO Auto-generated method stub return null; } @Override public boolean expandActionView() { // TODO Auto-generated method stub return false; } @Override public boolean collapseActionView() { // TODO Auto-generated method stub return false; } @Override public boolean isActionViewExpanded() { return false; } @Override public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { // TODO Auto-generated method stub return null; } @Override public MenuItem setActionProvider(ActionProvider actionProvider) { // TODO Auto-generated method stub return null; } @Override public ActionProvider getActionProvider() { // TODO Auto-generated method stub return null; } } 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(generateMessage()); final ComposeMessageActivity a = getActivity(); ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms); send.performClick(); } }; private MessageRunnable mSendMmsMessage = new MessageRunnable() { public void run() { // only on the first message will there be a recipients editor if (mRecipientsEditor.getVisibility() == View.VISIBLE) { mRecipientsEditor.setText(mRecipient); } // Add a subject final ComposeMessageActivity a = getActivity(); MenuItem item = new AddSubjectMenuItem(); mActivity.onOptionsItemSelected(item); mSubjectTextEditor.setText(generateMessage()); mTextEditor.setText(generateMessage()); Button send = (Button)mActivity.findViewById(R.id.send_button); send.performClick(); } }; /** * Send a flurry of SMS and MMS messages */ @LargeTest public void testSendManyMessages() throws Throwable { // BTW, sending 50 messages brings up the "Sending too many messages" alert so // backing down to a smaller number. final int MAXSEND = 30; final int MSG_PER_RECIPIENT = MAXSEND / mRecipients.size(); final int MMS_FREQ = Math.min(MSG_PER_RECIPIENT / 10, 1); final ComposeMessageActivity a = getActivity(); for (String recipient : mRecipients) { mActivity.runOnUiThread(new Runnable() { public void run() { a.initialize(null, 0); a.loadMessageContent(); } }); for (int i = 0; i < MSG_PER_RECIPIENT; i++) { Log.v(TAG, "Sending msg: " + i); if (i % MMS_FREQ == 0) { mSendMmsMessage.setRecipient(recipient); runTestOnUiThread(mSendMmsMessage); } else { mSendSmsMessage.setRecipient(recipient); runTestOnUiThread(mSendSmsMessage); } Thread.sleep(5000); // wait 5 seconds between messages } } assertTrue(true); } }