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.net.httpflags; 6 7 import static com.google.common.truth.Truth.assertThat; 8 9 import static org.junit.Assert.assertThrows; 10 11 import androidx.test.ext.junit.runners.AndroidJUnit4; 12 import androidx.test.filters.SmallTest; 13 14 import com.google.protobuf.ByteString; 15 16 import org.junit.Test; 17 import org.junit.runner.RunWith; 18 19 import org.chromium.base.test.util.Batch; 20 21 import java.nio.charset.StandardCharsets; 22 import java.util.HashMap; 23 24 /** Tests {@link BaseFeature} */ 25 @Batch(Batch.UNIT_TESTS) 26 @RunWith(AndroidJUnit4.class) 27 public final class BaseFeatureTest { 28 @Test 29 @SmallTest testGetOverrides_emptyIfNoFlags()30 public void testGetOverrides_emptyIfNoFlags() { 31 assertThat( 32 BaseFeature.getOverrides( 33 new ResolvedFlags(new HashMap<String, ResolvedFlags.Value>()))) 34 .isEqualTo(BaseFeatureOverrides.newBuilder().build()); 35 } 36 37 @Test 38 @SmallTest testGetOverrides_emptyIfNoBaseFeatureOverrideFlags()39 public void testGetOverrides_emptyIfNoBaseFeatureOverrideFlags() { 40 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 41 flags.put("NotABaseFeatureOverride", new ResolvedFlags.Value("test value")); 42 43 assertThat(BaseFeature.getOverrides(new ResolvedFlags(flags))) 44 .isEqualTo(BaseFeatureOverrides.newBuilder().build()); 45 } 46 47 @Test 48 @SmallTest testGetOverrides_returnsOverrides()49 public void testGetOverrides_returnsOverrides() { 50 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 51 flags.put("NotABaseFeatureOverride1", new ResolvedFlags.Value(true)); 52 flags.put(BaseFeature.FLAG_PREFIX + "BaseFeatureOverride1", new ResolvedFlags.Value(true)); 53 flags.put("NotABaseFeatureOverride2", new ResolvedFlags.Value(false)); 54 flags.put(BaseFeature.FLAG_PREFIX + "BaseFeatureOverride2", new ResolvedFlags.Value(false)); 55 flags.put("NotABaseFeatureOverride3", new ResolvedFlags.Value(true)); 56 57 assertThat(BaseFeature.getOverrides(new ResolvedFlags(flags))) 58 .isEqualTo( 59 BaseFeatureOverrides.newBuilder() 60 .putFeatureStates( 61 "BaseFeatureOverride1", 62 BaseFeatureOverrides.FeatureState.newBuilder() 63 .setEnabled(true) 64 .build()) 65 .putFeatureStates( 66 "BaseFeatureOverride2", 67 BaseFeatureOverrides.FeatureState.newBuilder() 68 .setEnabled(false) 69 .build()) 70 .build()); 71 } 72 73 @Test 74 @SmallTest testGetOverrides_throwsOnNonBooleanOverride()75 public void testGetOverrides_throwsOnNonBooleanOverride() { 76 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 77 flags.put( 78 BaseFeature.FLAG_PREFIX + "BaseFeatureOverride", 79 new ResolvedFlags.Value("test value")); 80 ResolvedFlags resolvedFlags = new ResolvedFlags(flags); 81 82 assertThrows( 83 IllegalArgumentException.class, 84 () -> { 85 BaseFeature.getOverrides(resolvedFlags); 86 }); 87 } 88 89 @Test 90 @SmallTest testGetOverrides_returnsParamOverrides()91 public void testGetOverrides_returnsParamOverrides() { 92 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 93 flags.put( 94 BaseFeature.FLAG_PREFIX 95 + "TestBaseFeatureName" 96 + BaseFeature.PARAM_DELIMITER 97 + "TestBooleanParam", 98 new ResolvedFlags.Value(true)); 99 flags.put( 100 BaseFeature.FLAG_PREFIX 101 + "TestBaseFeatureName" 102 + BaseFeature.PARAM_DELIMITER 103 + "TestIntParam", 104 new ResolvedFlags.Value(123)); 105 flags.put( 106 BaseFeature.FLAG_PREFIX 107 + "TestBaseFeatureName" 108 + BaseFeature.PARAM_DELIMITER 109 + "TestFloatParam", 110 new ResolvedFlags.Value(42.42f)); 111 flags.put( 112 BaseFeature.FLAG_PREFIX 113 + "TestBaseFeatureName" 114 + BaseFeature.PARAM_DELIMITER 115 + "TestStringParam", 116 new ResolvedFlags.Value("test_string_value")); 117 ByteString byteString = ByteString.copyFrom(new byte[] {0, 1, 2, 42, -128, 127}); 118 flags.put( 119 BaseFeature.FLAG_PREFIX 120 + "TestBaseFeatureName" 121 + BaseFeature.PARAM_DELIMITER 122 + "TestBytesParam", 123 new ResolvedFlags.Value(byteString)); 124 125 assertThat(BaseFeature.getOverrides(new ResolvedFlags(flags))) 126 .isEqualTo( 127 BaseFeatureOverrides.newBuilder() 128 .putFeatureStates( 129 "TestBaseFeatureName", 130 BaseFeatureOverrides.FeatureState.newBuilder() 131 .putParams( 132 "TestBooleanParam", 133 ByteString.copyFrom( 134 "true", StandardCharsets.UTF_8)) 135 .putParams( 136 "TestIntParam", 137 ByteString.copyFrom( 138 "123", StandardCharsets.UTF_8)) 139 .putParams( 140 "TestFloatParam", 141 ByteString.copyFrom( 142 "42.42", StandardCharsets.UTF_8)) 143 .putParams( 144 "TestStringParam", 145 ByteString.copyFrom( 146 "test_string_value", 147 StandardCharsets.UTF_8)) 148 .putParams("TestBytesParam", byteString) 149 .build()) 150 .build()); 151 } 152 153 @Test 154 @SmallTest testGetOverrides_associatesParamsWithFeatures()155 public void testGetOverrides_associatesParamsWithFeatures() { 156 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 157 flags.put( 158 BaseFeature.FLAG_PREFIX 159 + "TestBaseFeature1Name" 160 + BaseFeature.PARAM_DELIMITER 161 + "TestParam1", 162 new ResolvedFlags.Value("test_value1")); 163 flags.put( 164 BaseFeature.FLAG_PREFIX 165 + "TestBaseFeature2Name" 166 + BaseFeature.PARAM_DELIMITER 167 + "TestParam2", 168 new ResolvedFlags.Value("test_value2")); 169 170 assertThat(BaseFeature.getOverrides(new ResolvedFlags(flags))) 171 .isEqualTo( 172 BaseFeatureOverrides.newBuilder() 173 .putFeatureStates( 174 "TestBaseFeature1Name", 175 BaseFeatureOverrides.FeatureState.newBuilder() 176 .putParams( 177 "TestParam1", 178 ByteString.copyFrom( 179 "test_value1", 180 StandardCharsets.UTF_8)) 181 .build()) 182 .putFeatureStates( 183 "TestBaseFeature2Name", 184 BaseFeatureOverrides.FeatureState.newBuilder() 185 .putParams( 186 "TestParam2", 187 ByteString.copyFrom( 188 "test_value2", 189 StandardCharsets.UTF_8)) 190 .build()) 191 .build()); 192 } 193 194 @Test 195 @SmallTest testGetOverrides_combinesEnabledStateWithParam()196 public void testGetOverrides_combinesEnabledStateWithParam() { 197 HashMap<String, ResolvedFlags.Value> flags = new HashMap<String, ResolvedFlags.Value>(); 198 flags.put(BaseFeature.FLAG_PREFIX + "TestBaseFeatureName", new ResolvedFlags.Value(true)); 199 flags.put( 200 BaseFeature.FLAG_PREFIX 201 + "TestBaseFeatureName" 202 + BaseFeature.PARAM_DELIMITER 203 + "TestParam", 204 new ResolvedFlags.Value("test_value")); 205 206 assertThat(BaseFeature.getOverrides(new ResolvedFlags(flags))) 207 .isEqualTo( 208 BaseFeatureOverrides.newBuilder() 209 .putFeatureStates( 210 "TestBaseFeatureName", 211 BaseFeatureOverrides.FeatureState.newBuilder() 212 .setEnabled(true) 213 .putParams( 214 "TestParam", 215 ByteString.copyFrom( 216 "test_value", 217 StandardCharsets.UTF_8)) 218 .build()) 219 .build()); 220 } 221 } 222