FingerprintGestureControllerTest.java revision 27fcd9c97a2ceb50bab026237390207e5ee9e290
1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.accessibility;
18
19import android.accessibilityservice.FingerprintGestureController;
20import android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback;
21import android.accessibilityservice.IAccessibilityServiceConnection;
22import android.os.Looper;
23import org.junit.Before;
24import org.junit.BeforeClass;
25import org.junit.Test;
26import org.mockito.Mock;
27import org.mockito.MockitoAnnotations;
28
29import static android.accessibilityservice.FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_DOWN;
30
31import static org.junit.Assert.assertFalse;
32import static org.junit.Assert.assertTrue;
33import static org.mockito.Mockito.reset;
34import static org.mockito.Mockito.times;
35import static org.mockito.Mockito.verify;
36import static org.mockito.Mockito.verifyZeroInteractions;
37import static org.mockito.Mockito.when;
38
39/**
40 * Tests for FingerprintGestureController.
41 * TODO: These tests aren't really for server code, so this isn't their ideal home.
42 */
43public class FingerprintGestureControllerTest {
44    @Mock IAccessibilityServiceConnection mMockAccessibilityServiceConnection;
45    @Mock FingerprintGestureCallback mMockFingerprintGestureCallback;
46    FingerprintGestureController mFingerprintGestureController;
47
48    @BeforeClass
49    public static void oneTimeInitialization() {
50        if (Looper.myLooper() == null) {
51            Looper.prepare();
52        }
53    }
54
55    @Before
56    public void setUp() {
57        MockitoAnnotations.initMocks(this);
58        mFingerprintGestureController =
59                new FingerprintGestureController(mMockAccessibilityServiceConnection);
60    }
61
62    @Test
63    public void testIsGestureDetectionActive_returnsValueFromServer() throws Exception {
64        when(mMockAccessibilityServiceConnection.isFingerprintGestureDetectionAvailable())
65                .thenReturn(true);
66        assertTrue(mFingerprintGestureController.isGestureDetectionAvailable());
67        when(mMockAccessibilityServiceConnection.isFingerprintGestureDetectionAvailable())
68                .thenReturn(false);
69        assertFalse(mFingerprintGestureController.isGestureDetectionAvailable());
70    }
71
72    @Test
73    public void testCallbacks_withNoListeners_shouldNotCrash() {
74        mFingerprintGestureController.onGestureDetectionActiveChanged(true);
75        mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
76    }
77
78    @Test
79    public void testDetectionActiveCallback_noHandler_shouldCallback() {
80        mFingerprintGestureController.registerFingerprintGestureCallback(
81                mMockFingerprintGestureCallback, null);
82        mFingerprintGestureController.onGestureDetectionActiveChanged(true);
83        verify(mMockFingerprintGestureCallback, times(1))
84                .onGestureDetectionAvailabilityChanged(true);
85        mFingerprintGestureController.onGestureDetectionActiveChanged(false);
86        verify(mMockFingerprintGestureCallback, times(1))
87                .onGestureDetectionAvailabilityChanged(false);
88
89        reset(mMockFingerprintGestureCallback);
90        mFingerprintGestureController.unregisterFingerprintGestureCallback(
91                mMockFingerprintGestureCallback);
92        mFingerprintGestureController.onGestureDetectionActiveChanged(true);
93        mFingerprintGestureController.onGestureDetectionActiveChanged(false);
94        verifyZeroInteractions(mMockFingerprintGestureCallback);
95    }
96
97    @Test
98    public void testDetectionActiveCallback_withHandler_shouldPostRunnableToHandler() {
99        MessageCapturingHandler messageCapturingHandler = new MessageCapturingHandler((message) -> {
100            message.getCallback().run();
101            return true;
102        });
103
104        mFingerprintGestureController.registerFingerprintGestureCallback(
105                mMockFingerprintGestureCallback, messageCapturingHandler);
106        mFingerprintGestureController.onGestureDetectionActiveChanged(true);
107        verify(mMockFingerprintGestureCallback, times(0))
108                .onGestureDetectionAvailabilityChanged(true);
109        messageCapturingHandler.sendLastMessage();
110        verify(mMockFingerprintGestureCallback, times(1))
111                .onGestureDetectionAvailabilityChanged(true);
112
113        mFingerprintGestureController.onGestureDetectionActiveChanged(false);
114        verify(mMockFingerprintGestureCallback, times(0))
115                .onGestureDetectionAvailabilityChanged(false);
116        messageCapturingHandler.sendLastMessage();
117        verify(mMockFingerprintGestureCallback, times(1))
118                .onGestureDetectionAvailabilityChanged(false);
119
120        reset(mMockFingerprintGestureCallback);
121        mFingerprintGestureController.unregisterFingerprintGestureCallback(
122                mMockFingerprintGestureCallback);
123        mFingerprintGestureController.onGestureDetectionActiveChanged(true);
124        mFingerprintGestureController.onGestureDetectionActiveChanged(false);
125        assertFalse(messageCapturingHandler.hasMessages());
126        verifyZeroInteractions(mMockFingerprintGestureCallback);
127    }
128
129    @Test
130    public void testGestureCallback_noHandler_shouldCallListener() {
131        mFingerprintGestureController.registerFingerprintGestureCallback(
132                mMockFingerprintGestureCallback, null);
133        mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
134        verify(mMockFingerprintGestureCallback, times(1)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
135
136        reset(mMockFingerprintGestureCallback);
137        mFingerprintGestureController.unregisterFingerprintGestureCallback(
138                mMockFingerprintGestureCallback);
139        mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
140        verifyZeroInteractions(mMockFingerprintGestureCallback);
141    }
142
143    @Test
144    public void testGestureCallback_withHandler_shouldPostRunnableToHandler() {
145        MessageCapturingHandler messageCapturingHandler = new MessageCapturingHandler((message) -> {
146            message.getCallback().run();
147            return true;
148        });
149
150        mFingerprintGestureController.registerFingerprintGestureCallback(
151                mMockFingerprintGestureCallback, messageCapturingHandler);
152        mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
153        verify(mMockFingerprintGestureCallback, times(0)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
154        messageCapturingHandler.sendLastMessage();
155        verify(mMockFingerprintGestureCallback, times(1)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
156
157        reset(mMockFingerprintGestureCallback);
158        mFingerprintGestureController.unregisterFingerprintGestureCallback(
159                mMockFingerprintGestureCallback);
160        mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
161        assertFalse(messageCapturingHandler.hasMessages());
162        verifyZeroInteractions(mMockFingerprintGestureCallback);
163    }
164}
165