• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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