Reducing flakiness from Automater test
The test seemed to be failing because the screen was off or locked.
Added a launchpad activity which will dismiss keyguard and power on the
screen before starting the app_details activity. Also added
remove-active-admin as a tear down command and improved logging
to better troubleshoot failures in the future.
Bug: b/28067602
Change-Id: I348ca8bd4105afa1b37a71959fdadb56b36b76bb
diff --git a/tests/deviceadmin/deviceadminapp/Android.mk b/tests/deviceadmin/deviceadminapp/Android.mk
index 29c7cb3..6ee3943 100644
--- a/tests/deviceadmin/deviceadminapp/Android.mk
+++ b/tests/deviceadmin/deviceadminapp/Android.mk
@@ -31,4 +31,4 @@
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/deviceadmin/deviceadminapp/AndroidManifest.xml b/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
index 9ce61a6..ba99bcf 100644
--- a/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
+++ b/tests/deviceadmin/deviceadminapp/AndroidManifest.xml
@@ -19,7 +19,7 @@
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="24"/>
- <application>
+ <application android:testOnly="true">
<receiver
android:name=".EmptyDeviceAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN"
diff --git a/tests/deviceadmin/uninstalltest/Android.mk b/tests/deviceadmin/uninstalltest/Android.mk
index 03831e2..ceee809 100644
--- a/tests/deviceadmin/uninstalltest/Android.mk
+++ b/tests/deviceadmin/uninstalltest/Android.mk
@@ -31,4 +31,4 @@
# tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/deviceadmin/uninstalltest/AndroidManifest.xml b/tests/deviceadmin/uninstalltest/AndroidManifest.xml
index 52a681a..f6d38de 100644
--- a/tests/deviceadmin/uninstalltest/AndroidManifest.xml
+++ b/tests/deviceadmin/uninstalltest/AndroidManifest.xml
@@ -19,8 +19,11 @@
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="24"/>
+ <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
<application>
<uses-library android:name="android.test.runner"/>
+ <activity android:name="android.devicepolicy.cts.uiautomatertest.UiAutomaterTestActivity"/>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/deviceadmin/uninstalltest/AndroidTest.xml b/tests/deviceadmin/uninstalltest/AndroidTest.xml
index 51615f7..5bea9b3 100644
--- a/tests/deviceadmin/uninstalltest/AndroidTest.xml
+++ b/tests/deviceadmin/uninstalltest/AndroidTest.xml
@@ -16,16 +16,19 @@
<configuration description="Config for the CTS device admin uninstall tests">
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
<option name="cleanup-apks" value="true" />
+ <option name="install-arg" value="-t" />
<option name="test-file-name" value="CtsEmptyDeviceAdmin.apk" />
<option name="test-file-name" value="CtsDeviceAdminUninstallerTestCases.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="dpm set-active-admin --user cur android.devicepolicy.cts.emptydeviceadmin/.EmptyDeviceAdmin" />
+ <option name="teardown-command" value="dpm remove-active-admin --user cur android.devicepolicy.cts.emptydeviceadmin/.EmptyDeviceAdmin" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.devicepolicy.cts.uiautomatertest" />
+ <option name="runtime-hint" value="30s" />
</test>
</configuration>
\ No newline at end of file
diff --git a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
index 23b3755..6e723b36 100644
--- a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
+++ b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/DeviceAdminUninstallTest.java
@@ -15,6 +15,8 @@
*/
package android.devicepolicy.cts.uiautomatertest;
+import android.app.Activity;
+import android.app.Instrumentation;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
@@ -26,11 +28,14 @@
import android.provider.Settings;
import android.widget.ScrollView;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.List;
import android.support.test.InstrumentationRegistry;
@@ -44,6 +49,7 @@
import android.support.test.uiautomator.UiScrollable;
import android.support.test.uiautomator.UiSelector;
import android.support.test.uiautomator.Until;
+import android.util.Log;
@RunWith(AndroidJUnit4.class)
@LargeTest
@@ -61,20 +67,35 @@
.res("com.android.settings", "left_button");
private static final UiSelector OK_BUTTON_SELECTOR = new UiSelector()
.resourceId("android:id/button1");
+ private static final UiSelector SCROLL_VIEW_SELECTOR =
+ new UiSelector().className(ScrollView.class);
+
private static final long DEACTIVATE_ADMIN_TIMEOUT = 15000;
private static final long WAIT_FOR_ACTIVITY_TIMEOUT = 6000;
+ private static final String TAG = DeviceAdminUninstallTest.class.getSimpleName();
private UiDevice mUiDevice;
+ private Instrumentation mInstrumentation;
private Context mContext;
private DevicePolicyManager mDpm;
private PackageManager mPm;
+ private Activity mActivity;
@Before
public void setUp() throws Exception {
- mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mUiDevice = UiDevice.getInstance(mInstrumentation);
mContext = InstrumentationRegistry.getTargetContext();
mDpm = mContext.getSystemService(DevicePolicyManager.class);
mPm = mContext.getPackageManager();
+ startTestActivity();
+ }
+
+ private void startTestActivity() {
+ final Intent testActivityIntent = new Intent(mContext, UiAutomaterTestActivity.class);
+ testActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mActivity = mInstrumentation.startActivitySync(testActivityIntent);
+ mInstrumentation.waitForIdleSync();
}
private boolean hasActiveAdmin() {
@@ -122,19 +143,17 @@
final Intent displayAppDetailsIntent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageURI);
- displayAppDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(displayAppDetailsIntent);
+ mActivity.startActivity(displayAppDetailsIntent);
}
private void automateUninstallThroughUi() {
- StringBuilder failMessageBuilder = new StringBuilder();
- UiObject uninstallButton = mUiDevice
- .findObject(UNINSTALL_BUTTON_SELECTOR);
- UiScrollable scrollable = new UiScrollable(new UiSelector().className(ScrollView.class));
- UiObject deactivateButton = mUiDevice
- .findObject(DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR);
- UiObject okButton = mUiDevice
- .findObject(OK_BUTTON_SELECTOR);
+ String errorMessage = "No exception in UI Automation";
+
+ UiObject uninstallButton = mUiDevice.findObject(UNINSTALL_BUTTON_SELECTOR);
+ UiScrollable scrollable = new UiScrollable(SCROLL_VIEW_SELECTOR);
+ UiObject deactivateButton = mUiDevice.findObject(DEACTIVATE_AND_UNINSTALL_BUTTON_SELECTOR);
+ UiObject okButton = mUiDevice.findObject(OK_BUTTON_SELECTOR);
+
mUiDevice.wait(Until.hasObject(UNINSTALL_BUTTON_BYSELECTOR), WAIT_FOR_ACTIVITY_TIMEOUT);
try {
uninstallButton.clickAndWaitForNewWindow();
@@ -143,14 +162,20 @@
waitTillNoActiveAdmin();
okButton.clickAndWaitForNewWindow();
} catch (UiObjectNotFoundException exc) {
- failMessageBuilder.append(exc.getMessage());
+ Log.e(TAG, "Error while automating uninstall of " + DEVICE_ADMIN_PACKAGE_NAME, exc);
+ errorMessage = generateStackTrace(exc);
} finally {
- Assert.assertFalse(
- "Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not uninstalled.\n"
- + failMessageBuilder.toString(), packageExists());
+ Assert.assertFalse("Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not uninstalled\n"
+ + errorMessage, packageExists());
}
}
+ private String generateStackTrace(Throwable t) {
+ StringWriter errorWriter = new StringWriter();
+ t.printStackTrace(new PrintWriter(errorWriter));
+ return errorWriter.toString();
+ }
+
@Test
public void uninstallPackageWithActiveAdmin() {
Assert.assertTrue("Package " + DEVICE_ADMIN_PACKAGE_NAME + " was not found installed",
@@ -160,4 +185,10 @@
launchApplicationDetailsActivity();
automateUninstallThroughUi();
}
+
+ @After
+ public void tearDown() {
+ mActivity.finish();
+ mUiDevice.pressHome();
+ }
}
diff --git a/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java
new file mode 100644
index 0000000..aad76ec
--- /dev/null
+++ b/tests/deviceadmin/uninstalltest/src/android/devicepolicy/cts/uiautomatertest/UiAutomaterTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.devicepolicy.cts.uiautomatertest;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+public class UiAutomaterTestActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ }
+}