Skip to content

Commit

Permalink
[M111][RDSG] Update client-side logic for cohort tracking
Browse files Browse the repository at this point in the history
Merge to M111.

To make it easier analyze the less dilute data, update cohort tracking
to activate users who triggered the global default experiment, or
would have triggered for control group.
- Add finch param global_setting_cohort_id to indicate the cohort id;
- Add pre-defined dummy flags to activate eligible clients;
- Read flag RequestDesktopSiteDefaultsEnabledCohort for eligible
clients in enabled group;
- Read flag RequestDesktopSiteDefaultsControlCohort for eligible
clients in control group.
- registerSyntheticFieldTrial RequestDesktopSiteDefaultsCohort for
both enabled and control group.

Opt-in arm is not supported for the new cohort tracking.

(cherry picked from commit c60c515)

Bug: 1411580
Change-Id: I3f24233722f6c93265a08179636b0ebae9be9496
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4204925
Reviewed-by: Theresa Sullivan <twellington@chromium.org>
Reviewed-by: Aishwarya Rajesh <aishwaryarj@google.com>
Commit-Queue: Shu Yang <shuyng@google.com>
Cr-Original-Commit-Position: refs/heads/main@{#1099468}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4215426
Auto-Submit: Shu Yang <shuyng@google.com>
Commit-Queue: Theresa Sullivan <twellington@chromium.org>
Cr-Commit-Position: refs/branch-heads/5563@{#105}
Cr-Branched-From: 3ac59a6-refs/heads/main@{#1097615}
  • Loading branch information
Shu Yang authored and Chromium LUCI CQ committed Feb 2, 2023
1 parent 8878ae3 commit d132b6d
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,20 @@
*/
public class RequestDesktopUtils {
private static final String SITE_WILDCARD = "*";
// Global defaults experiment constants.
private static final String ENABLED_GROUP_SUFFIX = "_Enabled";
private static final String CONTROL_GROUP_SUFFIX = "_Control";
private static final String DEFAULT_ON_GROUP_NAME_PREFIX = "DefaultOn_";
private static final String OPT_IN_GROUP_NAME_PREFIX = "OptIn_";
// This is used to lookup the name of a feature used to track a cohort of users who triggered
// the global default experiment, or would have triggered for control groups.
private static final String PARAM_GLOBAL_DEFAULTS_COHORT_ID = "global_setting_cohort_id";
private static final int DEFAULT_GLOBAL_DEFAULTS_COHORT_ID = 0;
private static final String GLOBAL_DEFAULTS_COHORT_NAME = "RequestDesktopSiteDefaultsCohort";
private static final String GLOBAL_DEFAULTS_ENABLED_COHORT_NAME =
"RequestDesktopSiteDefaultsEnabledCohort";
private static final String GLOBAL_DEFAULTS_CONTROL_COHORT_NAME =
"RequestDesktopSiteDefaultsControlCohort";

static final String PARAM_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES =
"default_on_display_size_threshold_inches";
Expand Down Expand Up @@ -97,12 +111,6 @@ public class RequestDesktopUtils {
static final String PARAM_GLOBAL_SETTING_OPT_IN_MEMORY_LIMIT = "opt_in_memory_limit";
static final int DEFAULT_GLOBAL_SETTING_OPT_IN_MEMORY_LIMIT_THRESHOLD_MB = 0;

// Global defaults experiment constants.
static final String ENABLED_GROUP_SUFFIX = "_Enabled";
static final String CONTROL_GROUP_SUFFIX = "_Control";
static final String DEFAULT_ON_GROUP_NAME_PREFIX = "DefaultOn_";
static final String OPT_IN_GROUP_NAME_PREFIX = "OptIn_";

// Note: these values must match the UserAgentRequestType enum in enums.xml.
@IntDef({UserAgentRequestType.REQUEST_DESKTOP, UserAgentRequestType.REQUEST_MOBILE})
@Retention(RetentionPolicy.SOURCE)
Expand Down Expand Up @@ -406,8 +414,10 @@ static boolean shouldDefaultEnableGlobalSetting(double displaySizeInInches, Cont
if (inCohort
|| sharedPreferencesManager.contains(
ChromePreferenceKeys.DEFAULT_ENABLE_DESKTOP_SITE_GLOBAL_SETTING_COHORT)) {
int cohortId = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
feature, PARAM_GLOBAL_DEFAULTS_COHORT_ID, DEFAULT_GLOBAL_DEFAULTS_COHORT_ID);
maybeRegisterSyntheticFieldTrials(
isControlGroup, screenSizeThreshold, /*isOptInArm*/ false);
isControlGroup, screenSizeThreshold, cohortId, /*isOptInArm*/ false);
}

// Should enable the setting only in the enabled (not control) experiment group.
Expand Down Expand Up @@ -656,8 +666,10 @@ static boolean shouldShowGlobalSettingOptInMessage(

if (sharedPreferencesManager.contains(
ChromePreferenceKeys.DESKTOP_SITE_GLOBAL_SETTING_OPT_IN_MESSAGE_COHORT)) {
int cohortId = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
feature, PARAM_GLOBAL_DEFAULTS_COHORT_ID, DEFAULT_GLOBAL_DEFAULTS_COHORT_ID);
maybeRegisterSyntheticFieldTrials(
isControlGroup, minScreenSizeThreshold, /*isOptInArm*/ true);
isControlGroup, minScreenSizeThreshold, cohortId, /*isOptInArm*/ true);
}

// Should show the opt-in message only in the enabled (not control) experiment group.
Expand Down Expand Up @@ -796,11 +808,39 @@ static void updateDesktopSiteGlobalSettingOnUserRequest(

@VisibleForTesting
static void maybeRegisterSyntheticFieldTrials(
boolean isControlGroup, double screenSizeThreshold, boolean isOptInArm) {
boolean isControlGroup, double screenSizeThreshold, int cohortId, boolean isOptInArm) {
if (!UmaSessionStats.isMetricsServiceAvailable()) {
return;
}

// For backward compatibility.
if (cohortId == 0) {
maybeRegisterSyntheticFieldTrials(isControlGroup, screenSizeThreshold, isOptInArm);
return;
}
assert !isOptInArm : "Opt-in arm is not supported for the new cohort tracking.";

String thresholdAsString = String.valueOf(screenSizeThreshold).replace('.', '_');
String baseGroupName = DEFAULT_ON_GROUP_NAME_PREFIX + thresholdAsString + "_" + cohortId;

String syntheticFeatureName = isControlGroup
? GLOBAL_DEFAULTS_CONTROL_COHORT_NAME + cohortId
: GLOBAL_DEFAULTS_ENABLED_COHORT_NAME + cohortId;

if (!isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
UmaSessionStats.registerSyntheticFieldTrial(
syntheticFeatureName, baseGroupName + ENABLED_GROUP_SUFFIX);
} else if (isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
UmaSessionStats.registerSyntheticFieldTrial(
syntheticFeatureName, baseGroupName + CONTROL_GROUP_SUFFIX);
}

String syntheticFeatureNameForUma = GLOBAL_DEFAULTS_COHORT_NAME + cohortId;
UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureNameForUma, baseGroupName);
}

private static void maybeRegisterSyntheticFieldTrials(
boolean isControlGroup, double screenSizeThreshold, boolean isOptInArm) {
String thresholdAsString = String.valueOf(screenSizeThreshold).replace('.', '_');
String baseGroupName =
(isOptInArm ? OPT_IN_GROUP_NAME_PREFIX : DEFAULT_ON_GROUP_NAME_PREFIX)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -466,25 +466,43 @@ public void testShouldDefaultEnableGlobalSetting_ExperimentControlGroup() {

@Test
public void testMaybeRegisterSyntheticFieldTrials_DefaultOnEnabled12Inches() {
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, false);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, 0, false);
Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteDefaultsSynthetic",
sGlobalDefaultsExperimentTrialName);
Assert.assertEquals("Group name is incorrect.", "DefaultOn_12_0_Enabled",
sGlobalDefaultsExperimentGroupName);
}

@Test
public void testMaybeRegisterSyntheticFieldTrials_DefaultOnEnabled12Inches_WithCohortId() {
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, 2, false);
Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteDefaultsCohort2",
sGlobalDefaultsExperimentTrialName);
Assert.assertEquals(
"Group name is incorrect.", "DefaultOn_12_0_2", sGlobalDefaultsExperimentGroupName);
}

