1 // Copyright 2022 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 static org.junit.Assert.assertFalse; 8 import static org.junit.Assert.assertTrue; 9 10 import org.junit.After; 11 import org.junit.Test; 12 import org.junit.runner.RunWith; 13 14 import org.chromium.base.test.BaseRobolectricTestRunner; 15 16 import java.util.Map; 17 18 /** Unit Tests for {@link MutableFlagWithSafeDefault}. */ 19 @RunWith(BaseRobolectricTestRunner.class) 20 public class MutableFlagWithSafeDefaultUnitTest { 21 static final String FEATURE_A_NAME = "FeatureA"; 22 static final String FEATURE_B_NAME = "FeatureB"; 23 static final Map<String, Boolean> A_ON_B_OFF = 24 Map.of(FEATURE_A_NAME, true, FEATURE_B_NAME, false); 25 26 private static class TestFeatureMap extends FeatureMap { 27 @Override getNativeMap()28 protected long getNativeMap() { 29 return 0; 30 } 31 } 32 33 private final TestFeatureMap mFeatureMap = new TestFeatureMap(); 34 35 @After tearDown()36 public void tearDown() { 37 Flag.resetFlagsForTesting(); 38 } 39 40 @Test(expected = AssertionError.class) testDuplicateFeatureInMap_throwsException()41 public void testDuplicateFeatureInMap_throwsException() { 42 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 43 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 44 } 45 46 @Test(expected = AssertionError.class) testDuplicateFeatureOutsideOfMap_throwsException()47 public void testDuplicateFeatureOutsideOfMap_throwsException() { 48 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 49 new MutableFlagWithSafeDefault(mFeatureMap, FEATURE_A_NAME, false); 50 } 51 52 @Test testNativeInitialized_getsFromChromeFeatureList()53 public void testNativeInitialized_getsFromChromeFeatureList() { 54 MutableFlagWithSafeDefault featureA = 55 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 56 MutableFlagWithSafeDefault featureB = 57 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_B_NAME, true); 58 59 // Values from ChromeFeatureList should be used from now on. 60 FeatureList.setTestFeatures(A_ON_B_OFF); 61 62 // Verify that {@link MutableFlagWithSafeDefault} returns native values. 63 assertTrue(featureA.isEnabled()); 64 assertFalse(featureB.isEnabled()); 65 } 66 67 @Test testNativeNotInitialized_useDefault()68 public void testNativeNotInitialized_useDefault() { 69 MutableFlagWithSafeDefault featureA = 70 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 71 MutableFlagWithSafeDefault featureB = 72 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_B_NAME, true); 73 74 // Query the flags to make sure the default values are returned. 75 assertFalse(featureA.isEnabled()); 76 assertTrue(featureB.isEnabled()); 77 } 78 79 @Test testNativeInitializedUsedDefault_getsFromChromeFeatureList()80 public void testNativeInitializedUsedDefault_getsFromChromeFeatureList() { 81 MutableFlagWithSafeDefault featureA = 82 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_A_NAME, false); 83 MutableFlagWithSafeDefault featureB = 84 mFeatureMap.mutableFlagWithSafeDefault(FEATURE_B_NAME, true); 85 86 // Query the flags to make sure the default values are returned. 87 assertFalse(featureA.isEnabled()); 88 assertTrue(featureB.isEnabled()); 89 90 // Values from ChromeFeatureList should be used from now on. 91 FeatureList.setTestFeatures(A_ON_B_OFF); 92 93 // Verify that {@link MutableFlagWithSafeDefault} returns native values. 94 assertTrue(featureA.isEnabled()); 95 assertFalse(featureB.isEnabled()); 96 } 97 } 98