blob: 9f56da78c3bd3cdfa1c1972f25d78246f8dff033 [file] [log] [blame]
Adrian Roosef7a4022017-01-19 14:48:35 -08001/*
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.systemui.statusbar.phone;
18
19import static org.mockito.Matchers.any;
20import static org.mockito.Matchers.anyBoolean;
21import static org.mockito.Mockito.doAnswer;
22import static org.mockito.Mockito.mock;
23import static org.mockito.Mockito.when;
24
Chris Wren27a52fa2017-02-01 14:21:43 -050025import android.metrics.LogMaker;
26import android.metrics.MetricsReader;
Adrian Roos02de4982017-02-11 09:35:54 +010027import android.support.test.filters.FlakyTest;
Adrian Roosef7a4022017-01-19 14:48:35 -080028import android.support.test.filters.SmallTest;
Chris Wren27a52fa2017-02-01 14:21:43 -050029import android.support.test.metricshelper.MetricsAsserts;
Adrian Roosef7a4022017-01-19 14:48:35 -080030import android.support.test.runner.AndroidJUnit4;
Chris Wren27a52fa2017-02-01 14:21:43 -050031import android.util.DisplayMetrics;
Adrian Roosef7a4022017-01-19 14:48:35 -080032
Chris Wren27a52fa2017-02-01 14:21:43 -050033import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Adrian Roosef7a4022017-01-19 14:48:35 -080034import com.android.keyguard.KeyguardHostView.OnDismissAction;
35import com.android.systemui.SysuiTestCase;
Chris Wren27a52fa2017-02-01 14:21:43 -050036import com.android.systemui.statusbar.ActivatableNotificationView;
37import com.android.systemui.statusbar.KeyguardIndicationController;
38import com.android.systemui.statusbar.NotificationData;
39import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
Adrian Roosef7a4022017-01-19 14:48:35 -080040
41import org.junit.Before;
Adrian Roos02de4982017-02-11 09:35:54 +010042import org.junit.Ignore;
Adrian Roosef7a4022017-01-19 14:48:35 -080043import org.junit.Test;
44import org.junit.runner.RunWith;
45
Geoffrey Pitsch63b55432017-02-10 13:30:25 -050046// TODO(gpitsch): We have seen some flakes in these tests, needs some investigation.
47// Q: How is mMetricsReader being used by the tested code?
Adrian Roos02de4982017-02-11 09:35:54 +010048// A: StatusBar uses MetricsLogger to write to the event log, then read back by MetricsReader
49@SmallTest
50@RunWith(AndroidJUnit4.class)
Jason Monk2a6ea9c2017-01-26 11:14:51 -050051public class StatusBarTest extends SysuiTestCase {
Adrian Roosef7a4022017-01-19 14:48:35 -080052
53 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Chris Wren27a52fa2017-02-01 14:21:43 -050054 UnlockMethodCache mUnlockMethodCache;
55 KeyguardIndicationController mKeyguardIndicationController;
56 NotificationStackScrollLayout mStackScroller;
Jason Monk2a6ea9c2017-01-26 11:14:51 -050057 StatusBar mStatusBar;
Adrian Roosef7a4022017-01-19 14:48:35 -080058
Chris Wren27a52fa2017-02-01 14:21:43 -050059 private MetricsReader mMetricsReader;
60 private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
61
Adrian Roos02de4982017-02-11 09:35:54 +010062 @Before
Adrian Roosef7a4022017-01-19 14:48:35 -080063 public void setup() {
64 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
Chris Wren27a52fa2017-02-01 14:21:43 -050065 mUnlockMethodCache = mock(UnlockMethodCache.class);
66 mKeyguardIndicationController = mock(KeyguardIndicationController.class);
67 mStackScroller = mock(NotificationStackScrollLayout.class);
68 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
69 mKeyguardIndicationController, mStackScroller);
Adrian Roosef7a4022017-01-19 14:48:35 -080070
71 doAnswer(invocation -> {
72 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
73 onDismissAction.onDismiss();
74 return null;
75 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean());
76
77 doAnswer(invocation -> {
78 Runnable runnable = (Runnable) invocation.getArguments()[0];
79 runnable.run();
80 return null;
81 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
Chris Wren27a52fa2017-02-01 14:21:43 -050082
83 when(mStackScroller.getActivatedChild()).thenReturn(null);
84
85 mMetricsReader = new MetricsReader();
86 mMetricsReader.checkpoint(); // clear out old logs
Chris Wren6f6c0cd2017-02-08 17:21:53 -050087 try {
88 // pause so that no new events arrive in the rest of this millisecond.
89 Thread.sleep(2);
90 } catch (InterruptedException e) {
91 // pass
92 }
Adrian Roosef7a4022017-01-19 14:48:35 -080093 }
94
Adrian Roos02de4982017-02-11 09:35:54 +010095 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -080096 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() {
97 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
98 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
99
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500100 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800101 }
102
Adrian Roos02de4982017-02-11 09:35:54 +0100103 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800104 public void executeRunnableDismissingKeyguard_nullRunnable_showing() {
105 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
106 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
107
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500108 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800109 }
110
Adrian Roos02de4982017-02-11 09:35:54 +0100111 @Test
Adrian Roosef7a4022017-01-19 14:48:35 -0800112 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() {
113 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
114 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
115
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500116 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
Adrian Roosef7a4022017-01-19 14:48:35 -0800117 }
118
Adrian Roos02de4982017-02-11 09:35:54 +0100119 @Ignore("flaky test")
120 @FlakyTest
121 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500122 public void lockscreenStateMetrics_notShowing() {
123 // uninteresting state, except that fingerprint must be non-zero
124 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
125 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
126 // interesting state
127 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
128 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
129 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
130
131 mStatusBar.onKeyguardViewManagerStatesUpdated();
132
133 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log", mMetricsReader,
134 new LogMaker(MetricsEvent.LOCKSCREEN)
135 .setType(MetricsEvent.TYPE_CLOSE)
136 .setSubtype(0));
137 }
138
Adrian Roos02de4982017-02-11 09:35:54 +0100139 @Ignore("flaky test")
140 @FlakyTest
141 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500142 public void lockscreenStateMetrics_notShowing_secure() {
143 // uninteresting state, except that fingerprint must be non-zero
144 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
145 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
146 // interesting state
147 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
148 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
149 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
150
151 mStatusBar.onKeyguardViewManagerStatesUpdated();
152
153 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log", mMetricsReader,
154 new LogMaker(MetricsEvent.LOCKSCREEN)
155 .setType(MetricsEvent.TYPE_CLOSE)
156 .setSubtype(1));
157 }
158
Adrian Roos02de4982017-02-11 09:35:54 +0100159 @Ignore("flaky test")
160 @FlakyTest
161 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500162 public void lockscreenStateMetrics_isShowing() {
163 // uninteresting state, except that fingerprint must be non-zero
164 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
165 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
166 // interesting state
167 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
168 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
169 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
170
171 mStatusBar.onKeyguardViewManagerStatesUpdated();
172
173 MetricsAsserts.assertHasLog("missing insecure lockscreen showing", mMetricsReader,
174 new LogMaker(MetricsEvent.LOCKSCREEN)
175 .setType(MetricsEvent.TYPE_OPEN)
176 .setSubtype(0));
177 }
178
Adrian Roos02de4982017-02-11 09:35:54 +0100179 @Ignore("flaky test")
180 @FlakyTest
181 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500182 public void lockscreenStateMetrics_isShowing_secure() {
183 // uninteresting state, except that fingerprint must be non-zero
184 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
185 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
186 // interesting state
187 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
188 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
189 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
190
191 mStatusBar.onKeyguardViewManagerStatesUpdated();
192
193 MetricsAsserts.assertHasLog("missing secure lockscreen showing log", mMetricsReader,
194 new LogMaker(MetricsEvent.LOCKSCREEN)
195 .setType(MetricsEvent.TYPE_OPEN)
196 .setSubtype(1));
197 }
198
Adrian Roos02de4982017-02-11 09:35:54 +0100199 @Ignore("flaky test")
200 @FlakyTest
201 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500202 public void lockscreenStateMetrics_isShowingBouncer() {
203 // uninteresting state, except that fingerprint must be non-zero
204 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
205 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true);
206 // interesting state
207 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
208 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
209 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true);
210
211 mStatusBar.onKeyguardViewManagerStatesUpdated();
212
213 MetricsAsserts.assertHasLog("missing bouncer log", mMetricsReader,
214 new LogMaker(MetricsEvent.BOUNCER)
215 .setType(MetricsEvent.TYPE_OPEN)
216 .setSubtype(1));
217 }
218
Adrian Roos02de4982017-02-11 09:35:54 +0100219 @Ignore("flaky test")
220 @FlakyTest
221 @Test
Chris Wren27a52fa2017-02-01 14:21:43 -0500222 public void onActivatedMetrics() {
223 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
224 mStatusBar.onActivated(view);
225
226 MetricsAsserts.assertHasLog("missing lockscreen note tap log", mMetricsReader,
227 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
228 .setType(MetricsEvent.TYPE_ACTION));
229 }
230
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500231 static class TestableStatusBar extends StatusBar {
Chris Wren27a52fa2017-02-01 14:21:43 -0500232 public TestableStatusBar(StatusBarKeyguardViewManager man,
233 UnlockMethodCache unlock, KeyguardIndicationController key,
234 NotificationStackScrollLayout stack) {
Adrian Roosef7a4022017-01-19 14:48:35 -0800235 mStatusBarKeyguardViewManager = man;
Chris Wren27a52fa2017-02-01 14:21:43 -0500236 mUnlockMethodCache = unlock;
237 mKeyguardIndicationController = key;
238 mStackScroller = stack;
Adrian Roosef7a4022017-01-19 14:48:35 -0800239 }
240
241 @Override
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500242 protected H createHandler() {
Adrian Roosef7a4022017-01-19 14:48:35 -0800243 return null;
244 }
245 }
Adrian Roos02de4982017-02-11 09:35:54 +0100246}