/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.content; import android.test.AndroidTestCase; import android.test.RenamingDelegatingContext; import android.test.mock.MockContext; import android.test.mock.MockContentResolver; import android.accounts.Account; import android.os.Bundle; import android.os.SystemClock; public class SyncQueueTest extends AndroidTestCase { private static final Account ACCOUNT1 = new Account("test.account1", "test.type1"); private static final Account ACCOUNT2 = new Account("test.account2", "test.type2"); private static final String AUTHORITY1 = "test.authority1"; private static final String AUTHORITY2 = "test.authority2"; private static final String AUTHORITY3 = "test.authority3"; private SyncStorageEngine mSettings; private SyncQueue mSyncQueue; @Override protected void setUp() throws Exception { super.setUp(); MockContentResolver mockResolver = new MockContentResolver(); mSettings = SyncStorageEngine.newTestInstance(new TestContext(mockResolver, getContext())); mSyncQueue = new SyncQueue(mSettings); } public void testSyncQueueOrder() throws Exception { final SyncOperation op1 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("1"), 0); final SyncOperation op2 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY2, newTestBundle("2"), 100); final SyncOperation op3 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("3"), 150); final SyncOperation op4 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY2, newTestBundle("4"), 60); final SyncOperation op5 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("5"), 80); final SyncOperation op6 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY2, newTestBundle("6"), 0); op6.expedited = true; mSyncQueue.add(op1); mSyncQueue.add(op2); mSyncQueue.add(op3); mSyncQueue.add(op4); mSyncQueue.add(op5); mSyncQueue.add(op6); long now = SystemClock.elapsedRealtime() + 200; assertEquals(op6, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op6); assertEquals(op1, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op1); assertEquals(op4, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op4); assertEquals(op5, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op5); assertEquals(op2, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op2); assertEquals(op3, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op3); } public void testOrderWithBackoff() throws Exception { final SyncOperation op1 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("1"), 0); final SyncOperation op2 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY2, newTestBundle("2"), 100); final SyncOperation op3 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("3"), 150); final SyncOperation op4 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY3, newTestBundle("4"), 60); final SyncOperation op5 = new SyncOperation( ACCOUNT1, SyncStorageEngine.SOURCE_USER, AUTHORITY1, newTestBundle("5"), 80); final SyncOperation op6 = new SyncOperation( ACCOUNT2, SyncStorageEngine.SOURCE_USER, AUTHORITY2, newTestBundle("6"), 0); op6.expedited = true; mSyncQueue.add(op1); mSyncQueue.add(op2); mSyncQueue.add(op3); mSyncQueue.add(op4); mSyncQueue.add(op5); mSyncQueue.add(op6); long now = SystemClock.elapsedRealtime() + 200; assertEquals(op6, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op6); assertEquals(op1, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op1); mSettings.setBackoff(ACCOUNT2, AUTHORITY3, now + 200, 5); assertEquals(op5, mSyncQueue.nextReadyToRun(now).first); mSettings.setBackoff(ACCOUNT2, AUTHORITY3, SyncStorageEngine.NOT_IN_BACKOFF_MODE, 0); assertEquals(op4, mSyncQueue.nextReadyToRun(now).first); mSettings.setDelayUntilTime(ACCOUNT2, AUTHORITY3, now + 200); assertEquals(op5, mSyncQueue.nextReadyToRun(now).first); mSettings.setDelayUntilTime(ACCOUNT2, AUTHORITY3, 0); assertEquals(op4, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op4); assertEquals(op5, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op5); assertEquals(op2, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op2); assertEquals(op3, mSyncQueue.nextReadyToRun(now).first); mSyncQueue.remove(op3); } Bundle newTestBundle(String val) { Bundle bundle = new Bundle(); bundle.putString("test", val); return bundle; } static class TestContext extends ContextWrapper { ContentResolver mResolver; public TestContext(ContentResolver resolver, Context realContext) { super(new RenamingDelegatingContext(new MockContext(), realContext, "test.")); mResolver = resolver; } @Override public void enforceCallingOrSelfPermission(String permission, String message) { } @Override public ContentResolver getContentResolver() { return mResolver; } } }