10b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov/* 20b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Copyright (C) 2010 The Android Open Source Project 30b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 40b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 50b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * you may not use this file except in compliance with the License. 60b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * You may obtain a copy of the License at 70b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 80b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 90b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * See the License for the specific language governing permissions and 140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * limitations under the License. 150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovpackage com.android.server; 180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.createStrictMock; 200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.expect; 210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.replay; 220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.reportMatcher; 230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.reset; 240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.verify; 250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport org.easymock.IArgumentMatcher; 270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 28cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.accessibilityservice.AccessibilityServiceInfo; 2958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganovimport android.os.UserHandle; 300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.AndroidTestCase; 310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.suitebuilder.annotation.LargeTest; 320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.suitebuilder.annotation.MediumTest; 330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManager; 360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManagerClient; 370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport java.util.ArrayList; 390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport java.util.List; 400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov/** 420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Tests for the AccessibilityManager which mocking the backing service. 430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovpublic class AccessibilityManagerTest extends AndroidTestCase { 450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Timeout required for pending Binder calls or event processing to 480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * complete. 490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public static final long TIMEOUT_BINDER_CALL = 50; 510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * The reusable mock {@link IAccessibilityManager}. 540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private final IAccessibilityManager mMockServiceInterface = 560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov createStrictMock(IAccessibilityManager.class); 570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @Override 590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void setUp() throws Exception { 600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov reset(mMockServiceInterface); 610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @MediumTest 640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testGetAccessibilityServiceList() throws Exception { 650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create a list of installed accessibility services the mock service returns 66cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov List<AccessibilityServiceInfo> expectedServices = new ArrayList<AccessibilityServiceInfo>(); 67cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); 68cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov accessibilityServiceInfo.packageNames = new String[] { "foo.bar" }; 69cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov expectedServices.add(accessibilityServiceInfo); 700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service behavior 720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IAccessibilityManager mockServiceInterface = mMockServiceInterface; 7358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(), 7458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn( 7500aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED); 7658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.getInstalledAccessibilityServiceList(UserHandle.USER_OWNER)) 7758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov .andReturn(expectedServices); 780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov replay(mockServiceInterface); 790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 8158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface, 8258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER); 83cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov List<AccessibilityServiceInfo> receivedServices = 84cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov manager.getInstalledAccessibilityServiceList(); 850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result (list equals() compares it contents as well) 870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertEquals("All expected services must be returned", receivedServices, expectedServices); 880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify the mock service was properly called 900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov verify(mockServiceInterface); 910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @MediumTest 940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testInterrupt() throws Exception { 950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service behavior 960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IAccessibilityManager mockServiceInterface = mMockServiceInterface; 9758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(), 9858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn( 9958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED); 10058d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov mockServiceInterface.interrupt(UserHandle.USER_OWNER); 1010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov replay(mockServiceInterface); 1020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 10458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface, 10558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER); 1060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov manager.interrupt(); 1070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify the mock service was properly called 1090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov verify(mockServiceInterface); 1100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 1130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testIsEnabled() throws Exception { 1140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service behavior 1150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IAccessibilityManager mockServiceInterface = mMockServiceInterface; 11658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(), 11758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn( 11858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED); 1190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov replay(mockServiceInterface); 1200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 12258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface, 12358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER); 1240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean isEnabledServiceEnabled = manager.isEnabled(); 1250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertTrue("Must be enabled since the mock service is enabled", isEnabledServiceEnabled); 1280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // disable accessibility 13000aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov manager.getClient().setState(0); 1310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the asynchronous IBinder call to complete 1330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 1340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 1360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean isEnabledServcieDisabled = manager.isEnabled(); 1370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertFalse("Must be disabled since the mock service is disabled", 1400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov isEnabledServcieDisabled); 1410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify the mock service was properly called 1430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov verify(mockServiceInterface); 1440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @MediumTest 1470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_AccessibilityEnabled() throws Exception { 1480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create an event to be dispatched 1490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 1500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service behavior 1520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IAccessibilityManager mockServiceInterface = mMockServiceInterface; 15358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(), 15458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn( 15558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED); 15658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent), 15758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn(true); 15858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent), 15958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn(false); 1600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov replay(mockServiceInterface); 1610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test (manager and service in different processes) 16358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface, 16458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER); 1650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov manager.sendAccessibilityEvent(sentEvent); 1660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent nextEventDifferentProcesses = AccessibilityEvent.obtain(); 1690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertSame("The manager and the service are in different processes, so the event must be " + 1700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov "recycled", sentEvent, nextEventDifferentProcesses); 1710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test (manager and service in the same process) 1730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov manager.sendAccessibilityEvent(sentEvent); 1740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent nextEventSameProcess = AccessibilityEvent.obtain(); 1770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertNotSame("The manager and the service are in the same process, so the event must not" + 1780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov "be recycled", sentEvent, nextEventSameProcess); 1790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify the mock service was properly called 1810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov verify(mockServiceInterface); 1820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @MediumTest 1850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_AccessibilityDisabled() throws Exception { 1860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create an event to be dispatched 1870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 1880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service behavior 1900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IAccessibilityManager mockServiceInterface = mMockServiceInterface; 19158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(), 19258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER)).andReturn(0); 1930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov replay(mockServiceInterface); 1940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test (accessibility disabled) 19658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface, 19758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov UserHandle.USER_OWNER); 1980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov try { 1990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov manager.sendAccessibilityEvent(sentEvent); 2000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fail("No accessibility events are sent if accessibility is disabled"); 2010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } catch (IllegalStateException ise) { 2020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 2030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertEquals("Accessibility off. Did you forget to check that?", ise.getMessage()); 2040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify the mock service was properly called 2070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov verify(mockServiceInterface); 2080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 2110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Determines if an {@link AccessibilityEvent} passed as a method argument 2120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * matches expectations. 2130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 2140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param matched The event to check. 2150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @return True if expectations are matched. 2160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 2170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static AccessibilityEvent eqAccessibilityEvent(AccessibilityEvent matched) { 2180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov reportMatcher(new AccessibilityEventMather(matched)); 2190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return null; 2200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 2230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Determines if an {@link IAccessibilityManagerClient} passed as a method argument 2240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * matches expectations which in this case are that any instance is accepted. 2250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 2260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @return <code>null</code>. 2270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 2280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static IAccessibilityManagerClient anyIAccessibilityManagerClient() { 2290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov reportMatcher(new AnyIAccessibilityManagerClientMather()); 2300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return null; 2310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 2340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Matcher for {@link AccessibilityEvent}s. 2350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 2360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static class AccessibilityEventMather implements IArgumentMatcher { 2370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private AccessibilityEvent mExpectedEvent; 2380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public AccessibilityEventMather(AccessibilityEvent expectedEvent) { 2400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mExpectedEvent = expectedEvent; 2410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public boolean matches(Object matched) { 2440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (!(matched instanceof AccessibilityEvent)) { 2450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return false; 2460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent receivedEvent = (AccessibilityEvent) matched; 2480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return mExpectedEvent.getEventType() == receivedEvent.getEventType(); 2490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void appendTo(StringBuffer buffer) { 2520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov buffer.append("sendAccessibilityEvent()"); 2530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov buffer.append(" with event type \""); 2540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov buffer.append(mExpectedEvent.getEventType()); 2550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov buffer.append("\""); 2560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 2600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Matcher for {@link IAccessibilityManagerClient}s. 2610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 2620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static class AnyIAccessibilityManagerClientMather implements IArgumentMatcher { 2630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public boolean matches(Object matched) { 2640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (!(matched instanceof IAccessibilityManagerClient)) { 2650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return false; 2660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return true; 2680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void appendTo(StringBuffer buffer) { 2710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov buffer.append("addClient() with any IAccessibilityManagerClient"); 2720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov} 275