blob: 610592f6b71ce25ef624a15c5a11e8ea25c31513 [file] [log] [blame]
Julia Reynolds4b318432017-11-22 10:56:18 -05001package com.android.server.notification;
2
Jason Monkec4b6772017-12-06 10:31:09 -05003import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
5import static org.junit.Assert.assertTrue;
Julia Reynolds4b318432017-11-22 10:56:18 -05006import static org.mockito.Mockito.spy;
7
8import android.content.Intent;
9import android.net.Uri;
Julia Reynolds4b318432017-11-22 10:56:18 -050010import android.service.notification.Condition;
Beverlybe6d3522017-11-20 11:01:59 -050011import android.service.notification.ScheduleCalendar;
Julia Reynolds4b318432017-11-22 10:56:18 -050012import android.service.notification.ZenModeConfig;
Jason Monkec4b6772017-12-06 10:31:09 -050013import android.support.test.filters.SmallTest;
14import android.support.test.runner.AndroidJUnit4;
Julia Reynolds4b318432017-11-22 10:56:18 -050015
16import org.junit.Before;
Julia Reynolds4b318432017-11-22 10:56:18 -050017import org.junit.Test;
Jason Monkec4b6772017-12-06 10:31:09 -050018import org.junit.runner.RunWith;
Julia Reynolds4b318432017-11-22 10:56:18 -050019import org.mockito.MockitoAnnotations;
20
21import java.util.Calendar;
22import java.util.GregorianCalendar;
23
Jason Monkec4b6772017-12-06 10:31:09 -050024@RunWith(AndroidJUnit4.class)
25@SmallTest
26public class ScheduleConditionProviderTest extends NotificationTestCase {
Julia Reynolds4b318432017-11-22 10:56:18 -050027
28 ScheduleConditionProvider mService;
29
Julia Reynolds4b318432017-11-22 10:56:18 -050030 @Before
31 public void setUp() throws Exception {
32 MockitoAnnotations.initMocks(this);
Julia Reynolds4b318432017-11-22 10:56:18 -050033
34 Intent startIntent =
35 new Intent("com.android.server.notification.ScheduleConditionProvider");
36 startIntent.setPackage("android");
Jason Monkec4b6772017-12-06 10:31:09 -050037 ScheduleConditionProvider service = new ScheduleConditionProvider();
38 service.attach(
39 getContext(),
40 null, // ActivityThread not actually used in Service
41 ScheduleConditionProvider.class.getName(),
42 null, // token not needed when not talking with the activity manager
43 null,
44 null // mocked services don't talk with the activity manager
45 );
46 service.onCreate();
47 service.onBind(startIntent);
48 mService = spy(service);
Julia Reynolds4b318432017-11-22 10:56:18 -050049 }
50
51 @Test
52 public void testIsValidConditionId_incomplete() throws Exception {
53 Uri badConditionId = Uri.EMPTY;
54 assertFalse(mService.isValidConditionId(badConditionId));
55 assertEquals(Condition.STATE_ERROR,
56 mService.evaluateSubscriptionLocked(badConditionId, null, 0, 1000).state);
57 }
58
59 @Test
60 public void testIsValidConditionId() throws Exception {
61 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
62 info.days = new int[] {1, 2, 4};
63 info.startHour = 8;
64 info.startMinute = 56;
65 info.nextAlarm = 1000;
66 info.exitAtAlarm = true;
67 info.endHour = 12;
68 info.endMinute = 9;
69 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
70 assertTrue(mService.isValidConditionId(conditionId));
71 }
72
73 @Test
74 public void testEvaluateSubscription_noAlarmExit_InSchedule() {
75 Calendar now = getNow();
76
77 // Schedule - 1 hour long; starts now
78 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
79 info.days = new int[] {Calendar.FRIDAY};
80 info.startHour = now.get(Calendar.HOUR_OF_DAY);
81 info.startMinute = now.get(Calendar.MINUTE);
82 info.nextAlarm = 0;
83 info.exitAtAlarm = false;
84 info.endHour = now.get(Calendar.HOUR_OF_DAY) + 1;
85 info.endMinute = info.startMinute;
86 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
87 ScheduleCalendar cal = new ScheduleCalendar();
88 cal.setSchedule(info);
89 assertTrue(cal.isInSchedule(now.getTimeInMillis()));
90
91 Condition condition = mService.evaluateSubscriptionLocked(
92 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 1000);
93
94 assertEquals(Condition.STATE_TRUE, condition.state);
95 }
96
97 @Test
98 public void testEvaluateSubscription_noAlarmExit_InScheduleSnoozed() {
99 Calendar now = getNow();
100
101 // Schedule - 1 hour long; starts now
102 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
103 info.days = new int[] {Calendar.FRIDAY};
104 info.startHour = now.get(Calendar.HOUR_OF_DAY);
105 info.startMinute = now.get(Calendar.MINUTE);
106 info.nextAlarm = 0;
107 info.exitAtAlarm = false;
108 info.endHour = now.get(Calendar.HOUR_OF_DAY) + 1;
109 info.endMinute = info.startMinute;
110 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
111 ScheduleCalendar cal = new ScheduleCalendar();
112 cal.setSchedule(info);
113 assertTrue(cal.isInSchedule(now.getTimeInMillis()));
114
115 mService.addSnoozed(conditionId);
116
117 Condition condition = mService.evaluateSubscriptionLocked(
118 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 1000);
119
120 assertEquals(Condition.STATE_FALSE, condition.state);
121 }
122
123 @Test
124 public void testEvaluateSubscription_noAlarmExit_beforeSchedule() {
125 Calendar now = new GregorianCalendar();
126 now.set(Calendar.HOUR_OF_DAY, 14);
127 now.set(Calendar.MINUTE, 15);
128 now.set(Calendar.SECOND, 59);
129 now.set(Calendar.MILLISECOND, 0);
130 now.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
131
132 // Schedule - 1 hour long; starts in 1 second
133 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
134 info.days = new int[] {Calendar.FRIDAY};
135 info.startHour = now.get(Calendar.HOUR_OF_DAY);
136 info.startMinute = now.get(Calendar.MINUTE) + 1;
137 info.nextAlarm = 0;
138 info.exitAtAlarm = false;
139 info.endHour = now.get(Calendar.HOUR_OF_DAY) + 1;
140 info.endMinute = info.startMinute;
141 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
142 ScheduleCalendar cal = new ScheduleCalendar();
143 cal.setSchedule(info);
144
145 Condition condition = mService.evaluateSubscriptionLocked(
146 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 1000);
147
148 assertEquals(Condition.STATE_FALSE, condition.state);
149 }
150
151 @Test
152 public void testEvaluateSubscription_noAlarmExit_endSchedule() {
153 Calendar now = getNow();
154
155 // Schedule - 1 hour long; ends now
156 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
157 info.days = new int[] {Calendar.FRIDAY};
158 info.startHour = now.get(Calendar.HOUR_OF_DAY) - 1;
159 info.startMinute = now.get(Calendar.MINUTE);
160 info.nextAlarm = 0;
161 info.exitAtAlarm = false;
162 info.endHour = now.get(Calendar.HOUR_OF_DAY);
163 info.endMinute = now.get(Calendar.MINUTE);
164 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
165 ScheduleCalendar cal = new ScheduleCalendar();
166 cal.setSchedule(info);
167
168 Condition condition = mService.evaluateSubscriptionLocked(
169 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 1000);
170
171 assertEquals(Condition.STATE_FALSE, condition.state);
172 }
173
174 @Test
175 public void testEvaluateSubscription_alarmSetBeforeInSchedule() {
176 Calendar now = getNow();
177
178 // Schedule - 1 hour long; starts now, ends with alarm
179 ZenModeConfig.ScheduleInfo info = getScheduleEndsInHour(now);
180 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
181 ScheduleCalendar cal = new ScheduleCalendar();
182 cal.setSchedule(info);
183
184 // an hour before start, update with an alarm that will fire during the schedule
185 mService.evaluateSubscriptionLocked(
186 conditionId, cal, now.getTimeInMillis() - 1000, now.getTimeInMillis() + 1000);
187
188 // at start, should be in dnd
189 Condition condition = mService.evaluateSubscriptionLocked(
190 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 1000);
191 assertEquals(Condition.STATE_TRUE, condition.state);
192
193 // at alarm fire time, should exit dnd
194 assertTrue(cal.isInSchedule(now.getTimeInMillis() + 1000));
195 assertTrue("" + info.nextAlarm + " " + now.getTimeInMillis(),
196 cal.shouldExitForAlarm(now.getTimeInMillis() + 1000));
197 condition = mService.evaluateSubscriptionLocked(
198 conditionId, cal, now.getTimeInMillis() + 1000, 0);
199 assertEquals(Condition.STATE_FALSE, condition.state);
200 }
201
202 @Test
203 public void testEvaluateSubscription_alarmSetInSchedule() {
204 Calendar now = getNow();
205
206 // Schedule - 1 hour long; starts now, ends with alarm
207 ZenModeConfig.ScheduleInfo info = getScheduleEndsInHour(now);
208 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
209 ScheduleCalendar cal = new ScheduleCalendar();
210 cal.setSchedule(info);
211
212 // at start, should be in dnd
213 Condition condition = mService.evaluateSubscriptionLocked(
214 conditionId, cal, now.getTimeInMillis(), 0);
215 assertEquals(Condition.STATE_TRUE, condition.state);
216
217 // in schedule, update with alarm time, should be in dnd
218 condition = mService.evaluateSubscriptionLocked(
219 conditionId, cal, now.getTimeInMillis() + 500, now.getTimeInMillis() + 1000);
220 assertEquals(Condition.STATE_TRUE, condition.state);
221
222 // at alarm fire time, should exit dnd
223 assertTrue(cal.isInSchedule(now.getTimeInMillis() + 1000));
224 assertTrue("" + info.nextAlarm + " " + now.getTimeInMillis(),
225 cal.shouldExitForAlarm(now.getTimeInMillis() + 1000));
226 condition = mService.evaluateSubscriptionLocked(
227 conditionId, cal, now.getTimeInMillis() + 1000, 0);
228 assertEquals(Condition.STATE_FALSE, condition.state);
229 }
230
231 @Test
232 public void testEvaluateSubscription_earlierAlarmSet() {
233 Calendar now = getNow();
234
235 // Schedule - 1 hour long; starts now, ends with alarm
236 ZenModeConfig.ScheduleInfo info = getScheduleEndsInHour(now);
237 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
238 ScheduleCalendar cal = new ScheduleCalendar();
239 cal.setSchedule(info);
240
241 // at start, should be in dnd, alarm in 2000 ms
242 Condition condition = mService.evaluateSubscriptionLocked(
243 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 2000);
244 assertEquals(Condition.STATE_TRUE, condition.state);
245
246 // in schedule, update with earlier alarm time, should be in dnd
247 condition = mService.evaluateSubscriptionLocked(
248 conditionId, cal, now.getTimeInMillis() + 500, now.getTimeInMillis() + 1000);
249 assertEquals(Condition.STATE_TRUE, condition.state);
250
251 // at earliest alarm fire time, should exit dnd
252 assertTrue(cal.isInSchedule(now.getTimeInMillis() + 1000));
253 assertTrue("" + info.nextAlarm + " " + now.getTimeInMillis(),
254 cal.shouldExitForAlarm(now.getTimeInMillis() + 1000));
255 condition = mService.evaluateSubscriptionLocked(
256 conditionId, cal, now.getTimeInMillis() + 1000, 0);
257 assertEquals(Condition.STATE_FALSE, condition.state);
258 }
259
260 @Test
261 public void testEvaluateSubscription_laterAlarmSet() {
262 Calendar now = getNow();
263
264 // Schedule - 1 hour long; starts now, ends with alarm
265 ZenModeConfig.ScheduleInfo info = getScheduleEndsInHour(now);
266 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
267 ScheduleCalendar cal = new ScheduleCalendar();
268 cal.setSchedule(info);
269
270 // at start, should be in dnd, alarm in 500 ms
271 Condition condition = mService.evaluateSubscriptionLocked(
272 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 500);
273 assertEquals(Condition.STATE_TRUE, condition.state);
274
275 // in schedule, update with later alarm time, should be in dnd
276 condition = mService.evaluateSubscriptionLocked(
277 conditionId, cal, now.getTimeInMillis() + 250, now.getTimeInMillis() + 1000);
278 assertEquals(Condition.STATE_TRUE, condition.state);
279
280 // at earliest alarm fire time, should exit dnd
281 assertTrue(cal.isInSchedule(now.getTimeInMillis() + 500));
282 assertTrue("" + info.nextAlarm + " " + now.getTimeInMillis(),
283 cal.shouldExitForAlarm(now.getTimeInMillis() + 500));
284 condition = mService.evaluateSubscriptionLocked(
285 conditionId, cal, now.getTimeInMillis() + 500, 0);
286 assertEquals(Condition.STATE_FALSE, condition.state);
287 }
288
289 @Test
290 public void testEvaluateSubscription_alarmCanceled() {
291 Calendar now = getNow();
292
293 // Schedule - 1 hour long; starts now, ends with alarm
294 ZenModeConfig.ScheduleInfo info = getScheduleEndsInHour(now);
295 Uri conditionId = ZenModeConfig.toScheduleConditionId(info);
296 ScheduleCalendar cal = new ScheduleCalendar();
297 cal.setSchedule(info);
298
299 // at start, should be in dnd, alarm in 500 ms
300 Condition condition = mService.evaluateSubscriptionLocked(
301 conditionId, cal, now.getTimeInMillis(), now.getTimeInMillis() + 500);
302 assertEquals(Condition.STATE_TRUE, condition.state);
303
304 // in schedule, cancel alarm
305 condition = mService.evaluateSubscriptionLocked(
306 conditionId, cal, now.getTimeInMillis() + 250, 0);
307 assertEquals(Condition.STATE_TRUE, condition.state);
308
309 // at previous alarm time, should not exit DND
310 assertTrue(cal.isInSchedule(now.getTimeInMillis() + 500));
311 assertFalse(cal.shouldExitForAlarm(now.getTimeInMillis() + 500));
312 condition = mService.evaluateSubscriptionLocked(
313 conditionId, cal, now.getTimeInMillis() + 500, 0);
314 assertEquals(Condition.STATE_TRUE, condition.state);
315
316 // end of schedule, exit DND
317 now.add(Calendar.HOUR_OF_DAY, 1);
318 condition = mService.evaluateSubscriptionLocked(conditionId, cal, now.getTimeInMillis(), 0);
319 assertEquals(Condition.STATE_FALSE, condition.state);
320 }
321
322 private Calendar getNow() {
323 Calendar now = new GregorianCalendar();
324 now.set(Calendar.HOUR_OF_DAY, 14);
325 now.set(Calendar.MINUTE, 16);
326 now.set(Calendar.SECOND, 0);
327 now.set(Calendar.MILLISECOND, 0);
328 now.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
329 return now;
330 }
331
332 private ZenModeConfig.ScheduleInfo getScheduleEndsInHour(Calendar now) {
333 ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo();
334 info.days = new int[] {Calendar.FRIDAY};
335 info.startHour = now.get(Calendar.HOUR_OF_DAY);
336 info.startMinute = now.get(Calendar.MINUTE);
337 info.exitAtAlarm = true;
338 info.endHour = now.get(Calendar.HOUR_OF_DAY) + 1;
339 info.endMinute = now.get(Calendar.MINUTE);
340 return info;
341 }
342}