1 /*
2  * Copyright (C) 2021 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.server.devicestate;
18 
19 import static com.android.server.devicestate.OverrideRequest.OVERRIDE_REQUEST_TYPE_BASE_STATE;
20 import static com.android.server.devicestate.OverrideRequest.OVERRIDE_REQUEST_TYPE_EMULATED_STATE;
21 import static com.android.server.devicestate.OverrideRequestController.STATUS_ACTIVE;
22 import static com.android.server.devicestate.OverrideRequestController.STATUS_CANCELED;
23 
24 import static junit.framework.Assert.assertEquals;
25 import static junit.framework.Assert.assertNull;
26 
27 import android.annotation.Nullable;
28 import android.hardware.devicestate.DeviceStateRequest;
29 import android.os.Binder;
30 import android.platform.test.annotations.Presubmit;
31 
32 import androidx.annotation.NonNull;
33 import androidx.test.runner.AndroidJUnit4;
34 
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 
39 import java.util.HashMap;
40 import java.util.Map;
41 
42 /**
43  * Unit tests for {@link OverrideRequestController}.
44  * <p/>
45  * Run with <code>atest OverrideRequestControllerTest</code>.
46  */
47 @Presubmit
48 @RunWith(AndroidJUnit4.class)
49 public final class OverrideRequestControllerTest {
50     private TestStatusChangeListener mStatusListener;
51     private OverrideRequestController mController;
52 
53     @Before
setup()54     public void setup() {
55         mStatusListener = new TestStatusChangeListener();
56         mController = new OverrideRequestController(mStatusListener);
57     }
58 
59     @Test
addRequest()60     public void addRequest() {
61         OverrideRequest request = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
62                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
63         assertNull(mStatusListener.getLastStatus(request));
64 
65         mController.addRequest(request);
66         assertEquals(mStatusListener.getLastStatus(request).intValue(), STATUS_ACTIVE);
67     }
68 
69     @Test
addRequest_cancelExistingRequestThroughNewRequest()70     public void addRequest_cancelExistingRequestThroughNewRequest() {
71         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
72                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
73         assertNull(mStatusListener.getLastStatus(firstRequest));
74 
75         mController.addRequest(firstRequest);
76         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
77 
78         OverrideRequest secondRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
79                 1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
80         assertNull(mStatusListener.getLastStatus(secondRequest));
81 
82         mController.addRequest(secondRequest);
83         assertEquals(mStatusListener.getLastStatus(secondRequest).intValue(), STATUS_ACTIVE);
84         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
85     }
86 
87     @Test
addRequest_cancelActiveRequest()88     public void addRequest_cancelActiveRequest() {
89         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
90                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
91 
92         mController.addRequest(firstRequest);
93 
94         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
95 
96         mController.cancelOverrideRequest();
97 
98         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
99     }
100 
101     @Test
addBaseStateRequest()102     public void addBaseStateRequest() {
103         OverrideRequest request = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
104                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
105         assertNull(mStatusListener.getLastStatus(request));
106 
107         mController.addBaseStateRequest(request);
108         assertEquals(mStatusListener.getLastStatus(request).intValue(), STATUS_ACTIVE);
109     }
110 
111     @Test
addBaseStateRequest_cancelExistingBaseStateRequestThroughNewRequest()112     public void addBaseStateRequest_cancelExistingBaseStateRequestThroughNewRequest() {
113         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
114                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
115         assertNull(mStatusListener.getLastStatus(firstRequest));
116 
117         mController.addBaseStateRequest(firstRequest);
118         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
119 
120         OverrideRequest secondRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
121                 1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
122         assertNull(mStatusListener.getLastStatus(secondRequest));
123 
124         mController.addBaseStateRequest(secondRequest);
125         assertEquals(mStatusListener.getLastStatus(secondRequest).intValue(), STATUS_ACTIVE);
126         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
127     }
128 
129     @Test
addBaseStateRequest_cancelActiveBaseStateRequest()130     public void addBaseStateRequest_cancelActiveBaseStateRequest() {
131         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
132                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
133 
134         mController.addBaseStateRequest(firstRequest);
135 
136         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
137 
138         mController.cancelBaseStateOverrideRequest();
139 
140         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
141     }
142 
143     @Test
handleBaseStateChanged()144     public void handleBaseStateChanged() {
145         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
146                 0 /* requestedState */,
147                 DeviceStateRequest.FLAG_CANCEL_WHEN_BASE_CHANGES /* flags */,
148                 OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
149 
150         OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
151                 0 /* uid */,
152                 0 /* requestedState */,
153                 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
154 
155         mController.addRequest(firstRequest);
156 
157         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
158 
159         mController.addBaseStateRequest(baseStateRequest);
160 
161         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_ACTIVE);
162 
163         mController.handleBaseStateChanged(1);
164 
165         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
166         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_CANCELED);
167     }
168 
169     @Test
handleProcessDied()170     public void handleProcessDied() {
171         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
172                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
173 
174         OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
175                 0 /* uid */,
176                 1 /* requestedState */,
177                 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
178 
179         mController.addRequest(firstRequest);
180         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
181 
182         mController.addBaseStateRequest(baseStateRequest);
183         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_ACTIVE);
184 
185         mController.handleProcessDied(0);
186         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
187         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_CANCELED);
188     }
189 
190     @Test
handleProcessDied_stickyRequests()191     public void handleProcessDied_stickyRequests() {
192         mController.setStickyRequestsAllowed(true);
193 
194         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
195                 0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
196 
197         OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
198                 0 /* uid */,
199                 1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
200 
201         mController.addRequest(firstRequest);
202         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
203 
204         mController.addBaseStateRequest(baseStateRequest);
205         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_ACTIVE);
206 
207         mController.handleProcessDied(0);
208         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
209         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_CANCELED);
210 
211         mController.cancelStickyRequest();
212         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
213     }
214 
215     @Test
handleNewSupportedStates()216     public void handleNewSupportedStates() {
217         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
218                 1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
219 
220         OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
221                 0 /* uid */,
222                 1 /* requestedState */,
223                 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
224 
225         mController.addRequest(firstRequest);
226         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
227 
228         mController.addBaseStateRequest(baseStateRequest);
229         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_ACTIVE);
230 
231         mController.handleNewSupportedStates(new int[]{0, 1},
232                 DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_DEFAULT);
233         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
234         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_ACTIVE);
235 
236         mController.handleNewSupportedStates(new int[]{0},
237                 DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_DEFAULT);
238         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
239         assertEquals(mStatusListener.getLastStatus(baseStateRequest).intValue(), STATUS_CANCELED);
240     }
241 
242     @Test
cancelOverrideRequestsTest()243     public void cancelOverrideRequestsTest() {
244         OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
245                 1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
246 
247         mController.addRequest(firstRequest);
248         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
249 
250         mController.cancelOverrideRequest();
251         assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED);
252     }
253 
254     private static final class TestStatusChangeListener implements
255             OverrideRequestController.StatusChangeListener {
256         private Map<OverrideRequest, Integer> mLastStatusMap = new HashMap<>();
257 
258         @Override
onStatusChanged(@onNull OverrideRequest request, int newStatus, int flags)259         public void onStatusChanged(@NonNull OverrideRequest request, int newStatus, int flags) {
260             mLastStatusMap.put(request, newStatus);
261         }
262 
263         @Nullable
getLastStatus(OverrideRequest request)264         public Integer getLastStatus(OverrideRequest request) {
265             return mLastStatusMap.get(request);
266         }
267     }
268 }
269