• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 static com.android.adservices.common.DeviceSideDeviceConfigHelper.callWithDeviceConfigPermissions;
19 import static com.android.adservices.service.DebugFlagsConstants.KEY_CONSENT_MANAGER_DEBUG_MODE;
20 import static com.android.adservices.service.DebugFlagsConstants.KEY_CONSENT_NOTIFIED_DEBUG_MODE;
21 import static com.android.adservices.service.FlagsConstants.KEY_ADID_KILL_SWITCH;
22 import static com.android.adservices.service.FlagsConstants.KEY_DISABLE_TOPICS_ENROLLMENT_CHECK;
23 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_ENABLE_KANON_AUCTION_SERVER_FEATURE;
24 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_ENABLE_KANON_SIGN_JOIN_FEATURE;
25 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_KANON_HTTP_CLIENT_TIMEOUT;
26 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_KANON_KEY_ATTESTATION_ENABLED;
27 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_KANON_PERCENTAGE_IMMEDIATE_SIGN_JOIN_CALLS;
28 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_KANON_SET_TYPE_TO_SIGN_JOIN;
29 import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_KANON_SIGN_JOIN_LOGGING_ENABLED;
30 import static com.android.adservices.service.FlagsConstants.KEY_GLOBAL_KILL_SWITCH;
31 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_DELETE_REGISTRATIONS_KILL_SWITCH;
32 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_REGISTER_SOURCE_KILL_SWITCH;
33 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_REGISTER_TRIGGER_KILL_SWITCH;
34 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_REGISTER_WEB_SOURCE_KILL_SWITCH;
35 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_REGISTER_WEB_TRIGGER_KILL_SWITCH;
36 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_API_STATUS_KILL_SWITCH;
37 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_SESSION_STABLE_KILL_SWITCHES;
38 import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_KILL_SWITCH;
39 import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_EPOCH_JOB_PERIOD_MS;
40 import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_PERCENTAGE_FOR_RANDOM_TOPIC;
41 
42 import android.os.Build;
43 
44 import androidx.test.platform.app.InstrumentationRegistry;
45 
46 import com.android.adservices.experimental.AbstractFlagsRouletteRunner;
47 import com.android.adservices.experimental.AbstractFlagsRouletteRunner.FlagsRouletteState;
48 import com.android.adservices.service.Flags;
49 import com.android.adservices.service.FlagsFactory;
50 import com.android.adservices.service.PhFlags;
51 import com.android.adservices.shared.testing.AndroidLogger;
52 import com.android.adservices.shared.testing.Logger.LogLevel;
53 import com.android.adservices.shared.testing.Logger.RealLogger;
54 import com.android.adservices.shared.testing.NameValuePairSetter;
55 import com.android.modules.utils.build.SdkLevel;
56 
57 import com.google.common.annotations.VisibleForTesting;
58 
59 public final class AdServicesFlagsSetterRule
60         extends AbstractAdServicesFlagsSetterRule<AdServicesFlagsSetterRule> {
61 
62     private final boolean mAdoptShellPermissions;
63 
AdServicesFlagsSetterRule()64     private AdServicesFlagsSetterRule() {
65         this(/* adoptShellPermissions= */ true);
66     }
67 
AdServicesFlagsSetterRule(boolean adoptShellPermissions)68     private AdServicesFlagsSetterRule(boolean adoptShellPermissions) {
69         super(
70                 AndroidLogger.getInstance(),
71                 namespace -> new DeviceSideDeviceConfigHelper(namespace, adoptShellPermissions),
72                 DeviceSideSystemPropertiesHelper.getInstance());
73         mAdoptShellPermissions = adoptShellPermissions;
74     }
75 
76     @VisibleForTesting
AdServicesFlagsSetterRule(RealLogger logger, NameValuePairSetter flagsSetter)77     AdServicesFlagsSetterRule(RealLogger logger, NameValuePairSetter flagsSetter) {
78         super(logger, flagsSetter);
79         mAdoptShellPermissions = false;
80     }
81 
82     /** Returns a rule that doesn't set anything. */
newInstance()83     public static AdServicesFlagsSetterRule newInstance() {
84         return new AdServicesFlagsSetterRule();
85     }
86 
87     /** Returns a rule that won't adopt shell permissions - typically used on unit tests. */
withoutAdoptingShellPermissions()88     public static AdServicesFlagsSetterRule withoutAdoptingShellPermissions() {
89         return new AdServicesFlagsSetterRule(/* adoptShellPermissions= */ false);
90     }
91 
92     /** Factory method that only {@link #setDefaultLogcatTags() sets the default logcat tags}. */
withDefaultLogcatTags()93     private static AdServicesFlagsSetterRule withDefaultLogcatTags() {
94         return newInstance().setDefaultLogcatTags();
95     }
96 
97     /** Factory method that sets default flags required to enable K-Anon functionality. */
forKAnonEnabledTests()98     public static AdServicesFlagsSetterRule forKAnonEnabledTests() {
99         return withDefaultLogcatTags()
100                 .setLogcatTag(LOGCAT_TAG_FLEDGE, LogLevel.VERBOSE)
101                 .setLogcatTag(LOGCAT_TAG_KANON, LogLevel.VERBOSE)
102                 .setFlag(KEY_FLEDGE_ENABLE_KANON_SIGN_JOIN_FEATURE, true)
103                 .setFlag(KEY_FLEDGE_ENABLE_KANON_AUCTION_SERVER_FEATURE, true)
104                 .setFlag(KEY_FLEDGE_KANON_SET_TYPE_TO_SIGN_JOIN, "android")
105                 .setFlag(KEY_FLEDGE_KANON_PERCENTAGE_IMMEDIATE_SIGN_JOIN_CALLS, 100)
106                 .setFlag(KEY_FLEDGE_KANON_HTTP_CLIENT_TIMEOUT, 10000)
107                 .setFlag(KEY_FLEDGE_KANON_SIGN_JOIN_LOGGING_ENABLED, true)
108                 .setFlag(KEY_FLEDGE_KANON_KEY_ATTESTATION_ENABLED, true);
109     }
110 
111     /** Factory method that only disables the global kill switch. */
forGlobalKillSwitchDisabledTests()112     public static AdServicesFlagsSetterRule forGlobalKillSwitchDisabledTests() {
113         return withDefaultLogcatTags().setGlobalKillSwitch(false);
114     }
115 
116     /** Factory method that disables all major API kill switches. */
forAllApisEnabledTests()117     public static AdServicesFlagsSetterRule forAllApisEnabledTests() {
118         return newInstance().enableAllApis();
119     }
120 
121     /** Factory method for Measurement E2E CTS tests */
forMeasurementE2ETests(String packageName)122     public static AdServicesFlagsSetterRule forMeasurementE2ETests(String packageName) {
123         return forGlobalKillSwitchDisabledTests()
124                 .setLogcatTag(LOGCAT_TAG_MEASUREMENT, LogLevel.VERBOSE)
125                 .setCompatModeFlags()
126                 .setMsmtApiAppAllowList(packageName)
127                 .setMsmtWebContextClientAllowList(packageName)
128                 .setDebugFlag(KEY_CONSENT_MANAGER_DEBUG_MODE, true)
129                 .setDebugFlag(KEY_CONSENT_NOTIFIED_DEBUG_MODE, true)
130                 .setFlag(KEY_GLOBAL_KILL_SWITCH, false)
131                 .setFlag(KEY_MEASUREMENT_KILL_SWITCH, false)
132                 .setFlag(KEY_MEASUREMENT_API_REGISTER_SOURCE_KILL_SWITCH, false)
133                 .setFlag(KEY_MEASUREMENT_API_REGISTER_TRIGGER_KILL_SWITCH, false)
134                 .setFlag(KEY_MEASUREMENT_API_REGISTER_WEB_SOURCE_KILL_SWITCH, false)
135                 .setFlag(KEY_MEASUREMENT_API_REGISTER_WEB_TRIGGER_KILL_SWITCH, false)
136                 .setFlag(KEY_MEASUREMENT_API_DELETE_REGISTRATIONS_KILL_SWITCH, false)
137                 .setFlag(KEY_MEASUREMENT_API_STATUS_KILL_SWITCH, false)
138                 .setFlag(KEY_MEASUREMENT_ENABLE_SESSION_STABLE_KILL_SWITCHES, false)
139                 .setFlag(KEY_ADID_KILL_SWITCH, false);
140     }
141 
142     /** Factory method for Topics CB tests */
forTopicsPerfTests( long epochPeriodMs, int pctRandomTopic)143     public static AdServicesFlagsSetterRule forTopicsPerfTests(
144             long epochPeriodMs, int pctRandomTopic) {
145         return forGlobalKillSwitchDisabledTests()
146                 .setLogcatTag(LOGCAT_TAG_TOPICS, LogLevel.VERBOSE)
147                 .setTopicsKillSwitch(false)
148                 .setDebugFlag(KEY_CONSENT_MANAGER_DEBUG_MODE, true)
149                 .setFlag(KEY_DISABLE_TOPICS_ENROLLMENT_CHECK, true)
150                 .setFlag(KEY_TOPICS_EPOCH_JOB_PERIOD_MS, epochPeriodMs)
151                 .setFlag(KEY_TOPICS_PERCENTAGE_FOR_RANDOM_TOPIC, pctRandomTopic)
152                 .setCompatModeFlags();
153     }
154 
155     // NOTE: add more factory methods as needed
156 
157     @Override
getTestPackageName()158     protected String getTestPackageName() {
159         return InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName();
160     }
161 
162     @Override
getDeviceSdk()163     protected int getDeviceSdk() {
164         return Build.VERSION.SDK_INT;
165     }
166 
167     @Override
isAtLeastS()168     protected boolean isAtLeastS() {
169         return SdkLevel.isAtLeastS();
170     }
171 
172     @Override
isAtLeastT()173     protected boolean isAtLeastT() {
174         return SdkLevel.isAtLeastT();
175     }
176 
177     @Override
isFlagManagedByRunner(String flag)178     protected boolean isFlagManagedByRunner(String flag) {
179         FlagsRouletteState roulette = AbstractFlagsRouletteRunner.getFlagsRouletteState();
180         if (roulette == null || !roulette.flagNames.contains(flag)) {
181             return false;
182         }
183         mLog.w(
184                 "Not setting flag %s as it's managed by %s (which manages %s)",
185                 flag, roulette.runnerName, roulette.flagNames);
186         return true;
187     }
188 
189     // NOTE: currently only used by device-side tests, so it's added directly here in order to use
190     // the logic defined by PhFlags - if needed by hostside, we'll have to move it up and
191     // re-implement that logic there.
192     /** Calls {@link PhFlags#getAdIdRequestPerSecond()} with the proper permissions. */
getAdIdRequestPerSecond()193     public float getAdIdRequestPerSecond() {
194         try {
195             return callWithDeviceConfigPermissions(
196                     mAdoptShellPermissions,
197                     () -> FlagsFactory.getFlags().getAdIdRequestPermitsPerSecond());
198         } catch (Throwable t) {
199             float defaultValue = Flags.ADID_REQUEST_PERMITS_PER_SECOND;
200             mLog.e(
201                     t,
202                     "FlagsConstants.getAdIdRequestPermitsPerSecond() failed, returning default"
203                             + " value (%f)",
204                     defaultValue);
205             return defaultValue;
206         }
207     }
208 }
209