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