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