diff options
| author | Eric Rowe <erowe@google.com> | 2009-10-28 15:25:45 -0700 |
|---|---|---|
| committer | Eric Rowe <erowe@google.com> | 2010-01-14 17:04:27 -0800 |
| commit | 7d961f86208b35c12867a049d4bb815da72167d3 (patch) | |
| tree | 8af1ea2d31c2bdfd5d41360b596a195f35aa96ef /cmds | |
| parent | c1d00a99f3dcacf7b0235e386a2aa0902e07179e (diff) | |
| download | android_development-7d961f86208b35c12867a049d4bb815da72167d3.tar.gz android_development-7d961f86208b35c12867a049d4bb815da72167d3.tar.bz2 android_development-7d961f86208b35c12867a049d4bb815da72167d3.zip | |
DO NOT MERGE Create way to run monkey with multiple scripts.
By giving multiple -f arguments, the monkey will randomly choose between the
scripts. Also, add the --setup argument which will run a setup script before
starting to play the other scripts in random order.
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/monkey/src/com/android/commands/monkey/Monkey.java | 28 | ||||
| -rw-r--r-- | cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java | 140 |
2 files changed, 162 insertions, 6 deletions
diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java index 3edd4f3a3..0d7a758eb 100644 --- a/cmds/monkey/src/com/android/commands/monkey/Monkey.java +++ b/cmds/monkey/src/com/android/commands/monkey/Monkey.java @@ -145,8 +145,11 @@ public class Monkey { long mDroppedFlipEvents = 0; - /** a filename to the script (if any) **/ - private String mScriptFileName = null; + /** a filename to the setup script (if any) */ + private String mSetupFileName = null; + + /** filenames of the script (if any) */ + private ArrayList<String> mScriptFileNames = new ArrayList<String>(); /** a TCP port to listen on for remote commands. */ private int mServerPort = -1; @@ -402,12 +405,22 @@ public class Monkey { return -4; } - if (mScriptFileName != null) { + if (mScriptFileNames != null && mScriptFileNames.size() == 1) { // script mode, ignore other options - mEventSource = new MonkeySourceScript(mScriptFileName, mThrottle); + mEventSource = new MonkeySourceScript(mScriptFileNames.get(0), mThrottle); mEventSource.setVerbose(mVerbose); mCountEvents = false; + } else if (mScriptFileNames != null) { + if (mSetupFileName != null) { + mEventSource = new MonkeySourceRandomScript(mSetupFileName, mScriptFileNames, + mThrottle, mSeed); + mCount++; + } else { + mEventSource = new MonkeySourceRandomScript(mScriptFileNames, mThrottle, mSeed); + } + mEventSource.setVerbose(mVerbose); + mCountEvents = false; } else if (mServerPort != -1) { try { mEventSource = new MonkeySourceNetwork(mServerPort); @@ -572,8 +585,10 @@ public class Monkey { mSendNoEvents = true; } else if (opt.equals("--port")) { mServerPort = (int) nextOptionLong("Server port to listen on for commands"); + } else if (opt.equals("--setup")) { + mSetupFileName = nextOptionData(); } else if (opt.equals("-f")) { - mScriptFileName = nextOptionData(); + mScriptFileNames.add(nextOptionData()); } else if (opt.equals("-h")) { showUsage(); return false; @@ -979,7 +994,8 @@ public class Monkey { usage.append(" [--pct-nav PERCENT] [--pct-majornav PERCENT]\n"); usage.append(" [--pct-appswitch PERCENT] [--pct-flip PERCENT]\n"); usage.append(" [--pct-anyevent PERCENT]\n"); - usage.append(" [--wait-dbg] [--dbg-no-events] [-f scriptfile]\n"); + usage.append(" [--wait-dbg] [--dbg-no-events]\n"); + usage.append(" [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]\n"); usage.append(" [--port port]\n"); usage.append(" [-s SEED] [-v [-v] ...] [--throttle MILLISEC]\n"); usage.append(" COUNT"); diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java new file mode 100644 index 000000000..a937398b2 --- /dev/null +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java @@ -0,0 +1,140 @@ +/* + * 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.commands.monkey; + +import java.security.SecureRandom; +import java.util.ArrayList; + +/** + * Class for generating MonkeyEvents from multiple scripts. + */ +public class MonkeySourceRandomScript implements MonkeyEventSource { + /** The verbose level of the source (currently not used) */ + private int mVerbose = 0; + + /** The source for the setup script if it exists */ + private MonkeySourceScript mSetupSource = null; + + /** The list of MonkeySourceScript instances to be played in random order */ + private ArrayList<MonkeySourceScript> mScriptSources = new ArrayList<MonkeySourceScript>(); + + /** The current source, set to the setup source and then a random script */ + private MonkeySourceScript mCurrentSource = null; + + /** The random number generator */ + private SecureRandom mRandom; + + /** + * Creates a MonkeySourceRandomScript instance with an additional setup script. + * + * @param setupFileName The name of the setup script file on the device. + * @param scriptFileNames An ArrayList of the names of the script files to be run randomly. + * @param throttle The amount of time to sleep in ms between events. + * @param seed The seed of the random number generator. + */ + public MonkeySourceRandomScript(String setupFileName, ArrayList<String> scriptFileNames, + long throttle, long seed) { + if (setupFileName != null) { + mSetupSource = new MonkeySourceScript(setupFileName, throttle); + mCurrentSource = mSetupSource; + } + + for (String fileName: scriptFileNames) { + mScriptSources.add(new MonkeySourceScript(fileName, throttle)); + } + + mRandom = new SecureRandom(); + mRandom.setSeed((seed == 0) ? -1 : seed); + } + + /** + * Creates a MonkeySourceRandomScript instance without an additional setup script. + * + * @param scriptFileNames An ArrayList of the names of the script files to be run randomly. + * @param throttle The amount of time to sleep in ms between events. + * @param seed The seed of the random number generator. + */ + public MonkeySourceRandomScript(ArrayList<String> scriptFileNames, long throttle, long seed) { + this(null, scriptFileNames, throttle, seed); + } + + /** + * Gets the next event from the current event source. If the event source is null, a new + * script event source is chosen randomly from the list of script sources and the next event is + * chosen from that. + * + * @return The first event in the event queue or null if the end of the file + * is reached or if an error is encountered reading the file. + */ + public MonkeyEvent getNextEvent() { + if (mCurrentSource == null) { + int numSources = mScriptSources.size(); + if (numSources == 1) { + mCurrentSource = mScriptSources.get(0); + } else if (numSources > 1) { + mCurrentSource = mScriptSources.get(mRandom.nextInt(numSources)); + } + } + + if (mCurrentSource != null) { + MonkeyEvent nextEvent = mCurrentSource.getNextEvent(); + if (nextEvent == null) { + mCurrentSource = null; + } + return nextEvent; + } + return null; + } + + /** + * Sets the verbosity for the source as well as all sub event sources. + * + * @param verbose The verbose level. + */ + public void setVerbose(int verbose) { + mVerbose = verbose; + + if (mSetupSource != null) { + mSetupSource.setVerbose(verbose); + } + + for (MonkeySourceScript source: mScriptSources) { + source.setVerbose(verbose); + } + } + + /** + * Validates that all the underlying event sources are valid + * + * @return True if all the script files are valid. + * + * @see MonkeySourceScript#validate() + */ + public boolean validate() { + if (mSetupSource != null && !mSetupSource.validate()) { + return false; + } + + for (MonkeySourceScript source: mScriptSources) { + if (!source.validate()) { + return false; + } + } + + return true; + } +} |
