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