1/*
2 * Copyright (C) 2014 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.inputmethod.latin.accounts;
18
19import android.accounts.AccountManager;
20import android.content.Context;
21import android.content.Intent;
22import android.content.SharedPreferences;
23import android.preference.PreferenceManager;
24import android.test.AndroidTestCase;
25
26import com.android.inputmethod.latin.settings.LocalSettingsConstants;
27
28/**
29 * Tests for {@link AccountsChangedReceiver}.
30 */
31public class AccountsChangedReceiverTests extends AndroidTestCase {
32    private static final String ACCOUNT_1 = "account1@example.com";
33    private static final String ACCOUNT_2 = "account2@example.com";
34
35    private SharedPreferences mPrefs;
36    private String mLastKnownAccount = null;
37
38    @Override
39    protected void setUp() throws Exception {
40        super.setUp();
41        mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
42        // Keep track of the current account so that we restore it when the test finishes.
43        mLastKnownAccount = mPrefs.getString(LocalSettingsConstants.PREF_ACCOUNT_NAME, null);
44    }
45
46    @Override
47    protected void tearDown() throws Exception {
48        super.tearDown();
49        // Restore the account that was present before running the test.
50        updateAccountName(mLastKnownAccount);
51    }
52
53    public void testUnknownIntent() {
54        updateAccountName(ACCOUNT_1);
55        AccountsChangedReceiver reciever = new AccountsChangedReceiver();
56        reciever.onReceive(getContext(), new Intent("some-random-action"));
57        // Account should *not* be removed from preferences.
58        assertAccountName(ACCOUNT_1);
59    }
60
61    public void testAccountRemoved() {
62        updateAccountName(ACCOUNT_1);
63        AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
64            @Override
65            protected String[] getAccountsForLogin(Context context) {
66                return new String[] {ACCOUNT_2};
67            }
68        };
69        reciever.onReceive(getContext(), new Intent(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION));
70        // Account should be removed from preferences.
71        assertAccountName(null);
72    }
73
74    public void testAccountRemoved_noAccounts() {
75        updateAccountName(ACCOUNT_2);
76        AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
77            @Override
78            protected String[] getAccountsForLogin(Context context) {
79                return new String[0];
80            }
81        };
82        reciever.onReceive(getContext(), new Intent(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION));
83        // Account should be removed from preferences.
84        assertAccountName(null);
85    }
86
87    public void testAccountNotRemoved() {
88        updateAccountName(ACCOUNT_2);
89        AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
90            @Override
91            protected String[] getAccountsForLogin(Context context) {
92                return new String[] {ACCOUNT_1, ACCOUNT_2};
93            }
94        };
95        reciever.onReceive(getContext(), new Intent(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION));
96        // Account should *not* be removed from preferences.
97        assertAccountName(ACCOUNT_2);
98    }
99
100    private void updateAccountName(String accountName) {
101        if (accountName == null) {
102            mPrefs.edit().remove(LocalSettingsConstants.PREF_ACCOUNT_NAME).apply();
103        } else {
104            mPrefs.edit().putString(LocalSettingsConstants.PREF_ACCOUNT_NAME, accountName).apply();
105        }
106    }
107
108    private void assertAccountName(String expectedAccountName) {
109        assertEquals(expectedAccountName,
110                mPrefs.getString(LocalSettingsConstants.PREF_ACCOUNT_NAME, null));
111    }
112}
113