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