Skip to content

Commit 46e7d7f

Browse files
Henrique Nakashimachromeos-ci-prod
authored andcommitted
[Android] Break deps from Features and FieldTrials to CachedFlag/Param
This is a preparation to move most of the code in base.cached_flags to components/cached_flags. The dependencies that need to be broken for this to be possible are all for testing and are removed in this CL. Bug: 370797986 Change-Id: Ib0de691436bd9dfb526921a464916519d10777de Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5902519 Commit-Queue: Henrique Nakashima <[email protected]> Reviewed-by: Andrew Grieve <[email protected]> Reviewed-by: Calder Kitagawa <[email protected]> Cr-Commit-Position: refs/heads/main@{#1363291} CrOS-Libchrome-Original-Commit: e33fc53d7cbb742fd457c29713cf99e993534403
1 parent c570ca3 commit 46e7d7f

File tree

12 files changed

+147
-118
lines changed

12 files changed

+147
-118
lines changed

base/android/java/src/org/chromium/base/cached_flags/AllCachedFieldTrialParameters.java

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,12 @@
88

99
import androidx.annotation.AnyThread;
1010

11-
import org.json.JSONException;
12-
import org.json.JSONObject;
13-
1411
import org.chromium.base.FeatureMap;
1512

16-
import java.util.HashMap;
17-
import java.util.Iterator;
1813
import java.util.Map;
1914

2015
/** AllCachedFieldTrialParameters caches all the parameters for a feature. */
2116
public class AllCachedFieldTrialParameters extends CachedFieldTrialParameter {
22-
/** Decodes a previously encoded map. Returns empty map on parse error. */
23-
private static Map<String, String> decodeJsonEncodedMap(String value) {
24-
Map<String, String> resultingMap = new HashMap<String, String>();
25-
try {
26-
final JSONObject json = new JSONObject(value);
27-
Iterator<String> keys = json.keys();
28-
while (keys.hasNext()) {
29-
final String key = keys.next();
30-
resultingMap.put(key, json.getString(key));
31-
}
32-
return resultingMap;
33-
} catch (JSONException e) {
34-
}
35-
return new HashMap<>();
36-
}
37-
38-
private static String encodeParams(Map<String, String> params) {
39-
return new JSONObject(params).toString();
40-
}
4117

4218
public AllCachedFieldTrialParameters(FeatureMap featureMap, String featureName) {
4319
// As this includes all parameters, the parameterName is empty.
@@ -47,7 +23,7 @@ public AllCachedFieldTrialParameters(FeatureMap featureMap, String featureName)
4723
/** Returns a map of field trial parameter to value. */
4824
@AnyThread
4925
public Map<String, String> getParams() {
50-
return decodeJsonEncodedMap(getConsistentStringValue());
26+
return CachedFlagsSharedPreferences.decodeJsonEncodedMap(getConsistentStringValue());
5127
}
5228

5329
@AnyThread
@@ -81,13 +57,15 @@ private String getConsistentStringValue() {
8157
void writeCacheValueToEditor(final SharedPreferences.Editor editor) {
8258
final Map<String, String> params =
8359
mFeatureMap.getFieldTrialParamsForFeature(getFeatureName());
84-
editor.putString(getSharedPreferenceKey(), encodeParams(params));
60+
editor.putString(
61+
getSharedPreferenceKey(), CachedFlagsSharedPreferences.encodeParams(params));
8562
}
8663

8764
/** Sets the parameters for the specified feature when used in tests. */
8865
public static void setForTesting(String featureName, Map<String, String> params) {
89-
String preferenceKey = generateSharedPreferenceKey(featureName, "");
90-
String overrideValue = encodeParams(params);
66+
String preferenceKey =
67+
CachedFlagsSharedPreferences.generateParamSharedPreferenceKey(featureName, "");
68+
String overrideValue = CachedFlagsSharedPreferences.encodeParams(params);
9169
ValuesOverridden.setOverrideForTesting(preferenceKey, overrideValue);
9270
}
9371
}

base/android/java/src/org/chromium/base/cached_flags/CachedFieldTrialParameter.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -110,23 +110,12 @@ public String getParameterName() {
110110
return mType;
111111
}
112112

113-
/**
114-
* @return A human-readable string uniquely identifying the field trial parameter.
115-
*/
116-
private static String generateFullName(String featureName, String parameterName) {
117-
return featureName + ":" + parameterName;
118-
}
119-
120-
static String generateSharedPreferenceKey(String featureName, String parameterName) {
121-
return CachedFlagsSharedPreferences.FLAGS_FIELD_TRIAL_PARAM_CACHED.createKey(
122-
generateFullName(featureName, parameterName));
123-
}
124-
125113
/**
126114
* @return The SharedPreferences key to cache the field trial parameter.
127115
*/
128116
String getSharedPreferenceKey() {
129-
return generateSharedPreferenceKey(getFeatureName(), getParameterName());
117+
return CachedFlagsSharedPreferences.generateParamSharedPreferenceKey(
118+
getFeatureName(), getParameterName());
130119
}
131120

132121
/**
@@ -136,14 +125,4 @@ String getSharedPreferenceKey() {
136125
* loaded yet.
137126
*/
138127
abstract void writeCacheValueToEditor(SharedPreferences.Editor editor);
139-
140-
/**
141-
* Forces a field trial parameter value for testing. This is only for the annotation processor
142-
* to use. Tests should use "PARAMETER.setForTesting()" instead.
143-
*/
144-
public static void setForTesting(
145-
String featureName, String variationName, String stringVariationValue) {
146-
String preferenceKey = generateSharedPreferenceKey(featureName, variationName);
147-
ValuesOverridden.setOverrideForTesting(preferenceKey, stringVariationValue);
148-
}
149128
}

base/android/java/src/org/chromium/base/cached_flags/CachedFlag.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -150,25 +150,6 @@ String getSharedPreferenceKey() {
150150
return mPreferenceKey;
151151
}
152152

153-
/**
154-
* Sets the feature flags to use in JUnit and instrumentation tests.
155-
*
156-
* @deprecated Do not call this from tests; use @EnableFeatures/@DisableFeatures annotations
157-
* instead.
158-
*/
159-
@Deprecated
160-
public static void setFeaturesForTesting(Map<String, Boolean> features) {
161-
synchronized (ValuesReturned.sBoolValues) {
162-
for (Map.Entry<String, Boolean> entry : features.entrySet()) {
163-
String featureName = entry.getKey();
164-
Boolean flagValue = entry.getValue();
165-
String sharedPreferencesKey =
166-
CachedFlagsSharedPreferences.FLAGS_CACHED.createKey(featureName);
167-
ValuesReturned.sBoolValues.put(sharedPreferencesKey, flagValue);
168-
}
169-
}
170-
}
171-
172153
/** Create a Map of feature names -> {@link CachedFlag} from multiple lists of CachedFlags. */
173154
public static Map<String, CachedFlag> createCachedFlagMap(
174155
List<List<CachedFlag>> allCachedFlagsLists) {

base/android/java/src/org/chromium/base/cached_flags/CachedFlagUtils.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,4 @@ public static void cacheFieldTrialParameters(
4242
}
4343
editor.apply();
4444
}
45-
46-
/**
47-
* Do not call this from tests.
48-
*
49-
* <p>Test runners already reset this state.
50-
*
51-
* <p>Exceptions are tests that test the flags infrastructure.
52-
*/
53-
public static void resetFlagsForTesting() {
54-
ValuesReturned.clearForTesting();
55-
ValuesOverridden.removeOverrides();
56-
}
5745
}

base/android/java/src/org/chromium/base/cached_flags/CachedFlagsSharedPreferences.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,25 @@
44

55
package org.chromium.base.cached_flags;
66

7+
import org.json.JSONException;
8+
import org.json.JSONObject;
9+
10+
import org.chromium.base.Log;
711
import org.chromium.base.shared_preferences.KeyPrefix;
812
import org.chromium.base.shared_preferences.PreferenceKeyRegistry;
913
import org.chromium.base.shared_preferences.SharedPreferencesManager;
1014
import org.chromium.build.BuildConfig;
1115

1216
import java.util.Collections;
17+
import java.util.HashMap;
18+
import java.util.Iterator;
1319
import java.util.List;
20+
import java.util.Map;
1421

1522
/** Shared preferences used by org.chromium.base.cached_flags */
1623
public class CachedFlagsSharedPreferences {
24+
private static final String TAG = "CachedFlags";
25+
1726
/** CachedFlags store flag values for the next run with this prefix. */
1827
public static final KeyPrefix FLAGS_CACHED = new KeyPrefix("Chrome.Flags.CachedFlag.*");
1928

@@ -46,4 +55,41 @@ public class CachedFlagsSharedPreferences {
4655
public static SharedPreferencesManager getInstance() {
4756
return SharedPreferencesManager.getInstanceForRegistry(REGISTRY);
4857
}
58+
59+
/**
60+
* @return A human-readable string uniquely identifying the field trial parameter.
61+
*/
62+
private static String generateParamFullName(String featureName, String parameterName) {
63+
return featureName + ":" + parameterName;
64+
}
65+
66+
public static String generateParamSharedPreferenceKey(
67+
String featureName, String parameterName) {
68+
return FLAGS_FIELD_TRIAL_PARAM_CACHED.createKey(
69+
generateParamFullName(featureName, parameterName));
70+
}
71+
72+
public static String encodeParams(Map<String, String> params) {
73+
return new JSONObject(params).toString();
74+
}
75+
76+
/** Decodes a previously encoded map. Returns empty map on parse error. */
77+
static Map<String, String> decodeJsonEncodedMap(String value) {
78+
Map<String, String> resultingMap = new HashMap<>();
79+
if (value.isEmpty()) {
80+
return resultingMap;
81+
}
82+
try {
83+
final JSONObject json = new JSONObject(value);
84+
Iterator<String> keys = json.keys();
85+
while (keys.hasNext()) {
86+
final String key = keys.next();
87+
resultingMap.put(key, json.getString(key));
88+
}
89+
return resultingMap;
90+
} catch (JSONException e) {
91+
Log.e(TAG, "Error parsing JSON", e);
92+
return new HashMap<>();
93+
}
94+
}
4995
}

base/android/java/src/org/chromium/base/cached_flags/ValuesOverridden.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@
1010
import java.util.Map;
1111

1212
/** Keeps track of values overridden for testing for cached flags and field trial parameters. */
13-
class ValuesOverridden {
13+
public abstract class ValuesOverridden {
1414
@CheckDiscard(
1515
"Should only exist in tests and in debug builds, should be optimized out in "
1616
+ "Release.")
1717
private static Map<String, String> sOverridesTestFeatures;
1818

19-
static void setOverrideForTesting(String preferenceKey, String overrideValue) {
19+
/**
20+
* Set an |overrideValue| to be used in place of the disk value of a |preferenceKey| in tests.
21+
*
22+
* <p>Don't use directly from tests.
23+
*/
24+
public static void setOverrideForTesting(String preferenceKey, String overrideValue) {
2025
if (sOverridesTestFeatures == null) {
2126
sOverridesTestFeatures = new HashMap<>();
2227
}
@@ -46,7 +51,12 @@ static Double getDouble(String preferenceName) {
4651
return stringValue != null ? Double.valueOf(stringValue) : null;
4752
}
4853

49-
static void removeOverrides() {
54+
/**
55+
* Remove all override values set.
56+
*
57+
* <p>Don't use directly from tests.
58+
*/
59+
public static void removeOverrides() {
5060
sOverridesTestFeatures = null;
5161
}
5262
}

base/android/java/src/org/chromium/base/cached_flags/ValuesReturned.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.Map;
1111

1212
/** Keeps track of values returned for cached flags and field trial parameters. */
13-
abstract class ValuesReturned {
13+
public abstract class ValuesReturned {
1414
@GuardedBy("sBoolValues")
1515
static final Map<String, Boolean> sBoolValues = new HashMap<>();
1616

@@ -23,7 +23,12 @@ abstract class ValuesReturned {
2323
@GuardedBy("sDoubleValues")
2424
static final Map<String, Double> sDoubleValues = new HashMap<>();
2525

26-
static void clearForTesting() {
26+
/**
27+
* Forget the values returned this run for tests. New values will be calculated when needed.
28+
*
29+
* <p>Do not call this directly from tests.
30+
*/
31+
public static void clearForTesting() {
2732
synchronized (sBoolValues) {
2833
sBoolValues.clear();
2934
}
@@ -37,4 +42,21 @@ static void clearForTesting() {
3742
sDoubleValues.clear();
3843
}
3944
}
45+
46+
/**
47+
* Sets the feature flags to use in JUnit and instrumentation tests.
48+
*
49+
* <p>Do not call this from tests; use @EnableFeatures/@DisableFeatures annotations instead.
50+
*/
51+
public static void setFeaturesForTesting(Map<String, Boolean> features) {
52+
synchronized (sBoolValues) {
53+
for (Map.Entry<String, Boolean> entry : features.entrySet()) {
54+
String featureName = entry.getKey();
55+
Boolean flagValue = entry.getValue();
56+
String sharedPreferencesKey =
57+
CachedFlagsSharedPreferences.FLAGS_CACHED.createKey(featureName);
58+
sBoolValues.put(sharedPreferencesKey, flagValue);
59+
}
60+
}
61+
}
4062
}

base/android/junit/src/org/chromium/base/cached_flags/CachedFeatureFlagsSafeModeUnitTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import static org.junit.Assert.assertFalse;
99
import static org.junit.Assert.assertTrue;
1010

11-
import org.chromium.base.test.util.BaseFlagTestRule;
1211
import org.junit.After;
1312
import org.junit.Before;
1413
import org.junit.Rule;
@@ -18,9 +17,10 @@
1817
import org.chromium.base.FeatureList;
1918
import org.chromium.base.FeatureList.TestValues;
2019
import org.chromium.base.FeatureMap;
20+
import org.chromium.base.cached_flags.CachedFlagsSafeMode.Behavior;
2121
import org.chromium.base.task.test.PausedExecutorTestRule;
2222
import org.chromium.base.test.BaseRobolectricTestRunner;
23-
import org.chromium.base.cached_flags.CachedFlagsSafeMode.Behavior;
23+
import org.chromium.base.test.util.BaseFlagTestRule;
2424

2525
import java.util.Arrays;
2626

@@ -712,7 +712,8 @@ private void assertCachedParamsEqualNative2() {
712712
}
713713

714714
private static void clearMemory() {
715-
CachedFlagUtils.resetFlagsForTesting();
715+
ValuesReturned.clearForTesting();
716+
ValuesOverridden.removeOverrides();
716717
CachedFlagsSafeMode.getInstance().clearMemoryForTesting();
717718
}
718719
}

base/android/junit/src/org/chromium/base/cached_flags/CachedFieldTrialParameterUnitTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ public void testNativeNotInitializedPrefsCached_getsFromPrefs() {
145145
CachedFlagUtils.cacheFieldTrialParameters(PARAMS_TO_CACHE);
146146

147147
// Simulate a second run
148-
CachedFlagUtils.resetFlagsForTesting();
148+
ValuesReturned.clearForTesting();
149+
ValuesOverridden.removeOverrides();
149150

150151
// Set different values in native which shouldn't be used
151152
TestValues testValues = new TestValues();
@@ -175,7 +176,10 @@ public void testSetForTesting() {
175176
INT_PARAM.setForTesting(INT_PARAM_TEST_OVERRIDE);
176177
DOUBLE_PARAM.setForTesting(DOUBLE_PARAM_TEST_OVERRIDE);
177178
STRING2_PARAM.setForTesting(STRING2_PARAM_TEST_OVERRIDE);
178-
AllCachedFieldTrialParameters.setForTesting(FEATURE_B, ALL_PARAM_TEST_OVERRIDE);
179+
String preferenceKey =
180+
CachedFlagsSharedPreferences.generateParamSharedPreferenceKey(FEATURE_B, "");
181+
String overrideValue = CachedFlagsSharedPreferences.encodeParams(ALL_PARAM_TEST_OVERRIDE);
182+
ValuesOverridden.setOverrideForTesting(preferenceKey, overrideValue);
179183

180184
// Should not take priority over the overrides
181185
CachedFlagUtils.cacheFieldTrialParameters(PARAMS_TO_CACHE);

base/android/junit/src/org/chromium/base/cached_flags/CachedFlagUnitTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public class CachedFlagUnitTest {
3030

3131
@After
3232
public void tearDown() {
33-
CachedFlagUtils.resetFlagsForTesting();
33+
ValuesReturned.clearForTesting();
34+
ValuesOverridden.removeOverrides();
3435
}
3536

3637
@Test(expected = AssertionError.class)
@@ -81,7 +82,8 @@ public void testNativeNotInitializedPrefsCached_getsFromPrefs() {
8182
assertIsEnabledMatches(A_OFF_B_ON, featureA, featureB);
8283

8384
// Pretend the app was restarted. The SharedPrefs should remain.
84-
CachedFlagUtils.resetFlagsForTesting();
85+
ValuesReturned.clearForTesting();
86+
ValuesOverridden.removeOverrides();
8587

8688
// Simulate ChromeFeatureList retrieving new, different values for the flags.
8789
FeatureList.setTestFeatures(A_ON_B_ON);
@@ -98,7 +100,8 @@ public void testNativeNotInitializedPrefsCached_getsFromPrefs() {
98100
assertIsEnabledMatches(A_OFF_B_ON, featureA, featureB);
99101

100102
// Pretend the app was restarted again.
101-
CachedFlagUtils.resetFlagsForTesting();
103+
ValuesReturned.clearForTesting();
104+
ValuesOverridden.removeOverrides();
102105

103106
// The SharedPrefs should retain the latest values.
104107
assertIsEnabledMatches(A_ON_B_ON, featureA, featureB);

0 commit comments

Comments
 (0)