1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.test;
18
19import android.content.ContentResolver;
20import android.content.Context;
21import android.os.Bundle;
22import android.os.SystemClock;
23import android.net.Uri;
24import android.accounts.Account;
25
26/**
27 * If you would like to test sync a single provider with an
28 * {@link InstrumentationTestCase}, this provides some of the boiler plate in {@link #setUp} and
29 * {@link #tearDown}.
30 */
31public class SyncBaseInstrumentation extends InstrumentationTestCase {
32    private Context mTargetContext;
33    ContentResolver mContentResolver;
34    private static final int MAX_TIME_FOR_SYNC_IN_MINS = 20;
35
36    @Override
37    protected void setUp() throws Exception {
38        super.setUp();
39        mTargetContext = getInstrumentation().getTargetContext();
40        mContentResolver = mTargetContext.getContentResolver();
41    }
42
43    /**
44     * Syncs the specified provider.
45     * @throws Exception
46     */
47    protected void syncProvider(Uri uri, String accountName, String authority) throws Exception {
48        Bundle extras = new Bundle();
49        extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
50        Account account = new Account(accountName, "com.google");
51
52        ContentResolver.requestSync(account, authority, extras);
53        long startTimeInMillis = SystemClock.elapsedRealtime();
54        long endTimeInMillis = startTimeInMillis + MAX_TIME_FOR_SYNC_IN_MINS * 60000;
55
56        int counter = 0;
57        // Making sure race condition does not occur when en entry have been removed from pending
58        // and active tables and loaded in memory (therefore sync might be still in progress)
59        while (counter < 2) {
60            // Sleep for 1 second.
61            Thread.sleep(1000);
62            // Finish test if time to sync has exceeded max time.
63            if (SystemClock.elapsedRealtime() > endTimeInMillis) {
64                break;
65            }
66
67            if (ContentResolver.isSyncActive(account, authority)) {
68                counter = 0;
69                continue;
70            }
71            counter++;
72        }
73    }
74
75    protected void cancelSyncsandDisableAutoSync() {
76        ContentResolver.setMasterSyncAutomatically(false);
77        ContentResolver.cancelSync(null /* all accounts */, null /* all authorities */);
78    }
79}
80