Merge "Store result directory in build attributes." into mnc-dev
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildInfo.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildInfo.java
deleted file mode 100644
index fafdb91..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildInfo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.tradefed.build;
-
-import com.android.tradefed.build.FolderBuildInfo;
-
-import java.io.File;
-
-/**
- * An extension of {@link FolderBuildInfo} that includes additional CTS build info.
- */
-public class CtsBuildInfo extends FolderBuildInfo implements ICtsBuildInfo {
-
-    private File mResultDir = null;
-
-    /**
-     * Creates a {@link CtsBuildInfo}
-     *
-     * @param buildId
-     * @param testTarget
-     * @param buildName
-     */
-    public CtsBuildInfo(String buildId, String testTarget, String buildName) {
-        super(buildId, testTarget, buildName);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getResultDir() {
-        return mResultDir;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setResultDir(File resultDir) {
-        mResultDir = resultDir;
-    }
-}
\ No newline at end of file
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index 6169e77..ca67746 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -15,6 +15,7 @@
  */
 package com.android.cts.tradefed.build;
 
+import com.android.tradefed.build.FolderBuildInfo;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.build.IBuildProvider;
 import com.android.tradefed.build.IFolderBuildInfo;
@@ -41,15 +42,13 @@
         if (mCtsRootDirPath == null) {
             throw new IllegalArgumentException("Missing --cts-install-path");
         }
-        CtsBuildInfo ctsBuild = new CtsBuildInfo(CTS_BUILD_VERSION, "cts", "cts");
+        IFolderBuildInfo ctsBuild = new FolderBuildInfo(
+            Package.getPackage(CTS_PACKAGE).getImplementationVersion(),
+            "cts", "cts");
         ctsBuild.setRootDir(new File(mCtsRootDirPath));
         return ctsBuild;
     }
 
-    public static String getBuildNumber() {
-        return Package.getPackage(CTS_PACKAGE).getImplementationVersion();
-    }
-
     /**
      * {@inheritDoc}
      */
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/ICtsBuildInfo.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/ICtsBuildInfo.java
deleted file mode 100644
index 0b3ad65..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/ICtsBuildInfo.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.tradefed.build;
-
-import com.android.tradefed.build.IFolderBuildInfo;
-
-import java.io.File;
-
-/**
- * An {@link IFolderBuildInfo} that contains local CTS result directory.
- */
-public interface ICtsBuildInfo extends IFolderBuildInfo{
-
-    /**
-     * Returns the local CTS result directory.
-     */
-    public File getResultDir();
-
-    /**
-     * Sets the local CTS result directory.
-     */
-    public void setResultDir(File resultDir);
-}
\ No newline at end of file
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
index 2d6d8f2..24239e6 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
@@ -24,6 +24,7 @@
 import com.android.cts.tradefed.testtype.ITestPackageRepo;
 import com.android.cts.tradefed.testtype.TestPackageRepo;
 import com.android.cts.util.AbiUtils;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.command.Console;
 import com.android.tradefed.config.ArgsOptionParser;
 import com.android.tradefed.config.ConfigurationException;
@@ -48,7 +49,8 @@
 
     protected static final String ADD_PATTERN = "a(?:dd)?";
 
-    private CtsBuildHelper mCtsBuild = null;
+    private IFolderBuildInfo mBuildInfo = null;
+    private CtsBuildHelper mBuildHelper = null;
 
     CtsConsole() {
         super();
@@ -57,8 +59,7 @@
     @Override
     public void run() {
         printLine(String.format("Android CTS %s build:%s",
-                CtsBuildProvider.CTS_BUILD_VERSION,
-                CtsBuildProvider.getBuildNumber()));
+                CtsBuildProvider.CTS_BUILD_VERSION, getCtsBuildInfo().getBuildId()));
         super.run();
     }
 
@@ -71,7 +72,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listPlans(ctsBuild);
                 }
@@ -80,7 +81,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listPackages(ctsBuild);
                 }
@@ -89,7 +90,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listResults(ctsBuild);
                 }
