introduce reboot interval

- do reboot only for given interval (still based on package) so that reboot does not
  happen too often : one reboot per 30 mins by default
- add additional delay after reboot to make sure that things are ready: 2 mins now

Change-Id: I05120a00e0837a831985446b01fba9b5eabb60bf
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index 7be1e34..da07f3b 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -47,6 +47,9 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.lang.InterruptedException;
+import java.lang.System;
+import java.lang.Thread;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -137,6 +140,14 @@
             "Reboot after each package run")
     private boolean mRebootPerPackage = false;
 
+    @Option(name = "reboot-wait-time", description =
+            "Additional wait time in ms after boot complete. Meaningful only with reboot-per-package option")
+    private int mRebootWaitTimeMSec = 120000;
+
+    @Option(name = "reboot-interval", description =
+            "Interval between each reboot in min. Meaningful only with reboot-per-package option")
+    private int mRebootIntervalMin = 30;
+
     /** data structure for a {@link IRemoteTest} and its known tests */
     class TestPackage {
         private final IRemoteTest mTestForPackage;
@@ -337,7 +348,8 @@
             // always collect the device info, even for resumed runs, since test will likely be
             // running on a different device
             collectDeviceInfo(getDevice(), mCtsBuild, listener);
-
+            long prevTime = System.currentTimeMillis();
+            long intervalInMSec = mRebootIntervalMin * 60 * 1000;
             while (!mRemainingTestPkgs.isEmpty()) {
                 TestPackage knownTests = mRemainingTestPkgs.get(0);
 
@@ -352,25 +364,34 @@
                 forwardPackageDetails(knownTests.getPackageDef(), listener);
                 test.run(filter);
                 mRemainingTestPkgs.remove(0);
-                if (mRebootPerPackage) {
-                    Log.i(LOG_TAG, String.format("Rebooting after running package %s",
-                            knownTests.getPackageDef().getName()));
-                    final int TIMEOUT_MS = 4 * 60 * 1000;
-                    TestDeviceOptions options = mDevice.getOptions();
-                    // store default value and increase time-out for reboot
-                    int rebootTimeout = options.getRebootTimeout();
-                    long onlineTimeout = options.getOnlineTimeout();
-                    options.setRebootTimeout(TIMEOUT_MS);
-                    options.setOnlineTimeout(TIMEOUT_MS);
-                    mDevice.setOptions(options);
+                if (mRebootPerPackage && (mRemainingTestPkgs.size() > 0)) {
+                    long currentTime = System.currentTimeMillis();
+                    if ((currentTime - prevTime) > intervalInMSec) {
+                        Log.i(LOG_TAG, String.format("Rebooting after running package %s",
+                                knownTests.getPackageDef().getName()));
+                        final int TIMEOUT_MS = 4 * 60 * 1000;
+                        TestDeviceOptions options = mDevice.getOptions();
+                        // store default value and increase time-out for reboot
+                        int rebootTimeout = options.getRebootTimeout();
+                        long onlineTimeout = options.getOnlineTimeout();
+                        options.setRebootTimeout(TIMEOUT_MS);
+                        options.setOnlineTimeout(TIMEOUT_MS);
+                        mDevice.setOptions(options);
 
-                    mDevice.reboot();
+                        mDevice.reboot();
 
-                    // restore default values
-                    options.setRebootTimeout(rebootTimeout);
-                    options.setOnlineTimeout(onlineTimeout);
-                    mDevice.setOptions(options);
-                    Log.i(LOG_TAG, "Rebooting done");
+                        // restore default values
+                        options.setRebootTimeout(rebootTimeout);
+                        options.setOnlineTimeout(onlineTimeout);
+                        mDevice.setOptions(options);
+                        Log.i(LOG_TAG, "Rebooting done");
+                        try {
+                            Thread.sleep(mRebootWaitTimeMSec);
+                        } catch (InterruptedException e) {
+                            Log.i(LOG_TAG, "Boot wait interrupted");
+                        }
+                        prevTime = System.currentTimeMillis();
+                    }
                 }
             }