120d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling/*
220d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * Copyright (C) 2016 The Android Open Source Project
320d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling *
420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * Licensed under the Apache License, Version 2.0 (the "License");
520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * you may not use this file except in compliance with the License.
620d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * You may obtain a copy of the License at
720d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling *
820d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling *      http://www.apache.org/licenses/LICENSE-2.0
920d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling *
1020d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * Unless required by applicable law or agreed to in writing, software
1120d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * distributed under the License is distributed on an "AS IS" BASIS,
1220d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * See the License for the specific language governing permissions and
1420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling * limitations under the License.
1520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling */
1620d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingpackage com.android.settings.accounts;
1720d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
18044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhangimport static com.google.common.truth.Truth.assertThat;
19771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
20771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport static org.mockito.Answers.RETURNS_DEEP_STUBS;
21771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport static org.mockito.Matchers.anyInt;
22771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport static org.mockito.Mockito.when;
23044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang
2420d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport android.accounts.Account;
25771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport android.accounts.AccountManager;
26771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport android.accounts.AuthenticatorDescription;
2720d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport android.content.Context;
28044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhangimport android.content.Intent;
29771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport android.content.SyncAdapterType;
3020d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport android.os.UserHandle;
3120d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport android.support.v7.preference.Preference;
3220d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
33044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhangimport com.android.settings.R;
3420d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport com.android.settings.SettingsActivity;
359f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
3620d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport com.android.settings.TestConfig;
37771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport com.android.settings.testutils.shadow.ShadowAccountManager;
38771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport com.android.settings.testutils.shadow.ShadowContentResolver;
3920d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
40771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport org.junit.After;
41771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport org.junit.Before;
4220d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport org.junit.Test;
4320d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport org.junit.runner.RunWith;
44771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport org.mockito.Mock;
45771848dde0d2960b8ec7d359090ba5106d6bb727Doris Lingimport org.mockito.MockitoAnnotations;
4620d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport org.robolectric.annotation.Config;
4720d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingimport org.robolectric.shadows.ShadowApplication;
4820d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
4920d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling@RunWith(SettingsRobolectricTestRunner.class)
50771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
51771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        shadows = {ShadowAccountManager.class, ShadowContentResolver.class})
5220d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingpublic class AccountSyncPreferenceControllerTest {
5320d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
54771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Mock(answer = RETURNS_DEEP_STUBS)
55771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    private AccountManager mAccountManager;
56771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
57771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    private Context mContext;
58771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    private AccountSyncPreferenceController mController;
59771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    private Preference mPreference;
60771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
61771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Before
62771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void setUp() {
63771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        MockitoAnnotations.initMocks(this);
64771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowApplication application = ShadowApplication.getInstance();
65771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        application.setSystemService(Context.ACCOUNT_SERVICE, mAccountManager);
66771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mContext = application.getApplicationContext();
67771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
68771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(
69771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                new AuthenticatorDescription[0]);
70771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
71771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
72771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mPreference = new Preference(mContext);
73771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mPreference.setKey("account_sync");
74771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
75771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController = new AccountSyncPreferenceController(mContext);
76771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.init(new Account("acct1", "type1"), new UserHandle(3));
77771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
78771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
79771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @After
80771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void tearDown() {
81771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.reset();
82771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
83771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
8420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    @Test
8520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    public void handlePreferenceTreeClick_shouldStartFragment() {
86771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.handlePreferenceTreeClick(mPreference);
8720d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
88771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        final Intent nextActivity = ShadowApplication.getInstance().getNextStartedActivity();
89044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang
90044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang        assertThat(nextActivity.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
91044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang                .isEqualTo(AccountSyncSettings.class.getName());
92044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang        assertThat(nextActivity.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
93044dc59acca6711ca604e9dca1d169ef5f19e2c8Fan Zhang                .isEqualTo(R.string.account_sync_title);
9420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    }
9520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
96771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
97771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_adapterInvisible_shouldNotCount() {
98771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType = new SyncAdapterType("authority" /* authority */,
99771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, false /* userVisible */, true /* supportsUploading */);
100771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters = {syncAdapterType};
101771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
102771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
103771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
104771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
105771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
106771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_all_off));
107771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
108771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
109771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
110771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_notSameAccountType_shouldNotCount() {
111771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType = new SyncAdapterType("authority" /* authority */,
112771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type5" /* accountType */, true /* userVisible */, true /* supportsUploading */);
113771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters = {syncAdapterType};
114771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
115771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
116771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
117771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
118771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
119771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_all_off));
120771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
121771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
122771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
123771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_notSyncable_shouldNotCount() {
124771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType = new SyncAdapterType("authority" /* authority */,
125771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
126771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters = {syncAdapterType};
127771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
128771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncable("authority", 0);
129771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
130771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
131771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
132771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
133771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_all_off));
134771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
135771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
136771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
137771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_syncDisabled_shouldNotCount() {
138771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType = new SyncAdapterType("authority" /* authority */,
139771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
140771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters = {syncAdapterType};
141771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
142771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAutomatically("authority", false);
143771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setMasterSyncAutomatically(3, true);
144771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
145771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
146771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
147771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
148771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_all_off));
149771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
150771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
151771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
152771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_syncEnabled_shouldCount() {
153771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType = new SyncAdapterType("authority" /* authority */,
154771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
155771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters = {syncAdapterType};
156771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
157771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
158771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
159771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
160771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
161771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_all_on));
162771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
163771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
164771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    @Test
165771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    public void updateSummary_multipleSyncAdapters_shouldSetSummary() {
166771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType1 = new SyncAdapterType("authority1" /* authority */,
167771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
168771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType2 = new SyncAdapterType("authority2" /* authority */,
169771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
170771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType3 = new SyncAdapterType("authority3" /* authority */,
171771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
172771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType syncAdapterType4 = new SyncAdapterType("authority4" /* authority */,
173771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                "type1" /* accountType */, true /* userVisible */, true /* supportsUploading */);
174771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        SyncAdapterType[] syncAdapters =
175771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                {syncAdapterType1, syncAdapterType2, syncAdapterType3, syncAdapterType4};
176771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
177771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
178771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        ShadowContentResolver.setSyncAutomatically("authority4", false);
179771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
180771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        mController.updateSummary(mPreference);
181771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling
182771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling        assertThat(mPreference.getSummary())
183771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling                .isEqualTo(mContext.getString(R.string.account_sync_summary_some_on, 3, 4));
184771848dde0d2960b8ec7d359090ba5106d6bb727Doris Ling    }
18520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling}
186