1d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt// Copyright 2013 The Chromium Authors. All rights reserved.
2d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt// Use of this source code is governed by a BSD-style license that can be
36cb1f6521a84955752c2b99100cf1df87637f86cDmitry Shmidt// found in the LICENSE file.
4d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
5d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtpackage org.chromium.sync.notifier;
6d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
7d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport android.accounts.Account;
8d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport android.content.Context;
9d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport android.test.InstrumentationTestCase;
10d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport android.test.suitebuilder.annotation.SmallTest;
11d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
12d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport com.google.ipc.invalidation.external.client.types.ObjectId;
13d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
14d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport org.chromium.base.CollectionUtil;
15d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport org.chromium.base.test.util.AdvancedMockContext;
16d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport org.chromium.base.test.util.Feature;
17d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport org.chromium.sync.internal_api.pub.base.ModelType;
18d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
19d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport java.util.Arrays;
20d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport java.util.EnumSet;
21d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport java.util.HashSet;
22d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtimport java.util.Set;
23d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
24d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt/**
25d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * Tests for the {@link InvalidationPreferences}.
26d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt *
27d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt * @author dsmyers@google.com (Daniel Myers)
28d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt */
29d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidtpublic class InvalidationPreferencesTest extends InstrumentationTestCase {
30d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    private Context mContext;
31d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
32d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @Override
33d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    protected void setUp() throws Exception {
34d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        super.setUp();
35d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        mContext = new AdvancedMockContext(getInstrumentation().getContext());
36d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    }
37d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
38d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @SmallTest
39d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @Feature({"Sync"})
40d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    public void testTranslateBasicSyncTypes() throws Exception {
41d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        /*
42d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * Test plan: convert three strings to model types, one of which is invalid. Verify that
43d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * the two valid strings are properly converted and that the invalid string is dropped.
44d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         */
45d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        HashSet<ModelType> expectedTypes = CollectionUtil.newHashSet(
46d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt                ModelType.BOOKMARK,ModelType.SESSION);
47d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Set<ModelType> actualTypes = ModelType.syncTypesToModelTypes(
48d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt                CollectionUtil.newHashSet("BOOKMARK", "SESSION", "0!!!INVALID"));
49d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertEquals(expectedTypes, actualTypes);
50d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    }
51d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
52d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @SmallTest
53d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @Feature({"Sync"})
54d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    public void testTranslateAllSyncTypes() {
55d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        /*
56d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * Test plan: convert the special all-types type to model types. Verify that it is
57d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * properly expanded.
58d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         */
59d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Set<ModelType> expectedTypes = EnumSet.allOf(ModelType.class);
60d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Set<ModelType> actualTypes = ModelType.syncTypesToModelTypes(
61d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt                CollectionUtil.newHashSet(ModelType.ALL_TYPES_TYPE));
62d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertEquals(expectedTypes, actualTypes);
63d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    }
64d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
65d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @SmallTest
66d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @Feature({"Sync"})
67d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    public void testReadMissingData() {
68d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        /*
69d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * Test plan: read saved state from empty preferences. Verify that null is returned.
70d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         */
71d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        InvalidationPreferences invPreferences = new InvalidationPreferences(mContext);
72d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedSyncedAccount());
73d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedSyncedTypes());
74d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedObjectIds());
75d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getInternalNotificationClientState());
76d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    }
77d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
78d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @SmallTest
79d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    @Feature({"Sync"})
80d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    public void testReadWriteAndReadData() {
81d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        /*
82d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * Test plan: write and read back saved state. Verify that the returned state is what
83d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         * was written.
84d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt         */
85d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        InvalidationPreferences invPreferences = new InvalidationPreferences(mContext);
86d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        InvalidationPreferences.EditContext editContext = invPreferences.edit();
87d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
88d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        // We should never write both a real type and the all-types type in practice, but we test
89d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        // with them here to ensure that preferences are not interpreting the written data.
90d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Set<String> syncTypes = CollectionUtil.newHashSet("BOOKMARK", ModelType.ALL_TYPES_TYPE);
91d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Set<ObjectId> objectIds = CollectionUtil.newHashSet(
92d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt                ObjectId.newInstance(1, "obj1".getBytes()),
93d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt                ObjectId.newInstance(2, "obj2".getBytes()));
94d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        Account account = new Account("test@example.com", "bogus");
95d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        byte[] internalClientState = new byte[]{100, 101, 102};
96d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        invPreferences.setSyncTypes(editContext, syncTypes);
97d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        invPreferences.setObjectIds(editContext, objectIds);
98d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        invPreferences.setAccount(editContext, account);
99d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        invPreferences.setInternalNotificationClientState(editContext, internalClientState);
100d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
101d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        // Nothing should yet have been written.
102d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedSyncedAccount());
103d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedSyncedTypes());
104d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertNull(invPreferences.getSavedObjectIds());
105d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt
106d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        // Write the new data and verify that they are correctly read back.
107d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        invPreferences.commit(editContext);
108d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertEquals(account, invPreferences.getSavedSyncedAccount());
109d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertEquals(syncTypes, invPreferences.getSavedSyncedTypes());
110d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt        assertEquals(objectIds, invPreferences.getSavedObjectIds());
1116cb1f6521a84955752c2b99100cf1df87637f86cDmitry Shmidt        assertTrue(Arrays.equals(
1126cb1f6521a84955752c2b99100cf1df87637f86cDmitry Shmidt                internalClientState, invPreferences.getInternalNotificationClientState()));
113d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt    }
114d5dc24eb5fbf0e0feff214c0260cae845721d5feDmitry Shmidt}