1 /* 2 * Copyright (C) 2012 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 package com.android.loganalysis.item; 17 18 import org.json.JSONArray; 19 import org.json.JSONException; 20 import org.json.JSONObject; 21 22 import java.util.Arrays; 23 import java.util.Date; 24 import java.util.HashSet; 25 import java.util.Set; 26 27 /** 28 * An {@link IItem} used to store monkey log info. 29 */ 30 public class MonkeyLogItem extends GenericItem { 31 @SuppressWarnings("serial") 32 private class StringSet extends HashSet<String> {} 33 34 public enum DroppedCategory { 35 KEYS, 36 POINTERS, 37 TRACKBALLS, 38 FLIPS, 39 ROTATIONS 40 } 41 42 /** Constant for JSON output */ 43 public static final String START_TIME = "START_TIME"; 44 /** Constant for JSON output */ 45 public static final String STOP_TIME = "STOP_TIME"; 46 /** Constant for JSON output */ 47 public static final String PACKAGES = "PACKAGES"; 48 /** Constant for JSON output */ 49 public static final String CATEGORIES = "CATEGORIES"; 50 /** Constant for JSON output */ 51 public static final String THROTTLE = "THROTTLE"; 52 /** Constant for JSON output */ 53 public static final String SEED = "SEED"; 54 /** Constant for JSON output */ 55 public static final String TARGET_COUNT = "TARGET_COUNT"; 56 /** Constant for JSON output */ 57 public static final String IGNORE_SECURITY_EXCEPTIONS = "IGNORE_SECURITY_EXCEPTIONS"; 58 /** Constant for JSON output */ 59 public static final String TOTAL_DURATION = "TOTAL_TIME"; 60 /** Constant for JSON output */ 61 public static final String START_UPTIME_DURATION = "START_UPTIME"; 62 /** Constant for JSON output */ 63 public static final String STOP_UPTIME_DURATION = "STOP_UPTIME"; 64 /** Constant for JSON output */ 65 public static final String IS_FINISHED = "IS_FINISHED"; 66 /** Constant for JSON output */ 67 public static final String NO_ACTIVITIES = "NO_ACTIVITIES"; 68 /** Constant for JSON output */ 69 public static final String INTERMEDIATE_COUNT = "INTERMEDIATE_COUNT"; 70 /** Constant for JSON output */ 71 public static final String FINAL_COUNT = "FINAL_COUNT"; 72 /** Constant for JSON output */ 73 public static final String CRASH = "CRASH"; 74 75 private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList( 76 START_TIME, STOP_TIME, PACKAGES, CATEGORIES, THROTTLE, SEED, TARGET_COUNT, 77 IGNORE_SECURITY_EXCEPTIONS, TOTAL_DURATION, START_UPTIME_DURATION, STOP_UPTIME_DURATION, 78 IS_FINISHED, NO_ACTIVITIES, INTERMEDIATE_COUNT, FINAL_COUNT, CRASH, 79 DroppedCategory.KEYS.toString(), 80 DroppedCategory.POINTERS.toString(), 81 DroppedCategory.TRACKBALLS.toString(), 82 DroppedCategory.FLIPS.toString(), 83 DroppedCategory.ROTATIONS.toString())); 84 85 /** 86 * The constructor for {@link MonkeyLogItem}. 87 */ MonkeyLogItem()88 public MonkeyLogItem() { 89 super(ATTRIBUTES); 90 91 setAttribute(PACKAGES, new StringSet()); 92 setAttribute(CATEGORIES, new StringSet()); 93 setAttribute(THROTTLE, 0); 94 setAttribute(IGNORE_SECURITY_EXCEPTIONS, false); 95 setAttribute(IS_FINISHED, false); 96 setAttribute(NO_ACTIVITIES, false); 97 setAttribute(INTERMEDIATE_COUNT, 0); 98 } 99 100 /** 101 * Get the start time of the monkey log. 102 */ getStartTime()103 public Date getStartTime() { 104 return (Date) getAttribute(START_TIME); 105 } 106 107 /** 108 * Set the start time of the monkey log. 109 */ setStartTime(Date time)110 public void setStartTime(Date time) { 111 setAttribute(START_TIME, time); 112 } 113 114 /** 115 * Get the stop time of the monkey log. 116 */ getStopTime()117 public Date getStopTime() { 118 return (Date) getAttribute(STOP_TIME); 119 } 120 121 /** 122 * Set the stop time of the monkey log. 123 */ setStopTime(Date time)124 public void setStopTime(Date time) { 125 setAttribute(STOP_TIME, time); 126 } 127 128 /** 129 * Get the set of packages that the monkey is run on. 130 */ getPackages()131 public Set<String> getPackages() { 132 return (StringSet) getAttribute(PACKAGES); 133 } 134 135 /** 136 * Add a package to the set that the monkey is run on. 137 */ addPackage(String thePackage)138 public void addPackage(String thePackage) { 139 ((StringSet) getAttribute(PACKAGES)).add(thePackage); 140 } 141 142 /** 143 * Get the set of categories that the monkey is run on. 144 */ getCategories()145 public Set<String> getCategories() { 146 return (StringSet) getAttribute(CATEGORIES); 147 } 148 149 /** 150 * Add a category to the set that the monkey is run on. 151 */ addCategory(String category)152 public void addCategory(String category) { 153 ((StringSet) getAttribute(CATEGORIES)).add(category); 154 } 155 156 /** 157 * Get the throttle for the monkey run. 158 */ getThrottle()159 public int getThrottle() { 160 return (Integer) getAttribute(THROTTLE); 161 } 162 163 /** 164 * Set the throttle for the monkey run. 165 */ setThrottle(int throttle)166 public void setThrottle(int throttle) { 167 setAttribute(THROTTLE, throttle); 168 } 169 170 /** 171 * Get the seed for the monkey run. 172 */ getSeed()173 public Long getSeed() { 174 return (Long) getAttribute(SEED); 175 } 176 177 /** 178 * Set the seed for the monkey run. 179 */ setSeed(long seed)180 public void setSeed(long seed) { 181 setAttribute(SEED, seed); 182 } 183 184 /** 185 * Get the target count for the monkey run. 186 */ getTargetCount()187 public Integer getTargetCount() { 188 return (Integer) getAttribute(TARGET_COUNT); 189 } 190 191 /** 192 * Set the target count for the monkey run. 193 */ setTargetCount(int count)194 public void setTargetCount(int count) { 195 setAttribute(TARGET_COUNT, count); 196 } 197 198 /** 199 * Get if the ignore security exceptions flag is set for the monkey run. 200 */ getIgnoreSecurityExceptions()201 public boolean getIgnoreSecurityExceptions() { 202 return (Boolean) getAttribute(IGNORE_SECURITY_EXCEPTIONS); 203 } 204 205 /** 206 * Set if the ignore security exceptions flag is set for the monkey run. 207 */ setIgnoreSecurityExceptions(boolean ignore)208 public void setIgnoreSecurityExceptions(boolean ignore) { 209 setAttribute(IGNORE_SECURITY_EXCEPTIONS, ignore); 210 } 211 212 /** 213 * Get the total duration of the monkey run in milliseconds. 214 */ getTotalDuration()215 public Long getTotalDuration() { 216 return (Long) getAttribute(TOTAL_DURATION); 217 } 218 219 /** 220 * Set the total duration of the monkey run in milliseconds. 221 */ setTotalDuration(long time)222 public void setTotalDuration(long time) { 223 setAttribute(TOTAL_DURATION, time); 224 } 225 226 /** 227 * Get the start uptime duration of the monkey run in milliseconds. 228 */ getStartUptimeDuration()229 public Long getStartUptimeDuration() { 230 return (Long) getAttribute(START_UPTIME_DURATION); 231 } 232 233 /** 234 * Set the start uptime duration of the monkey run in milliseconds. 235 */ setStartUptimeDuration(long uptime)236 public void setStartUptimeDuration(long uptime) { 237 setAttribute(START_UPTIME_DURATION, uptime); 238 } 239 240 /** 241 * Get the stop uptime duration of the monkey run in milliseconds. 242 */ getStopUptimeDuration()243 public Long getStopUptimeDuration() { 244 return (Long) getAttribute(STOP_UPTIME_DURATION); 245 } 246 247 /** 248 * Set the stop uptime duration of the monkey run in milliseconds. 249 */ setStopUptimeDuration(long uptime)250 public void setStopUptimeDuration(long uptime) { 251 setAttribute(STOP_UPTIME_DURATION, uptime); 252 } 253 254 /** 255 * Get if the monkey run finished without crashing. 256 */ getIsFinished()257 public boolean getIsFinished() { 258 return (Boolean) getAttribute(IS_FINISHED); 259 } 260 261 /** 262 * Set if the monkey run finished without crashing. 263 */ setIsFinished(boolean finished)264 public void setIsFinished(boolean finished) { 265 setAttribute(IS_FINISHED, finished); 266 } 267 268 /** 269 * Get if the monkey run aborted due to no activies to run. 270 */ getNoActivities()271 public boolean getNoActivities() { 272 return (Boolean) getAttribute(NO_ACTIVITIES); 273 } 274 275 /** 276 * Set if the monkey run aborted due to no activies to run. 277 */ setNoActivities(boolean noActivities)278 public void setNoActivities(boolean noActivities) { 279 setAttribute(NO_ACTIVITIES, noActivities); 280 } 281 282 283 /** 284 * Get the intermediate count for the monkey run. 285 * <p> 286 * This count starts at 0 and increments every 100 events. This number should be within 100 of 287 * the final count. 288 * </p> 289 */ getIntermediateCount()290 public int getIntermediateCount() { 291 return (Integer) getAttribute(INTERMEDIATE_COUNT); 292 } 293 294 /** 295 * Set the intermediate count for the monkey run. 296 * <p> 297 * This count starts at 0 and increments every 100 events. This number should be within 100 of 298 * the final count. 299 * </p> 300 */ setIntermediateCount(int count)301 public void setIntermediateCount(int count) { 302 setAttribute(INTERMEDIATE_COUNT, count); 303 } 304 305 /** 306 * Get the final count for the monkey run. 307 */ getFinalCount()308 public Integer getFinalCount() { 309 return (Integer) getAttribute(FINAL_COUNT); 310 } 311 312 /** 313 * Set the final count for the monkey run. 314 */ setFinalCount(int count)315 public void setFinalCount(int count) { 316 setAttribute(FINAL_COUNT, count); 317 } 318 319 /** 320 * Get the dropped events count for a {@link DroppedCategory} for the monkey run. 321 */ getDroppedCount(DroppedCategory category)322 public Integer getDroppedCount(DroppedCategory category) { 323 return (Integer) getAttribute(category.toString()); 324 } 325 326 /** 327 * Set the dropped events count for a {@link DroppedCategory} for the monkey run. 328 */ setDroppedCount(DroppedCategory category, int count)329 public void setDroppedCount(DroppedCategory category, int count) { 330 setAttribute(category.toString(), count); 331 } 332 333 /** 334 * Get the {@link AnrItem}, {@link JavaCrashItem}, or {@link NativeCrashItem} for the monkey run 335 * or null if there was no crash. 336 */ getCrash()337 public MiscLogcatItem getCrash() { 338 return (MiscLogcatItem) getAttribute(CRASH); 339 } 340 341 /** 342 * Set the {@link AnrItem}, {@link JavaCrashItem}, or {@link NativeCrashItem} for the monkey 343 * run. 344 */ setCrash(MiscLogcatItem crash)345 public void setCrash(MiscLogcatItem crash) { 346 setAttribute(CRASH, crash); 347 } 348 349 /** 350 * {@inheritDoc} 351 */ 352 @Override toJson()353 public JSONObject toJson() { 354 JSONObject object = super.toJson(); 355 356 // Override packages and categories 357 put(object, PACKAGES, new JSONArray(getPackages())); 358 put(object, CATEGORIES, new JSONArray(getCategories())); 359 360 return object; 361 } 362 363 /** 364 * Try to put an {@link Object} in a {@link JSONObject} and remove the existing key if it fails. 365 */ put(JSONObject object, String key, Object value)366 private static void put(JSONObject object, String key, Object value) { 367 try { 368 object.put(key, value); 369 } catch (JSONException e) { 370 object.remove(key); 371 } 372 } 373 } 374