OSDN Git Service

Unit test to keep a11y cache critical events up to date
authorEugene Susla <eugenesusla@google.com>
Wed, 28 Dec 2016 22:42:54 +0000 (14:42 -0800)
committerEugene Susla <eugenesusla@google.com>
Wed, 4 Jan 2017 19:45:08 +0000 (11:45 -0800)
Unit test AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK, introduced in Icbdb91803b646fa06aaf11996d350f6f65c1e809

Bug: b/32642665
Test: Ensure the introduced unit test passes
Change-Id: I60741c42334c61af8cd695e20c3a1f6be706824d

core/java/android/view/accessibility/AccessibilityCache.java
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityCacheTest.java

index 9bc4bc7..db2ea48 100644 (file)
@@ -370,6 +370,9 @@ public final class AccessibilityCache {
         mIsAllWindowsCached = false;
     }
 
+    /**
+     * Clears nodes for the window with the given id
+     */
     private void clearNodesForWindowLocked(int windowId) {
         if (DEBUG) {
             Log.i(LOG_TAG, "clearNodesForWindowLocked(" + windowId + ")");
index 9ccf290..ace65a6 100644 (file)
 package com.android.server.accessibility;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertNull;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyObject;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.when;
 
 import android.support.test.runner.AndroidJUnit4;
@@ -479,6 +481,25 @@ public class AccessibilityCacheTest {
                 AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION);
     }
 
+    @Test
+    public void testCacheCriticalEventList_doesntLackEvents() {
+        for (int i = 0; i < 32; i++) {
+            int eventType = 1 << i;
+            if ((eventType & AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK) == 0) {
+                try {
+                    assertEventTypeClearsNode(eventType, false);
+                    verify(mAccessibilityNodeRefresher, never())
+                            .refreshNode(anyObject(), anyBoolean());
+                } catch (Throwable e) {
+                    throw new AssertionError(
+                            "Failed for eventType: " + AccessibilityEvent.eventTypeToString(
+                                    eventType),
+                            e);
+                }
+            }
+        }
+    }
+
     private void assertNodeIsRefreshedWithEventType(int eventType, int contentChangeTypes) {
         AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(SINGLE_VIEW_ID, WINDOW_ID_1);
         mAccessibilityCache.add(nodeInfo);
@@ -521,13 +542,28 @@ public class AccessibilityCacheTest {
     }
 
     private void assertEventTypeClearsNode(int eventType) {
+        assertEventTypeClearsNode(eventType, true);
+    }
+
+    private void assertEventTypeClearsNode(int eventType, boolean clears) {
         final int nodeId = 0xBEEF;
         AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(nodeId, WINDOW_ID_1);
         long id = nodeInfo.getSourceNodeId();
         mAccessibilityCache.add(nodeInfo);
         nodeInfo.recycle();
         mAccessibilityCache.onAccessibilityEvent(AccessibilityEvent.obtain(eventType));
-        assertNull(mAccessibilityCache.getNode(WINDOW_ID_1, id));
+        AccessibilityNodeInfo cachedNode = mAccessibilityCache.getNode(WINDOW_ID_1, id);
+        try {
+            if (clears) {
+                assertNull(cachedNode);
+            } else {
+                assertNotNull(cachedNode);
+            }
+        } finally {
+            if (cachedNode != null) {
+                cachedNode.recycle();
+            }
+        }
     }
 
     private AccessibilityNodeInfo getParentNode() {