@Test
public void testMaybeRegisterSyntheticFieldTrials_DefaultOnControl12Inches() {
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(true, 12.0, false);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(true, 12.0, 0, false);
Assert.assertEquals("Trial name is incorrect.",
"RequestDesktopSiteDefaultsControlSynthetic", sGlobalDefaultsExperimentTrialName);
Assert.assertEquals("Group name is incorrect.", "DefaultOn_12_0_Control",
sGlobalDefaultsExperimentGroupName);
}

@Test
public void testMaybeRegisterSyntheticFieldTrials_DefaultOnControl12Inches_WithCohortId() {
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(true, 12.0, 2, false);
Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteDefaultsCohort2",
sGlobalDefaultsExperimentTrialName);
Assert.assertEquals(
"Group name is incorrect.", "DefaultOn_12_0_2", sGlobalDefaultsExperimentGroupName);
}

@Test
public void testMaybeRegisterSyntheticFieldTrials_OptInEnabled10Inches() {
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 10.0, true);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 10.0, 0, true);
Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteOptInSynthetic",
sGlobalDefaultsExperimentTrialName);
Assert.assertEquals("Group name is incorrect.", "OptIn_10_0_Enabled",
Expand All @@ -494,12 +512,22 @@ public void testMaybeRegisterSyntheticFieldTrials_OptInEnabled10Inches() {
@Test
public void testMaybeRegisterSyntheticFieldTrials_DoNothingWhenExperimentIsActive() {
enableFeatureWithParams("RequestDesktopSiteDefaultsSynthetic", null, true);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, false);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, 0, false);
Assert.assertTrue("Synthetic trial should not be registered.",
sGlobalDefaultsExperimentTrialName == null
&& sGlobalDefaultsExperimentGroupName == null);
}

