1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base; 6 7 import org.junit.Assert; 8 import org.junit.Rule; 9 import org.junit.Test; 10 import org.junit.runner.RunWith; 11 12 import org.chromium.base.FeatureList.TestValues; 13 import org.chromium.base.test.BaseRobolectricTestRunner; 14 import org.chromium.base.test.util.Features.EnableFeatures; 15 import org.chromium.base.test.util.Features.JUnitProcessor; 16 17 /** Unit tests for {@link FeatureList}. */ 18 @RunWith(BaseRobolectricTestRunner.class) 19 public class FeatureListUnitTest { 20 @Rule public JUnitProcessor mFeaturesProcessor = new JUnitProcessor(); 21 22 private static final String FEATURE_A = "FeatureA"; 23 private static final String FEATURE_A_PARAM_1 = "Param1InFeatureA"; 24 private static final String FEATURE_A_PARAM_2 = "Param2InFeatureA"; 25 private static final String FEATURE_B = "FeatureB"; 26 27 @Test test_getTestValueForFeature_noOverride_throwsException()28 public void test_getTestValueForFeature_noOverride_throwsException() { 29 Assert.assertThrows( 30 IllegalArgumentException.class, 31 () -> FeatureList.getTestValueForFeature(FEATURE_A)); 32 } 33 34 @Test test_getTestValueForFeature_canUseDefaults_noException()35 public void test_getTestValueForFeature_canUseDefaults_noException() { 36 FeatureList.setTestCanUseDefaultsForTesting(); 37 38 Assert.assertNull(FeatureList.getTestValueForFeature(FEATURE_A)); 39 } 40 41 @Test test_getTestValueForFieldTrialParam_noOverride_returnsNull()42 public void test_getTestValueForFieldTrialParam_noOverride_returnsNull() { 43 Assert.assertNull(FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_1)); 44 } 45 46 @Test test_getTestValueForFeature_override()47 public void test_getTestValueForFeature_override() { 48 TestValues testValues = new TestValues(); 49 testValues.addFeatureFlagOverride(FEATURE_A, true); 50 FeatureList.setTestValues(testValues); 51 52 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_A)); 53 54 testValues.addFeatureFlagOverride(FEATURE_A, false); 55 FeatureList.setTestValues(testValues); 56 57 Assert.assertEquals(false, FeatureList.getTestValueForFeature(FEATURE_A)); 58 } 59 60 @Test test_getTestValueForFieldTrialParam_override()61 public void test_getTestValueForFieldTrialParam_override() { 62 TestValues testValues = new TestValues(); 63 testValues.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "paramValue"); 64 FeatureList.setTestValues(testValues); 65 66 Assert.assertEquals( 67 "paramValue", 68 FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_1)); 69 70 // Other params should still return null 71 Assert.assertNull(FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_2)); 72 } 73 74 @Test test_getTestValueForFeature_overrideOther_throwsException()75 public void test_getTestValueForFeature_overrideOther_throwsException() { 76 TestValues testValues = new TestValues(); 77 testValues.addFeatureFlagOverride(FEATURE_A, true); 78 FeatureList.setTestValues(testValues); 79 80 Assert.assertThrows( 81 IllegalArgumentException.class, 82 () -> FeatureList.getTestValueForFeature(FEATURE_B)); 83 } 84 85 @Test test_mergeTestValues_noConflict()86 public void test_mergeTestValues_noConflict() { 87 TestValues testValues1 = new TestValues(); 88 testValues1.addFeatureFlagOverride(FEATURE_A, false); 89 testValues1.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "paramValue1"); 90 91 TestValues testValues2 = new TestValues(); 92 testValues2.addFeatureFlagOverride(FEATURE_B, true); 93 testValues2.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_2, "paramValue2"); 94 95 FeatureList.setTestValues(testValues1); 96 FeatureList.mergeTestValues(testValues2, true); 97 98 Assert.assertEquals(false, FeatureList.getTestValueForFeature(FEATURE_A)); 99 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_B)); 100 Assert.assertEquals( 101 "paramValue1", 102 FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_1)); 103 Assert.assertEquals( 104 "paramValue2", 105 FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_2)); 106 } 107 108 @Test test_mergeTestValues_replace()109 public void test_mergeTestValues_replace() { 110 TestValues testValues1 = new TestValues(); 111 testValues1.addFeatureFlagOverride(FEATURE_A, false); 112 testValues1.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "false"); 113 114 TestValues testValues2 = new TestValues(); 115 testValues2.addFeatureFlagOverride(FEATURE_A, true); 116 testValues2.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "true"); 117 118 FeatureList.setTestValues(testValues1); 119 FeatureList.mergeTestValues(testValues2, true); 120 121 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_A)); 122 Assert.assertEquals( 123 "true", FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_1)); 124 } 125 126 @Test test_mergeTestValues_doNotReplace()127 public void test_mergeTestValues_doNotReplace() { 128 TestValues testValues1 = new TestValues(); 129 testValues1.addFeatureFlagOverride(FEATURE_A, false); 130 testValues1.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "false"); 131 132 TestValues testValues2 = new TestValues(); 133 testValues2.addFeatureFlagOverride(FEATURE_A, true); 134 testValues2.addFieldTrialParamOverride(FEATURE_A, FEATURE_A_PARAM_1, "true"); 135 136 FeatureList.setTestValues(testValues1); 137 FeatureList.mergeTestValues(testValues2, false); 138 139 Assert.assertEquals(false, FeatureList.getTestValueForFeature(FEATURE_A)); 140 Assert.assertEquals( 141 "false", FeatureList.getTestValueForFieldTrialParam(FEATURE_A, FEATURE_A_PARAM_1)); 142 } 143 144 @Test 145 @EnableFeatures({FEATURE_A, FEATURE_B}) test_setTestValues_replacesAnnotation()146 public void test_setTestValues_replacesAnnotation() { 147 FeatureList.setTestCanUseDefaultsForTesting(); 148 149 TestValues testValues = new TestValues(); 150 testValues.addFeatureFlagOverride(FEATURE_A, false); 151 FeatureList.setTestValues(testValues); 152 153 Assert.assertEquals(false, FeatureList.getTestValueForFeature(FEATURE_A)); 154 Assert.assertNull(FeatureList.getTestValueForFeature(FEATURE_B)); 155 } 156 157 @Test 158 @EnableFeatures({FEATURE_A, FEATURE_B}) test_mergeTestValues_replace_overridesAnnotation()159 public void test_mergeTestValues_replace_overridesAnnotation() { 160 TestValues testValues = new TestValues(); 161 testValues.addFeatureFlagOverride(FEATURE_A, false); 162 FeatureList.mergeTestValues(testValues, true); 163 164 Assert.assertEquals(false, FeatureList.getTestValueForFeature(FEATURE_A)); 165 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_B)); 166 } 167 168 @Test 169 @EnableFeatures({FEATURE_A, FEATURE_B}) test_mergeTestValues_doNotReplace_doesNotOverrideAnnotation()170 public void test_mergeTestValues_doNotReplace_doesNotOverrideAnnotation() { 171 TestValues testValues = new TestValues(); 172 testValues.addFeatureFlagOverride(FEATURE_A, false); 173 FeatureList.mergeTestValues(testValues, false); 174 175 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_A)); 176 Assert.assertEquals(true, FeatureList.getTestValueForFeature(FEATURE_B)); 177 } 178 } 179