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