Update CompatibilityBuildProvider to populate testsDir

Ensure the DeviceBuildInfo populate the testsDir.

Test: unit tests
./cts-tradefed run cts-dev -m CtsBackupHostTestCases
Bug: 62084954

Change-Id: I5d571b2cce45784cd0f4650aa25d8dc45090ee09
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
index 286f53f..75e8f3d 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
@@ -15,17 +15,18 @@
  */
 package com.android.compatibility.common.tradefed.build;
 
+import com.android.annotations.VisibleForTesting;
 import com.android.compatibility.SuiteInfo;
 import com.android.tradefed.build.BuildInfo;
 import com.android.tradefed.build.BuildRetrievalError;
 import com.android.tradefed.build.DeviceBuildInfo;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.build.IBuildProvider;
+import com.android.tradefed.build.IDeviceBuildInfo;
 import com.android.tradefed.build.IDeviceBuildProvider;
-import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.Option;
-import com.android.tradefed.config.OptionClass;
 import com.android.tradefed.config.Option.Importance;
+import com.android.tradefed.config.OptionClass;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 
@@ -165,14 +166,7 @@
         info.addBuildAttribute(SUITE_PLAN, mSuitePlan);
         info.addBuildAttribute(START_TIME_MS, Long.toString(startTimeMs));
         info.addBuildAttribute(RESULT_DIR, getDirSuffix(startTimeMs));
-        String rootDirPath = null;
-        if (info instanceof IFolderBuildInfo) {
-            File rootDir = ((IFolderBuildInfo) info).getRootDir();
-            if (rootDir != null) {
-                rootDirPath = rootDir.getAbsolutePath();
-            }
-        }
-        rootDirPath = System.getProperty(String.format("%s_ROOT", getSuiteInfoName()), rootDirPath);
+        String rootDirPath = getRootDirPath();
         if (rootDirPath == null || rootDirPath.trim().equals("")) {
             throw new IllegalArgumentException(
                     String.format("Missing install path property %s_ROOT", getSuiteInfoName()));
@@ -183,6 +177,12 @@
                     String.format("Root directory doesn't exist %s", rootDir.getAbsolutePath()));
         }
         info.addBuildAttribute(ROOT_DIR, rootDir.getAbsolutePath());
+        // For DeviceBuildInfo we populate the testsDir folder of the build info.
+        if (info instanceof IDeviceBuildInfo) {
+            File testDir =  new File(rootDir, String.format("android-%s/testcases/",
+                    getSuiteInfoName().toLowerCase()));
+            ((IDeviceBuildInfo) info).setTestsDir(testDir, "0");
+        }
         if (mURL != null && !mURL.isEmpty()) {
             info.addBuildAttribute(DYNAMIC_CONFIG_OVERRIDE_URL,
                     mURL.replace("{suite-name}", getSuiteInfoName()));
@@ -190,6 +190,14 @@
     }
 
     /**
+     * Returns the CTS_ROOT variable that the harness was started with.
+     */
+    @VisibleForTesting
+    String getRootDirPath() {
+        return System.getProperty(String.format("%s_ROOT", getSuiteInfoName()));
+    }
+
+    /**
      * Return the SuiteInfo name generated at build time. Exposed for testing.
      */
     protected String getSuiteInfoName() {
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
index 63ed9e8..f807818 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
@@ -16,6 +16,7 @@
 package com.android.compatibility.common.tradefed;
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelperTest;
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildProviderTest;
 import com.android.compatibility.common.tradefed.command.CompatibilityConsoleTest;
 import com.android.compatibility.common.tradefed.config.ConfigurationFactoryTest;
 import com.android.compatibility.common.tradefed.presubmit.ApkPackageNameCheck;
@@ -56,6 +57,7 @@
 @SuiteClasses({
     // build
     CompatibilityBuildHelperTest.class,
+    CompatibilityBuildProviderTest.class,
 
     // command
     CompatibilityConsoleTest.class,
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProviderTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProviderTest.java
new file mode 100644
index 0000000..a142081
--- /dev/null
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProviderTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 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.compatibility.common.tradefed.build;
+
+import static org.junit.Assert.*;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.build.IDeviceBuildInfo;
+import com.android.tradefed.config.OptionSetter;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.util.FileUtil;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.io.File;
+
+/**
+ * Unit tests for {@link CompatibilityBuildProvider}.
+ */
+@RunWith(JUnit4.class)
+public class CompatibilityBuildProviderTest {
+
+    private CompatibilityBuildProvider mProvider;
+    private ITestDevice mMockDevice;
+    private File mRootDir;
+
+    @Before
+    public void setUp() throws Exception {
+        mMockDevice = EasyMock.createMock(ITestDevice.class);
+        mRootDir = FileUtil.createTempDir("cts-root-dir");
+        mProvider = new CompatibilityBuildProvider() {
+            @Override
+            String getRootDirPath() {
+                return mRootDir.getAbsolutePath();
+            }
+        };
+    }
+
+    @After
+    public void tearDown() {
+        FileUtil.recursiveDelete(mRootDir);
+    }
+
+    /**
+     * Tests getting the build info without using the device information.
+     */
+    @Test
+    public void testBaseGetBuild() throws Exception {
+        EasyMock.replay(mMockDevice);
+        IBuildInfo info = mProvider.getBuild(mMockDevice);
+        EasyMock.verify(mMockDevice);
+        assertFalse(info instanceof IDeviceBuildInfo);
+    }
+
+    /**
+     * Tests building build infos using the device information.
+     */
+    @Test
+    public void testBaseGetBuild_withDevice() throws Exception {
+        OptionSetter setter = new OptionSetter(mProvider);
+        setter.setOptionValue("use-device-build-info", "true");
+        setter.setOptionValue("branch", "build_branch");
+        EasyMock.expect(mMockDevice.getBuildId()).andReturn("8888");
+        EasyMock.expect(mMockDevice.getBuildFlavor()).andReturn("flavor");
+        EasyMock.expect(mMockDevice.getBuildAlias()).andReturn("alias");
+        EasyMock.replay(mMockDevice);
+        IBuildInfo info = mProvider.getBuild(mMockDevice);
+        EasyMock.verify(mMockDevice);
+        assertTrue(info instanceof IDeviceBuildInfo);
+        // tests dir should be populated
+        assertNotNull(((IDeviceBuildInfo)info).getTestsDir());
+    }
+}