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