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;
2056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williamsimport android.content.ComponentName;
218ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.ContentResolver;
228ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.Context;
238ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.ContextWrapper;
248ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.Intent;
258ff9a156c04c24458d94c716a64a5b7327f0e987Amith Yamasaniimport android.content.PeriodicSync;
26fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williamsimport android.content.res.Resources;
27f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.os.Bundle;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.RenamingDelegatingContext;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.mock.MockContentResolver;
31f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.mock.MockContext;
32f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.LargeTest;
33f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.MediumTest;
34f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.SmallTest;
35c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
3656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williamsimport com.android.server.content.SyncStorageEngine.EndPoint;
3756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
3857286f970641493b315b0b42aba7ac6b672cc8b8Alon Albertimport com.android.internal.os.AtomicFile;
3957286f970641493b315b0b42aba7ac6b672cc8b8Alon Albert
40c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport java.io.File;
41c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintanaimport java.io.FileOutputStream;
42f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport java.util.List;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williamsimport com.android.server.content.SyncStorageEngine.EndPoint;
4556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SyncStorageEngineTest extends AndroidTestCase {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    protected Account account1;
4906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams    protected Account account2;
5056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    protected ComponentName syncService1;
51fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    protected String authority1 = "testprovider";
52fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    protected Bundle defaultBundle;
53fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    protected final int DEFAULT_USER = 0;
5456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
5556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    /* Some default poll frequencies. */
5656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    final long dayPoll = (60 * 60 * 24);
5756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    final long dayFuzz = 60;
5856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    final long thousandSecs = 1000;
5956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    final long thousandSecsFuzz = 100;
6056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
61fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    MockContentResolver mockResolver;
62fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    SyncStorageEngine engine;
6356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
6404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    private File getSyncDir() {
6504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        return new File(new File(getContext().getFilesDir(), "system"), "sync");
6604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    }
6704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
68fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
69fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public void setUp() {
70fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        account1 = new Account("a@example.com", "example.type");
7106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        account2 = new Account("b@example.com", "example.type");
7256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncService1 = new ComponentName("com.example", "SyncService");
73fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // Default bundle.
74fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        defaultBundle = new Bundle();
75fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        defaultBundle.putInt("int_key", 0);
76fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        defaultBundle.putString("string_key", "hello");
77fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // Set up storage engine.
78fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        mockResolver = new MockContentResolver();
79fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        engine = SyncStorageEngine.newTestInstance(
80fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                new TestContext(mockResolver, getContext()));
81fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
82fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Test that we handle the case of a history row being old enough to purge before the
85ba35271e91648c9cde2bb606aaf2001282231b07Matthew Williams     * corresponding sync is finished. This can happen if the clock changes while we are syncing.
86c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana     *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
882ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot    // TODO: this test causes AidlTest to fail. Omit for now
892ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot    // @SmallTest
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPurgeActiveSync() throws Exception {
91d9d2f1140b52fd0c014e9deac59f6000564b7e84Fred Quintana        final Account account = new Account("a@example.com", "example.type");
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String authority = "testprovider";
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MockContentResolver mockResolver = new MockContentResolver();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new TestContext(mockResolver, getContext()));
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time0 = 1000;
9956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        SyncOperation op = new SyncOperation(account, 0,
10056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                SyncOperation.REASON_PERIODIC,
10156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                SyncStorageEngine.SOURCE_LOCAL,
10256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                authority,
10306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                Bundle.EMPTY, time0, 0 /* flex*/, 0, 0, true);
10456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        long historyId = engine.insertStartSyncEvent(op, time0);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2;
10677c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana        engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0);
107c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
108c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
109c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    /**
110fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * Test persistence of pending operations.
111fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
112fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @MediumTest
11306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams    public void testAppendPending() throws Exception {
11456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        SyncOperation sop = new SyncOperation(account1,
11556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                DEFAULT_USER,
11656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                SyncOperation.REASON_PERIODIC,
11706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
11856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                0 /* runtime */, 0 /* flex */, 0 /* backoff */, 0 /* delayuntil */,
11956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                true /* expedited */);
12056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.insertIntoPending(sop);
12156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
122fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // Force engine to read from disk.
123fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        engine.clearAndReadState();
124fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
1258ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertTrue(engine.getPendingOperationCount() == 1);
126ba35271e91648c9cde2bb606aaf2001282231b07Matthew Williams        List<SyncStorageEngine.PendingOperation> pops = engine.getPendingOperations();
127ba35271e91648c9cde2bb606aaf2001282231b07Matthew Williams        SyncStorageEngine.PendingOperation popRetrieved = pops.get(0);
1288ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertEquals(sop.target.account, popRetrieved.target.account);
1298ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertEquals(sop.target.provider, popRetrieved.target.provider);
1308ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertEquals(sop.target.service, popRetrieved.target.service);
1318ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertEquals(sop.target.userId, popRetrieved.target.userId);
13256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        assertEquals(sop.reason, popRetrieved.reason);
13356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        assertEquals(sop.syncSource, popRetrieved.syncSource);
1346428046767ee4195617fb41b5639eefa2ca7a939Matthew Williams        assertEquals(sop.isExpedited(), popRetrieved.expedited);
13556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        assert(android.content.PeriodicSync.syncExtrasEquals(sop.extras, popRetrieved.extras));
136fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
137fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
138fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
13906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams     * Verify {@link com.android.server.content.SyncStorageEngine#writePendingOperationsLocked()}
14006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams     */
14106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams    public void testWritePendingOperationsLocked() throws Exception {
14206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        SyncOperation sop = new SyncOperation(account1,
14306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                DEFAULT_USER,
14406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncOperation.REASON_IS_SYNCABLE,
14506485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
14606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                1000L /* runtime */, 57L /* flex */, 0 /* backoff */, 0 /* delayuntil */,
14706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                true /* expedited */);
14806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        SyncOperation sop1 = new SyncOperation(account2,
14906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                DEFAULT_USER,
15006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncOperation.REASON_PERIODIC,
15106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncStorageEngine.SOURCE_LOCAL, authority1, defaultBundle,
15206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                0 /* runtime */, 0 /* flex */, 20L /* backoff */, 100L /* delayuntil */,
15306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                false /* expedited */);
15406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        SyncOperation deleted = new SyncOperation(account2,
15506485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                DEFAULT_USER,
15606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncOperation.REASON_SYNC_AUTO,
15706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
15806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                0 /* runtime */, 0 /* flex */, 20L /* backoff */, 100L /* delayuntil */,
15906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams                false /* expedited */);
16006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.insertIntoPending(sop);
16106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.insertIntoPending(sop1);
16206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.insertIntoPending(deleted);
16306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
16406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        SyncStorageEngine.PendingOperation popDeleted = engine.getPendingOperations().get(2);
16506485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        // Free verifying, going to delete it anyway.
16606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.target.account, popDeleted.target.account);
16706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.target.provider, popDeleted.target.provider);
16806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.target.service, popDeleted.target.service);
16906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.target.userId, popDeleted.target.userId);
17006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.reason, popDeleted.reason);
17106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(deleted.syncSource, popDeleted.syncSource);
1726428046767ee4195617fb41b5639eefa2ca7a939Matthew Williams        assertEquals(deleted.isExpedited(), popDeleted.expedited);
17306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assert(android.content.PeriodicSync.syncExtrasEquals(deleted.extras, popDeleted.extras));
17406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        // Delete one to force write-all
17506485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.deleteFromPending(popDeleted);
17606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals("Delete of pending op failed.", 2, engine.getPendingOperationCount());
17706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        // If there's dirty pending data (which there is because we deleted a pending op) this
17806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        // re-writes the entire file.
17906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.writeAllState();
18006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
18106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        engine.clearAndReadState();
18206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
18306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        // Validate state read back out.
18406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals("Delete of pending op failed.", 2, engine.getPendingOperationCount());
18506485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
18606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        List<SyncStorageEngine.PendingOperation> pops = engine.getPendingOperations();
18706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
18806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        SyncStorageEngine.PendingOperation popRetrieved = pops.get(0);
18906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.target.account, popRetrieved.target.account);
19006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.target.provider, popRetrieved.target.provider);
19106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.target.service, popRetrieved.target.service);
19206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.target.userId, popRetrieved.target.userId);
19306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.reason, popRetrieved.reason);
19406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop.syncSource, popRetrieved.syncSource);
1956428046767ee4195617fb41b5639eefa2ca7a939Matthew Williams        assertEquals(sop.isExpedited(), popRetrieved.expedited);
19606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assert(android.content.PeriodicSync.syncExtrasEquals(sop.extras, popRetrieved.extras));
19706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
19806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        popRetrieved = pops.get(1);
19906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.target.account, popRetrieved.target.account);
20006485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.target.provider, popRetrieved.target.provider);
20106485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.target.service, popRetrieved.target.service);
20206485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.target.userId, popRetrieved.target.userId);
20306485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.reason, popRetrieved.reason);
20406485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assertEquals(sop1.syncSource, popRetrieved.syncSource);
2056428046767ee4195617fb41b5639eefa2ca7a939Matthew Williams        assertEquals(sop1.isExpedited(), popRetrieved.expedited);
20606485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams        assert(android.content.PeriodicSync.syncExtrasEquals(sop1.extras, popRetrieved.extras));
20706485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams    }
20806485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams
20906485a7c6e3bbea1f427f345ac3a18b2346750e0Matthew Williams    /**
210fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * Test that we can create, remove and retrieve periodic syncs. Backwards compatibility -
211fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * periodic syncs with no flex time are no longer used.
212c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana     */
213f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
214c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void testPeriodics() throws Exception {
215c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account1 = new Account("a@example.com", "example.type");
216c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account2 = new Account("b@example.com", "example.type.2");
217c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority = "testprovider";
218c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras1 = new Bundle();
219c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras1.putString("a", "1");
220c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras2 = new Bundle();
221c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putString("a", "2");
222c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period1 = 200;
223c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period2 = 1000;
224c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
225c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1);
22656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint end1 = new EndPoint(account1, authority, 0);
22756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
228c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1);
229c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2);
230c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2);
231c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
23256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
233fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
234fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        removePeriodicSyncs(engine, account1, 0, authority);
235fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        removePeriodicSyncs(engine, account2, 0, authority);
236fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        removePeriodicSyncs(engine, account1, 1, authority);
237fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
238fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // this should add two distinct periodic syncs for account1 and one for account2
23956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period1, 0, extras1);
24056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period1, 0, extras2);
24156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period2, 0, extras2);
24256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(new EndPoint(account2, authority, 0), period2, 0, extras2);
243fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // add a second user
24456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 1), period1, 0, extras2);
245fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
24656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(new EndPoint(account1, authority, 0));
247fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
248fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(2, syncs.size());
249fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
250fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync1, syncs.get(0));
251fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync3, syncs.get(1));
252fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
25356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.removePeriodicSync(new EndPoint(account1, authority, 0), extras1);
254fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
25556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(new EndPoint(account1, authority, 0));
256fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
257fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync3, syncs.get(0));
258fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
25956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(new EndPoint(account2, authority, 0));
260fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
261fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync4, syncs.get(0));
262fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
26356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(new EndPoint(sync2.account, sync2.authority, 1));
264fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
265fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync2, syncs.get(0));
266fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
267fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
268fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
269fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * Test that we can create, remove and retrieve periodic syncs with a provided flex time.
270fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
271fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @MediumTest
272fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public void testPeriodicsV2() throws Exception {
273fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final Account account1 = new Account("a@example.com", "example.type");
274fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final Account account2 = new Account("b@example.com", "example.type.2");
275fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final String authority = "testprovider";
276fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final Bundle extras1 = new Bundle();
277fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        extras1.putString("a", "1");
278fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final Bundle extras2 = new Bundle();
279fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        extras2.putString("a", "2");
280fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int period1 = 200;
281fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int period2 = 1000;
282fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int flex1 = 10;
283fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int flex2 = 100;
28456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point1 = new EndPoint(account1, authority, 0);
28556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point2 = new EndPoint(account2, authority, 0);
28656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point1User2 = new EndPoint(account1, authority, 1);
287fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
288fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1, flex1);
289fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1, flex1);
290fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2, flex2);
291fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2, flex2);
292fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
29356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target1 = new EndPoint(account1, authority, 0);
29456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target2 = new EndPoint(account2, authority, 0);
29556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target1UserB = new EndPoint(account1, authority, 1);
29656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
297c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
298c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
299c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
300c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana                new TestContext(mockResolver, getContext()));
301c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
30204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority);
30304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority);
30404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 1, authority);
305c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
306fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // This should add two distinct periodic syncs for account1 and one for account2
30756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1, period1, flex1, extras1);
30856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1, period1, flex1, extras2);
30956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        // Edit existing sync and update the period and flex.
31056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1, period2, flex2, extras2);
31156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target2, period2, flex2, extras2);
31256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        // add a target for a second user.
31356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1UserB, period1, flex1, extras2);
314c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
31556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
316c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
317c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
318c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
319c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync1, syncs.get(0));
320c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(1));
321c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
32256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.removePeriodicSync(target1, extras1);
323c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
32456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1);
325c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
326c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(0));
327c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
32856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
329c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
330c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync4, syncs.get(0));
33104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
33256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1UserB);
33304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, syncs.size());
33404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(sync2, syncs.get(0));
335c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
336c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
337fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    private void removePeriodicSyncs(SyncStorageEngine engine, Account account, int userId, String authority) {
33856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target = new EndPoint(account, authority, userId);
33956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.setIsSyncable(account, userId, authority, engine.getIsSyncable(account, userId, authority));
34056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(target);
341c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        for (PeriodicSync sync : syncs) {
34256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams            engine.removePeriodicSync(target, sync.extras);
343c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
344c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
345c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
346f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @LargeTest
347c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void testAuthorityPersistence() throws Exception {
348c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account1 = new Account("a@example.com", "example.type");
349c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Account account2 = new Account("b@example.com", "example.type.2");
350c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority1 = "testprovider1";
351c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final String authority2 = "testprovider2";
352c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras1 = new Bundle();
353c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras1.putString("a", "1");
354c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final Bundle extras2 = new Bundle();
355c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putString("a", "2");
356c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putLong("b", 2);
357c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putInt("c", 1);
358c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putBoolean("d", true);
359c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putDouble("e", 1.2);
360c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putFloat("f", 4.5f);
361c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        extras2.putParcelable("g", account1);
362c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period1 = 200;
363c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final int period2 = 1000;
364fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int flex1 = 10;
365fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final int flex2 = 100;
366c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
36756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point1 = new EndPoint(account1, authority1, 0);
36856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point2 = new EndPoint(account1, authority2, 0);
36956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint point3 = new EndPoint(account2, authority1, 0);
37056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
371fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync1 = new PeriodicSync(account1, authority1, extras1, period1, flex1);
372fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync2 = new PeriodicSync(account1, authority1, extras2, period1, flex1);
373fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync3 = new PeriodicSync(account1, authority2, extras1, period1, flex1);
374fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync4 = new PeriodicSync(account1, authority2, extras2, period2, flex2);
375fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        PeriodicSync sync5 = new PeriodicSync(account2, authority1, extras1, period1, flex1);
376c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
37756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target1 = new EndPoint(account1, authority1, 0);
37856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target2 = new EndPoint(account1, authority2, 0);
37956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target3 = new EndPoint(account2, authority1, 0);
380c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
38104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority1);
38204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority1);
38304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account1, 0, authority2);
38404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        removePeriodicSyncs(engine, account2, 0, authority2);
385c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
38604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setMasterSyncAutomatically(false, 0);
387c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
38804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account1, 0, authority1, 1);
38904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account1, 0, authority1, true);
390c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
39104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account2, 0, authority1, 1);
39204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account2, 0, authority1, true);
393c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
39404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account1, 0, authority2, 1);
39504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account1, 0, authority2, false);
396c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
39704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setIsSyncable(account2, 0, authority2, 0);
39804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        engine.setSyncAutomatically(account2, 0, authority2, true);
399c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
40056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1, period1, flex1, extras1);
40156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target1, period1, flex1, extras2);
40256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target2, period1, flex1, extras1);
40356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target2, period2, flex2, extras2);
40456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.updateOrAddPeriodicSync(target3, period1, flex1, extras1);
405c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
406c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        engine.writeAllState();
407c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        engine.clearAndReadState();
408c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
40956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
410c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
411c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync1, syncs.get(0));
412c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync2, syncs.get(1));
413c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
41456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
415c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(2, syncs.size());
416c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync3, syncs.get(0));
417c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync4, syncs.get(1));
418c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
41956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
420c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(1, syncs.size());
421c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        assertEquals(sync5, syncs.get(0));
422c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
42304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authority1));
42404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority1));
42504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authority2));
42604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority2));
427c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
42804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account1, 0, authority1));
42904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account2, 0, authority1));
43004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account1, 0, authority2));
43104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(0, engine.getIsSyncable(account2, 0, authority2));
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
433c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
43456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    @SmallTest
43556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    public void testComponentParsing() throws Exception {
43656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
43756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
43856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + "<accounts version=\"2\" >\n"
43956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + "<authority id=\"0\" user=\"0\" package=\"" + syncService1.getPackageName() + "\""
44056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + " class=\"" + syncService1.getClassName() + "\" syncable=\"true\">"
44156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
44256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + "\n</authority>"
44356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                + "</accounts>").getBytes();
44456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
44556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        File syncDir = getSyncDir();
44656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncDir.mkdirs();
44756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
44856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        FileOutputStream fos = accountInfoFile.startWrite();
44956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        fos.write(accountsFileData);
45056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        accountInfoFile.finishWrite(fos);
45156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
45256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.clearAndReadState();
45356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
4548ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        SyncStorageEngine.AuthorityInfo aInfo = engine.getAuthority(0);
4558ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertNotNull(aInfo);
4568ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams
45756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        // Test service component read
45856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(
45956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                new SyncStorageEngine.EndPoint(syncService1, 0));
46056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        assertEquals(1, syncs.size());
4618ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assertEquals(true, engine.getIsTargetServiceActive(syncService1, 0));
4628ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams    }
4638ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams
4648ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams    @SmallTest
4658ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams    public void testComponentSettings() throws Exception {
4668ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        EndPoint target1 = new EndPoint(syncService1, 0);
4678ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        engine.updateOrAddPeriodicSync(target1, dayPoll, dayFuzz, Bundle.EMPTY);
4688ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams
4698ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        engine.setIsTargetServiceActive(target1.service, 0, true);
4708ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        boolean active = engine.getIsTargetServiceActive(target1.service, 0);
4718ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assert(active);
4728ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams
4738ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        engine.setIsTargetServiceActive(target1.service, 1, false);
4748ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        active = engine.getIsTargetServiceActive(target1.service, 1);
4758ef2204c8f5f9744a2ff7abdbbf2d26a5ea02837Matthew Williams        assert(!active);
47656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams    }
47756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
478f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
479fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
480fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * V2 introduces flex time as well as service components.
481fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * @throws Exception
482fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
483fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public void testAuthorityParsingV2() throws Exception {
484fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final Account account = new Account("account1", "type1");
485fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final String authority1 = "auth1";
486fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final String authority2 = "auth2";
487fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        final String authority3 = "auth3";
488fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
48956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target1 = new EndPoint(account, authority1, 0);
49056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target2 = new EndPoint(account, authority2, 0);
49156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target3 = new EndPoint(account, authority3, 0);
49256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target4 = new EndPoint(account, authority3, 1);
49356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
49456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync1 = new PeriodicSync(account, authority1, Bundle.EMPTY, dayPoll, dayFuzz);
49556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync2 = new PeriodicSync(account, authority2, Bundle.EMPTY, dayPoll, dayFuzz);
49656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync3 = new PeriodicSync(account, authority3, Bundle.EMPTY, dayPoll, dayFuzz);
49756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync1s = new PeriodicSync(account, authority1, Bundle.EMPTY, thousandSecs,
49856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                thousandSecsFuzz);
49956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync2s = new PeriodicSync(account, authority2, Bundle.EMPTY, thousandSecs,
50056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                thousandSecsFuzz);
50156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        PeriodicSync sync3s = new PeriodicSync(account, authority3, Bundle.EMPTY, thousandSecs,
50256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams                thousandSecsFuzz);
503fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
504fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
505fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<accounts version=\"2\" >\n"
506fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" >"
507fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
508fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n</authority>"
509fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"1\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth2\" >"
510fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
511fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n</authority>"
512fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                // No user defaults to user 0 - all users.
513fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"2\"            account=\"account1\" type=\"type1\" authority=\"auth3\" >"
514fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
515fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n</authority>"
516fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"3\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth3\" >"
517fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
518fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "\n</authority>"
519fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</accounts>").getBytes();
520fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
521fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        File syncDir = getSyncDir();
522fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        syncDir.mkdirs();
523fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
524fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        FileOutputStream fos = accountInfoFile.startWrite();
525fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        fos.write(accountsFileData);
526fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountInfoFile.finishWrite(fos);
527fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
52856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        engine.clearAndReadState();
529fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
53056dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
531fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals("Got incorrect # of syncs", 1, syncs.size());
532fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync1, syncs.get(0));
533fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
53456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
535fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
536fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync2, syncs.get(0));
537fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
53856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
539fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
540fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync3, syncs.get(0));
541fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
54256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target4);
54356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
544fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
545fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync3, syncs.get(0));
546fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
547fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // Test empty periodic data.
548fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
549fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<accounts version=\"2\">\n"
550fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
551fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
552fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
553fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</accounts>\n").getBytes();
554fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
555fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
556fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        fos = accountInfoFile.startWrite();
557fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        fos.write(accountsFileData);
558fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountInfoFile.finishWrite(fos);
559fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
560fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        engine.clearAndReadState();
561fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
56256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1);
563fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(0, syncs.size());
564fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
56556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
566fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(0, syncs.size());
567fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
56856dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
569fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(0, syncs.size());
570fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
571fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
572fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<accounts version=\"2\">\n"
573fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
574fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<periodicSync period=\"1000\" />\n"
575fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</authority>"
576fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
577fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<periodicSync period=\"1000\" />\n"
578fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</authority>"
579fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
580fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "<periodicSync period=\"1000\" />\n"
581fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</authority>"
582fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams                + "</accounts>\n").getBytes();
583fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
584fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
585fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        fos = accountInfoFile.startWrite();
586fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        fos.write(accountsFileData);
587fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        accountInfoFile.finishWrite(fos);
588fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
589fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        engine.clearAndReadState();
590fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
59156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1);
592fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
593fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync1s, syncs.get(0));
594fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
59556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
596fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
597fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync2s, syncs.get(0));
598fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
59956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
600fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(1, syncs.size());
601fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals(sync3s, syncs.get(0));
602fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
603fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
604fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @MediumTest
605c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana    public void testAuthorityParsing() throws Exception {
606c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final Account account = new Account("account1", "type1");
607c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority1 = "auth1";
608c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority2 = "auth2";
609c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final String authority3 = "auth3";
610c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final Bundle extras = new Bundle();
61156dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
61256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target1 = new EndPoint(account, authority1, 0);
61356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target2 = new EndPoint(account, authority2, 0);
61456dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target3 = new EndPoint(account, authority3, 0);
61556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        EndPoint target4 = new EndPoint(account, authority3, 1);
61656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
617c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, (long) (60 * 60 * 24));
618c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, (long) (60 * 60 * 24));
619c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, (long) (60 * 60 * 24));
620c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, 1000);
621c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, 1000);
622c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, 1000);
623c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
624c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        MockContentResolver mockResolver = new MockContentResolver();
625c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
626c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
627c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
628c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
629c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<accounts>\n"
63004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
63104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"1\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
63204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"2\"            account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
63304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"3\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
634c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
635c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
63604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        File syncDir = getSyncDir();
637c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        syncDir.mkdirs();
638c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
639c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
640c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
641c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
642c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
643fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
644c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
64556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
646c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
647fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        assertEquals("expected sync1: " + sync1.toString() + " == sync 2" + syncs.get(0).toString(), sync1, syncs.get(0));
648c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
64956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
650c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
651c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync2, syncs.get(0));
652c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
65356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
65404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, syncs.size());
65504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(sync3, syncs.get(0));
65656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target4);
65756dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams
65804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
659c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
660c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync3, syncs.get(0));
661c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
662c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
663fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts version=\"2\">\n"
664c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
665c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
666c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
667c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
668c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
669c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
670c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos = accountInfoFile.startWrite();
671c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
672c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
673c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
674c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        engine.clearAndReadState();
675c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
67656dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1);
677c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
678c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
67956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
680c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
681c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
68256dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
683c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(0, syncs.size());
684c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
685c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
686fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts version=\"2\">\n"
687c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
688c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
689c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
690c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
691c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
692c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
693c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
694c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "<periodicSync period=\"1000\" />\n"
695c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</authority>"
696c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana                + "</accounts>\n").getBytes();
697c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
698c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
699c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos = accountInfoFile.startWrite();
700c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        fos.write(accountsFileData);
701c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        accountInfoFile.finishWrite(fos);
702c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
703c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        engine.clearAndReadState();
704c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
70556dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target1);
706c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
707c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync1s, syncs.get(0));
708c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
70956dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target2);
710c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
711c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync2s, syncs.get(0));
712c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana
71356dbf8f23677d28615e61ef2fbb0e738cca02528Matthew Williams        syncs = engine.getPeriodicSyncs(target3);
714c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(1, syncs.size());
715c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana        assertEquals(sync3s, syncs.get(0));
716c2e4691d788088b22eadc9b2d35e9bdf0b6a0ffcFred Quintana    }
717fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
718f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
71904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    public void testListenForTicklesParsing() throws Exception {
72004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
72104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<accounts>\n"
72204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<listenForTickles user=\"0\" enabled=\"false\" />"
72304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<listenForTickles user=\"1\" enabled=\"true\" />"
72404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
72504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "<authority id=\"1\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
72604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                + "</accounts>\n").getBytes();
72704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
72804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        MockContentResolver mockResolver = new MockContentResolver();
72904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        final TestContext testContext = new TestContext(mockResolver, getContext());
73004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
73104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        File syncDir = getSyncDir();
73204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        syncDir.mkdirs();
73304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
73404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        FileOutputStream fos = accountInfoFile.startWrite();
73504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        fos.write(accountsFileData);
73604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        accountInfoFile.finishWrite(fos);
73704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
73804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
73904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
74004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getMasterSyncAutomatically(0));
74104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getMasterSyncAutomatically(1));
74204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getMasterSyncAutomatically(2));
74304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
74404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    }
74504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
74604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani    @MediumTest
747fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    public void testAuthorityRenaming() throws Exception {
748fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account1 = new Account("acc1", "type1");
749fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account2 = new Account("acc2", "type2");
750fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityContacts = "contacts";
751fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityCalendar = "calendar";
752fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityOther = "other";
753fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityContactsNew = "com.android.contacts";
754fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final String authorityCalendarNew = "com.android.calendar";
755fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
756fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
757fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
758fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
759fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
760fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
761fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts>\n"
762fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"0\" account=\"acc1\" type=\"type1\" authority=\"contacts\" />\n"
763fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"1\" account=\"acc1\" type=\"type1\" authority=\"calendar\" />\n"
764fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"2\" account=\"acc1\" type=\"type1\" authority=\"other\" />\n"
765fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"3\" account=\"acc2\" type=\"type2\" authority=\"contacts\" />\n"
766fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"4\" account=\"acc2\" type=\"type2\" authority=\"calendar\" />\n"
767fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"5\" account=\"acc2\" type=\"type2\" authority=\"other\" />\n"
768fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"6\" account=\"acc2\" type=\"type2\" enabled=\"false\""
769fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"com.android.calendar\" />\n"
770fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"7\" account=\"acc2\" type=\"type2\" enabled=\"false\""
771fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"com.android.contacts\" />\n"
772fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "</accounts>\n").getBytes();
773fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
774fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
775fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        syncDir.mkdirs();
776fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
777fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
778fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        fos.write(accountsFileData);
779fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        accountInfoFile.finishWrite(fos);
780fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
781fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
782fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
78304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityContacts));
78404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityCalendar));
78504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityOther));
78604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityContactsNew));
78704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityCalendarNew));
78804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani
78904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContacts));
79004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendar));
79104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(true, engine.getSyncAutomatically(account2, 0, authorityOther));
79204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContactsNew));
79304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendarNew));
794fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    }
795fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
796fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    @SmallTest
797fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    public void testSyncableMigration() throws Exception {
798fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final Account account = new Account("acc", "type");
799fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
800fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        MockContentResolver mockResolver = new MockContentResolver();
801fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
802fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        final TestContext testContext = new TestContext(mockResolver, getContext());
803fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
804fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
805fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<accounts>\n"
806fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"0\" account=\"acc\" authority=\"other1\" />\n"
807fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"1\" account=\"acc\" type=\"type\" authority=\"other2\" />\n"
808fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"2\" account=\"acc\" type=\"type\" syncable=\"false\""
809fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"other3\" />\n"
810fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "<authority id=\"3\" account=\"acc\" type=\"type\" syncable=\"true\""
811fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + " authority=\"other4\" />\n"
812fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana                + "</accounts>\n").getBytes();
813fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
814fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
815fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        syncDir.mkdirs();
816fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
817fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        FileOutputStream fos = accountInfoFile.startWrite();
818fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        fos.write(accountsFileData);
819fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        accountInfoFile.finishWrite(fos);
820fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
821fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
822fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana
82304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(-1, engine.getIsSyncable(account, 0, "other1"));
82404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account, 0, "other2"));
82504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(0, engine.getIsSyncable(account, 0, "other3"));
82604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani        assertEquals(1, engine.getIsSyncable(account, 0, "other4"));
827fb084400d6afa6443a421117fbcaee0265d38fb6Fred Quintana    }
828632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
829632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams    /**
830632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     * Verify that the API cannot cause a run-time reboot by passing in the empty string as an
831632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     * authority. The problem here is that
832632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     * {@link SyncStorageEngine#getOrCreateAuthorityLocked(account, provider)} would register
833632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     * an empty authority which causes a RTE in {@link SyncManager#scheduleReadyPeriodicSyncs()}.
834632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     * This is not strictly a SSE test, but it does depend on the SSE data structures.
835632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams     */
836632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams    @SmallTest
837632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams    public void testExpectedIllegalArguments() throws Exception {
838632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
839632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.setSyncAutomatically(account1, "", true);
840632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
841632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
842632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
843632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
844632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.addPeriodicSync(account1, "", Bundle.EMPTY, 84000L);
845632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
846632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
847632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
848632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
849632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.removePeriodicSync(account1, "", Bundle.EMPTY);
850632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
851632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
852632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
853632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
854632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.cancelSync(account1, "");
855632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
856632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
857632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
858632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
859632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.setIsSyncable(account1, "", 0);
860632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
861632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
862632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
863632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
864632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.cancelSync(account1, "");
865632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
866632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
867632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
868632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
869632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.requestSync(account1, "", Bundle.EMPTY);
870632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
871632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
872632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
873632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        try {
874632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            ContentResolver.getSyncStatus(account1, "");
875632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams            fail("empty provider string should throw IllegalArgumentException");
876632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        } catch (IllegalArgumentException expected) {}
877632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams
878632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        // Make sure we aren't blocking null account/provider for those functions that use it
879632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        // to specify ALL accounts/providers.
880632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        ContentResolver.requestSync(null, null, Bundle.EMPTY);
881632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams        ContentResolver.cancelSync(null, null);
882632515b9d0960749ddb1636677d7f12f196d73f7Matthew Williams    }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TestContext extends ContextWrapper {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ContentResolver mResolver;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    private final Context mRealContext;
890c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TestContext(ContentResolver resolver, Context realContext) {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(new RenamingDelegatingContext(new MockContext(), realContext, "test."));
893c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        mRealContext = realContext;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResolver = resolver;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
898fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public Resources getResources() {
899fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        return mRealContext.getResources();
900fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
901fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
902fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
903c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public File getFilesDir() {
904c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        return mRealContext.getFilesDir();
905c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
906c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
907c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    @Override
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(String permission, String message) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
911c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    @Override
912c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void sendBroadcast(Intent intent) {
913c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResolver;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
920