Install dEQP OnDevice package explicitly in DeqpTestRunner.

Previously DeqpTestRunner expected test package to have been installed before
DeqpTestRunner was called. This change makes DeqpTestRunner to explicitly
install the OnDevice package with the test runner's current ABI setting.

Change-Id: Ic38bc0c22157ec95de3111d9d0fe214a236eff1e
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();