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