Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2014 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.compatibility.common.util;
     18 
     19 import android.app.Instrumentation;
     20 import android.os.Bundle;
     21 import android.os.Environment;
     22 import android.util.Log;
     23 
     24 import java.io.File;
     25 import java.io.IOException;
     26 import java.util.List;
     27 
     28 /**
     29  * Handles adding results to the report for device side tests.
     30  *
     31  * NOTE: tests MUST call {@link #submit(Instrumentation)} if and only if the test passes in order to
     32  * send the results to the runner.
     33  */
     34 public class DeviceReportLog extends ReportLog {
     35     private static final String TAG = DeviceReportLog.class.getSimpleName();
     36     private static final String RESULT = "COMPATIBILITY_TEST_RESULT";
     37     private static final int INST_STATUS_ERROR = -1;
     38     private static final int INST_STATUS_IN_PROGRESS = 2;
     39 
     40     private ReportLogDeviceInfoStore store;
     41 
     42     public DeviceReportLog(String reportLogName, String streamName) {
     43         this(reportLogName, streamName,
     44                 new File(Environment.getExternalStorageDirectory(), "report-log-files"));
     45     }
     46 
     47     public DeviceReportLog(String reportLogName, String streamName, File logDirectory) {
     48         super(reportLogName, streamName);
     49         try {
     50             // dir value must match the src-dir value configured in ReportLogCollector target
     51             // preparer in cts/harness/tools/cts-tradefed/res/config/cts-preconditions.xml
     52             if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
     53                 throw new IOException("External storage is not mounted");
     54             } else if ((!logDirectory.exists() && !logDirectory.mkdirs())
     55                     || (logDirectory.exists() && !logDirectory.isDirectory())) {
     56                 throw new IOException("Cannot create directory for device info files");
     57             } else {
     58                 File jsonFile = new File(logDirectory, mReportLogName + ".reportlog.json");
     59                 store = new ReportLogDeviceInfoStore(jsonFile, mStreamName);
     60                 store.open();
     61             }
     62         } catch (Exception e) {
     63             Log.e(TAG, "Could not create report log file.", e);
     64         }
     65     }
     66 
     67     /**
     68      * Adds a double metric to the report.
     69      */
     70     @Override
     71     public void addValue(String source, String message, double value, ResultType type,
     72             ResultUnit unit) {
     73         super.addValue(source, message, value, type, unit);
     74         try {
     75             store.addResult(message, value);
     76         } catch (Exception e) {
     77             Log.e(TAG, "Could not log metric.", e);
     78         }
     79     }
     80 
     81     /**
     82      * Adds a double metric to the report.
     83      */
     84     @Override
     85     public void addValue(String message, double value, ResultType type, ResultUnit unit) {
     86         super.addValue(message, value, type, unit);
     87         try {
     88             store.addResult(message, value);
     89         } catch (Exception e) {
     90             Log.e(TAG, "Could not log metric.", e);
     91         }
     92     }
     93 
     94     /**
     95      * Adds a double array of metrics to the report.
     96      */
     97     @Override
     98     public void addValues(String source, String message, double[] values, ResultType type,
     99             ResultUnit unit) {
    100         super.addValues(source, message, values, type, unit);
    101         try {
    102             store.addArrayResult(message, values);
    103         } catch (Exception e) {
    104             Log.e(TAG, "Could not log metric.", e);
    105         }
    106     }
    107 
    108     /**
    109      * Adds a double array of metrics to the report.
    110      */
    111     @Override
    112     public void addValues(String message, double[] values, ResultType type, ResultUnit unit) {
    113         super.addValues(message, values, type, unit);
    114         try {
    115             store.addArrayResult(message, values);
    116         } catch (Exception e) {
    117             Log.e(TAG, "Could not log metric.", e);
    118         }
    119     }
    120 
    121     /**
    122      * Adds an int metric to the report.
    123      */
    124     @Override
    125     public void addValue(String message, int value, ResultType type, ResultUnit unit) {
    126         try {
    127             store.addResult(message, value);
    128         } catch (Exception e) {
    129             Log.e(TAG, "Could not log metric.", e);
    130         }
    131     }
    132 
    133     /**
    134      * Adds a long metric to the report.
    135      */
    136     @Override
    137     public void addValue(String message, long value, ResultType type, ResultUnit unit) {
    138         try {
    139             store.addResult(message, value);
    140         } catch (Exception e) {
    141             Log.e(TAG, "Could not log metric.", e);
    142         }
    143     }
    144 
    145     /**
    146      * Adds a float metric to the report.
    147      */
    148     @Override
    149     public void addValue(String message, float value, ResultType type, ResultUnit unit) {
    150         try {
    151             store.addResult(message, value);
    152         } catch (Exception e) {
    153             Log.e(TAG, "Could not log metric.", e);
    154         }
    155     }
    156 
    157     /**
    158      * Adds a boolean metric to the report.
    159      */
    160     @Override
    161     public void addValue(String message, boolean value, ResultType type, ResultUnit unit) {
    162         try {
    163             store.addResult(message, value);
    164         } catch (Exception e) {
    165             Log.e(TAG, "Could not log metric.", e);
    166         }
    167     }
    168 
    169     /**
    170      * Adds a String metric to the report.
    171      */
    172     @Override
    173     public void addValue(String message, String value, ResultType type, ResultUnit unit) {
    174         try {
    175             store.addResult(message, value);
    176         } catch (Exception e) {
    177             Log.e(TAG, "Could not log metric.", e);
    178         }
    179     }
    180 
    181     /**
    182      * Adds an int array of metrics to the report.
    183      */
    184     @Override
    185     public void addValues(String message, int[] values, ResultType type, ResultUnit unit) {
    186         try {
    187             store.addArrayResult(message, values);
    188         } catch (Exception e) {
    189             Log.e(TAG, "Could not log metric.", e);
    190         }
    191     }
    192 
    193     /**
    194      * Adds a long array of metrics to the report.
    195      */
    196     @Override
    197     public void addValues(String message, long[] values, ResultType type, ResultUnit unit) {
    198         try {
    199             store.addArrayResult(message, values);
    200         } catch (Exception e) {
    201             Log.e(TAG, "Could not log metric.", e);
    202         }
    203     }
    204 
    205     /**
    206      * Adds a float array of metrics to the report.
    207      */
    208     @Override
    209     public void addValues(String message, float[] values, ResultType type, ResultUnit unit) {
    210         try {
    211             store.addArrayResult(message, values);
    212         } catch (Exception e) {
    213             Log.e(TAG, "Could not log metric.", e);
    214         }
    215     }
    216 
    217     /**
    218      * Adds a boolean array of metrics to the report.
    219      */
    220     @Override
    221     public void addValues(String message, boolean[] values, ResultType type, ResultUnit unit) {
    222         try {
    223             store.addArrayResult(message, values);
    224         } catch (Exception e) {
    225             Log.e(TAG, "Could not log metric.", e);
    226         }
    227     }
    228 
    229     /**
    230      * Adds a String List of metrics to the report.
    231      */
    232     @Override
    233     public void addValues(String message, List<String> values, ResultType type, ResultUnit unit) {
    234         try {
    235             store.addListResult(message, values);
    236         } catch (Exception e) {
    237             Log.e(TAG, "Could not log metric.", e);
    238         }
    239     }
    240 
    241     /**
    242      * Sets the summary double metric of the report.
    243      *
    244      * NOTE: messages over {@value Metric#MAX_MESSAGE_LENGTH} chars will be trimmed.
    245      */
    246     @Override
    247     public void setSummary(String message, double value, ResultType type, ResultUnit unit) {
    248         super.setSummary(message, value, type, unit);
    249         try {
    250             store.addResult(message, value);
    251         } catch (Exception e) {
    252             Log.e(TAG, "Could not log metric.", e);
    253         }
    254     }
    255 
    256     /**
    257      * Closes report file and submits report to instrumentation.
    258      */
    259     public void submit(Instrumentation instrumentation) {
    260         try {
    261             store.close();
    262             Bundle output = new Bundle();
    263             output.putString(RESULT, serialize(this));
    264             instrumentation.sendStatus(INST_STATUS_IN_PROGRESS, output);
    265         } catch (Exception e) {
    266             Log.e(TAG, "ReportLog Submit Failed", e);
    267             instrumentation.sendStatus(INST_STATUS_ERROR, null);
    268         }
    269     }
    270 
    271     /**
    272      * Closes report file. Static functions that do not have access to instrumentation can
    273      * use this to close report logs. Summary, if present, is not reported to instrumentation, hence
    274      * does not appear in the result XML.
    275      */
    276     public void submit() {
    277         try {
    278             store.close();
    279         } catch (Exception e) {
    280             Log.e(TAG, "ReportLog Submit Failed", e);
    281         }
    282     }
    283 }
    284