1 /*
2  * Copyright (C) 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 package com.android.adservices.common;
17 
18 import com.android.adservices.common.AdServicesExtendedMockitoTestCase.Mocker;
19 import com.android.adservices.common.logging.AdServicesLoggingUsageRule;
20 import com.android.adservices.errorlogging.ErrorLogUtil;
21 import com.android.adservices.mockito.AdServicesExtendedMockitoRule;
22 import com.android.adservices.mockito.StaticClassChecker;
23 import com.android.adservices.service.DebugFlags;
24 import com.android.adservices.service.Flags;
25 
26 import com.google.common.annotations.VisibleForTesting;
27 
28 import java.util.Objects;
29 
30 /**
31  * Base class for all unit tests that use {@code ExtendedMockito} - for "regular Mockito" use {@link
32  * AdServicesMockitoTestCase} instead).
33  *
34  * <p><b>NOTE:</b> subclasses MUST use {@link
35  * com.android.modules.utils.testing.ExtendedMockitoRule.SpyStatic} and/or {@link
36  * com.android.modules.utils.testing.ExtendedMockitoRule.MockStatic} to set which static classes are
37  * mocked ad/or spied.
38  *
39  * <p><b>NOTE:</b>if the subclass wants to provide its own {@code mocker}, it should extend {@link
40  * AdServicesMockerLessExtendedMockitoTestCase} instead - see {@link AdServicesJobServiceTestCase}
41  * as an example.
42  *
43  * <p>TODO(b/355699778) - Add linter to ensure ErrorLogUtil invocation is not mocked in subclasses.
44  * {@link ErrorLogUtil} is automatically spied for all subclasses to ensure {@link
45  * AdServicesLoggingUsageRule} is enforced for logging verification. Subclasses should not mock
46  * {@link ErrorLogUtil} to avoid interference with mocking behavior needed for the rule.
47  */
48 public abstract class AdServicesExtendedMockitoTestCase
49         extends AdServicesMockerLessExtendedMockitoTestCase<Mocker> {
50 
51     @Override
newMocker( AdServicesExtendedMockitoRule rule, Flags mockFlags, DebugFlags mockDebugFlags)52     protected final Mocker newMocker(
53             AdServicesExtendedMockitoRule rule, Flags mockFlags, DebugFlags mockDebugFlags) {
54         return new Mocker(rule, mockFlags, mockDebugFlags);
55     }
56 
57     public static final class Mocker
58             extends AdServicesMockerLessExtendedMockitoTestCase.InternalMocker {
Mocker(StaticClassChecker checker, Flags flags, DebugFlags mockDebugFlags)59         private Mocker(StaticClassChecker checker, Flags flags, DebugFlags mockDebugFlags) {
60             super(checker, flags, mockDebugFlags);
61         }
62 
63         // Factory methods below are used by AdServicesExtendedMockitoTestCaseXYZMockerTest - there
64         // is one method for each of these tests, so it creates a Mocker object that implements
65         // the mockier interface being tested
66 
67         @VisibleForTesting
forSharedMockerTests()68         static Mocker forSharedMockerTests() {
69             return new Mocker(/* checker= */ null, /* flags= */ null, /* mockDebugFlags= */ null);
70         }
71 
72         @VisibleForTesting
forAndroidMockerTests()73         static Mocker forAndroidMockerTests() {
74             return new Mocker(/* checker= */ null, /* flags= */ null, /* mockDebugFlags= */ null);
75         }
76 
77         @VisibleForTesting
forAndroidStaticMockerTests(StaticClassChecker checker)78         static Mocker forAndroidStaticMockerTests(StaticClassChecker checker) {
79             return new Mocker(
80                     Objects.requireNonNull(checker, "checker cannot be null"),
81                     /* flags= */ null,
82                     /* mockDebugFlags= */ null);
83         }
84 
85         @VisibleForTesting
forAdServicesPragmaticMockerTests()86         static Mocker forAdServicesPragmaticMockerTests() {
87             return new Mocker(/* checker= */ null, /* flags= */ null, /* mockDebugFlags= */ null);
88         }
89 
90         @VisibleForTesting
forAdServicesFlagsMockerTests(Flags flags)91         static Mocker forAdServicesFlagsMockerTests(Flags flags) {
92             return new Mocker(
93                     /* checker= */ null,
94                     Objects.requireNonNull(flags, "flags cannot be null"),
95                     /* mockDebugFlags= */ null);
96         }
97 
98         @VisibleForTesting
forAdServicesDebugFlagsMockerTests(DebugFlags debugFlags)99         static Mocker forAdServicesDebugFlagsMockerTests(DebugFlags debugFlags) {
100             return new Mocker(
101                     /* checker= */ null,
102                     /* flags= */ null,
103                     Objects.requireNonNull(debugFlags, "DebugFlags cannot be null"));
104         }
105 
106         @VisibleForTesting
forAdServicesStaticMockerTests(StaticClassChecker checker)107         static Mocker forAdServicesStaticMockerTests(StaticClassChecker checker) {
108             return new Mocker(
109                     Objects.requireNonNull(checker, "checker cannot be null"),
110                     /* flags= */ null,
111                     /* mockDebugFlags= */ null);
112         }
113     }
114 }
115