summaryrefslogtreecommitdiffstats
path: root/chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java')
-rw-r--r--chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java268
1 files changed, 268 insertions, 0 deletions
diff --git a/chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java b/chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java
new file mode 100644
index 00000000000..d45179717c1
--- /dev/null
+++ b/chromium/components/policy/android/junit/src/org/chromium/components/policy/PolicyCacheTest.java
@@ -0,0 +1,268 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.policy;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Pair;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.CollectionUtil;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.build.BuildConfig;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/** Robolectric test for PolicyCache. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public final class PolicyCacheTest {
+ private static final String POLICY_NAME = "policy-name";
+ private static final String POLICY_NAME_2 = "policy-name-2";
+ private static final String POLICY_NAME_3 = "policy-name-3";
+ private static final String POLICY_NAME_4 = "policy-name-4";
+ private static final String POLICY_NAME_5 = "policy-name-5";
+
+ private SharedPreferences mSharedPreferences;
+
+ private PolicyCache mPolicyCache;
+
+ @Mock
+ private PolicyMap mPolicyMap;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ PolicyCache.resetForTesting();
+ mPolicyCache = PolicyCache.get();
+ mSharedPreferences = ContextUtils.getApplicationContext().getSharedPreferences(
+ PolicyCache.POLICY_PREF, Context.MODE_PRIVATE);
+
+ initPolicyMap();
+ }
+
+ private void initPolicyMap() {
+ when(mPolicyMap.getIntValue(anyString())).thenReturn(null);
+ when(mPolicyMap.getBooleanValue(anyString())).thenReturn(null);
+ when(mPolicyMap.getStringValue(anyString())).thenReturn(null);
+ when(mPolicyMap.getListValueAsString(anyString())).thenReturn(null);
+ when(mPolicyMap.getDictValueAsString(anyString())).thenReturn(null);
+ }
+
+ @After
+ public void tearDown() {}
+
+ @Test
+ public void testGetInt() {
+ Assert.assertNull(mPolicyCache.getIntValue(POLICY_NAME));
+ int expectedPolicyValue = 42;
+ mSharedPreferences.edit().putInt(POLICY_NAME, expectedPolicyValue).apply();
+ Assert.assertEquals(expectedPolicyValue, mPolicyCache.getIntValue(POLICY_NAME).intValue());
+ }
+
+ @Test
+ public void testGetBoolean() {
+ Assert.assertNull(mPolicyCache.getBooleanValue(POLICY_NAME));
+ boolean expectedPolicyValue = true;
+ mSharedPreferences.edit().putBoolean(POLICY_NAME, expectedPolicyValue).apply();
+ Assert.assertEquals(
+ expectedPolicyValue, mPolicyCache.getBooleanValue(POLICY_NAME).booleanValue());
+ }
+
+ @Test
+ public void testGetString() {
+ Assert.assertNull(mPolicyCache.getStringValue(POLICY_NAME));
+ String expectedPolicyValue = "test-value";
+ mSharedPreferences.edit().putString(POLICY_NAME, expectedPolicyValue).apply();
+ Assert.assertEquals(expectedPolicyValue, mPolicyCache.getStringValue(POLICY_NAME));
+ }
+
+ @Test
+ public void testGetList() throws JSONException {
+ Assert.assertNull(mPolicyCache.getListValue(POLICY_NAME));
+ String policyValue = "[42, \"test\", true]";
+ mSharedPreferences.edit().putString(POLICY_NAME, policyValue).apply();
+ JSONArray actualPolicyValue = mPolicyCache.getListValue(POLICY_NAME);
+ Assert.assertNotNull(actualPolicyValue);
+ Assert.assertEquals(3, actualPolicyValue.length());
+ Assert.assertEquals(42, actualPolicyValue.getInt(0));
+ Assert.assertEquals("test", actualPolicyValue.getString(1));
+ Assert.assertEquals(true, actualPolicyValue.getBoolean(2));
+ }
+
+ @Test
+ public void testGetInvalidList() throws JSONException {
+ String policyValue = "[42, \"test\"";
+ mSharedPreferences.edit().putString(POLICY_NAME, policyValue).apply();
+ Assert.assertNull(mPolicyCache.getListValue(POLICY_NAME));
+ }
+
+ @Test
+ public void testGetDict() throws JSONException {
+ Assert.assertNull(mPolicyCache.getDictValue(POLICY_NAME));
+ String policyValue = "{\"key1\":\"value1\", \"key2\":{\"a\":1, \"b\":2}}";
+ mSharedPreferences.edit().putString(POLICY_NAME, policyValue).apply();
+ JSONObject actualPolicyValue = mPolicyCache.getDictValue(POLICY_NAME);
+ Assert.assertNotNull(actualPolicyValue);
+ Assert.assertEquals(2, actualPolicyValue.length());
+ Assert.assertEquals("value1", actualPolicyValue.getString("key1"));
+ Assert.assertEquals(1, actualPolicyValue.getJSONObject("key2").getInt("a"));
+ Assert.assertEquals(2, actualPolicyValue.getJSONObject("key2").getInt("b"));
+ }
+
+ @Test
+ public void testGetInvalidDict() throws JSONException {
+ Assert.assertNull(mPolicyCache.getDictValue(POLICY_NAME));
+ String policyValue = "{\"key1\":\"value1\", \"key2\":{\"a\":1, \"b\":2}";
+ mSharedPreferences.edit().putString(POLICY_NAME, policyValue).apply();
+ Assert.assertNull(mPolicyCache.getListValue(POLICY_NAME));
+ }
+
+ @Test
+ public void testCachePolicies() {
+ cachePolicies(CollectionUtil.newHashMap(
+ Pair.create(POLICY_NAME, Pair.create(PolicyCache.Type.Integer, 1)),
+ Pair.create(POLICY_NAME_2, Pair.create(PolicyCache.Type.Boolean, true)),
+ Pair.create(POLICY_NAME_3, Pair.create(PolicyCache.Type.String, "2")),
+ Pair.create(POLICY_NAME_4, Pair.create(PolicyCache.Type.List, "[1]")),
+ Pair.create(POLICY_NAME_5, Pair.create(PolicyCache.Type.Dict, "{1:2}"))));
+
+ Assert.assertEquals(1, mSharedPreferences.getInt(POLICY_NAME, 0));
+ Assert.assertEquals(true, mSharedPreferences.getBoolean(POLICY_NAME_2, false));
+ Assert.assertEquals("2", mSharedPreferences.getString(POLICY_NAME_3, null));
+ Assert.assertEquals("[1]", mSharedPreferences.getString(POLICY_NAME_4, null));
+ Assert.assertEquals("{1:2}", mSharedPreferences.getString(POLICY_NAME_5, null));
+ }
+
+ @Test
+ public void testCacheUpdated() {
+ cachePolicies(CollectionUtil.newHashMap(
+ Pair.create(POLICY_NAME, Pair.create(PolicyCache.Type.Integer, 1))));
+ cachePolicies(CollectionUtil.newHashMap(
+ Pair.create(POLICY_NAME_2, Pair.create(PolicyCache.Type.Boolean, true))));
+
+ Assert.assertFalse(mSharedPreferences.contains(POLICY_NAME));
+ Assert.assertEquals(true, mSharedPreferences.getBoolean(POLICY_NAME_2, false));
+ }
+
+ @Test
+ public void testNotCachingUnnecessaryPolicy() {
+ when(mPolicyMap.getIntValue(eq(POLICY_NAME))).thenReturn(1);
+ when(mPolicyMap.getBooleanValue(eq(POLICY_NAME_2))).thenReturn(true);
+
+ mPolicyCache.cachePolicies(
+ mPolicyMap, Arrays.asList(Pair.create(POLICY_NAME_2, PolicyCache.Type.Boolean)));
+
+ Assert.assertFalse(mSharedPreferences.contains(POLICY_NAME));
+ Assert.assertEquals(true, mSharedPreferences.getBoolean(POLICY_NAME_2, false));
+ }
+
+ @Test
+ public void testNotCachingUnavailablePolicy() {
+ when(mPolicyMap.getBooleanValue(eq(POLICY_NAME_2))).thenReturn(true);
+
+ mPolicyCache.cachePolicies(mPolicyMap,
+ Arrays.asList(Pair.create(POLICY_NAME, PolicyCache.Type.Integer),
+ Pair.create(POLICY_NAME_2, PolicyCache.Type.Boolean)));
+
+ Assert.assertFalse(mSharedPreferences.contains(POLICY_NAME));
+ Assert.assertEquals(true, mSharedPreferences.getBoolean(POLICY_NAME_2, false));
+ }
+
+ @Test
+ public void testWriteOnlyAfterCacheUpdate() {
+ mSharedPreferences.edit()
+ .putInt(POLICY_NAME, 1)
+ .putBoolean(POLICY_NAME_2, true)
+ .putString(POLICY_NAME_3, "a")
+ .putString(POLICY_NAME_4, "[1]")
+ .putString(POLICY_NAME_5, "{1:2}")
+ .apply();
+ Assert.assertTrue(mPolicyCache.isReadable());
+
+ cachePolicies(CollectionUtil.newHashMap(
+ Pair.create(POLICY_NAME, Pair.create(PolicyCache.Type.Integer, 1)),
+ Pair.create(POLICY_NAME_2, Pair.create(PolicyCache.Type.Boolean, true)),
+ Pair.create(POLICY_NAME_3, Pair.create(PolicyCache.Type.String, "2")),
+ Pair.create(POLICY_NAME_4, Pair.create(PolicyCache.Type.List, "[1]")),
+ Pair.create(POLICY_NAME_5, Pair.create(PolicyCache.Type.Dict, "{1:2}"))));
+
+ Assert.assertFalse(mPolicyCache.isReadable());
+ if (BuildConfig.ENABLE_ASSERTS) {
+ assertAssertionError(() -> mPolicyCache.getIntValue(POLICY_NAME));
+ assertAssertionError(() -> mPolicyCache.getBooleanValue(POLICY_NAME_2));
+ assertAssertionError(() -> mPolicyCache.getStringValue(POLICY_NAME_3));
+ assertAssertionError(() -> mPolicyCache.getListValue(POLICY_NAME_4));
+ assertAssertionError(() -> mPolicyCache.getDictValue(POLICY_NAME_5));
+ }
+ }
+
+ /**
+ * @param policies A Map for policies that needs to be cached. Each policy
+ * name is mapped to a pair of policy type and policy value.
+ * Setting up {@link #mPolicyCache} mock and call {@link PolicyCache#cachePolicies}.
+ */
+ private void cachePolicies(Map<String, Pair<PolicyCache.Type, Object>> policies) {
+ List<Pair<String, PolicyCache.Type>> cachedPolicies = new ArrayList();
+ CollectionUtil.forEach(policies, entry -> {
+ String policyName = entry.getKey();
+ PolicyCache.Type policyType = entry.getValue().first;
+ Object policyValue = entry.getValue().second;
+ switch (policyType) {
+ case Integer:
+ when(mPolicyMap.getIntValue(eq(policyName))).thenReturn((Integer) policyValue);
+ break;
+ case Boolean:
+ when(mPolicyMap.getBooleanValue(eq(policyName)))
+ .thenReturn((Boolean) policyValue);
+ break;
+ case String:
+ when(mPolicyMap.getStringValue(eq(policyName)))
+ .thenReturn((String) policyValue);
+ break;
+ case List:
+ when(mPolicyMap.getListValueAsString(eq(policyName)))
+ .thenReturn((String) policyValue);
+ break;
+ case Dict:
+ when(mPolicyMap.getDictValueAsString(eq(policyName)))
+ .thenReturn((String) policyValue);
+ break;
+ }
+ cachedPolicies.add(Pair.create(policyName, policyType));
+ });
+ mPolicyCache.cachePolicies(mPolicyMap, cachedPolicies);
+ }
+
+ private void assertAssertionError(Runnable runnable) {
+ AssertionError assertionError = null;
+ try {
+ runnable.run();
+ } catch (AssertionError e) {
+ assertionError = e;
+ }
+
+ Assert.assertNotNull("AssertionError not thrown", assertionError);
+ }
+}