ControllerProviderOpsTests.java revision 3096b4ae18f55c9ebf04d83c534da4d5e3370932
17c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler/*
27c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * Copyright (C) 2009 The Android Open Source Project
37c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler *
47c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
57c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * you may not use this file except in compliance with the License.
67c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * You may obtain a copy of the License at
77c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler *
87c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
97c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler *
107c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * Unless required by applicable law or agreed to in writing, software
117c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
127c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * See the License for the specific language governing permissions and
147c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * limitations under the License.
157c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler */
167c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
177c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerpackage com.android.email;
187c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
19e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadlerimport com.android.email.provider.ContentCache;
2069af769688acc28a20cdbad046cea2565456801cMarc Blankimport com.android.email.provider.EmailProvider;
2169af769688acc28a20cdbad046cea2565456801cMarc Blankimport com.android.email.provider.ProviderTestUtils;
22a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
23a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Account;
24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Body;
25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
2612b82d9374947c9268217f45befe8a74bd9b60d7Ben Komaloimport com.android.emailcommon.provider.HostAuth;
2753ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
287c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
297c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport android.content.Context;
30391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blankimport android.net.Uri;
317c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport android.test.ProviderTestCase2;
327c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
33fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadlerimport java.util.Locale;
34b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blankimport java.util.concurrent.ExecutionException;
35fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler
367c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler/**
377c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * Tests of the Controller class that depend on the underlying provider.
38206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki *
397c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * NOTE:  It would probably make sense to rewrite this using a MockProvider, instead of the
407c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * ProviderTestCase (which is a real provider running on a temp database).  This would be more of
417c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * a true "unit test".
42206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki *
437c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler * You can run this entire test case with:
447c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler *   runtest -c com.android.email.ControllerProviderOpsTests email
457c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler */
467c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerpublic class ControllerProviderOpsTests extends ProviderTestCase2<EmailProvider> {
477c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
484be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki    private Context mProviderContext;
494be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki    private Context mContext;
504be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki    private TestController mTestController;
514be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki
527c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
537c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    public ControllerProviderOpsTests() {
5431d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
557c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
567c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
577c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    @Override
587c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    public void setUp() throws Exception {
597c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        super.setUp();
607c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        mProviderContext = getMockContext();
617c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        mContext = getContext();
624be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController = new TestController(mProviderContext, mContext);
63e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Invalidate all caches, since we reset the database for each test
64e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        ContentCache.invalidateAllCachesForTest();
657c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
667c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
677c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    @Override
687c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    public void tearDown() throws Exception {
697c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        super.tearDown();
704be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.cleanupForTest();
717c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
727c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
737c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
747c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Lightweight subclass of the Controller class allows injection of mock context
757c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
767c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    public static class TestController extends Controller {
777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
787c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        protected TestController(Context providerContext, Context systemContext) {
79c184f36c2df16431693d7709e28ded593efc3da7Marc Blank            super(systemContext);
807c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler            setProviderContext(providerContext);
817c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        }
827c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
837c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
84fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler    /**
85fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler     * These are strings that should not change per locale.
86fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler     */
87fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler    public void testGetMailboxServerName() {
884be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("", mTestController.getMailboxServerName(-1));
89fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler
904be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Inbox", mTestController.getMailboxServerName(Mailbox.TYPE_INBOX));
914be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Outbox", mTestController.getMailboxServerName(Mailbox.TYPE_OUTBOX));
924be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Trash", mTestController.getMailboxServerName(Mailbox.TYPE_TRASH));
934be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Sent", mTestController.getMailboxServerName(Mailbox.TYPE_SENT));
944be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Junk", mTestController.getMailboxServerName(Mailbox.TYPE_JUNK));
95fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler
96fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        // Now try again with translation
97fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Locale savedLocale = Locale.getDefault();
98fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Locale.setDefault(Locale.FRANCE);
994be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Inbox", mTestController.getMailboxServerName(Mailbox.TYPE_INBOX));
1004be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Outbox", mTestController.getMailboxServerName(Mailbox.TYPE_OUTBOX));
1014be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Trash", mTestController.getMailboxServerName(Mailbox.TYPE_TRASH));
1024be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Sent", mTestController.getMailboxServerName(Mailbox.TYPE_SENT));
1034be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals("Junk", mTestController.getMailboxServerName(Mailbox.TYPE_JUNK));
104fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Locale.setDefault(savedLocale);
105c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
106c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
107c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    /**
108c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Test of Controller.createMailbox().
109c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Sunny day test only - creates a mailbox that does not exist.
110c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Does not test duplication, bad accountID, or any other bad input.
111c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     */
112c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    public void testCreateMailbox() {
113c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Account account = ProviderTestUtils.setupAccount("mailboxid", true, mProviderContext);
114c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long accountId = account.mId;
115c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
116c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long oldBoxId = Mailbox.findMailboxOfType(mProviderContext, accountId, Mailbox.TYPE_DRAFTS);
117c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertEquals(Mailbox.NO_MAILBOX, oldBoxId);
118c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1194be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.createMailbox(accountId, Mailbox.TYPE_DRAFTS);
120c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long boxId = Mailbox.findMailboxOfType(mProviderContext, accountId, Mailbox.TYPE_DRAFTS);
121206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki
122c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check that the drafts mailbox exists
123c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertTrue("mailbox exists", boxId != Mailbox.NO_MAILBOX);
124c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
125206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki
126206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    /**
127c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Test of Controller.findOrCreateMailboxOfType().
128c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Checks:
129c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - finds correctly the ID of existing mailbox
130c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - creates non-existing mailbox
131c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - creates only once a new mailbox
132c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - when accountId or mailboxType are -1, returns NO_MAILBOX
133c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     */
134c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    public void testFindOrCreateMailboxOfType() {
135c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Account account = ProviderTestUtils.setupAccount("mailboxid", true, mProviderContext);
136c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long accountId = account.mId;
137c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Mailbox box = ProviderTestUtils.setupMailbox("box", accountId, false, mProviderContext);
138c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        final int boxType = Mailbox.TYPE_TRASH;
139c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        box.mType = boxType;
140c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        box.save(mProviderContext);
141c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long boxId = box.mId;
142c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1434be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long testBoxId = mTestController.findOrCreateMailboxOfType(accountId, boxType);
144c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
145c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check it found the right mailbox id
146c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertEquals(boxId, testBoxId);
147c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1484be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long boxId2 = mTestController.findOrCreateMailboxOfType(accountId, Mailbox.TYPE_DRAFTS);
149c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertTrue("mailbox created", boxId2 != Mailbox.NO_MAILBOX);
150c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertTrue("with different id", testBoxId != boxId2);
151c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
152c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check it doesn't create twice when existing
1534be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long boxId3 = mTestController.findOrCreateMailboxOfType(accountId, Mailbox.TYPE_DRAFTS);
154c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertEquals("don't create if exists", boxId3, boxId2);
155206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki
156c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check invalid aruments
1574be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals(Mailbox.NO_MAILBOX,
1584be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki                mTestController.findOrCreateMailboxOfType(-1, Mailbox.TYPE_DRAFTS));
1594be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals(Mailbox.NO_MAILBOX, mTestController.findOrCreateMailboxOfType(accountId, -1));
160c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
161c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1627c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
163b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * Test the "move message" function.
164b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     */
165b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    public void testMoveMessage() throws InterruptedException, ExecutionException {
166b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Account account1 = ProviderTestUtils.setupAccount("message-move", true, mProviderContext);
167b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long account1Id = account1.mId;
168b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
169b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box1Id = box1.mId;
170b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
171b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box2Id = box2.mId;
17211aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Mailbox boxDest = ProviderTestUtils.setupMailbox("d", account1Id, true, mProviderContext);
17311aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long boxDestId = boxDest.mId;
174b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
175b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
176b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank                true, mProviderContext);
17711aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
17811aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                true, mProviderContext);
179b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long message1Id = message1.mId;
18011aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long message2Id = message2.mId;
181b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
182b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // Because moveMessage runs asynchronously, call get() to force it to complete
1830bb7f1c37c99beb2a91bd98e64fcc9656877e034Ben Komalo        mTestController.moveMessages(new long[] { message1Id, message2Id }, boxDestId).get();
184b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
185b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // now read back a fresh copy and confirm it's in the trash
18611aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
18711aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message1Id).mMailboxKey);
18811aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
18911aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message2Id).mMailboxKey);
190b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    }
191b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
192b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    /**
1937c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test the "delete message" function.  Sunny day:
1947c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - message/mailbox/account all exist
1957c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - trash mailbox exists
1967c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
197e87ff6c3cbbfc5e3636f9827b58820652e3ea1c5Todd Kennedy    public void testDeleteMessage() {
1987c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mProviderContext);
1997c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
20077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox box = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
20177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long boxId = box.mId;
2027c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
20377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox trashBox = ProviderTestUtils.setupMailbox("box2", account1Id, false,
20477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
20553ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        trashBox.mType = Mailbox.TYPE_TRASH;
20677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        trashBox.save(mProviderContext);
20777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long trashBoxId = trashBox.mId;
20877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
20977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox draftBox = ProviderTestUtils.setupMailbox("box3", account1Id, false,
21077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
21153ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        draftBox.mType = Mailbox.TYPE_DRAFTS;
21277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        draftBox.save(mProviderContext);
21377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long draftBoxId = draftBox.mId;
21477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
21577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
21677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 1: Message in a regular mailbox, account known.
21777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message1", account1Id, boxId, false,
21877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    true, mProviderContext);
21977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
22077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
2213096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
22277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
22377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // now read back a fresh copy and confirm it's in the trash
22477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
22577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    messageId);
22677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertEquals(trashBoxId, restored.mMailboxKey);
22777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2287c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
22977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
2303096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            // Case 2: Already in trash
23177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId,
23277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
23377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2347c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2353096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
23677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
23777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
23877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
23977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
24077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
24177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
2423096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            // Case 3: Draft
24377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId,
24477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
24577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
24677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
2473096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
24877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
24977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
25077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
25177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2527c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2537c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2547c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2557c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test deleting message when there is no trash mailbox
2567c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
257e87ff6c3cbbfc5e3636f9827b58820652e3ea1c5Todd Kennedy    public void testDeleteMessageNoTrash() {
2587c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 =
2597c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupAccount("message-delete-notrash", true, mProviderContext);
2607c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
2617c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
2627c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long box1Id = box1.mId;
2637c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2647c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1 =
2657c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
2667c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                        mProviderContext);
2677c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long message1Id = message1.mId;
2687c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2693096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki        mTestController.deleteMessageSync(message1Id);
2707c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2717c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // now read back a fresh copy and confirm it's in the trash
2727c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1get =
2737c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                EmailContent.Message.restoreMessageWithId(mProviderContext, message1Id);
2747c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2757c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // check the new mailbox and see if it looks right
2767c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(-1 == message1get.mMailboxKey);
2777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(box1Id == message1get.mMailboxKey);
27853ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        Mailbox mailbox2get = Mailbox.restoreMailboxWithId(mProviderContext,
2797c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                message1get.mMailboxKey);
28053ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        assertEquals(Mailbox.TYPE_TRASH, mailbox2get.mType);
2817c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2827c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2837c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2846ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test read/unread flag
2856ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
2863b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testReadUnread() throws InterruptedException, ExecutionException {
287fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("read-unread", false, mProviderContext);
288fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
289fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("read-unread", 0, false, mProviderContext);
290fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
291fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
2926ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
2936ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
2946ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
2956ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
2966ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
2976ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
2986ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
2996ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "read"
3003b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3016ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3026ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagRead);
3036ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3046ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "unread"
3053b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, false).get();
3066ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3076ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagRead);
3083b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3093b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "read"
3103b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3113b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3123b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagRead);
3136ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3146ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3156ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
3166ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test favorites flag
3176ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3183b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testFavorites() throws InterruptedException, ExecutionException {
319fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("favorites", false, mProviderContext);
320fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
321fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("favorites", 0, false, mProviderContext);
322fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
323fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3246ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3256ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3266ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3276ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3296ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3306ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3316ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "favorite"
3323b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3336ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3346ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagFavorite);
3356ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3366ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "not favorite"
3373b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, false).get();
3386ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3396ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagFavorite);
3403b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3413b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "favorite"
3423b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3433b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3443b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagFavorite);
3456ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3466ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
347391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    public void testGetAndDeleteAttachmentMailbox() {
3484be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
349391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
3504be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox anotherBox = mTestController.getAttachmentMailbox();
351391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(anotherBox);
352391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // We should always get back the same Mailbox row
353391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, anotherBox.mId);
354391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Add two messages to this mailbox
355391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message1", 0, box.mId, false, true,
356391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
357391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message2", 0, box.mId, false, true,
358391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
359391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure we can find them where they are expected
360391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(2, EmailContent.count(mProviderContext, Message.CONTENT_URI,
361391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
362391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Delete them
3634be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.deleteAttachmentMessages();
364391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure they're gone
365391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, EmailContent.count(mProviderContext, Message.CONTENT_URI,
366391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
367391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
368391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
369e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
370d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Test wiping an account's synced data.  Everything should go, but account & empty inbox.
371d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Also ensures that the remaining account and the remaining inbox have cleared their
372d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * server sync keys, to force refresh eventually.
373e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
374e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testWipeSyncedData() {
375d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account1 = ProviderTestUtils.setupAccount("wipe-synced-1", false, mProviderContext);
376d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.mSyncKey = "account-1-sync-key";
377d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.save(mProviderContext);
378e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
379d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, false, mProviderContext);
380d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mType = Mailbox.TYPE_INBOX;
381d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mSyncKey = "box-1-sync-key";
382d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.save(mProviderContext);
383e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box1Id = box1.mId;
384e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
385e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box2Id = box2.mId;
38669af769688acc28a20cdbad046cea2565456801cMarc Blank        // An EAS account mailbox
38769af769688acc28a20cdbad046cea2565456801cMarc Blank        Mailbox eas = ProviderTestUtils.setupMailbox("eas", account1Id, false, mProviderContext);
38869af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.mType = Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
38969af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.save(mProviderContext);
390e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
391d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account2 = ProviderTestUtils.setupAccount("wipe-synced-2", false, mProviderContext);
392d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.mSyncKey = "account-2-sync-key";
393d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.save(mProviderContext);
394e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
395d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box3 = ProviderTestUtils.setupMailbox("box3", account2Id, false, mProviderContext);
396d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mSyncKey = "box-3-sync-key";
397d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mType = Mailbox.TYPE_INBOX;
398d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.save(mProviderContext);
399e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box3Id = box3.mId;
400e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box4 = ProviderTestUtils.setupMailbox("box4", account2Id, true, mProviderContext);
401e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box4Id = box4.mId;
402e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
40369af769688acc28a20cdbad046cea2565456801cMarc Blank        // Now populate the 4 non-account boxes with messages
404e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
405e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
406e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message1Id = message.mId;
407e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
408e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
409e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message2Id = message.mId;
410e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message3", account2Id, box3Id, false,
411e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
412e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message3Id = message.mId;
413e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message4", account2Id, box4Id, false,
414e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
415e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message4Id = message.mId;
416e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
417e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Now wipe account 1's data
418e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        mTestController.deleteSyncedDataSync(account1Id);
419e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
42069af769688acc28a20cdbad046cea2565456801cMarc Blank        // Confirm:  Mailboxes gone (except account box), all messages gone, account survives
42169af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box1Id));
422e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box2Id));
42369af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, eas.mId));
424e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message1Id));
425e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message2Id));
426d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1 = Account.restoreAccountWithId(mProviderContext, account1Id);
427d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNotNull(account1);
428d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNull(account1.mSyncKey);
429e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
430e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm:  Other account survived
431e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box3Id));
432e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box4Id));
433e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message3Id));
434e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message4Id));
435e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Account.restoreAccountWithId(mProviderContext, account2Id));
436e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
437e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
438206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    public void testLoadMessageFromUri() throws Exception {
439391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Create a simple message
440391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        Message msg = new Message();
441391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String text = "This is some text";
442391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mText = text;
443391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String sender = "sender@host.com";
444391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mFrom = sender;
445391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Save this away
446391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.save(mProviderContext);
447391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
448206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki        Uri fileUri = ProviderTestUtils.createTempEmlFile(mProviderContext, msg,
449206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki                mContext.getFilesDir());
450391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
451391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Load the message via Controller and a Uri
4524be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Message loadedMsg = mTestController.loadMessageFromUri(fileUri);
453391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
454391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check server id, mailbox key, account key, and from
455391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(loadedMsg);
456391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertTrue(loadedMsg.mServerId.startsWith(Controller.ATTACHMENT_MESSAGE_UID_PREFIX));
4574be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
458391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
459391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, loadedMsg.mMailboxKey);
460391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, loadedMsg.mAccountKey);
461391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(loadedMsg.mFrom, sender);
462391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check body text
463391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String loadedMsgText = Body.restoreBodyTextWithMessageId(mProviderContext, loadedMsg.mId);
464391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(text, loadedMsgText);
465391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
466391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
4676ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
4688d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * Create a simple HostAuth with protocol
4697c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
4708d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    private HostAuth setupSimpleHostAuth(String protocol) {
4718d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        HostAuth hostAuth = new HostAuth();
4728d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        hostAuth.mProtocol = protocol;
4738d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        return hostAuth;
4748d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
4758d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
4768d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testIsMessagingController() {
4778d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account1", false,
4788d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4798d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthRecv = setupSimpleHostAuth("eas");
4808d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mProviderContext);
4814be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
4828d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account2", false,
4838d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4848d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.mHostAuthRecv = setupSimpleHostAuth("imap");
4858d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mProviderContext);
4864be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
4878d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account3 = ProviderTestUtils.setupAccount("account3", false,
4888d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4898d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.mHostAuthRecv = setupSimpleHostAuth("pop3");
4908d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.save(mProviderContext);
4914be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
4928d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account4 = ProviderTestUtils.setupAccount("account4", false,
4938d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4948d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.mHostAuthRecv = setupSimpleHostAuth("smtp");
4958d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.save(mProviderContext);
4964be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
4978d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // There should be values for all of these accounts in the legacy map
4984be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account1.mId));
4994be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account2.mId));
5004be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account3.mId));
5014be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account4.mId));
5028d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // The map should have the expected values
5034be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account1.mId));
5044be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account2.mId));
5054be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account3.mId));
5064be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account4.mId));
5078d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // This second pass should pull values from the cache
5084be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
5094be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5104be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5114be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5128d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
5136ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
5146ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
5158d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * TODO: releasing associated data (e.g. attachments, embedded images)
5166ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
5177c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler}
518