@Test
public void testMaybeRegisterSyntheticFieldTrials_ExperimentIsActive_WithCohortId() {
enableFeatureWithParams("RequestDesktopSiteDefaultsEnabledCohort2", null, true);
RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, 2, false);
Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteDefaultsCohort2",
sGlobalDefaultsExperimentTrialName);
Assert.assertEquals(
"Group name is incorrect.", "DefaultOn_12_0_2", sGlobalDefaultsExperimentGroupName);
}

@Test
public void testMaybeDefaultEnableGlobalSetting() {
enableFeatureWithParams(ChromeFeatureList.REQUEST_DESKTOP_SITE_DEFAULTS, null, true);
Expand Down Expand Up @@ -1120,5 +1148,7 @@ private void disableGlobalDefaultsExperimentFeatures() {
enableFeatureWithParams("RequestDesktopSiteDefaultsSynthetic", null, false);
enableFeatureWithParams("RequestDesktopSiteOptInControlSynthetic", null, false);
enableFeatureWithParams("RequestDesktopSiteOptInSynthetic", null, false);
enableFeatureWithParams("RequestDesktopSiteDefaultsControlCohort2", null, false);
enableFeatureWithParams("RequestDesktopSiteDefaultsEnabledCohort2", null, false);
}
}
40 changes: 40 additions & 0 deletions chrome/browser/flags/android/chrome_feature_list.cc
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,15 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kReportParentalControlSitesChild,
&kRequestDesktopSiteDefaults,
&kRequestDesktopSiteDefaultsControl,
&kRequestDesktopSiteDefaultsControlCohort1,
&kRequestDesktopSiteDefaultsControlCohort2,
&kRequestDesktopSiteDefaultsControlCohort3,
&kRequestDesktopSiteDefaultsControlCohort4,
&kRequestDesktopSiteDefaultsControlSynthetic,
&kRequestDesktopSiteDefaultsEnabledCohort1,
&kRequestDesktopSiteDefaultsEnabledCohort2,
&kRequestDesktopSiteDefaultsEnabledCohort3,
&kRequestDesktopSiteDefaultsEnabledCohort4,
&kRequestDesktopSiteDefaultsSynthetic,
&kRequestDesktopSiteOptInControlSynthetic,
&kRequestDesktopSiteOptInSynthetic,
Expand Down Expand Up @@ -829,10 +837,42 @@ BASE_FEATURE(kRequestDesktopSiteDefaultsControl,
"RequestDesktopSiteDefaultsControl",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsControlCohort1,
"RequestDesktopSiteDefaultsControlCohort1",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsControlCohort2,
"RequestDesktopSiteDefaultsControlCohort2",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsControlCohort3,
"RequestDesktopSiteDefaultsControlCohort3",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsControlCohort4,
"RequestDesktopSiteDefaultsControlCohort4",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsControlSynthetic,
"RequestDesktopSiteDefaultsControlSynthetic",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort1,
"RequestDesktopSiteDefaultsEnabledCohort1",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort2,
"RequestDesktopSiteDefaultsEnabledCohort2",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort3,
"RequestDesktopSiteDefaultsEnabledCohort3",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort4,
"RequestDesktopSiteDefaultsEnabledCohort4",
base::FEATURE_DISABLED_BY_DEFAULT);

BASE_FEATURE(kRequestDesktopSiteDefaultsSynthetic,
"RequestDesktopSiteDefaultsSynthetic",
base::FEATURE_DISABLED_BY_DEFAULT);
Expand Down
8 changes: 8 additions & 0 deletions chrome/browser/flags/android/chrome_feature_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,15 @@ BASE_DECLARE_FEATURE(kRelatedSearchesUi);
BASE_DECLARE_FEATURE(kReportParentalControlSitesChild);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaults);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControl);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlCohort1);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlCohort2);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlCohort3);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlCohort4);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlSynthetic);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort1);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort2);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort3);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsEnabledCohort4);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsSynthetic);
BASE_DECLARE_FEATURE(kRequestDesktopSiteOptInControlSynthetic);
BASE_DECLARE_FEATURE(kRequestDesktopSiteOptInSynthetic);
Expand Down

0 comments on commit d132b6d

Please sign in to comment.