Merge "RootTargetPreparer: add option to ignore failure and carry on with setup"
diff --git a/test_framework/com/android/tradefed/targetprep/RootTargetPreparer.java b/test_framework/com/android/tradefed/targetprep/RootTargetPreparer.java
index 50ddaae..8d6031b 100644
--- a/test_framework/com/android/tradefed/targetprep/RootTargetPreparer.java
+++ b/test_framework/com/android/tradefed/targetprep/RootTargetPreparer.java
@@ -15,12 +15,14 @@
  */
 package com.android.tradefed.targetprep;
 
+import com.android.tradefed.command.remote.DeviceDescriptor;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.OptionClass;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.device.StubDevice;
 import com.android.tradefed.invoker.TestInformation;
+import com.android.tradefed.log.LogUtil.CLog;
 
 /**
  * Target preparer that performs "adb root" or "adb unroot" based on option "force-root".
@@ -39,6 +41,11 @@
                             + "root during setup.")
     private boolean mForceRoot = true;
 
+    @Option(
+            name = "throw-on-error",
+            description = "Throws TargetSetupError if adb root/unroot fails")
+    private boolean mThrowOnError = true;
+
     @Override
     public void setUp(TestInformation testInfo)
             throws TargetSetupError, BuildError, DeviceNotAvailableException {
@@ -49,9 +56,9 @@
         }
         mWasRoot = device.isAdbRoot();
         if (!mWasRoot && mForceRoot && !device.enableAdbRoot()) {
-            throw new TargetSetupError("Failed to adb root device", device.getDeviceDescriptor());
+            throwOrLog("Failed to adb root device", device.getDeviceDescriptor());
         } else if (mWasRoot && !mForceRoot && !device.disableAdbRoot()) {
-            throw new TargetSetupError("Failed to adb unroot device", device.getDeviceDescriptor());
+            throwOrLog("Failed to adb unroot device", device.getDeviceDescriptor());
         }
     }
 
@@ -68,4 +75,13 @@
             device.enableAdbRoot();
         }
     }
+
+    private void throwOrLog(String message, DeviceDescriptor deviceDescriptor)
+            throws TargetSetupError {
+        if (mThrowOnError) {
+            throw new TargetSetupError(message, deviceDescriptor);
+        } else {
+            CLog.w(message + " " + deviceDescriptor);
+        }
+    }
 }
diff --git a/tests/src/com/android/tradefed/targetprep/RootTargetPreparerTest.java b/tests/src/com/android/tradefed/targetprep/RootTargetPreparerTest.java
index e28d420..22c74cc 100644
--- a/tests/src/com/android/tradefed/targetprep/RootTargetPreparerTest.java
+++ b/tests/src/com/android/tradefed/targetprep/RootTargetPreparerTest.java
@@ -124,4 +124,36 @@
 
         mRootTargetPreparer.setUp(mTestInfo);
     }
+
+    @Test
+    public void testSetUpFail_forceRoot_ignoresFailure() throws Exception {
+        OptionSetter setter = new OptionSetter(mRootTargetPreparer);
+        setter.setOptionValue("throw-on-error", "false");
+
+        EasyMock.expect(mMockDevice.isAdbRoot()).andReturn(false).once();
+        EasyMock.expect(mMockDevice.enableAdbRoot()).andReturn(false).once();
+        EasyMock.expect(mMockDevice.getDeviceDescriptor()).andReturn(null).once();
+        EasyMock.expect(mMockDevice.disableAdbRoot()).andReturn(true).once();
+        EasyMock.replay(mMockDevice, mMockBuildInfo);
+
+        mRootTargetPreparer.setUp(mTestInfo);
+        mRootTargetPreparer.tearDown(mTestInfo, null);
+    }
+
+    @Test
+    public void testSetUpFail_forceUnroot_ignoresFailure() throws Exception {
+        OptionSetter setter = new OptionSetter(mRootTargetPreparer);
+        setter.setOptionValue("force-root", "false");
+        setter.setOptionValue("throw-on-error", "false");
+
+        EasyMock.expect(mMockDevice.isAdbRoot()).andReturn(true).once();
+        EasyMock.expect(mMockDevice.disableAdbRoot()).andReturn(false).once();
+        EasyMock.expect(mMockDevice.getDeviceDescriptor()).andReturn(null).once();
+        EasyMock.expect(mMockDevice.enableAdbRoot()).andReturn(true).once();
+        EasyMock.replay(mMockDevice, mMockBuildInfo);
+
+        mRootTargetPreparer.setUp(mTestInfo);
+        mRootTargetPreparer.tearDown(mTestInfo, null);
+        EasyMock.verify(mMockDevice, mMockBuildInfo);
+    }
 }