Merge "Install dEQP OnDevice package explicitly in DeqpTestRunner." into lmp-dev
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index db1b2dd..c185cec 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -1,8 +1,10 @@
 package com.android.cts.tradefed.testtype;
 
+import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.MultiLineReceiver;
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
@@ -10,9 +12,12 @@
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -25,8 +30,12 @@
  *
  * Supports running drawElements Quality Program tests found under external/deqp.
  */
-public class DeqpTestRunner implements IDeviceTest, IRemoteTest {
-    final private int TESTCASE_BATCH_LIMIT = 1000;
+public class DeqpTestRunner implements IBuildReceiver, IDeviceTest, IRemoteTest {
+
+    private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk";
+    private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp";
+
+    private final int TESTCASE_BATCH_LIMIT = 1000;
 
     private boolean mLogData;
 
@@ -36,6 +45,7 @@
     private final String mName;
     private Collection<TestIdentifier> mTests;
     private IAbi mAbi;
+    private CtsBuildHelper mCtsBuild;
 
     private TestIdentifier mCurrentTestId;
     private boolean mGotTestResult;
@@ -58,6 +68,14 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    /**
      * Enable or disable raw dEQP test log collection.
      */
     public void setCollectLogs(boolean logData) {
@@ -420,6 +438,29 @@
     }
 
     /**
+     * Install dEQP OnDevice Package
+     */
+    private void installTestApk() throws DeviceNotAvailableException {
+        try {
+            File apkFile = mCtsBuild.getTestApp(DEQP_ONDEVICE_APK);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            String errorCode = getDevice().installPackage(apkFile, true, options);
+            if (errorCode != null) {
+                CLog.e("Failed to install %s. Reason: %s", DEQP_ONDEVICE_APK, errorCode);
+            }
+        } catch (FileNotFoundException e) {
+            CLog.e("Could not find test apk %s", DEQP_ONDEVICE_APK);
+        }
+    }
+
+    /**
+     * Uninstall dEQP OnDevice Package
+     */
+    private void uninstallTestApk() throws DeviceNotAvailableException {
+        getDevice().uninstallPackage(DEQP_ONDEVICE_PKG);
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -429,6 +470,10 @@
         if ((mName.equals( "dEQP-GLES3") && isSupportedGles(mDevice, 3, 0))
             || (mName.equals("dEQP-GLES31") && isSupportedGles(mDevice, 3, 1))) {
 
+            // Make sure there is no pre-existing package form earlier interrupted test run.
+            uninstallTestApk();
+            installTestApk();
+
             while (!mTests.isEmpty()) {
                 executeTests(listener);
 
@@ -445,16 +490,18 @@
 
                         source.cancel();
                     }
-                if (!mGotTestResult) {
-                    mListener.testFailed(mCurrentTestId,
-                        "Log doesn't contain test result");
-                }
+                    if (!mGotTestResult) {
+                        mListener.testFailed(mCurrentTestId,
+                            "Log doesn't contain test result");
+                    }
 
                     mListener.testEnded(mCurrentTestId, emptyMap);
                     mCurrentTestId = null;
                     mListener.testRunEnded(0, emptyMap);
                 }
             }
+
+            uninstallTestApk();
         } else {
             /* Pass all tests if OpenGL ES version is not supported */
             Map <String, String> emptyMap = Collections.emptyMap();