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.commands.monkey; 18 19 import java.util.ArrayList; 20 import java.util.Random; 21 22 /** 23 * Class for generating MonkeyEvents from multiple scripts. 24 */ 25 public class MonkeySourceRandomScript implements MonkeyEventSource { 26 /** The verbose level of the source (currently not used) */ 27 private int mVerbose = 0; 28 29 /** The source for the setup script if it exists */ 30 private MonkeySourceScript mSetupSource = null; 31 32 /** The list of MonkeySourceScript instances to be played in random order */ 33 private ArrayList<MonkeySourceScript> mScriptSources = new ArrayList<MonkeySourceScript>(); 34 35 /** The current source, set to the setup source and then a random script */ 36 private MonkeySourceScript mCurrentSource = null; 37 38 /** The random number generator */ 39 private Random mRandom; 40 41 private boolean mRandomizeScript = false; 42 43 private int mScriptCount = 0; 44 45 /** 46 * Creates a MonkeySourceRandomScript instance with an additional setup script. 47 * 48 * @param setupFileName The name of the setup script file on the device. 49 * @param scriptFileNames An ArrayList of the names of the script files to be run randomly. 50 * @param throttle The amount of time to sleep in ms between events. 51 * @param randomizeThrottle Whether to randomize throttle. 52 * @param random The random number generator. 53 */ 54 public MonkeySourceRandomScript(String setupFileName, ArrayList<String> scriptFileNames, 55 long throttle, boolean randomizeThrottle, Random random, long profileWaitTime, 56 long deviceSleepTime, boolean randomizeScript) { 57 if (setupFileName != null) { 58 mSetupSource = new MonkeySourceScript(random, setupFileName, throttle, 59 randomizeThrottle, profileWaitTime, deviceSleepTime); 60 mCurrentSource = mSetupSource; 61 } 62 63 for (String fileName: scriptFileNames) { 64 mScriptSources.add(new MonkeySourceScript(random, fileName, throttle, 65 randomizeThrottle, profileWaitTime, deviceSleepTime)); 66 } 67 68 mRandom = random; 69 mRandomizeScript = randomizeScript; 70 } 71 72 /** 73 * Creates a MonkeySourceRandomScript instance without an additional setup script. 74 * 75 * @param scriptFileNames An ArrayList of the names of the script files to be run randomly. 76 * @param throttle The amount of time to sleep in ms between events. 77 * @param randomizeThrottle Whether to randomize throttle. 78 * @param random The random number generator. 79 */ 80 public MonkeySourceRandomScript(ArrayList<String> scriptFileNames, long throttle, 81 boolean randomizeThrottle, Random random, long profileWaitTime, long deviceSleepTime, 82 boolean randomizeScript) { 83 this(null, scriptFileNames, throttle, randomizeThrottle, random, profileWaitTime, 84 deviceSleepTime, randomizeScript); 85 } 86 87 /** 88 * Gets the next event from the current event source. If the event source is null, a new 89 * script event source is chosen randomly from the list of script sources and the next event is 90 * chosen from that. 91 * 92 * @return The first event in the event queue or null if the end of the file 93 * is reached or if an error is encountered reading the file. 94 */ 95 public MonkeyEvent getNextEvent() { 96 if (mCurrentSource == null) { 97 int numSources = mScriptSources.size(); 98 if (numSources == 1) { 99 mCurrentSource = mScriptSources.get(0); 100 } else if (numSources > 1 ) { 101 if (mRandomizeScript) { 102 mCurrentSource = mScriptSources.get(mRandom.nextInt(numSources)); 103 } else { 104 mCurrentSource = mScriptSources.get(mScriptCount % numSources); 105 mScriptCount++; 106 } 107 } 108 } 109 110 if (mCurrentSource != null) { 111 MonkeyEvent nextEvent = mCurrentSource.getNextEvent(); 112 if (nextEvent == null) { 113 mCurrentSource = null; 114 } 115 return nextEvent; 116 } 117 return null; 118 } 119 120 /** 121 * Sets the verbosity for the source as well as all sub event sources. 122 * 123 * @param verbose The verbose level. 124 */ 125 public void setVerbose(int verbose) { 126 mVerbose = verbose; 127 128 if (mSetupSource != null) { 129 mSetupSource.setVerbose(verbose); 130 } 131 132 for (MonkeySourceScript source: mScriptSources) { 133 source.setVerbose(verbose); 134 } 135 } 136 137 /** 138 * Validates that all the underlying event sources are valid 139 * 140 * @return True if all the script files are valid. 141 * 142 * @see MonkeySourceScript#validate() 143 */ 144 public boolean validate() { 145 if (mSetupSource != null && !mSetupSource.validate()) { 146 return false; 147 } 148 149 for (MonkeySourceScript source: mScriptSources) { 150 if (!source.validate()) { 151 return false; 152 } 153 } 154 155 return true; 156 } 157 } 158