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