SyncStorageEngineTest.java revision fa77418134c6f1f80af225a78819f069e9c974fb
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (C) 2007 The Android Open Source Project
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf * Licensed under the Apache License, Version 2.0 (the "License");
544d362409d5469aed47d19e7908d19bd194493aThomas Graf * you may not use this file except in compliance with the License.
644d362409d5469aed47d19e7908d19bd194493aThomas Graf * You may obtain a copy of the License at
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *      http://www.apache.org/licenses/LICENSE-2.0
944d362409d5469aed47d19e7908d19bd194493aThomas Graf *
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Unless required by applicable law or agreed to in writing, software
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf * distributed under the License is distributed on an "AS IS" BASIS,
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * See the License for the specific language governing permissions and
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * limitations under the License.
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf
1744d362409d5469aed47d19e7908d19bd194493aThomas Grafpackage com.android.server.content;
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1944d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.accounts.Account;
2044d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.ContentResolver;
2144d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.Context;
2244d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.ContextWrapper;
2344d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.Intent;
2444d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.PeriodicSync;
2544d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.content.res.Resources;
2644d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.os.Bundle;
2744d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.AndroidTestCase;
2844d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.RenamingDelegatingContext;
2944d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.mock.MockContentResolver;
3044d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.mock.MockContext;
3144d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.suitebuilder.annotation.LargeTest;
3244d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.suitebuilder.annotation.MediumTest;
3344d362409d5469aed47d19e7908d19bd194493aThomas Grafimport android.test.suitebuilder.annotation.SmallTest;
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf
3544d362409d5469aed47d19e7908d19bd194493aThomas Grafimport com.android.internal.os.AtomicFile;
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf
3744d362409d5469aed47d19e7908d19bd194493aThomas Grafimport java.io.File;
3844d362409d5469aed47d19e7908d19bd194493aThomas Grafimport java.io.FileOutputStream;
3944d362409d5469aed47d19e7908d19bd194493aThomas Grafimport java.util.List;
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf
4144d362409d5469aed47d19e7908d19bd194493aThomas Grafpublic class SyncStorageEngineTest extends AndroidTestCase {
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf    protected Account account1;
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf    protected String authority1 = "testprovider";
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf    protected Bundle defaultBundle;
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf    protected final int DEFAULT_USER = 0;
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf    MockContentResolver mockResolver;
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf    SyncStorageEngine engine;
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf    private File getSyncDir() {
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf        return new File(new File(getContext().getFilesDir(), "system"), "sync");
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void setUp() {
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf        account1 = new Account("a@example.com", "example.type");
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf        // Default bundle.
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf        defaultBundle = new Bundle();
6044d362409d5469aed47d19e7908d19bd194493aThomas Graf        defaultBundle.putInt("int_key", 0);
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf        defaultBundle.putString("string_key", "hello");
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf        // Set up storage engine.
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf        mockResolver = new MockContentResolver();
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine = SyncStorageEngine.newTestInstance(
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf                new TestContext(mockResolver, getContext()));
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
6744d362409d5469aed47d19e7908d19bd194493aThomas Graf
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf    /**
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf     * Test that we handle the case of a history row being old enough to purge before the
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf     * correcponding sync is finished. This can happen if the clock changes while we are syncing.
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf     *
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf     */
7344d362409d5469aed47d19e7908d19bd194493aThomas Graf    // TODO: this test causes AidlTest to fail. Omit for now
7444d362409d5469aed47d19e7908d19bd194493aThomas Graf    // @SmallTest
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testPurgeActiveSync() throws Exception {
7644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account = new Account("a@example.com", "example.type");
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority = "testprovider";
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf
8144d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf                new TestContext(mockResolver, getContext()));
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf        long time0 = 1000;
8544d362409d5469aed47d19e7908d19bd194493aThomas Graf        long historyId = engine.insertStartSyncEvent(
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf                account, 0, SyncOperation.REASON_PERIODIC, authority, time0,
8744d362409d5469aed47d19e7908d19bd194493aThomas Graf                SyncStorageEngine.SOURCE_LOCAL, false /* initialization */, null /* extras */);
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf        long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2;
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0);
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf    /**
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf     * Test persistence of pending operations.
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf     */
9544d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
9644d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testPending() throws Exception {
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine.PendingOperation pop =
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf                new SyncStorageEngine.PendingOperation(account1, DEFAULT_USER,
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf                        SyncOperation.REASON_PERIODIC, SyncStorageEngine.SOURCE_LOCAL,
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf                        authority1, defaultBundle, false);
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.insertIntoPending(pop);
10344d362409d5469aed47d19e7908d19bd194493aThomas Graf        // Force engine to read from disk.
10444d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
10544d362409d5469aed47d19e7908d19bd194493aThomas Graf
10644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assert(engine.getPendingOperationCount() == 1);
10744d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf    /**
11044d362409d5469aed47d19e7908d19bd194493aThomas Graf     * Test that we can create, remove and retrieve periodic syncs. Backwards compatibility -
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf     * periodic syncs with no flex time are no longer used.
11244d362409d5469aed47d19e7908d19bd194493aThomas Graf     */
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testPeriodics() throws Exception {
11544d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account1 = new Account("a@example.com", "example.type");
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account2 = new Account("b@example.com", "example.type.2");
11744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority = "testprovider";
11844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras1 = new Bundle();
11944d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras1.putString("a", "1");
12044d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras2 = new Bundle();
12144d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putString("a", "2");
12244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period1 = 200;
12344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period2 = 1000;
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf
12544d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1);
12644d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1);
12744d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2);
12844d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2);
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf
13044d362409d5469aed47d19e7908d19bd194493aThomas Graf
13144d362409d5469aed47d19e7908d19bd194493aThomas Graf
13244d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 0, authority);
13344d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account2, 0, authority);
13444d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 1, authority);
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf
13644d362409d5469aed47d19e7908d19bd194493aThomas Graf        // this should add two distinct periodic syncs for account1 and one for account2
13744d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync1, 0);
13844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync2, 0);
13944d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync3, 0);
14044d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync4, 0);
14144d362409d5469aed47d19e7908d19bd194493aThomas Graf        // add a second user
14244d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync2, 1);
14344d362409d5469aed47d19e7908d19bd194493aThomas Graf
14444d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority);
14544d362409d5469aed47d19e7908d19bd194493aThomas Graf
14644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(2, syncs.size());
14744d362409d5469aed47d19e7908d19bd194493aThomas Graf
14844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1, syncs.get(0));
14944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(1));
15044d362409d5469aed47d19e7908d19bd194493aThomas Graf
15144d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.removePeriodicSync(sync1, 0);
15244d362409d5469aed47d19e7908d19bd194493aThomas Graf
15344d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account1, 0, authority);
15444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
15544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
15644d362409d5469aed47d19e7908d19bd194493aThomas Graf
15744d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account2, 0, authority);
15844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
15944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync4, syncs.get(0));
16044d362409d5469aed47d19e7908d19bd194493aThomas Graf
16144d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(sync2.account, 1, sync2.authority);
16244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
16344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2, syncs.get(0));
16444d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
16544d362409d5469aed47d19e7908d19bd194493aThomas Graf
16644d362409d5469aed47d19e7908d19bd194493aThomas Graf    /**
16744d362409d5469aed47d19e7908d19bd194493aThomas Graf     * Test that we can create, remove and retrieve periodic syncs with a provided flex time.
16844d362409d5469aed47d19e7908d19bd194493aThomas Graf     */
16944d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
17044d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testPeriodicsV2() throws Exception {
17144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account1 = new Account("a@example.com", "example.type");
17244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account2 = new Account("b@example.com", "example.type.2");
17344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority = "testprovider";
17444d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras1 = new Bundle();
17544d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras1.putString("a", "1");
17644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras2 = new Bundle();
17744d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putString("a", "2");
17844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period1 = 200;
17944d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period2 = 1000;
18044d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int flex1 = 10;
18144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int flex2 = 100;
18244d362409d5469aed47d19e7908d19bd194493aThomas Graf
18344d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1, flex1);
18444d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1, flex1);
18544d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2, flex2);
18644d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2, flex2);
18744d362409d5469aed47d19e7908d19bd194493aThomas Graf
18844d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
18944d362409d5469aed47d19e7908d19bd194493aThomas Graf
19044d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
19144d362409d5469aed47d19e7908d19bd194493aThomas Graf                new TestContext(mockResolver, getContext()));
19244d362409d5469aed47d19e7908d19bd194493aThomas Graf
19344d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 0, authority);
19444d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account2, 0, authority);
19544d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 1, authority);
19644d362409d5469aed47d19e7908d19bd194493aThomas Graf
19744d362409d5469aed47d19e7908d19bd194493aThomas Graf        // This should add two distinct periodic syncs for account1 and one for account2
19844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync1, 0);
19944d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync2, 0);
20044d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync3, 0); // Should edit sync2 and update the period.
20144d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync4, 0);
20244d362409d5469aed47d19e7908d19bd194493aThomas Graf        // add a second user
20344d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync2, 1);
20444d362409d5469aed47d19e7908d19bd194493aThomas Graf
20544d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority);
20644d362409d5469aed47d19e7908d19bd194493aThomas Graf
20744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(2, syncs.size());
20844d362409d5469aed47d19e7908d19bd194493aThomas Graf
20944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1, syncs.get(0));
21044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(1));
21144d362409d5469aed47d19e7908d19bd194493aThomas Graf
21244d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.removePeriodicSync(sync1, 0);
21344d362409d5469aed47d19e7908d19bd194493aThomas Graf
21444d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account1, 0, authority);
21544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
21644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
21744d362409d5469aed47d19e7908d19bd194493aThomas Graf
21844d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account2, 0, authority);
21944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
22044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync4, syncs.get(0));
22144d362409d5469aed47d19e7908d19bd194493aThomas Graf
22244d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(sync2.account, 1, sync2.authority);
22344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
22444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2, syncs.get(0));
22544d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
22644d362409d5469aed47d19e7908d19bd194493aThomas Graf
22744d362409d5469aed47d19e7908d19bd194493aThomas Graf    private void removePeriodicSyncs(SyncStorageEngine engine, Account account, int userId, String authority) {
22844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setIsSyncable(account, userId, authority, engine.getIsSyncable(account, 0, authority));
22944d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, userId, authority);
23044d362409d5469aed47d19e7908d19bd194493aThomas Graf        for (PeriodicSync sync : syncs) {
23144d362409d5469aed47d19e7908d19bd194493aThomas Graf            engine.removePeriodicSync(sync, userId);
23244d362409d5469aed47d19e7908d19bd194493aThomas Graf        }
23344d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
23444d362409d5469aed47d19e7908d19bd194493aThomas Graf
23544d362409d5469aed47d19e7908d19bd194493aThomas Graf    @LargeTest
23644d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testAuthorityPersistence() throws Exception {
23744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account1 = new Account("a@example.com", "example.type");
23844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account2 = new Account("b@example.com", "example.type.2");
23944d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority1 = "testprovider1";
24044d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority2 = "testprovider2";
24144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras1 = new Bundle();
24244d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras1.putString("a", "1");
24344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras2 = new Bundle();
24444d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putString("a", "2");
24544d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putLong("b", 2);
24644d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putInt("c", 1);
24744d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putBoolean("d", true);
24844d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putDouble("e", 1.2);
24944d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putFloat("f", 4.5f);
25044d362409d5469aed47d19e7908d19bd194493aThomas Graf        extras2.putParcelable("g", account1);
25144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period1 = 200;
25244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int period2 = 1000;
25344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int flex1 = 10;
25444d362409d5469aed47d19e7908d19bd194493aThomas Graf        final int flex2 = 100;
25544d362409d5469aed47d19e7908d19bd194493aThomas Graf
25644d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1 = new PeriodicSync(account1, authority1, extras1, period1, flex1);
25744d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2 = new PeriodicSync(account1, authority1, extras2, period1, flex1);
25844d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3 = new PeriodicSync(account1, authority2, extras1, period1, flex1);
25944d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync4 = new PeriodicSync(account1, authority2, extras2, period2, flex2);
26044d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync5 = new PeriodicSync(account2, authority1, extras1, period1, flex1);
26144d362409d5469aed47d19e7908d19bd194493aThomas Graf
26244d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
26344d362409d5469aed47d19e7908d19bd194493aThomas Graf
26444d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
26544d362409d5469aed47d19e7908d19bd194493aThomas Graf                new TestContext(mockResolver, getContext()));
26644d362409d5469aed47d19e7908d19bd194493aThomas Graf
26744d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 0, authority1);
26844d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account2, 0, authority1);
26944d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account1, 0, authority2);
27044d362409d5469aed47d19e7908d19bd194493aThomas Graf        removePeriodicSyncs(engine, account2, 0, authority2);
27144d362409d5469aed47d19e7908d19bd194493aThomas Graf
27244d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setMasterSyncAutomatically(false, 0);
27344d362409d5469aed47d19e7908d19bd194493aThomas Graf
27444d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setIsSyncable(account1, 0, authority1, 1);
27544d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setSyncAutomatically(account1, 0, authority1, true);
27644d362409d5469aed47d19e7908d19bd194493aThomas Graf
27744d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setIsSyncable(account2, 0, authority1, 1);
27844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setSyncAutomatically(account2, 0, authority1, true);
27944d362409d5469aed47d19e7908d19bd194493aThomas Graf
28044d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setIsSyncable(account1, 0, authority2, 1);
28144d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setSyncAutomatically(account1, 0, authority2, false);
28244d362409d5469aed47d19e7908d19bd194493aThomas Graf
28344d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setIsSyncable(account2, 0, authority2, 0);
28444d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.setSyncAutomatically(account2, 0, authority2, true);
28544d362409d5469aed47d19e7908d19bd194493aThomas Graf
28644d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync1, 0);
28744d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync2, 0);
28844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync3, 0);
28944d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync4, 0);
29044d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.addPeriodicSync(sync5, 0);
29144d362409d5469aed47d19e7908d19bd194493aThomas Graf
29244d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.writeAllState();
29344d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
29444d362409d5469aed47d19e7908d19bd194493aThomas Graf
29544d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority1);
29644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(2, syncs.size());
29744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1, syncs.get(0));
29844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2, syncs.get(1));
29944d362409d5469aed47d19e7908d19bd194493aThomas Graf
30044d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account1, 0, authority2);
30144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(2, syncs.size());
30244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
30344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync4, syncs.get(1));
30444d362409d5469aed47d19e7908d19bd194493aThomas Graf
30544d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account2, 0, authority1);
30644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
30744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync5, syncs.get(0));
30844d362409d5469aed47d19e7908d19bd194493aThomas Graf
30944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account1, 0, authority1));
31044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority1));
31144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account1, 0, authority2));
31244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account2, 0, authority2));
31344d362409d5469aed47d19e7908d19bd194493aThomas Graf
31444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, engine.getIsSyncable(account1, 0, authority1));
31544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, engine.getIsSyncable(account2, 0, authority1));
31644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, engine.getIsSyncable(account1, 0, authority2));
31744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, engine.getIsSyncable(account2, 0, authority2));
31844d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
31944d362409d5469aed47d19e7908d19bd194493aThomas Graf
32044d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
32144d362409d5469aed47d19e7908d19bd194493aThomas Graf    /**
32244d362409d5469aed47d19e7908d19bd194493aThomas Graf     * V2 introduces flex time as well as service components.
32344d362409d5469aed47d19e7908d19bd194493aThomas Graf     * @throws Exception
32444d362409d5469aed47d19e7908d19bd194493aThomas Graf     */
32544d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testAuthorityParsingV2() throws Exception {
32644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account = new Account("account1", "type1");
32744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority1 = "auth1";
32844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority2 = "auth2";
32944d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority3 = "auth3";
33044d362409d5469aed47d19e7908d19bd194493aThomas Graf
33144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final long dayPoll = (60 * 60 * 24);
33244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final long dayFuzz = 60;
33344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final long thousandSecs = 1000;
33444d362409d5469aed47d19e7908d19bd194493aThomas Graf        final long thousandSecsFuzz = 100;
33544d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras = new Bundle();
33644d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, dayPoll, dayFuzz);
33744d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, dayPoll, dayFuzz);
33844d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, dayPoll, dayFuzz);
33944d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, thousandSecs, thousandSecsFuzz);
34044d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, thousandSecs, thousandSecsFuzz);
34144d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, thousandSecs, thousandSecsFuzz);
34244d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
34344d362409d5469aed47d19e7908d19bd194493aThomas Graf
34444d362409d5469aed47d19e7908d19bd194493aThomas Graf        final TestContext testContext = new TestContext(mockResolver, getContext());
34544d362409d5469aed47d19e7908d19bd194493aThomas Graf
34644d362409d5469aed47d19e7908d19bd194493aThomas Graf        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
34744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts version=\"2\" >\n"
34844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" >"
34944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
35044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n</authority>"
35144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth2\" >"
35244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
35344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n</authority>"
35444d362409d5469aed47d19e7908d19bd194493aThomas Graf                // No user defaults to user 0 - all users.
35544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\"            account=\"account1\" type=\"type1\" authority=\"auth3\" >"
35644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
35744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n</authority>"
35844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"3\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth3\" >"
35944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
36044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "\n</authority>"
36144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>").getBytes();
36244d362409d5469aed47d19e7908d19bd194493aThomas Graf
36344d362409d5469aed47d19e7908d19bd194493aThomas Graf        File syncDir = getSyncDir();
36444d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncDir.mkdirs();
36544d362409d5469aed47d19e7908d19bd194493aThomas Graf        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
36644d362409d5469aed47d19e7908d19bd194493aThomas Graf        FileOutputStream fos = accountInfoFile.startWrite();
36744d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
36844d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
36944d362409d5469aed47d19e7908d19bd194493aThomas Graf
37044d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
37144d362409d5469aed47d19e7908d19bd194493aThomas Graf
37244d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, 0, authority1);
37344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals("Got incorrect # of syncs", 1, syncs.size());
37444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1, syncs.get(0));
37544d362409d5469aed47d19e7908d19bd194493aThomas Graf
37644d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
37744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
37844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2, syncs.get(0));
37944d362409d5469aed47d19e7908d19bd194493aThomas Graf
38044d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
38144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
38244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
38344d362409d5469aed47d19e7908d19bd194493aThomas Graf
38444d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 1, authority3);
38544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
38644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
38744d362409d5469aed47d19e7908d19bd194493aThomas Graf
38844d362409d5469aed47d19e7908d19bd194493aThomas Graf        // Test empty periodic data.
38944d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
39044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts version=\"2\">\n"
39144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
39244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
39344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
39444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
39544d362409d5469aed47d19e7908d19bd194493aThomas Graf
39644d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
39744d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos = accountInfoFile.startWrite();
39844d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
39944d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
40044d362409d5469aed47d19e7908d19bd194493aThomas Graf
40144d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
40244d362409d5469aed47d19e7908d19bd194493aThomas Graf
40344d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority1);
40444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
40544d362409d5469aed47d19e7908d19bd194493aThomas Graf
40644d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
40744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
40844d362409d5469aed47d19e7908d19bd194493aThomas Graf
40944d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
41044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
41144d362409d5469aed47d19e7908d19bd194493aThomas Graf
41244d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
41344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts version=\"2\">\n"
41444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
41544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
41644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
41744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
41844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
41944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
42044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
42144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
42244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
42344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
42444d362409d5469aed47d19e7908d19bd194493aThomas Graf
42544d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
42644d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos = accountInfoFile.startWrite();
42744d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
42844d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
42944d362409d5469aed47d19e7908d19bd194493aThomas Graf
43044d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
43144d362409d5469aed47d19e7908d19bd194493aThomas Graf
43244d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority1);
43344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
43444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1s, syncs.get(0));
43544d362409d5469aed47d19e7908d19bd194493aThomas Graf
43644d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
43744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
43844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2s, syncs.get(0));
43944d362409d5469aed47d19e7908d19bd194493aThomas Graf
44044d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
44144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
44244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3s, syncs.get(0));
44344d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
44444d362409d5469aed47d19e7908d19bd194493aThomas Graf
44544d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
44644d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testAuthorityParsing() throws Exception {
44744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account = new Account("account1", "type1");
44844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority1 = "auth1";
44944d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority2 = "auth2";
45044d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authority3 = "auth3";
45144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Bundle extras = new Bundle();
45244d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, (long) (60 * 60 * 24));
45344d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, (long) (60 * 60 * 24));
45444d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, (long) (60 * 60 * 24));
45544d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, 1000);
45644d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, 1000);
45744d362409d5469aed47d19e7908d19bd194493aThomas Graf        PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, 1000);
45844d362409d5469aed47d19e7908d19bd194493aThomas Graf
45944d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
46044d362409d5469aed47d19e7908d19bd194493aThomas Graf
46144d362409d5469aed47d19e7908d19bd194493aThomas Graf        final TestContext testContext = new TestContext(mockResolver, getContext());
46244d362409d5469aed47d19e7908d19bd194493aThomas Graf
46344d362409d5469aed47d19e7908d19bd194493aThomas Graf        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
46444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts>\n"
46544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
46644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
46744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\"            account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
46844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"3\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
46944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
47044d362409d5469aed47d19e7908d19bd194493aThomas Graf
47144d362409d5469aed47d19e7908d19bd194493aThomas Graf        File syncDir = getSyncDir();
47244d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncDir.mkdirs();
47344d362409d5469aed47d19e7908d19bd194493aThomas Graf        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
47444d362409d5469aed47d19e7908d19bd194493aThomas Graf        FileOutputStream fos = accountInfoFile.startWrite();
47544d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
47644d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
47744d362409d5469aed47d19e7908d19bd194493aThomas Graf
47844d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
47944d362409d5469aed47d19e7908d19bd194493aThomas Graf
48044d362409d5469aed47d19e7908d19bd194493aThomas Graf        List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, 0, authority1);
48144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
48244d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals("expected sync1: " + sync1.toString() + " == sync 2" + syncs.get(0).toString(), sync1, syncs.get(0));
48344d362409d5469aed47d19e7908d19bd194493aThomas Graf
48444d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
48544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
48644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2, syncs.get(0));
48744d362409d5469aed47d19e7908d19bd194493aThomas Graf
48844d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
48944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
49044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
49144d362409d5469aed47d19e7908d19bd194493aThomas Graf
49244d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 1, authority3);
49344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
49444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3, syncs.get(0));
49544d362409d5469aed47d19e7908d19bd194493aThomas Graf
49644d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
49744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts version=\"2\">\n"
49844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
49944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
50044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
50144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
50244d362409d5469aed47d19e7908d19bd194493aThomas Graf
50344d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
50444d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos = accountInfoFile.startWrite();
50544d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
50644d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
50744d362409d5469aed47d19e7908d19bd194493aThomas Graf
50844d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
50944d362409d5469aed47d19e7908d19bd194493aThomas Graf
51044d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority1);
51144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
51244d362409d5469aed47d19e7908d19bd194493aThomas Graf
51344d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
51444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
51544d362409d5469aed47d19e7908d19bd194493aThomas Graf
51644d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
51744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, syncs.size());
51844d362409d5469aed47d19e7908d19bd194493aThomas Graf
51944d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
52044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts version=\"2\">\n"
52144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
52244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
52344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
52444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
52544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
52644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
52744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
52844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<periodicSync period=\"1000\" />\n"
52944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</authority>"
53044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
53144d362409d5469aed47d19e7908d19bd194493aThomas Graf
53244d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
53344d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos = accountInfoFile.startWrite();
53444d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
53544d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
53644d362409d5469aed47d19e7908d19bd194493aThomas Graf
53744d362409d5469aed47d19e7908d19bd194493aThomas Graf        engine.clearAndReadState();
53844d362409d5469aed47d19e7908d19bd194493aThomas Graf
53944d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority1);
54044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
54144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync1s, syncs.get(0));
54244d362409d5469aed47d19e7908d19bd194493aThomas Graf
54344d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority2);
54444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
54544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync2s, syncs.get(0));
54644d362409d5469aed47d19e7908d19bd194493aThomas Graf
54744d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncs = engine.getPeriodicSyncs(account, 0, authority3);
54844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, syncs.size());
54944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(sync3s, syncs.get(0));
55044d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
55144d362409d5469aed47d19e7908d19bd194493aThomas Graf
55244d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
55344d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testListenForTicklesParsing() throws Exception {
55444d362409d5469aed47d19e7908d19bd194493aThomas Graf        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
55544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts>\n"
55644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<listenForTickles user=\"0\" enabled=\"false\" />"
55744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<listenForTickles user=\"1\" enabled=\"true\" />"
55844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
55944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
56044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
56144d362409d5469aed47d19e7908d19bd194493aThomas Graf
56244d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
56344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final TestContext testContext = new TestContext(mockResolver, getContext());
56444d362409d5469aed47d19e7908d19bd194493aThomas Graf
56544d362409d5469aed47d19e7908d19bd194493aThomas Graf        File syncDir = getSyncDir();
56644d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncDir.mkdirs();
56744d362409d5469aed47d19e7908d19bd194493aThomas Graf        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
56844d362409d5469aed47d19e7908d19bd194493aThomas Graf        FileOutputStream fos = accountInfoFile.startWrite();
56944d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
57044d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
57144d362409d5469aed47d19e7908d19bd194493aThomas Graf
57244d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
57344d362409d5469aed47d19e7908d19bd194493aThomas Graf
57444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getMasterSyncAutomatically(0));
57544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getMasterSyncAutomatically(1));
57644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getMasterSyncAutomatically(2));
57744d362409d5469aed47d19e7908d19bd194493aThomas Graf
57844d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
57944d362409d5469aed47d19e7908d19bd194493aThomas Graf
58044d362409d5469aed47d19e7908d19bd194493aThomas Graf    @MediumTest
58144d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testAuthorityRenaming() throws Exception {
58244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account1 = new Account("acc1", "type1");
58344d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account2 = new Account("acc2", "type2");
58444d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authorityContacts = "contacts";
58544d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authorityCalendar = "calendar";
58644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authorityOther = "other";
58744d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authorityContactsNew = "com.android.contacts";
58844d362409d5469aed47d19e7908d19bd194493aThomas Graf        final String authorityCalendarNew = "com.android.calendar";
58944d362409d5469aed47d19e7908d19bd194493aThomas Graf
59044d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
59144d362409d5469aed47d19e7908d19bd194493aThomas Graf
59244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final TestContext testContext = new TestContext(mockResolver, getContext());
59344d362409d5469aed47d19e7908d19bd194493aThomas Graf
59444d362409d5469aed47d19e7908d19bd194493aThomas Graf        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
59544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts>\n"
59644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"acc1\" type=\"type1\" authority=\"contacts\" />\n"
59744d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"acc1\" type=\"type1\" authority=\"calendar\" />\n"
59844d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"acc1\" type=\"type1\" authority=\"other\" />\n"
59944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"3\" account=\"acc2\" type=\"type2\" authority=\"contacts\" />\n"
60044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"4\" account=\"acc2\" type=\"type2\" authority=\"calendar\" />\n"
60144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"5\" account=\"acc2\" type=\"type2\" authority=\"other\" />\n"
60244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"6\" account=\"acc2\" type=\"type2\" enabled=\"false\""
60344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + " authority=\"com.android.calendar\" />\n"
60444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"7\" account=\"acc2\" type=\"type2\" enabled=\"false\""
60544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + " authority=\"com.android.contacts\" />\n"
60644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
60744d362409d5469aed47d19e7908d19bd194493aThomas Graf
60844d362409d5469aed47d19e7908d19bd194493aThomas Graf        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
60944d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncDir.mkdirs();
61044d362409d5469aed47d19e7908d19bd194493aThomas Graf        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
61144d362409d5469aed47d19e7908d19bd194493aThomas Graf        FileOutputStream fos = accountInfoFile.startWrite();
61244d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
61344d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
61444d362409d5469aed47d19e7908d19bd194493aThomas Graf
61544d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
61644d362409d5469aed47d19e7908d19bd194493aThomas Graf
61744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityContacts));
61844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityCalendar));
61944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityOther));
62044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityContactsNew));
62144d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityCalendarNew));
62244d362409d5469aed47d19e7908d19bd194493aThomas Graf
62344d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContacts));
62444d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendar));
62544d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(true, engine.getSyncAutomatically(account2, 0, authorityOther));
62644d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContactsNew));
62744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendarNew));
62844d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
62944d362409d5469aed47d19e7908d19bd194493aThomas Graf
63044d362409d5469aed47d19e7908d19bd194493aThomas Graf    @SmallTest
63144d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void testSyncableMigration() throws Exception {
63244d362409d5469aed47d19e7908d19bd194493aThomas Graf        final Account account = new Account("acc", "type");
63344d362409d5469aed47d19e7908d19bd194493aThomas Graf
63444d362409d5469aed47d19e7908d19bd194493aThomas Graf        MockContentResolver mockResolver = new MockContentResolver();
63544d362409d5469aed47d19e7908d19bd194493aThomas Graf
63644d362409d5469aed47d19e7908d19bd194493aThomas Graf        final TestContext testContext = new TestContext(mockResolver, getContext());
63744d362409d5469aed47d19e7908d19bd194493aThomas Graf
63844d362409d5469aed47d19e7908d19bd194493aThomas Graf        byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
63944d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<accounts>\n"
64044d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"0\" account=\"acc\" authority=\"other1\" />\n"
64144d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"1\" account=\"acc\" type=\"type\" authority=\"other2\" />\n"
64244d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"2\" account=\"acc\" type=\"type\" syncable=\"false\""
64344d362409d5469aed47d19e7908d19bd194493aThomas Graf                + " authority=\"other3\" />\n"
64444d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "<authority id=\"3\" account=\"acc\" type=\"type\" syncable=\"true\""
64544d362409d5469aed47d19e7908d19bd194493aThomas Graf                + " authority=\"other4\" />\n"
64644d362409d5469aed47d19e7908d19bd194493aThomas Graf                + "</accounts>\n").getBytes();
64744d362409d5469aed47d19e7908d19bd194493aThomas Graf
64844d362409d5469aed47d19e7908d19bd194493aThomas Graf        File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
64944d362409d5469aed47d19e7908d19bd194493aThomas Graf        syncDir.mkdirs();
65044d362409d5469aed47d19e7908d19bd194493aThomas Graf        AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
65144d362409d5469aed47d19e7908d19bd194493aThomas Graf        FileOutputStream fos = accountInfoFile.startWrite();
65244d362409d5469aed47d19e7908d19bd194493aThomas Graf        fos.write(accountsFileData);
65344d362409d5469aed47d19e7908d19bd194493aThomas Graf        accountInfoFile.finishWrite(fos);
65444d362409d5469aed47d19e7908d19bd194493aThomas Graf
65544d362409d5469aed47d19e7908d19bd194493aThomas Graf        SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
65644d362409d5469aed47d19e7908d19bd194493aThomas Graf
65744d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(-1, engine.getIsSyncable(account, 0, "other1"));
65844d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, engine.getIsSyncable(account, 0, "other2"));
65944d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(0, engine.getIsSyncable(account, 0, "other3"));
66044d362409d5469aed47d19e7908d19bd194493aThomas Graf        assertEquals(1, engine.getIsSyncable(account, 0, "other4"));
66144d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
66244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
66344d362409d5469aed47d19e7908d19bd194493aThomas Graf
66444d362409d5469aed47d19e7908d19bd194493aThomas Grafclass TestContext extends ContextWrapper {
66544d362409d5469aed47d19e7908d19bd194493aThomas Graf
66644d362409d5469aed47d19e7908d19bd194493aThomas Graf    ContentResolver mResolver;
66744d362409d5469aed47d19e7908d19bd194493aThomas Graf
66844d362409d5469aed47d19e7908d19bd194493aThomas Graf    private final Context mRealContext;
66944d362409d5469aed47d19e7908d19bd194493aThomas Graf
67044d362409d5469aed47d19e7908d19bd194493aThomas Graf    public TestContext(ContentResolver resolver, Context realContext) {
67144d362409d5469aed47d19e7908d19bd194493aThomas Graf        super(new RenamingDelegatingContext(new MockContext(), realContext, "test."));
67244d362409d5469aed47d19e7908d19bd194493aThomas Graf        mRealContext = realContext;
67344d362409d5469aed47d19e7908d19bd194493aThomas Graf        mResolver = resolver;
67444d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
67544d362409d5469aed47d19e7908d19bd194493aThomas Graf
67644d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
67744d362409d5469aed47d19e7908d19bd194493aThomas Graf    public Resources getResources() {
67844d362409d5469aed47d19e7908d19bd194493aThomas Graf        return mRealContext.getResources();
67944d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
68044d362409d5469aed47d19e7908d19bd194493aThomas Graf
68144d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
68244d362409d5469aed47d19e7908d19bd194493aThomas Graf    public File getFilesDir() {
68344d362409d5469aed47d19e7908d19bd194493aThomas Graf        return mRealContext.getFilesDir();
68444d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
68544d362409d5469aed47d19e7908d19bd194493aThomas Graf
68644d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
68744d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void enforceCallingOrSelfPermission(String permission, String message) {
68844d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
68944d362409d5469aed47d19e7908d19bd194493aThomas Graf
69044d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
69144d362409d5469aed47d19e7908d19bd194493aThomas Graf    public void sendBroadcast(Intent intent) {
69244d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
69344d362409d5469aed47d19e7908d19bd194493aThomas Graf
69444d362409d5469aed47d19e7908d19bd194493aThomas Graf    @Override
69544d362409d5469aed47d19e7908d19bd194493aThomas Graf    public ContentResolver getContentResolver() {
69644d362409d5469aed47d19e7908d19bd194493aThomas Graf        return mResolver;
69744d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
69844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
69944d362409d5469aed47d19e7908d19bd194493aThomas Graf