iorap: AppLaunch - wait for background job to complete.

The background job will always compile all pending packages,
so trying to resume app launching too quickly after just 1 package
has been compiled will lead to undefined behavior.

Bug: 152322429
Test: am instrument
Change-Id: I97f773206196bf0ac469fbb87109fd5473b5ea07
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index 42cee7cc..13bf179 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -510,15 +510,18 @@
      * based on status of the compilation command.
      */
     private boolean compileAppForIorap(String appPkgName) throws IOException {
+        String logcatTimestamp = getTimeNowForLogcat();
+
         getInstrumentation().getUiAutomation().
                 executeShellCommand(IORAP_COMPILE_CMD);
 
-        for (int i = 0; i < IORAP_COMPILE_CMD_TIMEOUT; ++i) {
+        int i = 0;
+        for (i = 0; i < IORAP_COMPILE_CMD_TIMEOUT; ++i) {
             IorapCompilationStatus status = waitForIorapCompiled(appPkgName);
             if (status == IorapCompilationStatus.COMPLETE) {
                 Log.v(TAG, "compileAppForIorap: success");
                 logDumpsysIorapd(appPkgName);
-                return true;
+                break;
             } else if (status == IorapCompilationStatus.INSUFFICIENT_TRACES) {
                 Log.e(TAG, "compileAppForIorap: failed due to insufficient traces");
                 logDumpsysIorapd(appPkgName);
@@ -527,8 +530,24 @@
             sleep(1000);
         }
 
-        Log.e(TAG, "compileAppForIorap: failed due to timeout");
-        logDumpsysIorapd(appPkgName);
+        if (i == IORAP_COMPILE_CMD_TIMEOUT) {
+            Log.e(TAG, "compileAppForIorap: failed due to timeout");
+            logDumpsysIorapd(appPkgName);
+            return false;
+        }
+
+        // Wait for the job to finish completely.
+        // Other packages could be compiled in cyclic runs.
+        int currentAttempt = 0;
+        do {
+            String logcatLines = getLogcatSinceTime(logcatTimestamp);
+            if (logcatLines.contains("IorapForwardingService: Finished background job")) {
+                return true;
+            }
+            sleep(1000);
+        } while (currentAttempt++ < IORAP_COMPILE_CMD_TIMEOUT);
+
+        Log.e(TAG, "compileAppForIorap: failed due to jobscheduler timeout.");
         return false;
     }