15e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler/*
25e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Copyright (C) 2010 The Android Open Source Project
35e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *
45e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
55e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * you may not use this file except in compliance with the License.
65e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * You may obtain a copy of the License at
75e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *
85e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
95e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *
105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Unless required by applicable law or agreed to in writing, software
115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * See the License for the specific language governing permissions and
145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * limitations under the License.
155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */
165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerpackage com.android.email;
185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
195e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport com.android.email.provider.EmailContent;
205e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport com.android.email.provider.EmailProvider;
215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport com.android.email.provider.ProviderTestUtils;
225e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
235e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport android.content.Context;
245e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport android.database.Cursor;
255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport android.test.ProviderTestCase2;
265e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerimport android.test.suitebuilder.annotation.MediumTest;
275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler/**
295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * This is a series of unit tests for backup/restore of the Account class.
305e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *
315e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * Technically these are functional because they use the underlying preferences framework.
325e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler *
335e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler * NOTE:  These tests are destructive of any "legacy" accounts that might be lying around.
345e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler */
355e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler@MediumTest
365e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadlerpublic class AccountBackupRestoreTests extends ProviderTestCase2<EmailProvider> {
375e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
385e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    private Preferences mPreferences;
395e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    private Context mMockContext;
405e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
415e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public AccountBackupRestoreTests() {
425e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY);
435e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
445e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
455e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    @Override
465e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    protected void setUp() throws Exception {
475e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        super.setUp();
485e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
495e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        mMockContext = getMockContext();
505e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Note: preferences are not supported by this mock context, so we must
515e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // explicitly use (and clean out) the real ones for now.
525e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        mPreferences = Preferences.getPreferences(mContext);
535e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
545e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
555e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
565e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Delete any dummy accounts we set up for this test
575e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
585e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    @Override
595e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    protected void tearDown() throws Exception {
605e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        super.tearDown();
615e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
625e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
635e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
645e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
655e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Delete *all* legacy accounts
665e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
675e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    private void deleteLegacyAccounts() {
685e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account[] oldAccounts = mPreferences.getAccounts();
695e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        for (Account oldAccount : oldAccounts) {
705e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            oldAccount.delete(mPreferences);
715e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        }
725e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
735e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
745e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
755e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Test backup with no accounts
765e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
775e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public void testNoAccountBackup() {
785e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // create some "old" backups or legacy accounts
795e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount = new Account(mMockContext);
805e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount.save(mPreferences);
815e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // confirm they are there
825e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account[] oldBackups = mPreferences.getAccounts();
835e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertTrue(oldBackups.length >= 1);
845e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are no accounts in the provider
855e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, EmailContent.Account.CONTENT_URI,
865e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                null, null);
875e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(0, numAccounts);
885e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run backups
895e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        AccountBackupRestore.doBackupAccounts(mMockContext, mPreferences);
905e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // confirm there are no backups made
915e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account[] backups = mPreferences.getAccounts();
925e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(0, backups.length);
935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
945e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
955e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
965e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Test backup with accounts
975e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
985e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public void testBackup() {
995e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Clear the decks
1005e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
1015e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1025e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Create real accounts in need of backup
1035e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        EmailContent.Account liveAccount1 =
1045e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupAccount("testBackup1", false, mMockContext);
1055e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount1.mHostAuthRecv =
1065e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupHostAuth("legacy-recv", 0, false, mMockContext);
1075e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount1.mHostAuthSend =
1085e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupHostAuth("legacy-send", 0, false, mMockContext);
1095e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount1.setDefaultAccount(true);
1105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount1.save(mMockContext);
1115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        EmailContent.Account liveAccount2 =
1125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupAccount("testBackup2", false, mMockContext);
1135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount2.mHostAuthRecv =
1145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupHostAuth("legacy-recv", 0, false, mMockContext);
1155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount2.mHostAuthSend =
1165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupHostAuth("legacy-send", 0, false, mMockContext);
1175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount2.setDefaultAccount(false);
1185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        liveAccount2.save(mMockContext);
1195e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1205e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run backups
1215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        AccountBackupRestore.doBackupAccounts(mMockContext, mPreferences);
1225e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1235e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Confirm we have two backups now
1245e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Deep inspection is not performed here - see LegacyConversionsTests
1255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // We just check for basic identity & flags
1265e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account[] backups = mPreferences.getAccounts();
1275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(2, backups.length);
1285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        for (Account backup : backups) {
1295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            if ("testBackup1".equals(backup.getDescription())) {
1305e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                assertTrue(0 != (backup.mBackupFlags & Account.BACKUP_FLAGS_IS_DEFAULT));
1315e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            } else if ("testBackup2".equals(backup.getDescription())) {
1325e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                assertFalse(0 != (backup.mBackupFlags & Account.BACKUP_FLAGS_IS_DEFAULT));
1335e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            } else {
1345e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                fail("unexpected backup name=" + backup.getDescription());
1355e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            }
1365e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        }
1375e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backup1 = backups[0];
1385e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertTrue(0 != (backup1.mBackupFlags & Account.BACKUP_FLAGS_IS_BACKUP));
1395e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(liveAccount1.getDisplayName(), backup1.getDescription());
1405e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
1415e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1425e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
1435e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * TODO: Test backup EAS accounts, with and without contacts sync
1445e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     *
1455e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Blocker:  We need to inject the dependency on ContentResolver.getSyncAutomatically()
1465e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * so we can make our fake accounts appear to be syncable or non-syncable
1475e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
1485e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1495e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
1505e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Test no-restore with accounts found
1515e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
1525e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public void testNoAccountRestore1() {
1535e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are no real backups
1545e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
1555e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1565e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are test backups available
1575e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount1 = setupLegacyBackupAccount("backup1");
1585e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount1.save(mPreferences);
1595e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount2 = setupLegacyBackupAccount("backup2");
1605e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount2.save(mPreferences);
1615e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1625e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are accounts
1635e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        EmailContent.Account existing =
1645e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            ProviderTestUtils.setupAccount("existing", true, mMockContext);
1655e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1665e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run the restore
1675e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        boolean anyRestored = AccountBackupRestore.doRestoreAccounts(mMockContext, mPreferences);
1685e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertFalse(anyRestored);
1695e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1705e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure accounts still there
1715e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, EmailContent.Account.CONTENT_URI,
1725e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                null, null);
1735e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(1, numAccounts);
1745e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
1755e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1765e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
1775e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Test no-restore with no accounts & no backups
1785e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
1795e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public void testNoAccountRestore2() {
1805e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are no real backups
1815e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
1825e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1835e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are no accounts
1845e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, EmailContent.Account.CONTENT_URI,
1855e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                null, null);
1865e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(0, numAccounts);
1875e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1885e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run the restore
1895e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        boolean anyRestored = AccountBackupRestore.doRestoreAccounts(mMockContext, mPreferences);
1905e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertFalse(anyRestored);
1915e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1925e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure accounts still there
1935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        numAccounts = EmailContent.count(mMockContext, EmailContent.Account.CONTENT_URI,
1945e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                null, null);
1955e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertEquals(0, numAccounts);
1965e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
1975e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
1985e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
1995e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Test restore with 2 accounts.
2005e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Repeats test to verify restore of default account
2015e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
2025e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    public void testAccountRestore() {
2035e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // make sure there are no real backups
2045e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
2055e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2065e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // create test backups
2075e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount1 = setupLegacyBackupAccount("backup1");
2085e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount1.mBackupFlags |= Account.BACKUP_FLAGS_IS_DEFAULT;
2095e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount1.save(mPreferences);
2105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount2 = setupLegacyBackupAccount("backup2");
2115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount2.save(mPreferences);
2125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run the restore
2145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        boolean anyRestored = AccountBackupRestore.doRestoreAccounts(mMockContext, mPreferences);
2155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        assertTrue(anyRestored);
2165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Check the restored accounts
2185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Deep inspection is not performed here - see LegacyConversionsTests for that
2195e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // We just check for basic identity & flags
2205e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Cursor c = mMockContext.getContentResolver().query(EmailContent.Account.CONTENT_URI,
2215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                EmailContent.Account.CONTENT_PROJECTION, null, null, null);
2225e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        try {
2235e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            assertEquals(2, c.getCount());
2245e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            while (c.moveToNext()) {
2255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                EmailContent.Account restored =
2265e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    EmailContent.getContent(c, EmailContent.Account.class);
2275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                if ("backup1".equals(restored.getDisplayName())) {
2285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    assertTrue(restored.mIsDefault);
2295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                } else if ("backup2".equals(restored.getDisplayName())) {
2305e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    assertFalse(restored.mIsDefault);
2315e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                } else {
2325e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    fail("Unexpected restore account name=" + restored.getDisplayName());
2335e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                }
234d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler                checkRestoredTransientValues(restored);
2355e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            }
2365e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        } finally {
2375e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            c.close();
2385e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        }
2395e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2405e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // clear out the backups & accounts and try again
2415e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        deleteLegacyAccounts();
2425e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        mMockContext.getContentResolver().delete(EmailContent.Account.CONTENT_URI, null, null);
2435e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2445e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount3 = setupLegacyBackupAccount("backup3");
2455e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount3.save(mPreferences);
2465e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backupAccount4 = setupLegacyBackupAccount("backup4");
2475e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount4.mBackupFlags |= Account.BACKUP_FLAGS_IS_DEFAULT;
2485e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backupAccount4.save(mPreferences);
2495e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2505e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // run the restore
2515e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        AccountBackupRestore.doRestoreAccounts(mMockContext, mPreferences);
2525e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2535e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Check the restored accounts
2545e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // Deep inspection is not performed here - see LegacyConversionsTests for that
2555e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // We just check for basic identity & flags
2565e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        c = mMockContext.getContentResolver().query(EmailContent.Account.CONTENT_URI,
2575e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                EmailContent.Account.CONTENT_PROJECTION, null, null, null);
2585e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        try {
2595e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            assertEquals(2, c.getCount());
2605e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            while (c.moveToNext()) {
2615e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                EmailContent.Account restored =
2625e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    EmailContent.getContent(c, EmailContent.Account.class);
2635e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                if ("backup3".equals(restored.getDisplayName())) {
2645e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    assertFalse(restored.mIsDefault);
2655e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                } else if ("backup4".equals(restored.getDisplayName())) {
2665e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    assertTrue(restored.mIsDefault);
2675e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                } else {
2685e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                    fail("Unexpected restore account name=" + restored.getDisplayName());
2695e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler                }
270d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler                checkRestoredTransientValues(restored);
2715e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            }
2725e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        } finally {
2735e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler            c.close();
2745e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        }
2755e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
2765e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2775e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
278d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler     * Check a given restored account to make sure that transient (non-backed-up) values
279d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler     * are initialized to reasonable values.
280d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler     */
281d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler    private void checkRestoredTransientValues(EmailContent.Account restored) {
282d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        // sync key == null
283d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        assertNull(restored.mSyncKey);
284d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        // hostauth id's are no longer zero or -1
285d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        assertTrue(restored.mHostAuthKeyRecv > 0);
286d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        assertTrue(restored.mHostAuthKeySend > 0);
287d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        // protocol version == null or non-empty string
288d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler        assertTrue(restored.mProtocolVersion == null || restored.mProtocolVersion.length() > 0);
289d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler    }
290d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler
291d612717340b2670776a75a1d2e9e3df81fd4c052Andrew Stadler    /**
2925e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * TODO: Test restore EAS accounts, with and without contacts sync
2935e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     *
2945e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Blocker:  We need to inject the dependency on account manager to catch the calls to it
2955e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
2965e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
2975e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    /**
2985e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     * Setup a legacy backup account with many fields prefilled.
2995e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler     */
3005e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    private Account setupLegacyBackupAccount(String name) {
3015e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        Account backup = new Account(mMockContext);
3025e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler
3035e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        // fill in useful fields
3045e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mUuid = "test-uid-" + name;
3055e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mStoreUri = "store://test/" + name;
3065e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mLocalStoreUri = "local://localhost/" + name;
3075e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mSenderUri = "sender://test/" + name;
3085e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mDescription = name;
3095e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mName = "name " + name;
3105e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mEmail = "email " + name;
3115e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mAutomaticCheckIntervalMinutes = 100;
3125e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mLastAutomaticCheckTime = 200;
3135e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mNotifyNewMail = true;
3145e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mDraftsFolderName = "drafts " + name;
3155e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mSentFolderName = "sent " + name;
3165e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mTrashFolderName = "trash " + name;
3175e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mOutboxFolderName = "outbox " + name;
3185e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mAccountNumber = 300;
3195e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mVibrate = true;
3209e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        backup.mVibrateWhenSilent = false;
3215e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mRingtoneUri = "ringtone://test/" + name;
3225e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mSyncWindow = 400;
3235e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mBackupFlags = Account.BACKUP_FLAGS_IS_BACKUP;
3245e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mProtocolVersion = "proto version" + name;
3255e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        backup.mDeletePolicy = Account.DELETE_POLICY_NEVER;
326fc8d943a828cd79ff71c703ced37001bd5482173Andrew Stadler        backup.mSecurityFlags = 500;
3275e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler        return backup;
3285e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler    }
3295e91cccd4b530eb2aeace5c5bf4f3328a5b5d69dAndrew Stadler}
330