Merge "Use TestLogData to refactor host-side EDI" into oreo-mr1-cts-dev
am: 51ca915633

Change-Id: I051823f71df7eeed797714b250a2479fc5784ffe
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
index 51d59a1..328148c 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
@@ -19,6 +19,7 @@
 import com.android.compatibility.common.tradefed.testtype.CompatibilityTest;
 import com.android.compatibility.common.tradefed.util.RetryType;
 import com.android.compatibility.common.util.ChecksumReporter;
+import com.android.compatibility.common.util.DeviceInfo;
 import com.android.compatibility.common.util.ICaseResult;
 import com.android.compatibility.common.util.IInvocationResult;
 import com.android.compatibility.common.util.IModuleResult;
@@ -567,20 +568,42 @@
             mMasterResultReporter.testLog(name, type, stream);
             return;
         }
-        try {
-            File logFile = null;
-            if (mCompressLogs) {
-                try (InputStream inputStream = stream.createInputStream()) {
-                    logFile = mTestLogSaver.saveAndGZipLogData(name, type, inputStream);
+        if (name.endsWith(DeviceInfo.FILE_SUFFIX)) {
+            // Handle device info file case
+            testLogDeviceInfo(name, stream);
+        } else {
+            // Handle default case
+            try {
+                File logFile = null;
+                if (mCompressLogs) {
+                    try (InputStream inputStream = stream.createInputStream()) {
+                        logFile = mTestLogSaver.saveAndGZipLogData(name, type, inputStream);
+                    }
+                } else {
+                    try (InputStream inputStream = stream.createInputStream()) {
+                        logFile = mTestLogSaver.saveLogData(name, type, inputStream);
+                    }
                 }
-            } else {
-                try (InputStream inputStream = stream.createInputStream()) {
-                    logFile = mTestLogSaver.saveLogData(name, type, inputStream);
-                }
+                debug("Saved logs for %s in %s", name, logFile.getAbsolutePath());
+            } catch (IOException e) {
+                warn("Failed to write log for %s", name);
+                CLog.e(e);
             }
-            debug("Saved logs for %s in %s", name, logFile.getAbsolutePath());
+        }
+    }
+
+    /* Write device-info files to the result, invoked only by the master result reporter */
+    private void testLogDeviceInfo(String name, InputStreamSource stream) {
+        try {
+            File ediDir = new File(mResultDir, DeviceInfo.RESULT_DIR_NAME);
+            ediDir.mkdirs();
+            File ediFile = new File(ediDir, name);
+            if (!ediFile.exists()) {
+                // only write this file to the results if not already present
+                FileUtil.writeToFile(stream.createInputStream(), ediFile);
+            }
         } catch (IOException e) {
-            warn("Failed to write log for %s", name);
+            warn("Failed to write device info %s to result", name);
             CLog.e(e);
         }
     }
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
index d48e9f6..8a86fe9 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
@@ -16,27 +16,30 @@
 
 package com.android.compatibility.common.tradefed.targetprep;
 
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.testtype.CompatibilityTest;
-import com.android.compatibility.common.tradefed.util.CollectorUtil;
+import com.android.compatibility.common.util.DeviceInfo;
 import com.android.compatibility.common.util.DevicePropertyInfo;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.ITestLogger;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.FileInputStreamSource;
+import com.android.tradefed.result.ITestLoggerReceiver;
+import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.targetprep.BuildError;
 import com.android.tradefed.targetprep.TargetSetupError;
 import com.android.tradefed.util.FileUtil;
 
 import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.Map.Entry;
 
 /**
  * An {@link ApkInstrumentationPreparer} that collects device info.
  */
-public class DeviceInfoCollector extends ApkInstrumentationPreparer {
+public class DeviceInfoCollector extends ApkInstrumentationPreparer implements ITestLoggerReceiver {
 
     private static final String ABI = "ro.product.cpu.abi";
     private static final String ABI2 = "ro.product.cpu.abi2";
@@ -72,19 +75,16 @@
     private String mSrcDir;
 
     @Option(name = "dest-dir", description = "The directory under the result to store the files")
-    private String mDestDir;
+    private String mDestDir = DeviceInfo.RESULT_DIR_NAME;
 
+    @Deprecated
     @Option(name = "temp-dir", description = "The directory containing host-side device info files")
     private String mTempDir;
 
-    // Temp directory for host-side device info files.
-    private File mHostDir;
-
-    // Destination result directory for all device info files.
-    private File mResultDir;
+    private ITestLogger mLogger;
 
     public DeviceInfoCollector() {
-        mWhen = When.BOTH;
+        mWhen = When.BEFORE;
     }
 
     @Override
@@ -104,58 +104,30 @@
         if (mSkipDeviceInfo) {
             return;
         }
-
-        createTempHostDir();
-        createResultDir(buildInfo);
         run(device, buildInfo);
-        getDeviceInfoFiles(device);
+        File deviceInfoDir = null;
+        try {
+            deviceInfoDir = FileUtil.createTempDir(DeviceInfo.RESULT_DIR_NAME);
+            if (device.pullDir(mSrcDir, deviceInfoDir)) {
+                for (File deviceInfoFile : deviceInfoDir.listFiles()) {
+                    FileInputStreamSource source = new FileInputStreamSource(deviceInfoFile);
+                    mLogger.testLog(deviceInfoFile.getName(), LogDataType.TEXT, source);
+                    source.close();
+                }
+            } else {
+                CLog.e("Failed to pull device-info files from device %s", device.getSerialNumber());
+            }
+        } catch (IOException e) {
+            CLog.e("Failed to pull device-info files from device %s", device.getSerialNumber());
+            CLog.e(e);
+        } finally {
+            FileUtil.recursiveDelete(deviceInfoDir);
+        }
     }
 
     @Override
-    public void tearDown(ITestDevice device, IBuildInfo buildInfo, Throwable e) {
-        if (mSkipDeviceInfo) {
-            return;
-        }
-        if (mHostDir != null && mHostDir.isDirectory() &&
-                mResultDir != null && mResultDir.isDirectory()) {
-            CollectorUtil.pullFromHost(mHostDir, mResultDir);
-        }
-    }
-
-    private void createTempHostDir() {
-        try {
-            mHostDir = FileUtil.createNamedTempDir(mTempDir);
-            if (!mHostDir.isDirectory()) {
-                CLog.e("%s is not a directory", mHostDir.getAbsolutePath());
-                return;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void createResultDir(IBuildInfo buildInfo) {
-        CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(buildInfo);
-        try {
-            mResultDir = buildHelper.getResultDir();
-            if (mDestDir != null) {
-                mResultDir = new File(mResultDir, mDestDir);
-            }
-            mResultDir.mkdirs();
-            if (!mResultDir.isDirectory()) {
-                CLog.e("%s is not a directory", mResultDir.getAbsolutePath());
-                return;
-            }
-        } catch (FileNotFoundException fnfe) {
-            fnfe.printStackTrace();
-        }
-    }
-
-    private void getDeviceInfoFiles(ITestDevice device) {
-        if (mResultDir != null && mResultDir.isDirectory()) {
-            String mResultPath = mResultDir.getAbsolutePath();
-            CollectorUtil.pullFromDevice(device, mSrcDir, mResultPath);
-        }
+    public void setTestLogger(ITestLogger testLogger) {
+        mLogger = testLogger;
     }
 
     private static String nullToEmpty(String value) {
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java
index 7a1fe7f..c24e9df 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java
@@ -18,6 +18,7 @@
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
+import com.android.compatibility.common.util.DeviceInfo;
 import com.android.compatibility.common.util.ICaseResult;
 import com.android.compatibility.common.util.IInvocationResult;
 import com.android.compatibility.common.util.IModuleResult;
@@ -475,4 +476,26 @@
         // actual logs
         assertEquals(2, mBuildHelper.getLogsDir().listFiles()[0].listFiles()[0].list().length);
     }
+
+    /**
+     * Ensure that when {@link ResultReporter#testLog(String, LogDataType, InputStreamSource)} is
+     * called for host-side device info, a device info file is created in the result
+     */
+    public void testTestLogWithDeviceInfo() throws Exception {
+        InputStreamSource fakeData = new ByteArrayInputStreamSource("test".getBytes());
+        String deviceInfoName = String.format("Test%s", DeviceInfo.FILE_SUFFIX);
+        mReporter.invocationStarted(mContext);
+        mReporter.testLog(deviceInfoName, LogDataType.TEXT, fakeData);
+        File deviceInfoFolder = new File(mBuildHelper.getResultDir(), DeviceInfo.RESULT_DIR_NAME);
+        // assert device info folder was created
+        assertTrue(deviceInfoFolder.exists());
+        File[] deviceInfoFiles = deviceInfoFolder.listFiles();
+        // assert that one file was written to the folder
+        assertEquals(1, deviceInfoFiles.length);
+        File deviceInfoFile = deviceInfoFiles[0];
+        // assert device info file has been named correctly
+        assertEquals(deviceInfoName, deviceInfoFile.getName());
+        // assert contents of the file
+        assertEquals("test", FileUtil.readStringFromFile(deviceInfoFile));
+    }
 }
diff --git a/common/host-side/util/src/com/android/compatibility/common/util/DeviceInfo.java b/common/host-side/util/src/com/android/compatibility/common/util/DeviceInfo.java
index ef05813..5d303e5 100644
--- a/common/host-side/util/src/com/android/compatibility/common/util/DeviceInfo.java
+++ b/common/host-side/util/src/com/android/compatibility/common/util/DeviceInfo.java
@@ -15,36 +15,80 @@
  */
 package com.android.compatibility.common.util;
 
+import static org.junit.Assert.fail;
+
 import com.android.compatibility.common.util.HostInfoStore;
-import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.FileInputStreamSource;
+import com.android.tradefed.result.LogDataType;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestLogData;
+import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.StreamUtil;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.io.File;
 
 /**
  * Collect device information from host and write to a JSON file.
  */
-public abstract class DeviceInfo extends DeviceTestCase {
+@RunWith(DeviceJUnit4ClassRunner.class)
+public abstract class DeviceInfo implements IDeviceTest {
 
-    // Temporary folder must match the temp-dir value configured in DeviceInfoCollector target
-    // preparer in cts/tools/cts-tradefed/res/config/cts-preconditions.xml
-    private static final String TEMPORARY_REPORT_FOLDER = "temp-device-info-files/";
+    // Default name of the directory for storing device info files within the result directory
+    public static final String RESULT_DIR_NAME = "device-info-files";
+
+    public static final String FILE_SUFFIX = ".deviceinfo.json";
+
+    /** A reference to the device under test. */
+    protected ITestDevice mDevice;
 
     private HostInfoStore mStore;
 
+    @Rule
+    public TestLogData mLogger = new TestLogData();
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ITestDevice getDevice() {
+        return mDevice;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDevice(ITestDevice device) {
+        mDevice = device;
+    }
+
+    @Test
     public void testCollectDeviceInfo() throws Exception {
-        String collectionName = getClass().getSimpleName();
+        String deviceInfoName = getClass().getSimpleName() + FILE_SUFFIX;
+        File jsonFile = null;
+        FileInputStreamSource source = null;
         try {
-            final File dir = FileUtil.createNamedTempDir(TEMPORARY_REPORT_FOLDER);
-            File jsonFile = new File(dir, collectionName + ".deviceinfo.json");
+            jsonFile = FileUtil.createTempFile(getClass().getSimpleName(), FILE_SUFFIX);
             mStore = new HostInfoStore(jsonFile);
             mStore.open();
             collectDeviceInfo(mStore);
             mStore.close();
+            source = new FileInputStreamSource(jsonFile);
+            mLogger.addTestLog(deviceInfoName, LogDataType.TEXT, source);
         } catch (Exception e) {
-            e.printStackTrace();
+            CLog.e(e);
             fail(String.format("Failed to collect device info (%s): %s",
-                    collectionName, e.getMessage()));
+                    deviceInfoName, e.getMessage()));
+        } finally {
+            FileUtil.deleteFile(jsonFile);
+            StreamUtil.close(source);
         }
     }
 
@@ -52,4 +96,4 @@
      * Method to collect device information.
      */
     protected abstract void collectDeviceInfo(HostInfoStore store) throws Exception;
-}
\ No newline at end of file
+}
diff --git a/run_unit_tests.sh b/run_unit_tests.sh
index 64ecf25..3f29832 100755
--- a/run_unit_tests.sh
+++ b/run_unit_tests.sh
@@ -44,7 +44,6 @@
     cts-tradefed-tests\
     compatibility-device-info-tests\
     compatibility-manifest-generator-tests
-    compatibility-host-media-preconditions-tests\
     CompatibilityTestApp"
 
 pushd ${CTS_DIR}/..
@@ -74,5 +73,3 @@
 ${CTS_DIR}/common/util/tests/run_tests.sh
 
 ${CTS_DIR}/tools/cts-tradefed/tests/run_tests.sh
-
-${CTS_DIR}/tests/tests/mediastress/preconditions/tests/run_tests.sh