1/*
2 * Copyright (C) 2010 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 com.android.server.content;
18
19import android.accounts.Account;
20import android.content.ContentResolver;
21import android.content.Context;
22import android.os.Bundle;
23import android.os.PersistableBundle;
24import android.os.SystemClock;
25import android.provider.Settings;
26import android.test.AndroidTestCase;
27import android.test.suitebuilder.annotation.SmallTest;
28
29/**
30 * You can run those tests with:
31 *
32 * adb shell am instrument
33 * -e debug false
34 * -w
35 * -e class android.content.SyncOperationTest com.android.frameworks.coretests/android.test.InstrumentationTestRunner
36 */
37
38public class SyncOperationTest extends AndroidTestCase {
39
40    Account mDummy;
41    /** Indicate an unimportant long that we're not testing. */
42    long mUnimportantLong = 0L;
43    /** Empty bundle. */
44    Bundle mEmpty;
45    /** Silly authority. */
46    String mAuthority;
47
48    @Override
49    public void setUp() {
50        mDummy = new Account("account1", "type1");
51        mEmpty = new Bundle();
52        mAuthority = "authority1";
53    }
54
55    @SmallTest
56    public void testToKey() {
57        Account account1 = new Account("account1", "type1");
58        Account account2 = new Account("account2", "type2");
59
60        Bundle b1 = new Bundle();
61        Bundle b2 = new Bundle();
62        b2.putBoolean("b2", true);
63
64        SyncOperation op1 = new SyncOperation(account1, 0,
65                1, "foo", 0,
66                SyncOperation.REASON_PERIODIC,
67                "authority1",
68                b1,
69                false);
70
71        // Same as op1 but different time infos
72        SyncOperation op2 = new SyncOperation(account1, 0,
73                1, "foo", 0,
74                SyncOperation.REASON_PERIODIC,
75                "authority1",
76                b1,
77                false);
78
79        // Same as op1 but different authority
80        SyncOperation op3 = new SyncOperation(account1, 0,
81                1, "foo", 0,
82                SyncOperation.REASON_PERIODIC,
83                "authority2",
84                b1,
85                false);
86
87        // Same as op1 but different account
88        SyncOperation op4 = new SyncOperation(account2, 0,
89                1, "foo", 0,
90                SyncOperation.REASON_PERIODIC,
91                "authority1",
92                b1,
93                false);
94
95        // Same as op1 but different bundle
96        SyncOperation op5 = new SyncOperation(account1, 0,
97                1, "foo", 0,
98                SyncOperation.REASON_PERIODIC,
99                "authority1",
100                b2,
101                false);
102
103        assertEquals(op1.key, op2.key);
104        assertNotSame(op1.key, op3.key);
105        assertNotSame(op1.key, op4.key);
106        assertNotSame(op1.key, op5.key);
107    }
108
109    @SmallTest
110    public void testConversionToExtras() {
111        Account account1 = new Account("account1", "type1");
112        Bundle b1 = new Bundle();
113        b1.putParcelable("acc", account1);
114        b1.putString("str", "String");
115
116        SyncOperation op1 = new SyncOperation(account1, 0,
117                1, "foo", 0,
118                SyncOperation.REASON_PERIODIC,
119                "authority1",
120                b1,
121                false);
122
123        PersistableBundle pb = op1.toJobInfoExtras();
124        SyncOperation op2 = SyncOperation.maybeCreateFromJobExtras(pb);
125
126        assertTrue("Account fields in extras not persisted.",
127                account1.equals(op2.extras.get("acc")));
128        assertTrue("Fields in extras not persisted", "String".equals(op2.extras.getString("str")));
129    }
130
131    @SmallTest
132    public void testConversionFromExtras() {
133        PersistableBundle extras = new PersistableBundle();
134        SyncOperation op = SyncOperation.maybeCreateFromJobExtras(extras);
135        assertTrue("Non sync operation bundle falsely converted to SyncOperation.", op == null);
136    }
137
138    /**
139     * Tests whether a failed periodic sync operation is converted correctly into a one time
140     * sync operation, and whether the periodic sync can be re-created from the one-time operation.
141     */
142    @SmallTest
143    public void testFailedPeriodicConversion() {
144        SyncStorageEngine.EndPoint ep = new SyncStorageEngine.EndPoint(new Account("name", "type"),
145                "provider", 0);
146        Bundle extras = new Bundle();
147        SyncOperation periodic = new SyncOperation(ep, 0, "package", 0, 0, extras, false, true,
148                SyncOperation.NO_JOB_ID, 60000, 10000);
149        SyncOperation oneoff = periodic.createOneTimeSyncOperation();
150        assertFalse("Conversion to oneoff sync failed.", oneoff.isPeriodic);
151        assertEquals("Period not restored", periodic.periodMillis, oneoff.periodMillis);
152        assertEquals("Flex not restored", periodic.flexMillis, oneoff.flexMillis);
153    }
154}
155