• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 package com.android.adservices.mockito;
17 
18 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
19 
20 import android.app.ActivityManager;
21 import android.os.Binder;
22 import android.os.Process;
23 import android.util.Log;
24 
25 import com.android.adservices.shared.testing.Logger.LogLevel;
26 import com.android.modules.utils.build.SdkLevel;
27 
28 // TODO(b/324919960): add unit test
29 /**
30  * {@link AndroidStaticMocker} implementation that uses {@code ExtendedMockito}.
31  *
32  * <p><b>NOTE: </b> most expectations require {@code spyStatic()} or {@code mockStatic()} in the
33  * {@link com.android.dx.mockito.inline.extended.StaticMockitoSession session} ahead of time - this
34  * helper doesn't check that such calls were made, it's up to the caller to do so.
35  */
36 public final class AndroidExtendedMockitoMocker extends AbstractStaticMocker
37         implements AndroidStaticMocker {
38 
39     // TODO(b/338132355): create helper class to implement StaticClassChecker from rule
AndroidExtendedMockitoMocker(StaticClassChecker staticClassChecker)40     public AndroidExtendedMockitoMocker(StaticClassChecker staticClassChecker) {
41         super(staticClassChecker);
42     }
43 
44     @Override
mockGetCallingUidOrThrow(int uid)45     public void mockGetCallingUidOrThrow(int uid) {
46         logV("mockGetCallingUidOrThrow(%d)", uid);
47         mockBinderGetCallingUidOrThrow(uid);
48     }
49 
50     @Override
mockGetCallingUidOrThrow()51     public void mockGetCallingUidOrThrow() {
52         int uid = Process.myUid();
53         logV("mockGetCallingUidOrThrow(Process.myUid=%d)", uid);
54         mockBinderGetCallingUidOrThrow(uid);
55     }
56 
57     @Override
mockIsAtLeastR(boolean isIt)58     public void mockIsAtLeastR(boolean isIt) {
59         logV("mockIsAtLeastR(%b)", isIt);
60         assertSpiedOrMocked(SdkLevel.class);
61         doReturn(isIt).when(SdkLevel::isAtLeastR);
62     }
63 
64     @Override
mockIsAtLeastS(boolean isIt)65     public void mockIsAtLeastS(boolean isIt) {
66         logV("mockIsAtLeastS(%b)", isIt);
67         assertSpiedOrMocked(SdkLevel.class);
68         doReturn(isIt).when(SdkLevel::isAtLeastS);
69     }
70 
71     @Override
mockIsAtLeastT(boolean isIt)72     public void mockIsAtLeastT(boolean isIt) {
73         logV("mockIsAtLeastT(%b)", isIt);
74         assertSpiedOrMocked(SdkLevel.class);
75         doReturn(isIt).when(SdkLevel::isAtLeastT);
76     }
77 
78     @Override
mockSdkLevelR()79     public void mockSdkLevelR() {
80         logV("mockSdkLevelR()");
81         assertSpiedOrMocked(SdkLevel.class);
82         doReturn(true).when(SdkLevel::isAtLeastR);
83         doReturn(false).when(SdkLevel::isAtLeastS);
84         doReturn(false).when(SdkLevel::isAtLeastSv2);
85         doReturn(false).when(SdkLevel::isAtLeastT);
86         doReturn(false).when(SdkLevel::isAtLeastU);
87     }
88 
89     @Override
mockGetCurrentUser(int user)90     public void mockGetCurrentUser(int user) {
91         logV("mockGetCurrentUser(user=%d)", user);
92         assertSpiedOrMocked(ActivityManager.class);
93         doReturn(user).when(ActivityManager::getCurrentUser);
94     }
95 
96     @Override
interceptLogD(String tag)97     public LogInterceptor interceptLogD(String tag) {
98         logV("interceptLogD(%s)", tag);
99         assertSpiedOrMocked(Log.class);
100 
101         return LogInterceptor.forTagAndLevels(tag, LogLevel.DEBUG);
102     }
103 
104     @Override
interceptLogV(String tag)105     public LogInterceptor interceptLogV(String tag) {
106         logV("interceptLogV(%s)", tag);
107         assertSpiedOrMocked(Log.class);
108 
109         return LogInterceptor.forTagAndLevels(tag, LogLevel.VERBOSE);
110     }
111 
112     @Override
interceptLogE(String tag)113     public LogInterceptor interceptLogE(String tag) {
114         logV("interceptLogE(%s)", tag);
115         assertSpiedOrMocked(Log.class);
116 
117         return LogInterceptor.forTagAndLevels(tag, LogLevel.ERROR);
118     }
119 
120     // mock only, don't log
mockBinderGetCallingUidOrThrow(int uid)121     private void mockBinderGetCallingUidOrThrow(int uid) {
122         assertSpiedOrMocked(Binder.class);
123         doReturn(uid).when(Binder::getCallingUidOrThrow);
124     }
125 }
126