1 /*
2  * Copyright (C) 2022 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 
17 package com.android.systemui.smartspace
18 
19 import android.testing.AndroidTestingRunner
20 import android.testing.TestableLooper
21 import androidx.test.filters.SmallTest
22 import com.android.systemui.SysuiTestCase
23 import com.android.systemui.smartspace.preconditions.LockscreenPrecondition
24 import com.android.systemui.statusbar.policy.DeviceProvisionedController
25 import com.android.systemui.util.concurrency.Execution
26 import com.google.common.truth.Truth.assertThat
27 import org.junit.Before
28 import org.junit.Test
29 import org.junit.runner.RunWith
30 import org.mockito.ArgumentCaptor
31 import org.mockito.Mock
32 import org.mockito.Mockito
33 import org.mockito.Mockito.`when`
34 import org.mockito.Mockito.verify
35 import org.mockito.MockitoAnnotations
36 
37 @SmallTest
38 @RunWith(AndroidTestingRunner::class)
39 @TestableLooper.RunWithLooper
40 class LockscreenPreconditionTest : SysuiTestCase() {
41     @Mock
42     private lateinit var deviceProvisionedController: DeviceProvisionedController
43 
44     @Mock
45     private lateinit var execution: Execution
46 
47     @Mock
48     private lateinit var listener: SmartspacePrecondition.Listener
49 
50     @Before
51     fun setup() {
52         MockitoAnnotations.initMocks(this)
53     }
54 
55     /**
56      * Ensures fully enabled state is published.
57      */
58     @Test
59     fun testFullyEnabled() {
60         `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(true)
61         `when`(deviceProvisionedController.isDeviceProvisioned).thenReturn(true)
62         val precondition = LockscreenPrecondition(deviceProvisionedController, execution)
63         precondition.addListener(listener)
64 
65         `verify`(listener).onCriteriaChanged()
66         assertThat(precondition.conditionsMet()).isTrue()
67     }
68 
69     /**
70      * Ensures fully enabled state is published.
71      */
72     @Test
73     fun testProvisioning() {
74         `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(true)
75         `when`(deviceProvisionedController.isDeviceProvisioned).thenReturn(false)
76         val precondition =
77                 LockscreenPrecondition(deviceProvisionedController, execution)
78         precondition.addListener(listener)
79 
80         verify(listener).onCriteriaChanged()
81         assertThat(precondition.conditionsMet()).isFalse()
82 
83         var argumentCaptor = ArgumentCaptor.forClass(DeviceProvisionedController
84                 .DeviceProvisionedListener::class.java)
85         verify(deviceProvisionedController).addCallback(argumentCaptor.capture())
86 
87         Mockito.clearInvocations(listener)
88 
89         `when`(deviceProvisionedController.isDeviceProvisioned).thenReturn(true)
90         argumentCaptor.value.onDeviceProvisionedChanged()
91         verify(listener).onCriteriaChanged()
92         assertThat(precondition.conditionsMet()).isTrue()
93     }
94 
95     /**
96      * Makes sure user setup changes are propagated.
97      */
98     @Test
99     fun testUserSetup() {
100         `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(false)
101         `when`(deviceProvisionedController.isDeviceProvisioned).thenReturn(true)
102         val precondition =
103                 LockscreenPrecondition(deviceProvisionedController, execution)
104         precondition.addListener(listener)
105 
106         verify(listener).onCriteriaChanged()
107         assertThat(precondition.conditionsMet()).isFalse()
108 
109         var argumentCaptor = ArgumentCaptor.forClass(DeviceProvisionedController
110                 .DeviceProvisionedListener::class.java)
111         verify(deviceProvisionedController).addCallback(argumentCaptor.capture())
112 
113         Mockito.clearInvocations(listener)
114 
115         `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(true)
116         argumentCaptor.value.onUserSetupChanged()
117         verify(listener).onCriteriaChanged()
118         assertThat(precondition.conditionsMet()).isTrue()
119     }
120 }
121