Fixing some flakiness in the CTS accessibility tests.
1. Imporved synchronization while waiting for async
accessibility events.
2. Updated the gloabl action tests to avoid leading
the device in a state that causes subsequent tests
to fail.
bug:6301007
bug:6339712
bug:6467998
bug:6468754
bug:6339616
bug:6339713
bug:6468136
Change-Id: I1657f6089ef07c40051b69a0d86d09dfdb4c2307
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
index 97f4359..f1a7114 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
@@ -33,6 +33,7 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -165,7 +166,7 @@
/**
* Flag whether we are waiting for a specific event.
*/
- private volatile boolean mWaitingForEventDelivery;
+ private boolean mWaitingForEventDelivery;
/**
* Queue with received events.
@@ -178,10 +179,8 @@
}
public void onAccessibilityEvent(AccessibilityEvent event) {
- if (!mWaitingForEventDelivery) {
- return;
- }
synchronized (mLock) {
+ Log.e("OPALA", "Event: " + event);
mLock.notifyAll();
if (mWaitingForEventDelivery) {
mEventQueue.add(AccessibilityEvent.obtain(event));
@@ -232,8 +231,7 @@
" not installed.");
}
- throw new IllegalStateException("Delegating Accessibility Service not running."
- + "(Settings -> Accessibility -> Delegating Accessibility Service)");
+ throw new IllegalStateException("Delegating Accessibility Service not running.");
}
Intent intent = new Intent().setClassName(DELEGATING_SERVICE_PACKAGE,
@@ -281,8 +279,8 @@
/* do nothing */
}
});
- mInitialized = true;
synchronized (mLock) {
+ mInitialized = true;
mLock.notifyAll();
}
} catch (RemoteException re) {
@@ -294,8 +292,9 @@
* {@inheritDoc ServiceConnection#onServiceDisconnected(ComponentName)}
*/
public void onServiceDisconnected(ComponentName name) {
- mInitialized = false;
- /* do nothing */
+ synchronized (mLock) {
+ mInitialized = false;
+ }
}
/**
@@ -463,22 +462,22 @@
* to a given timeout.
*
* @param command The command to execute before starting to wait for the event.
- * @param filter Filter that recognizes the epected event.
+ * @param filter Filter that recognizes the expected event.
* @param timeoutMillis The max wait time in milliseconds.
*/
public AccessibilityEvent executeCommandAndWaitForAccessibilityEvent(Runnable command,
AccessibilityEventFilter filter, long timeoutMillis)
throws TimeoutException, Exception {
- // Prepare to wait for an event.
- mWaitingForEventDelivery = true;
- // Execute the command.
- command.run();
synchronized (mLock) {
+ mEventQueue.clear();
+ // Prepare to wait for an event.
+ mWaitingForEventDelivery = true;
+ // Execute the command.
+ command.run();
try {
// Wait for the event.
final long startTimeMillis = SystemClock.uptimeMillis();
while (true) {
- mLock.notifyAll();
// Drain the event queue
while (!mEventQueue.isEmpty()) {
AccessibilityEvent event = mEventQueue.remove(0);
@@ -495,6 +494,7 @@
throw new TimeoutException("Expected event not received within: "
+ timeoutMillis + " ms.");
}
+ mLock.notifyAll();
try {
mLock.wait(remainingTimeMillis);
} catch (InterruptedException ie) {
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
index e0ec789..f65627c 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
@@ -321,80 +321,54 @@
@MediumTest
public void testPerformGlobalActionBack() throws Exception {
- // Get the root node info.
- final AccessibilityNodeInfo root = getInteractionBridge().getRootInActiveWindow();
+ assertTrue(getInteractionBridge().performGlobalAction(
+ AccessibilityService.GLOBAL_ACTION_BACK));
- AccessibilityEvent expected = getInteractionBridge()
- .executeCommandAndWaitForAccessibilityEvent(new Runnable() {
- @Override
- public void run() {
- getInteractionBridge().performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
- }
- }, new AccessibilityEventFilter() {
- @Override
- public boolean accept(AccessibilityEvent event) {
- return (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
- && "com.android.launcher".equals(event.getPackageName());
- }
- },
- TIMEOUT_ASYNC_PROCESSING);
-
- // Check if the expected event was received.
- assertNotNull(expected);
+ // Sleep a bit so the UI is settles.
+ SystemClock.sleep(3000);
}
@MediumTest
public void testPerformGlobalActionHome() throws Exception {
- // Get the root node info.
- final AccessibilityNodeInfo root = getInteractionBridge().getRootInActiveWindow();
+ assertTrue(getInteractionBridge().performGlobalAction(
+ AccessibilityService.GLOBAL_ACTION_HOME));
- AccessibilityEvent expected = getInteractionBridge()
- .executeCommandAndWaitForAccessibilityEvent(new Runnable() {
- @Override
- public void run() {
- getInteractionBridge().performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
- }
- }, new AccessibilityEventFilter() {
- @Override
- public boolean accept(AccessibilityEvent event) {
- return (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
- && "com.android.launcher".equals(event.getPackageName());
- }
- },
- TIMEOUT_ASYNC_PROCESSING);
-
- // Check if the expected event was received.
- assertNotNull(expected);
+ // Sleep a bit so the UI is settles.
+ SystemClock.sleep(3000);
}
@MediumTest
public void testPerformGlobalActionRecents() throws Exception {
- // Get the root node info.
- final AccessibilityNodeInfo root = getInteractionBridge().getRootInActiveWindow();
-
// Check whether the action succeeded.
assertTrue(getInteractionBridge().performGlobalAction(
AccessibilityService.GLOBAL_ACTION_RECENTS));
- // Sleep a bit so the recents UI is shown.
+ // Sleep a bit so the UI is settles.
SystemClock.sleep(3000);
// Clean up.
- getInteractionBridge().performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
+ getInteractionBridge().performGlobalAction(
+ AccessibilityService.GLOBAL_ACTION_BACK);
+
+ // Sleep a bit so the UI is settles.
+ SystemClock.sleep(3000);
}
@MediumTest
public void testPerformGlobalActionNotifications() throws Exception {
- // Get the root node info.
- final AccessibilityNodeInfo root = getInteractionBridge().getRootInActiveWindow();
-
// Perform the action under test
- final boolean handled = getInteractionBridge().performGlobalAction(
- AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS);
- assertTrue(handled);
+ assertTrue(getInteractionBridge().performGlobalAction(
+ AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS));
+
+ // Sleep a bit so the UI is settles.
+ SystemClock.sleep(3000);
// Clean up.
- getInteractionBridge().performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
+ assertTrue(getInteractionBridge().performGlobalAction(
+ AccessibilityService.GLOBAL_ACTION_BACK));
+
+ // Sleep a bit so the UI is settles.
+ SystemClock.sleep(3000);
}
@MediumTest