Add support for ReportLog

Change-Id: I672b7bc41009ddee534a30bb428369ad916bb42c
diff --git a/libs/deviceutil/src/android/cts/util/DeviceReportLog.java b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
index b707fc8..a3ceecfa 100644
--- a/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
+++ b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
@@ -16,19 +16,24 @@
 
 package android.cts.util;
 
-import com.android.cts.util.ReportLog;
-
 import android.app.Instrumentation;
 import android.os.Bundle;
 import android.util.Log;
 
+import com.android.cts.util.ReportLog;
+
 public class DeviceReportLog extends ReportLog {
     private static final String TAG = "DeviceCtsReport";
     private static final String CTS_RESULT = "CTS_RESULT";
     private static final int INST_STATUS_IN_PROGRESS = 2;
+    private static final int BASE_DEPTH = 4;
 
-    DeviceReportLog() {
-        mDepth = 4;
+    public DeviceReportLog() {
+        mDepth = BASE_DEPTH;
+    }
+
+    public DeviceReportLog(int depth) {
+        mDepth = BASE_DEPTH + depth;
     }
 
     @Override
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 7fb0d5a..8ec3fdc 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -14,25 +14,13 @@
 
 LOCAL_PATH:= $(call my-dir)
 
-# Reusable Sensor test classes and helpers
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := cts-sensors-tests
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src/android/hardware/cts/helpers)
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-
 # CtsHardwareTestCases package
 
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner mockito-target android-ex-camera2
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner mockito-target android-ex-camera2
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index 35c312f..7cbe113 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -98,6 +98,15 @@
     private static final int RATE_5HZ = 200000;
     private static final int RATE_1HZ = 1000000;
 
+    private static final String[] STAT_KEYS = {
+        SensorStats.FREQUENCY_KEY,
+        SensorStats.JITTER_95_PERCENTILE_KEY,
+        SensorStats.EVENT_OUT_OF_ORDER_COUNT_KEY,
+        SensorStats.MAGNITUDE_KEY,
+        SensorStats.MEAN_KEY,
+        SensorStats.STANDARD_DEVIATION_KEY,
+    };
+
     /**
      * This test verifies that the sensor's properties complies with the required properites set in
      * the CDD.
@@ -123,7 +132,6 @@
                         sensorName, sensor.getMinDelay(), expected);
                 assertTrue(msg, sensor.getMinDelay() <= expected);
             }
-
         }
     }
 
@@ -214,6 +222,7 @@
         runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
     }
 
+    @SuppressWarnings("deprecation")
     public void testOrientation_100hz() throws Throwable {
         runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ, BATCHING_OFF);
     }
@@ -594,6 +603,10 @@
         op.setLogEvents(true);
         try {
             op.execute();
+
+            // Only report stats if it passes.
+            SensorStats.logSelectedStatsToReportLog(getInstrumentation(), 2, STAT_KEYS,
+                    op.getStats());
         } finally {
             SensorStats.logStats(TAG, op.getStats());
 
@@ -609,6 +622,8 @@
             String fileName = String.format("single_sensor_%s_%s%s.txt",
                     sensorName, sensorRate, batching);
             SensorStats.logStatsToFile(fileName, op.getStats());
+
+
         }
     }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
index 1a500d4..b868ea6 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
@@ -16,10 +16,17 @@
 
 package android.hardware.cts.helpers;
 
+import android.app.Instrumentation;
+import android.cts.util.DeviceReportLog;
 import android.hardware.cts.helpers.sensoroperations.ISensorOperation;
+import android.os.Bundle;
 import android.os.Environment;
 import android.util.Log;
 
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -148,6 +155,36 @@
         }
     }
 
+    /**
+     * Utility method to log selected stats to a {@link ReportLog} object.  The stats must be
+     * a number or an array of numbers.
+     */
+    public static void logSelectedStatsToReportLog(Instrumentation instrumentation, int depth,
+            String[] keys, SensorStats stats) {
+        DeviceReportLog reportLog = new DeviceReportLog(depth);
+
+        for (String key : keys) {
+            Object value = stats.getValue(key);
+            if (value instanceof Integer) {
+                reportLog.printValue(key, (Integer) value, ResultType.NEUTRAL, ResultUnit.NONE);
+            } else if (value instanceof Double) {
+                reportLog.printValue(key, (Double) value, ResultType.NEUTRAL, ResultUnit.NONE);
+            } else if (value instanceof Float) {
+                reportLog.printValue(key, (Float) value, ResultType.NEUTRAL, ResultUnit.NONE);
+            } else if (value instanceof double[]) {
+                reportLog.printArray(key, (double[]) value, ResultType.NEUTRAL, ResultUnit.NONE);
+            } else if (value instanceof float[]) {
+                float[] tmpFloat = (float[]) value;
+                double[] tmpDouble = new double[tmpFloat.length];
+                for (int i = 0; i < tmpDouble.length; i++) tmpDouble[i] = tmpFloat[i];
+                reportLog.printArray(key, tmpDouble, ResultType.NEUTRAL, ResultUnit.NONE);
+            }
+        }
+
+        reportLog.printSummary("summary", 0, ResultType.NEUTRAL, ResultUnit.NONE);
+        reportLog.deliverReportToHost(instrumentation);
+    }
+
     private static List<String> getSortedKeys(Map<String, Object> flattenedStats) {
         List<String> keys = new ArrayList<String>(flattenedStats.keySet());
         Collections.sort(keys);
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java
index 4bd0eed..a476dab 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java
@@ -16,14 +16,13 @@
 
 package android.hardware.cts.helpers;
 
-import android.test.AndroidTestCase;
-
+import android.cts.util.CtsAndroidTestCase;
 import android.util.Log;
 
 /**
  * Test Case class that handles gracefully sensors that are not available in the device.
  */
-public abstract class SensorTestCase extends AndroidTestCase {
+public abstract class SensorTestCase extends CtsAndroidTestCase {
     protected final String LOG_TAG = "TestRunner";
 
     protected SensorTestCase() {}