1 /*
2  * Copyright 2023 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.dreams;
18 
19 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
20 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
21 
22 import static org.mockito.ArgumentMatchers.any;
23 import static org.mockito.ArgumentMatchers.anyInt;
24 import static org.mockito.ArgumentMatchers.eq;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.spy;
27 import static org.mockito.Mockito.when;
28 
29 import android.app.ActivityManagerInternal;
30 import android.content.ContextWrapper;
31 import android.content.pm.UserInfo;
32 import android.content.res.Resources;
33 import android.os.PowerManagerInternal;
34 import android.os.UserHandle;
35 import android.os.UserManager;
36 import android.provider.Settings;
37 
38 import androidx.test.InstrumentationRegistry;
39 
40 import com.android.server.LocalServices;
41 import com.android.server.SystemService;
42 
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.Test;
46 import org.mockito.Mock;
47 import org.mockito.MockitoAnnotations;
48 import org.mockito.MockitoSession;
49 import org.mockito.quality.Strictness;
50 
51 /**
52  * Collection of tests for exercising the {@link DreamManagerService} lifecycle.
53  */
54 public class DreamManagerServiceMockingTest {
55     private ContextWrapper mContextSpy;
56     private Resources mResourcesSpy;
57 
58     @Mock
59     private ActivityManagerInternal mActivityManagerInternalMock;
60 
61     @Mock
62     private PowerManagerInternal mPowerManagerInternalMock;
63 
64     @Mock
65     private UserManager mUserManagerMock;
66 
67     private MockitoSession mMockitoSession;
68 
addLocalServiceMock(Class<T> clazz, T mock)69     private static <T> void addLocalServiceMock(Class<T> clazz, T mock) {
70         LocalServices.removeServiceForTest(clazz);
71         LocalServices.addService(clazz, mock);
72     }
73 
74     @Before
setUp()75     public void setUp() throws Exception {
76         MockitoAnnotations.initMocks(this);
77 
78         mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
79         mResourcesSpy = spy(mContextSpy.getResources());
80         when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
81 
82         addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
83         addLocalServiceMock(PowerManagerInternal.class, mPowerManagerInternalMock);
84 
85         when(mContextSpy.getSystemService(UserManager.class)).thenReturn(mUserManagerMock);
86         mMockitoSession = mockitoSession()
87                 .initMocks(this)
88                 .strictness(Strictness.LENIENT)
89                 .mockStatic(Settings.Secure.class)
90                 .startMocking();
91     }
92 
93     @After
tearDown()94     public void tearDown() throws Exception {
95         mMockitoSession.finishMocking();
96         LocalServices.removeServiceForTest(ActivityManagerInternal.class);
97         LocalServices.removeServiceForTest(PowerManagerInternal.class);
98     }
99 
createService()100     private DreamManagerService createService() {
101         return new DreamManagerService(mContextSpy);
102     }
103 
104     @Test
testSettingsQueryUserChange()105     public void testSettingsQueryUserChange() {
106         final DreamManagerService service = createService();
107 
108         final SystemService.TargetUser from =
109                 new SystemService.TargetUser(mock(UserInfo.class));
110         final SystemService.TargetUser to =
111                 new SystemService.TargetUser(mock(UserInfo.class));
112 
113         service.onUserSwitching(from, to);
114 
115         verify(() -> Settings.Secure.getIntForUser(any(),
116                 eq(Settings.Secure.SCREENSAVER_ENABLED),
117                 anyInt(),
118                 eq(UserHandle.USER_CURRENT)));
119     }
120 }
121