1b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook/* 2b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Copyright (C) 2009 Marc Blank 3b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Licensed to The Android Open Source Project. 4b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * 5b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License"); 6b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * you may not use this file except in compliance with the License. 7b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * You may obtain a copy of the License at 8b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * 9b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * http://www.apache.org/licenses/LICENSE-2.0 10b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * 11b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Unless required by applicable law or agreed to in writing, software 12b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS, 13b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * See the License for the specific language governing permissions and 15b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * limitations under the License. 16b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook */ 17b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 18b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookpackage com.android.exchange; 19b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 20b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport android.test.suitebuilder.annotation.MediumTest; 21b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 22b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.emailcommon.provider.Account; 23b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.emailcommon.provider.Mailbox; 24b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.ExchangeService.SyncError; 25b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.provider.EmailContentSetupUtils; 26b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.utility.ExchangeTestCase; 27b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 28b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport java.util.concurrent.ConcurrentHashMap; 29b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 30b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook/** 31b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * You can run this entire test case with: 32b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * runtest -c com.android.exchange.ExchangeServiceAccountTests exchange 33b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook */ 34b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook@MediumTest 35b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookpublic class ExchangeServiceAccountTests extends ExchangeTestCase { 36b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 37b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook public ExchangeServiceAccountTests() { 38b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook super(); 39b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook } 40b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 41b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook public void testReleaseSyncHolds() { 42b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook ExchangeService exchangeService = new ExchangeService(); 43b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook SyncError securityErrorAccount1 = 44b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook exchangeService.new SyncError(AbstractSyncService.EXIT_SECURITY_FAILURE, false); 45b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook SyncError ioError = 46b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook exchangeService.new SyncError(AbstractSyncService.EXIT_IO_ERROR, false); 47b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook SyncError securityErrorAccount2 = 48b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook exchangeService.new SyncError(AbstractSyncService.EXIT_SECURITY_FAILURE, false); 49b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Create account and two mailboxes 50b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Account acct1 = setupTestAccount("acct1", true); 51b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box1 = EmailContentSetupUtils.setupMailbox("box1", acct1.mId, true, 52b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext); 53b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box2 = EmailContentSetupUtils.setupMailbox("box2", acct1.mId, true, 54b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext); 55b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Account acct2 = setupTestAccount("acct2", true); 56b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box3 = EmailContentSetupUtils.setupMailbox("box3", acct2.mId, true, 57b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext); 58b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box4 = EmailContentSetupUtils.setupMailbox("box4", acct2.mId, true, 59b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext); 60b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 61b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook ConcurrentHashMap<Long, SyncError> errorMap = exchangeService.mSyncErrorMap; 62b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Add errors into the map 63b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box1.mId, securityErrorAccount1); 64b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box2.mId, ioError); 65b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box3.mId, securityErrorAccount2); 66b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box4.mId, securityErrorAccount2); 67b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // We should have 4 68b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(4, errorMap.keySet().size()); 69b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Release the holds on acct2 (there are two of them) 70b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertTrue(exchangeService.releaseSyncHolds(mProviderContext, 71b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook AbstractSyncService.EXIT_SECURITY_FAILURE, acct2)); 72b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // There should be two left 73b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(2, errorMap.keySet().size()); 74b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // And these are the two... 75b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertNotNull(errorMap.get(box2.mId)); 76b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertNotNull(errorMap.get(box1.mId)); 77b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 78b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Put the two back 79b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box3.mId, securityErrorAccount2); 80b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook errorMap.put(box4.mId, securityErrorAccount2); 81b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // We should have 4 again 82b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(4, errorMap.keySet().size()); 83b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Release all of the security holds 84b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertTrue(exchangeService.releaseSyncHolds(mProviderContext, 85b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook AbstractSyncService.EXIT_SECURITY_FAILURE, null)); 86b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // There should be one left 87b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(1, errorMap.keySet().size()); 88b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // And this is the one 89b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertNotNull(errorMap.get(box2.mId)); 90b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 91b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Release the i/o holds on account 2 (there aren't any) 92b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertFalse(exchangeService.releaseSyncHolds(mProviderContext, 93b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook AbstractSyncService.EXIT_IO_ERROR, acct2)); 94b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // There should still be one left 95b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(1, errorMap.keySet().size()); 96b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 97b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // Release the i/o holds on account 1 (there's one) 98b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertTrue(exchangeService.releaseSyncHolds(mProviderContext, 99b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook AbstractSyncService.EXIT_IO_ERROR, acct1)); 100b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook // There should still be one left 101b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertEquals(0, errorMap.keySet().size()); 102b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook } 103b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook 104b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook public void testIsSyncable() { 105b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Account acct1 = setupTestAccount("acct1", true); 106b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box1 = EmailContentSetupUtils.setupMailbox("box1", acct1.mId, true, 107b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext, Mailbox.TYPE_DRAFTS); 108b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box2 = EmailContentSetupUtils.setupMailbox("box2", acct1.mId, true, 109b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext, Mailbox.TYPE_OUTBOX); 110b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box3 = EmailContentSetupUtils.setupMailbox("box2", acct1.mId, true, 111b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext, Mailbox.TYPE_ATTACHMENT); 112b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box4 = EmailContentSetupUtils.setupMailbox("box2", acct1.mId, true, 113b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext, Mailbox.TYPE_NOT_SYNCABLE + 64); 114b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook Mailbox box5 = EmailContentSetupUtils.setupMailbox("box2", acct1.mId, true, 115b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook mProviderContext, Mailbox.TYPE_MAIL); 116b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertFalse(ExchangeService.isSyncable(box1)); 117b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertFalse(ExchangeService.isSyncable(box2)); 118b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertFalse(ExchangeService.isSyncable(box3)); 119b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertFalse(ExchangeService.isSyncable(box4)); 120b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook assertTrue(ExchangeService.isSyncable(box5)); 121b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook } 122b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook} 123