SyncStorageEngineTest.java revision 8ff9a156c04c24458d94c716a64a5b7327f0e987
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
178ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasanipackage com.android.server.content;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.accounts.Account;
208ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.ContentResolver;
218ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.Context;
228ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.ContextWrapper;
238ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.Intent;
248ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.PeriodicSync;
25f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.os.Bundle;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.RenamingDelegatingContext;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.mock.MockContentResolver;
29f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.mock.MockContext;
30f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.LargeTest;
31f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.MediumTest;
32f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.SmallTest;
33c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
3457286f970641493b315b0b42aba7ac6b672cc8b8Alon Albertimport com.android.internal.os.AtomicFile;
3557286f970641493b315b0b42aba7ac6b672cc8b8Alon Albert
36c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport java.io.File;
37c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintanaimport java.io.FileOutputStream;
38f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.util.List;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SyncStorageEngineTest extends AndroidTestCase {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    private File getSyncDir() {
4304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        return new File(new File(getContext().getFilesDir(), "system"), "sync");
4404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    }
4504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Test that we handle the case of a history row being old enough to purge before the
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correcponding sync is finished. This can happen if the clock changes while we are syncing.
49c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana     *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
512ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot    // TODO: this test causes AidlTest to fail. Omit for now
522ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot    // @SmallTest
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPurgeActiveSync() throws Exception {
54d9d2f1140b52fd0c014e9deac59f6000564b7e84Fred Quintana        final Account account = new Account("a@example.com", "example.type");
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String authority = "testprovider";
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MockContentResolver mockResolver = new MockContentResolver();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new TestContext(mockResolver, getContext()));
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time0 = 1000;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long historyId = engine.insertStartSyncEvent(
6457286f970641493b315b0b42aba7ac6b672cc8b8Alon Albert                account, 0, SyncOperation.REASON_PERIODIC, authority, time0,
6557286f970641493b315b0b42aba7ac6b672cc8b8Alon Albert                SyncStorageEngine.SOURCE_LOCAL, false /* initialization */, null /* extras */);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2;
6777c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana        engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0);
68c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
69c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
70c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    /**
71c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana     * Test that we can create, remove and retrieve periodic syncs
72c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana     */
73f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
74c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void testPeriodics() throws Exception {
75c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account1 = new Account("a@example.com", "example.type");
76c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account2 = new Account("b@example.com", "example.type.2");
77c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority = "testprovider";
78c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras1 = new Bundle();
79c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras1.putString("a", "1");
80c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras2 = new Bundle();
81c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putString("a", "2");
82c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period1 = 200;
83c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period2 = 1000;
84c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
85c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1);
86c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1);
87c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2);
88c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2);
89c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
90c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
91c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
92c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
93c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana                new TestContext(mockResolver, getContext()));
94c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
9504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority);
9604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority);
9704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 1, authority);
98c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
99c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        // this should add two distinct periodic syncs for account1 and one for account2
10004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync1.account, 0, sync1.authority, sync1.extras, sync1.period);
10104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync2.account, 0, sync2.authority, sync2.extras, sync2.period);
10204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync3.account, 0, sync3.authority, sync3.extras, sync3.period);
10304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync4.account, 0, sync4.authority, sync4.extras, sync4.period);
10404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        // add a second user
10504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync2.account, 1, sync2.authority, sync2.extras, sync2.period);
106c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
10704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority);
108c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
109c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
110c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
111c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync1, syncs.get(0));
112c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(1));
113c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
11404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.removePeriodicSync(sync1.account, 0, sync1.authority, sync1.extras);
115c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
11604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account1, 0, authority);
117c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
118c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(0));
119c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
12004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account2, 0, authority);
121c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
122c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync4, syncs.get(0));
12304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
12404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(sync2.account, 1, sync2.authority);
12504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, syncs.size());
12604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(sync2, syncs.get(0));
127c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
128c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
12904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    private void removePeriodicSyncs(SyncStorageEngine engine, Account account, int userId,
13004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            String authority) {
13104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account, userId, authority,
13204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                engine.getIsSyncable(account, 0, authority));
13304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, userId, authority);
134c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        for (PeriodicSync sync : syncs) {
13504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            engine.removePeriodicSync(sync.account, userId, sync.authority, sync.extras);
136c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
137c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
138c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
139f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @LargeTest
140c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void testAuthorityPersistence() throws Exception {
141c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account1 = new Account("a@example.com", "example.type");
142c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account2 = new Account("b@example.com", "example.type.2");
143c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority1 = "testprovider1";
144c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority2 = "testprovider2";
145c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras1 = new Bundle();
146c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras1.putString("a", "1");
147c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras2 = new Bundle();
148c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putString("a", "2");
149c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putLong("b", 2);
150c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putInt("c", 1);
151c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putBoolean("d", true);
152c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putDouble("e", 1.2);
153c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putFloat("f", 4.5f);
154c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putParcelable("g", account1);
155c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period1 = 200;
156c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period2 = 1000;
157c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
158c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync1 = new PeriodicSync(account1, authority1, extras1, period1);
159c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync2 = new PeriodicSync(account1, authority1, extras2, period1);
160c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync3 = new PeriodicSync(account1, authority2, extras1, period1);
161c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync4 = new PeriodicSync(account1, authority2, extras2, period2);
162c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync5 = new PeriodicSync(account2, authority1, extras1, period1);
163c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
164c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
165c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
166c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
167c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana                new TestContext(mockResolver, getContext()));
168c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
16904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority1);
17004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority1);
17104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority2);
17204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority2);
173c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
17404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setMasterSyncAutomatically(false, 0);
175c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
17604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account1, 0, authority1, 1);
17704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account1, 0, authority1, true);
178c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
17904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account2, 0, authority1, 1);
18004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account2, 0, authority1, true);
181c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
18204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account1, 0, authority2, 1);
18304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account1, 0, authority2, false);
184c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
18504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account2, 0, authority2, 0);
18604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account2, 0, authority2, true);
187c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
18804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync1.account, 0, sync1.authority, sync1.extras, sync1.period);
18904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync2.account, 0, sync2.authority, sync2.extras, sync2.period);
19004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync3.account, 0, sync3.authority, sync3.extras, sync3.period);
19104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync4.account, 0, sync4.authority, sync4.extras, sync4.period);
19204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.addPeriodicSync(sync5.account, 0, sync5.authority, sync5.extras, sync5.period);
193c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
194c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        engine.writeAllState();
195c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        engine.clearAndReadState();
196c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
19704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority1);
198c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
199c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync1, syncs.get(0));
200c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync2, syncs.get(1));
201c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
20204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account1, 0, authority2);
203c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
204c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(0));
205c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync4, syncs.get(1));
206c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
20704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account2, 0, authority1);
208c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
209c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync5, syncs.get(0));
210c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
21104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authority1));
21204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority1));
21304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authority2));
21404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority2));
215c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
21604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account1, 0, authority1));
21704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account2, 0, authority1));
21804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account1, 0, authority2));
21904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(0, engine.getIsSyncable(account2, 0, authority2));
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
221c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
222f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
223c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana    public void testAuthorityParsing() throws Exception {
224c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final Account account = new Account("account1", "type1");
225c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority1 = "auth1";
226c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority2 = "auth2";
227c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority3 = "auth3";
228c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final Bundle extras = new Bundle();
229c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, (long) (60 * 60 * 24));
230c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, (long) (60 * 60 * 24));
231c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, (long) (60 * 60 * 24));
232c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, 1000);
233c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, 1000);
234c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, 1000);
235c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
236c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        MockContentResolver mockResolver = new MockContentResolver();
237c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
238c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
239c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
240c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
241c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<accounts>\n"
24204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
24304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"1\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
24404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"2\"            account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
24504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"3\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
246c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
247c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
24804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        File syncDir = getSyncDir();
249c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        syncDir.mkdirs();
250c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
251c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
252c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
253c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
254c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
255fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
256c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
25704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, 0, authority1);
258c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
259c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync1, syncs.get(0));
260c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
26104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority2);
262c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
263c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync2, syncs.get(0));
264c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
26504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority3);
26604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, syncs.size());
26704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(sync3, syncs.get(0));
26804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
26904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 1, authority3);
270c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
271c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync3, syncs.get(0));
272c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
273c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
274fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts version=\"2\">\n"
275c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
276c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
277c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
278c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
279c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
280c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
281c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos = accountInfoFile.startWrite();
282c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
283c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
284c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
285c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        engine.clearAndReadState();
286c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
28704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority1);
288c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
289c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
29004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority2);
291c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
292c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
29304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority3);
294c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
295c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
296c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
297fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts version=\"2\">\n"
298c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
299c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
300c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
301c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
302c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
303c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
304c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
305c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
306c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
307c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
308c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
309c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
310c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos = accountInfoFile.startWrite();
311c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
312c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
313c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
314c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        engine.clearAndReadState();
315c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
31604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority1);
317c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
318c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync1s, syncs.get(0));
319c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
32004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority2);
321c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
322c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync2s, syncs.get(0));
323c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
32404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncs = engine.getPeriodicSyncs(account, 0, authority3);
325c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
326c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync3s, syncs.get(0));
327c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana    }
328fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
329f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
33004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    public void testListenForTicklesParsing() throws Exception {
33104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
33204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<accounts>\n"
33304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<listenForTickles user=\"0\" enabled=\"false\" />"
33404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<listenForTickles user=\"1\" enabled=\"true\" />"
33504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
33604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"1\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
33704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "</accounts>\n").getBytes();
33804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
33904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        MockContentResolver mockResolver = new MockContentResolver();
34004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        final TestContext testContext = new TestContext(mockResolver, getContext());
34104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
34204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        File syncDir = getSyncDir();
34304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncDir.mkdirs();
34404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
34504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        FileOutputStream fos = accountInfoFile.startWrite();
34604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        fos.write(accountsFileData);
34704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        accountInfoFile.finishWrite(fos);
34804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
34904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
35004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
35104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getMasterSyncAutomatically(0));
35204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getMasterSyncAutomatically(1));
35304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getMasterSyncAutomatically(2));
35404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
35504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    }
35604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
35704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    @MediumTest
358fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    public void testAuthorityRenaming() throws Exception {
359fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account1 = new Account("acc1", "type1");
360fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account2 = new Account("acc2", "type2");
361fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityContacts = "contacts";
362fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityCalendar = "calendar";
363fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityOther = "other";
364fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityContactsNew = "com.android.contacts";
365fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityCalendarNew = "com.android.calendar";
366fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
367fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
368fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
369fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
370fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
371fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
372fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts>\n"
373fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"0\" account=\"acc1\" type=\"type1\" authority=\"contacts\" />\n"
374fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"1\" account=\"acc1\" type=\"type1\" authority=\"calendar\" />\n"
375fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"2\" account=\"acc1\" type=\"type1\" authority=\"other\" />\n"
376fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"3\" account=\"acc2\" type=\"type2\" authority=\"contacts\" />\n"
377fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"4\" account=\"acc2\" type=\"type2\" authority=\"calendar\" />\n"
378fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"5\" account=\"acc2\" type=\"type2\" authority=\"other\" />\n"
379fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"6\" account=\"acc2\" type=\"type2\" enabled=\"false\""
380fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"com.android.calendar\" />\n"
381fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"7\" account=\"acc2\" type=\"type2\" enabled=\"false\""
382fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"com.android.contacts\" />\n"
383fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "</accounts>\n").getBytes();
384fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
385fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
386fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        syncDir.mkdirs();
387fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
388fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
389fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        fos.write(accountsFileData);
390fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        accountInfoFile.finishWrite(fos);
391fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
392fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
393fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
39404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityContacts));
39504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityCalendar));
39604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityOther));
39704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityContactsNew));
39804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityCalendarNew));
39904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
40004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContacts));
40104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendar));
40204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authorityOther));
40304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContactsNew));
40404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendarNew));
405fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    }
406fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
407fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    @SmallTest
408fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    public void testSyncableMigration() throws Exception {
409fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account = new Account("acc", "type");
410fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
411fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
412fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
413fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
414fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
415fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
416fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts>\n"
417fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"0\" account=\"acc\" authority=\"other1\" />\n"
418fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"1\" account=\"acc\" type=\"type\" authority=\"other2\" />\n"
419fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"2\" account=\"acc\" type=\"type\" syncable=\"false\""
420fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"other3\" />\n"
421fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"3\" account=\"acc\" type=\"type\" syncable=\"true\""
422fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"other4\" />\n"
423fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "</accounts>\n").getBytes();
424fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
425fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
426fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        syncDir.mkdirs();
427fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
428fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
429fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        fos.write(accountsFileData);
430fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        accountInfoFile.finishWrite(fos);
431fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
432fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
433fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
43404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(-1, engine.getIsSyncable(account, 0, "other1"));
43504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account, 0, "other2"));
43604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(0, engine.getIsSyncable(account, 0, "other3"));
43704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account, 0, "other4"));
438fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TestContext extends ContextWrapper {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ContentResolver mResolver;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
445c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    private final Context mRealContext;
446c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TestContext(ContentResolver resolver, Context realContext) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(new RenamingDelegatingContext(new MockContext(), realContext, "test."));
449c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        mRealContext = realContext;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResolver = resolver;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
454c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public File getFilesDir() {
455c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        return mRealContext.getFilesDir();
456c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
457c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
458c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    @Override
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(String permission, String message) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
462c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    @Override
463c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void sendBroadcast(Intent intent) {
464c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResolver;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
471