Bug 1421946 - Make Switchboard accept duplicated experiment names. r?maliu draft
authorNevin Chen <cnevinchen@gmail.com>
Thu, 30 Nov 2017 17:58:05 +0800
changeset 705545 a1719186a7aeb415fed6e9985926b20fa15f5d89
parent 705442 38f49346a200cc25492236c7b3c536fc835fe031
child 742393 0e3abc89938eef489ce633544314b4653f8089b9
push id91510
push userbmo:cnevinchen@gmail.com
push dateThu, 30 Nov 2017 09:58:37 +0000
reviewersmaliu
bugs1421946
milestone59.0a1
Bug 1421946 - Make Switchboard accept duplicated experiment names. r?maliu MozReview-Commit-ID: IL2WLraknMt
mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
--- a/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
+++ b/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
@@ -137,44 +137,35 @@ public class SwitchBoard {
         }
 
         final String config = Preferences.getDynamicConfigJson(c);
         if (config == null) {
             return false;
         }
 
         try {
-            // TODO: cache the array into a mapping so we don't do a loop everytime we are looking for a experiment key
             final JSONArray experiments = new JSONObject(config).getJSONArray(KEY_DATA);
-            JSONObject experiment = null;
 
+            // Allow repeated experiment names. Only return false after we've iterated all experiments and can't find a match.
             for (int i = 0; i < experiments.length(); i++) {
                 JSONObject entry = experiments.getJSONObject(i);
                 final String name = entry.getString(KEY_NAME);
-                if (name.equals(experimentName)) {
-                    experiment = entry;
-                    break;
+                final boolean isTarget = name.equals(experimentName);
+                if (isTarget) {
+                    final boolean isMatch = isMatch(c, entry.optJSONObject(KEY_MATCH));
+                    final JSONObject buckets = entry.getJSONObject(KEY_BUCKETS);
+                    final boolean isInBucket = isInBucket(c, buckets.getInt(KEY_MIN), buckets.getInt(KEY_MAX));
+                    if (isMatch && isInBucket) {
+                        return true;
+                    }
                 }
             }
 
-            if (experiment == null) {
-                return false;
-            }
-
-            if (!isMatch(c, experiment.optJSONObject(KEY_MATCH))) {
-                return false;
-            }
+            return false;
 
-            final JSONObject buckets = experiment.getJSONObject(KEY_BUCKETS);
-            final boolean inExperiment = isInBucket(c, buckets.getInt(KEY_MIN), buckets.getInt(KEY_MAX));
-
-            if (DEBUG) {
-                Log.d(TAG, experimentName + " = " + inExperiment);
-            }
-            return inExperiment;
         } catch (JSONException e) {
             // If the experiment name is not found in the JSON, just return false.
             // There is no need to log an error, since we don't really care if an
             // inactive experiment is missing from the config.
             return false;
         }
     }