@@ -116,7 +117,7 @@
                 for (int i = 2; i < args.size(); i++) {
                     flatArgs[i - 2] = args.get(i).get(0);
                 }
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     // FIXME may want to only add certain ABIs
                     addDerivedPlan(ctsBuild, AbiUtils.getAbisSupportedByCts(), flatArgs);
@@ -232,22 +233,28 @@
         }
     }
 
-    private CtsBuildHelper getCtsBuild() {
-        if (mCtsBuild == null) {
-            String ctsInstallPath = System.getProperty("CTS_ROOT");
-            if (ctsInstallPath != null) {
-                mCtsBuild = new CtsBuildHelper(new File(ctsInstallPath));
-                try {
-                    mCtsBuild.validateStructure();
-                } catch (FileNotFoundException e) {
-                    printLine(String.format("Invalid cts install: %s", e.getMessage()));
-                    mCtsBuild = null;
-                }
-            } else {
+    private IFolderBuildInfo getCtsBuildInfo() {
+        if (mBuildInfo == null) {
+            try {
+                mBuildInfo = (IFolderBuildInfo) new CtsBuildProvider().getBuild();
+            } catch (IllegalArgumentException e) {
                 printLine("Could not find CTS install location: CTS_ROOT env variable not set");
             }
         }
-        return mCtsBuild;
+        return mBuildInfo;
+    }
+
+    private CtsBuildHelper getCtsBuildHelper() {
+        if (mBuildHelper == null) {
+            try {
+                mBuildHelper = new CtsBuildHelper(getCtsBuildInfo());
+                mBuildHelper.validateStructure();
+            } catch (FileNotFoundException e) {
+                printLine(String.format("Invalid cts install: %s", e.getMessage()));
+                mBuildHelper = null;
+            }
+        }
+        return mBuildHelper;
     }
 
     public static void main(String[] args) throws InterruptedException, ConfigurationException {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
index 7883fce..fe096bd 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
@@ -15,10 +15,11 @@
  */
 package com.android.cts.tradefed.device;
 
-import com.android.cts.tradefed.build.ICtsBuildInfo;
 import com.android.cts.util.AbiUtils;
+import com.android.cts.tradefed.result.CtsXmlResultReporter;
 import com.android.ddmlib.Log;
 import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
@@ -115,12 +116,12 @@
 
     private static void pullExtendedDeviceInfoResults(ITestDevice device, IBuildInfo buildInfo)
             throws DeviceNotAvailableException {
-        if (!(buildInfo instanceof ICtsBuildInfo)) {
+        if (!(buildInfo instanceof IFolderBuildInfo)) {
             Log.e(LOG_TAG, "Invalid instance of buildInfo");
             return;
         }
-        ICtsBuildInfo ctsBuildInfo = (ICtsBuildInfo) buildInfo;
-        File localResultDir = ctsBuildInfo.getResultDir();
+        File localResultDir = new File(buildInfo.getBuildAttributes().get(
+                CtsXmlResultReporter.CTS_RESULT_DIR));
         if (localResultDir == null || !localResultDir.isDirectory()) {
             Log.e(LOG_TAG, "Local result directory is null or is not a directory");
             return;
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
index f4f133a..973d943 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
@@ -17,13 +17,13 @@
 package com.android.cts.tradefed.result;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.cts.tradefed.build.ICtsBuildInfo;
 import com.android.cts.tradefed.device.DeviceInfoCollector;
 import com.android.cts.tradefed.testtype.CtsTest;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.log.LogUtil.CLog;
@@ -62,6 +62,7 @@
 
     private static final String LOG_TAG = "CtsXmlResultReporter";
 
+    public static final String CTS_RESULT_DIR = "cts-result-dir";
     static final String TEST_RESULT_FILE_NAME = "testResult.xml";
     static final String CTS_RESULT_FILE_VERSION = "4.4";
     private static final String[] CTS_RESULT_RESOURCES = {"cts_result.xsl", "cts_result.css",
@@ -125,10 +126,10 @@
     @Override
     public void invocationStarted(IBuildInfo buildInfo) {
         mBuildInfo = buildInfo;
-        if (!(buildInfo instanceof ICtsBuildInfo)) {
-            throw new IllegalArgumentException("build info is not a ICtsBuildInfo");
+        if (!(buildInfo instanceof IFolderBuildInfo)) {
+            throw new IllegalArgumentException("build info is not a IFolderBuildInfo");
         }
-        ICtsBuildInfo ctsBuild = (ICtsBuildInfo)buildInfo;
+        IFolderBuildInfo ctsBuild = (IFolderBuildInfo)buildInfo;
         CtsBuildHelper ctsBuildHelper = getBuildHelper(ctsBuild);
         mDeviceSerial = buildInfo.getDeviceSerial() == null ? "unknown_device" :
             buildInfo.getDeviceSerial();
@@ -156,7 +157,7 @@
         mSuiteName = ctsBuildHelper.getSuiteName();
         mReporter = new ResultReporter(mResultServer, mSuiteName);
 
-        ctsBuild.setResultDir(mReportDir);
+        ctsBuild.addBuildAttribute(CTS_RESULT_DIR, mReportDir.getAbsolutePath());
 
         // TODO: allow customization of log dir
         // create a unique directory for saving logs, with same name as result dir
@@ -202,7 +203,7 @@
      * Helper method to retrieve the {@link CtsBuildHelper}.
      * @param ctsBuild
      */
-    CtsBuildHelper getBuildHelper(ICtsBuildInfo ctsBuild) {
+    CtsBuildHelper getBuildHelper(IFolderBuildInfo ctsBuild) {
         CtsBuildHelper buildHelper = new CtsBuildHelper(ctsBuild.getRootDir());
         try {
             buildHelper.validateStructure();
@@ -415,7 +416,7 @@
         serializer.attribute(ns, "endtime", endTime);
         serializer.attribute(ns, "version", CTS_RESULT_FILE_VERSION);
         serializer.attribute(ns, "suite", mSuiteName);
-        mResults.serialize(serializer);
+        mResults.serialize(serializer, mBuildInfo.getBuildId());
         // TODO: not sure why, but the serializer doesn't like this statement
         //serializer.endTag(ns, RESULT_TAG);
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
index 68cd1c0..9f67f2d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
@@ -104,9 +104,9 @@
      * @param serializer
      * @throws IOException
      */
-    public void serialize(KXmlSerializer serializer) throws IOException {
+    public void serialize(KXmlSerializer serializer, String buildId) throws IOException {
         mDeviceInfo.serialize(serializer);
-        serializeHostInfo(serializer);
+        serializeHostInfo(serializer, buildId);
         serializeTestSummary(serializer);
         // sort before serializing
         List<TestPackageResult> pkgs = new ArrayList<TestPackageResult>(mPackageResults.values());
@@ -121,7 +121,7 @@
      *
      * @param serializer
      */
-    private void serializeHostInfo(KXmlSerializer serializer) throws IOException {
+    private void serializeHostInfo(KXmlSerializer serializer, String buildId) throws IOException {
         serializer.startTag(ns, "HostInfo");
 
         String hostName = "";
@@ -143,7 +143,7 @@
 
         serializer.startTag(ns, "Cts");
         serializer.attribute(ns, "version", CtsBuildProvider.CTS_BUILD_VERSION);
-        serializer.attribute(ns, "build", CtsBuildProvider.getBuildNumber());
+        serializer.attribute(ns, "build", buildId);
         // TODO: consider outputting other tradefed options here
         serializer.startTag(ns, "IntValue");
         serializer.attribute(ns, "name", "testStatusTimeoutMs");
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
index f60dc03..a202083 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
@@ -50,7 +50,9 @@
         buildInfo = new BuildInfo();
         mResultDir = FileUtil.createTempDir("cts-result-dir");
         mMockCtsBuildInfo = EasyMock.createMock(ICtsBuildInfo.class);
-        EasyMock.expect(mMockCtsBuildInfo.getResultDir()).andStubReturn(mResultDir);
+        Map<String, String> attributes = new HashMap<>();
+        attributes.put(CtsXmlResultReporter.CTS_RESULT_DIR, mResultDir);
+        EasyMock.expect(mMockCtsBuildInfo.getBuildAttributes()).andStubReturn(attributes);
         EasyMock.replay(mMockCtsBuildInfo);
 
         assertNotNull(getDevice().getSerialNumber());