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.shared_preferences; 6 7 import static org.junit.Assert.fail; 8 9 import org.junit.Assert; 10 import org.junit.Before; 11 import org.junit.Test; 12 import org.junit.runner.RunWith; 13 14 import org.chromium.base.test.BaseRobolectricTestRunner; 15 16 import java.util.Collections; 17 import java.util.List; 18 import java.util.Set; 19 20 /** Unit tests for {@link KnownPreferenceKeyRegistries}. */ 21 @RunWith(BaseRobolectricTestRunner.class) 22 public class KnownPreferenceKeyRegistriesTest { 23 private static final String KEY_1 = "Chrome.Feature.Key1"; 24 private static final PreferenceKeyRegistry KNOWN_1 = 25 createRegistryWithOneKey("known_registry1", KEY_1); 26 27 private static final String KEY_2 = "Chrome.Feature.Key2"; 28 private static final PreferenceKeyRegistry KNOWN_2 = 29 createRegistryWithOneKey("known_registry2", KEY_2); 30 31 private static final String KEY_3 = "Chrome.Feature.Key3"; 32 private static final PreferenceKeyRegistry UNKNOWN = 33 createRegistryWithOneKey("unknown_registry", KEY_3); 34 35 @Before setUp()36 public void setUp() { 37 KnownPreferenceKeyRegistries.clearForTesting(); 38 } 39 40 @Test testOnlyKnownUsedAfterInit_noAssertion()41 public void testOnlyKnownUsedAfterInit_noAssertion() { 42 KnownPreferenceKeyRegistries.initializeKnownRegistries(Set.of(KNOWN_1, KNOWN_2)); 43 44 SharedPreferencesManager.getInstanceForRegistry(KNOWN_1).writeInt(KEY_1, 42); 45 SharedPreferencesManager.getInstanceForRegistry(KNOWN_2).writeInt(KEY_2, 43); 46 } 47 48 @Test testOnlyKnownUsedBeforeInit_noAssertion()49 public void testOnlyKnownUsedBeforeInit_noAssertion() { 50 SharedPreferencesManager.getInstanceForRegistry(KNOWN_1).writeInt(KEY_1, 42); 51 SharedPreferencesManager.getInstanceForRegistry(KNOWN_2).writeInt(KEY_2, 43); 52 53 KnownPreferenceKeyRegistries.initializeKnownRegistries(Set.of(KNOWN_1, KNOWN_2)); 54 } 55 56 @Test testUnknownUsedAfterInit_assertion()57 public void testUnknownUsedAfterInit_assertion() { 58 KnownPreferenceKeyRegistries.initializeKnownRegistries(Set.of(KNOWN_1, KNOWN_2)); 59 60 try { 61 SharedPreferencesManager.getInstanceForRegistry(UNKNOWN).writeInt(KEY_3, 42); 62 } catch (AssertionError e) { 63 assertContains("An unknown registry was used", e.getMessage()); 64 assertContains("unknown_registry", e.getMessage()); 65 return; 66 } 67 fail("Expected AssertionError"); 68 } 69 70 @Test testUnknownUsedBeforeInit_assertion()71 public void testUnknownUsedBeforeInit_assertion() { 72 SharedPreferencesManager.getInstanceForRegistry(UNKNOWN).writeInt(KEY_3, 42); 73 74 try { 75 KnownPreferenceKeyRegistries.initializeKnownRegistries(Set.of(KNOWN_1, KNOWN_2)); 76 } catch (AssertionError e) { 77 assertContains("Unknown registries were used", e.getMessage()); 78 assertContains("unknown_registry", e.getMessage()); 79 return; 80 } 81 fail("Expected AssertionError"); 82 } 83 createRegistryWithOneKey(String name, String key)84 private static PreferenceKeyRegistry createRegistryWithOneKey(String name, String key) { 85 return new PreferenceKeyRegistry( 86 name, List.of(key), Collections.EMPTY_LIST, Collections.EMPTY_LIST); 87 } 88 89 // TODO: Unify with HistogramWatcherTestBase's version. assertContains(String expectedSubstring, String actualString)90 protected static void assertContains(String expectedSubstring, String actualString) { 91 Assert.assertNotNull(actualString); 92 if (!actualString.contains(expectedSubstring)) { 93 fail( 94 String.format( 95 "Substring <%s> not found in string <%s>", 96 expectedSubstring, actualString)); 97 } 98 } 99 } 100