ControllerProviderOpsTests.java revision 53ea83ebf91f820692e8fa8e781f5cc982dd94db
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.HostAuth;
26a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
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
22177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
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        {
23077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 2: Message in a regular mailbox, account *un*known.
23177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message2", account1Id, boxId, false,
23277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    true, mProviderContext);
23377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2347c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
23577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, -1);
2367c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
23777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // now read back a fresh copy and confirm it's in the trash
23877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
23977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    messageId);
24077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertEquals(trashBoxId, restored.mMailboxKey);
24177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2427c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
24477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 3: Already in trash
24577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId,
24677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
24777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2487c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
25077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
25177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
25277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
25377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
25477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
25577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
25677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 4: Draft
25777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId,
25877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
25977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
26077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
26277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
26477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
26577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2667c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2677c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2687c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2697c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test deleting message when there is no trash mailbox
2707c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
271e87ff6c3cbbfc5e3636f9827b58820652e3ea1c5Todd Kennedy    public void testDeleteMessageNoTrash() {
2727c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 =
2737c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupAccount("message-delete-notrash", true, mProviderContext);
2747c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
2757c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
2767c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long box1Id = box1.mId;
2777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2787c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1 =
2797c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
2807c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                        mProviderContext);
2817c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long message1Id = message1.mId;
2827c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
28377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        mTestController.deleteMessageSync(message1Id, account1Id);
2847c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2857c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // now read back a fresh copy and confirm it's in the trash
2867c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1get =
2877c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                EmailContent.Message.restoreMessageWithId(mProviderContext, message1Id);
2887c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2897c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // check the new mailbox and see if it looks right
2907c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(-1 == message1get.mMailboxKey);
2917c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(box1Id == message1get.mMailboxKey);
29253ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        Mailbox mailbox2get = Mailbox.restoreMailboxWithId(mProviderContext,
2937c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                message1get.mMailboxKey);
29453ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        assertEquals(Mailbox.TYPE_TRASH, mailbox2get.mType);
2957c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2967c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2977c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2986ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test read/unread flag
2996ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3003b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testReadUnread() throws InterruptedException, ExecutionException {
301fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("read-unread", false, mProviderContext);
302fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
303fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("read-unread", 0, false, mProviderContext);
304fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
305fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3066ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3076ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3086ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3096ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3106ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3116ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3126ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3136ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "read"
3143b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3156ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3166ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagRead);
3176ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3186ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "unread"
3193b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, false).get();
3206ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3216ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagRead);
3223b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3233b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "read"
3243b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3253b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3263b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagRead);
3276ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3296ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
3306ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test favorites flag
3316ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3323b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testFavorites() throws InterruptedException, ExecutionException {
333fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("favorites", false, mProviderContext);
334fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
335fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("favorites", 0, false, mProviderContext);
336fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
337fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3386ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3396ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3406ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3416ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3426ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3436ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3446ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3456ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "favorite"
3463b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3476ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3486ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagFavorite);
3496ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3506ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "not favorite"
3513b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, false).get();
3526ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3536ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagFavorite);
3543b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3553b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "favorite"
3563b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3573b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3583b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagFavorite);
3596ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3606ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
361391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    public void testGetAndDeleteAttachmentMailbox() {
3624be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
363391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
3644be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox anotherBox = mTestController.getAttachmentMailbox();
365391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(anotherBox);
366391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // We should always get back the same Mailbox row
367391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, anotherBox.mId);
368391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Add two messages to this mailbox
369391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message1", 0, box.mId, false, true,
370391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
371391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message2", 0, box.mId, false, true,
372391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
373391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure we can find them where they are expected
374391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(2, EmailContent.count(mProviderContext, Message.CONTENT_URI,
375391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
376391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Delete them
3774be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.deleteAttachmentMessages();
378391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure they're gone
379391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, EmailContent.count(mProviderContext, Message.CONTENT_URI,
380391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
381391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
382391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
383e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
384d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Test wiping an account's synced data.  Everything should go, but account & empty inbox.
385d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Also ensures that the remaining account and the remaining inbox have cleared their
386d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * server sync keys, to force refresh eventually.
387e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
388e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testWipeSyncedData() {
389d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account1 = ProviderTestUtils.setupAccount("wipe-synced-1", false, mProviderContext);
390d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.mSyncKey = "account-1-sync-key";
391d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.save(mProviderContext);
392e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
393d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, false, mProviderContext);
394d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mType = Mailbox.TYPE_INBOX;
395d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mSyncKey = "box-1-sync-key";
396d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.save(mProviderContext);
397e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box1Id = box1.mId;
398e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
399e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box2Id = box2.mId;
40069af769688acc28a20cdbad046cea2565456801cMarc Blank        // An EAS account mailbox
40169af769688acc28a20cdbad046cea2565456801cMarc Blank        Mailbox eas = ProviderTestUtils.setupMailbox("eas", account1Id, false, mProviderContext);
40269af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.mType = Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
40369af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.save(mProviderContext);
404e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
405d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account2 = ProviderTestUtils.setupAccount("wipe-synced-2", false, mProviderContext);
406d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.mSyncKey = "account-2-sync-key";
407d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.save(mProviderContext);
408e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
409d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box3 = ProviderTestUtils.setupMailbox("box3", account2Id, false, mProviderContext);
410d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mSyncKey = "box-3-sync-key";
411d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mType = Mailbox.TYPE_INBOX;
412d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.save(mProviderContext);
413e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box3Id = box3.mId;
414e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box4 = ProviderTestUtils.setupMailbox("box4", account2Id, true, mProviderContext);
415e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box4Id = box4.mId;
416e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
41769af769688acc28a20cdbad046cea2565456801cMarc Blank        // Now populate the 4 non-account boxes with messages
418e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
419e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
420e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message1Id = message.mId;
421e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
422e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
423e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message2Id = message.mId;
424e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message3", account2Id, box3Id, false,
425e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
426e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message3Id = message.mId;
427e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message4", account2Id, box4Id, false,
428e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
429e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message4Id = message.mId;
430e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
431e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Now wipe account 1's data
432e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        mTestController.deleteSyncedDataSync(account1Id);
433e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
43469af769688acc28a20cdbad046cea2565456801cMarc Blank        // Confirm:  Mailboxes gone (except account box), all messages gone, account survives
43569af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box1Id));
436e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box2Id));
43769af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, eas.mId));
438e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message1Id));
439e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message2Id));
440d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1 = Account.restoreAccountWithId(mProviderContext, account1Id);
441d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNotNull(account1);
442d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNull(account1.mSyncKey);
443e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
444e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm:  Other account survived
445e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box3Id));
446e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box4Id));
447e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message3Id));
448e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message4Id));
449e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Account.restoreAccountWithId(mProviderContext, account2Id));
450e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
451e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
452206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    public void testLoadMessageFromUri() throws Exception {
453391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Create a simple message
454391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        Message msg = new Message();
455391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String text = "This is some text";
456391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mText = text;
457391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String sender = "sender@host.com";
458391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mFrom = sender;
459391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Save this away
460391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.save(mProviderContext);
461391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
462206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki        Uri fileUri = ProviderTestUtils.createTempEmlFile(mProviderContext, msg,
463206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki                mContext.getFilesDir());
464391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
465391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Load the message via Controller and a Uri
4664be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Message loadedMsg = mTestController.loadMessageFromUri(fileUri);
467391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
468391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check server id, mailbox key, account key, and from
469391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(loadedMsg);
470391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertTrue(loadedMsg.mServerId.startsWith(Controller.ATTACHMENT_MESSAGE_UID_PREFIX));
4714be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
472391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
473391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, loadedMsg.mMailboxKey);
474391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, loadedMsg.mAccountKey);
475391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(loadedMsg.mFrom, sender);
476391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check body text
477391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String loadedMsgText = Body.restoreBodyTextWithMessageId(mProviderContext, loadedMsg.mId);
478391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(text, loadedMsgText);
479391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
480391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
4816ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
4828d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * Create a simple HostAuth with protocol
4837c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
4848d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    private HostAuth setupSimpleHostAuth(String protocol) {
4858d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        HostAuth hostAuth = new HostAuth();
4868d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        hostAuth.mProtocol = protocol;
4878d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        return hostAuth;
4888d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
4898d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
4908d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testIsMessagingController() {
4918d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account1", false,
4928d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4938d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthRecv = setupSimpleHostAuth("eas");
4948d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mProviderContext);
4954be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
4968d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account2", false,
4978d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4988d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.mHostAuthRecv = setupSimpleHostAuth("imap");
4998d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mProviderContext);
5004be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5018d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account3 = ProviderTestUtils.setupAccount("account3", false,
5028d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
5038d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.mHostAuthRecv = setupSimpleHostAuth("pop3");
5048d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.save(mProviderContext);
5054be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5068d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account4 = ProviderTestUtils.setupAccount("account4", false,
5078d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
5088d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.mHostAuthRecv = setupSimpleHostAuth("smtp");
5098d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.save(mProviderContext);
5104be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5118d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // There should be values for all of these accounts in the legacy map
5124be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account1.mId));
5134be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account2.mId));
5144be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account3.mId));
5154be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account4.mId));
5168d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // The map should have the expected values
5174be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account1.mId));
5184be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account2.mId));
5194be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account3.mId));
5204be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account4.mId));
5218d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // This second pass should pull values from the cache
5224be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
5234be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5244be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5254be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5268d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
5276ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
5286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
5298d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * TODO: releasing associated data (e.g. attachments, embedded images)
5306ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
5317c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler}
532