ControllerProviderOpsTests.java revision e29189e3eeea9c629777b3deed6ea2be67caa737
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;
207c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport com.android.email.provider.EmailContent;
21b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blankimport com.android.email.provider.EmailProvider;
22b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blankimport com.android.email.provider.ProviderTestUtils;
237c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport com.android.email.provider.EmailContent.Account;
24391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blankimport com.android.email.provider.EmailContent.Body;
258d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blankimport com.android.email.provider.EmailContent.HostAuth;
267c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport com.android.email.provider.EmailContent.Mailbox;
277c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadlerimport com.android.email.provider.EmailContent.Message;
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() {
547c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        super(EmailProvider.class, EmailProvider.EMAIL_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.
16411aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki     *
165b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws ExecutionException
166b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws InterruptedException
167b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     */
168b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    public void testMoveMessage() throws InterruptedException, ExecutionException {
169b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Account account1 = ProviderTestUtils.setupAccount("message-move", true, mProviderContext);
170b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long account1Id = account1.mId;
171b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
172b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box1Id = box1.mId;
173b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
174b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box2Id = box2.mId;
17511aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Mailbox boxDest = ProviderTestUtils.setupMailbox("d", account1Id, true, mProviderContext);
17611aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long boxDestId = boxDest.mId;
177b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
178b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
179b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank                true, mProviderContext);
18011aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
18111aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                true, mProviderContext);
182b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long message1Id = message1.mId;
18311aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long message2Id = message2.mId;
184b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
185b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // Because moveMessage runs asynchronously, call get() to force it to complete
18611aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        mTestController.moveMessage(new long[] {message1Id, message2Id}, boxDestId).get();
187b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
188b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // now read back a fresh copy and confirm it's in the trash
18911aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
19011aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message1Id).mMailboxKey);
19111aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
19211aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message2Id).mMailboxKey);
193b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    }
194b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
195b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    /**
1967c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test the "delete message" function.  Sunny day:
1977c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - message/mailbox/account all exist
1987c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - trash mailbox exists
199b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws ExecutionException
200b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws InterruptedException
2017c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
202b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    public void testDeleteMessage() throws InterruptedException, ExecutionException {
2037c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mProviderContext);
2047c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
20577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox box = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
20677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long boxId = box.mId;
2077c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
20877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox trashBox = ProviderTestUtils.setupMailbox("box2", account1Id, false,
20977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
21077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        trashBox.mType = EmailContent.Mailbox.TYPE_TRASH;
21177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        trashBox.save(mProviderContext);
21277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long trashBoxId = trashBox.mId;
21377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
21477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox draftBox = ProviderTestUtils.setupMailbox("box3", account1Id, false,
21577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
21677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        draftBox.mType = EmailContent.Mailbox.TYPE_DRAFTS;
21777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        draftBox.save(mProviderContext);
21877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long draftBoxId = draftBox.mId;
21977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
22077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
22177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 1: Message in a regular mailbox, account known.
22277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message1", account1Id, boxId, false,
22377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    true, mProviderContext);
22477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
22577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
22677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
22777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
22877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // now read back a fresh copy and confirm it's in the trash
22977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
23077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    messageId);
23177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertEquals(trashBoxId, restored.mMailboxKey);
23277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2337c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
23477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
23577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 2: Message in a regular mailbox, account *un*known.
23677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message2", account1Id, boxId, false,
23777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    true, mProviderContext);
23877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2397c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, -1);
2417c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // now read back a fresh copy and confirm it's in the trash
24377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
24477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    messageId);
24577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertEquals(trashBoxId, restored.mMailboxKey);
24677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2477c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
24977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 3: Already in trash
25077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId,
25177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
25277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2537c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
25477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
25577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
25677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
25777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
25877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
25977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
26177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 4: Draft
26277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId,
26377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
26477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
26577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            mTestController.deleteMessageSync(messageId, account1Id);
26777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
26977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
27077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2717c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2727c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2737c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2747c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test deleting message when there is no trash mailbox
275b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws ExecutionException
276b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * @throws InterruptedException
2777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
278b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    public void testDeleteMessageNoTrash() throws InterruptedException, ExecutionException {
2797c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 =
2807c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupAccount("message-delete-notrash", true, mProviderContext);
2817c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
2827c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
2837c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long box1Id = box1.mId;
2847c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2857c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1 =
2867c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
2877c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                        mProviderContext);
2887c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long message1Id = message1.mId;
2897c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
29077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        mTestController.deleteMessageSync(message1Id, account1Id);
2917c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2927c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // now read back a fresh copy and confirm it's in the trash
2937c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1get =
2947c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                EmailContent.Message.restoreMessageWithId(mProviderContext, message1Id);
2957c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2967c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // check the new mailbox and see if it looks right
2977c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(-1 == message1get.mMailboxKey);
2987c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(box1Id == message1get.mMailboxKey);
2997c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Mailbox mailbox2get = EmailContent.Mailbox.restoreMailboxWithId(mProviderContext,
3007c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                message1get.mMailboxKey);
3017c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertEquals(EmailContent.Mailbox.TYPE_TRASH, mailbox2get.mType);
3027c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
3037c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
3047c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
3056ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test read/unread flag
3066ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3076ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    public void testReadUnread() {
308fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("read-unread", false, mProviderContext);
309fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
310fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("read-unread", 0, false, mProviderContext);
311fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
312fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3136ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3146ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3156ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3166ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3176ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3186ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3196ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3206ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "read"
3214be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.setMessageRead(message1Id, true);
3226ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3236ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagRead);
3246ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3256ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "unread"
3264be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.setMessageRead(message1Id, false);
3276ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagRead);
3296ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3306ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3316ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
3326ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test favorites flag
3336ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3346ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    public void testFavorites() {
335fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("favorites", false, mProviderContext);
336fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
337fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("favorites", 0, false, mProviderContext);
338fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
339fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3406ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3416ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3426ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3436ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3446ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3456ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3466ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3476ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "favorite"
3484be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.setMessageFavorite(message1Id, true);
3496ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3506ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagFavorite);
3516ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3526ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "not favorite"
3534be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.setMessageFavorite(message1Id, false);
3546ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3556ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagFavorite);
3566ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3576ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
358391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    public void testGetAndDeleteAttachmentMailbox() {
3594be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
360391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
3614be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox anotherBox = mTestController.getAttachmentMailbox();
362391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(anotherBox);
363391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // We should always get back the same Mailbox row
364391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, anotherBox.mId);
365391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Add two messages to this mailbox
366391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message1", 0, box.mId, false, true,
367391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
368391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message2", 0, box.mId, false, true,
369391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
370391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure we can find them where they are expected
371391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(2, EmailContent.count(mProviderContext, Message.CONTENT_URI,
372391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
373391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Delete them
3744be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.deleteAttachmentMessages();
375391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure they're gone
376391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, EmailContent.count(mProviderContext, Message.CONTENT_URI,
377391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
378391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
379391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
380e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
381e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     * Test wiping an account's synced data (but not the account)
382e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
383e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testWipeSyncedData() {
384e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account1 = ProviderTestUtils.setupAccount("wipe-synced-1", true, mProviderContext);
385e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
386e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
387e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box1Id = box1.mId;
388e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
389e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box2Id = box2.mId;
390e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
391e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Account account2 = ProviderTestUtils.setupAccount("wipe-synced-2", true, mProviderContext);
392e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
393e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box3 = ProviderTestUtils.setupMailbox("box3", account2Id, true, mProviderContext);
394e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box3Id = box3.mId;
395e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box4 = ProviderTestUtils.setupMailbox("box4", account2Id, true, mProviderContext);
396e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box4Id = box4.mId;
397e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
398e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Now populate all 4 with messages
399e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
400e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
401e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message1Id = message.mId;
402e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
403e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
404e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message2Id = message.mId;
405e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message3", account2Id, box3Id, false,
406e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
407e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message3Id = message.mId;
408e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message4", account2Id, box4Id, false,
409e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
410e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message4Id = message.mId;
411e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
412e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Now wipe account 1's data
413e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        mTestController.deleteSyncedDataSync(account1Id);
414e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
415e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm:  Mailboxes gone, messages gone, account survives
416e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box1Id));
417e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box2Id));
418e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message1Id));
419e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message2Id));
420e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Account.restoreAccountWithId(mProviderContext, account1Id));
421e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
422e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm:  Other account survived
423e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box3Id));
424e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box4Id));
425e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message3Id));
426e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message4Id));
427e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Account.restoreAccountWithId(mProviderContext, account2Id));
428e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
429e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
430206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    public void testLoadMessageFromUri() throws Exception {
431391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Create a simple message
432391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        Message msg = new Message();
433391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String text = "This is some text";
434391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mText = text;
435391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String sender = "sender@host.com";
436391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mFrom = sender;
437391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Save this away
438391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.save(mProviderContext);
439391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
440206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki        Uri fileUri = ProviderTestUtils.createTempEmlFile(mProviderContext, msg,
441206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki                mContext.getFilesDir());
442391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
443391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Load the message via Controller and a Uri
4444be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Message loadedMsg = mTestController.loadMessageFromUri(fileUri);
445391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
446391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check server id, mailbox key, account key, and from
447391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(loadedMsg);
448391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertTrue(loadedMsg.mServerId.startsWith(Controller.ATTACHMENT_MESSAGE_UID_PREFIX));
4494be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
450391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
451391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, loadedMsg.mMailboxKey);
452391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, loadedMsg.mAccountKey);
453391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(loadedMsg.mFrom, sender);
454391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check body text
455391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String loadedMsgText = Body.restoreBodyTextWithMessageId(mProviderContext, loadedMsg.mId);
456391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(text, loadedMsgText);
457391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
458391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
4596ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
4608d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * Create a simple HostAuth with protocol
4617c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
4628d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    private HostAuth setupSimpleHostAuth(String protocol) {
4638d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        HostAuth hostAuth = new HostAuth();
4648d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        hostAuth.mProtocol = protocol;
4658d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        return hostAuth;
4668d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
4678d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
4688d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testIsMessagingController() {
4698d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account1", false,
4708d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4718d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthRecv = setupSimpleHostAuth("eas");
4728d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mProviderContext);
4734be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
4748d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account2", false,
4758d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4768d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.mHostAuthRecv = setupSimpleHostAuth("imap");
4778d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mProviderContext);
4784be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
4798d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account3 = ProviderTestUtils.setupAccount("account3", false,
4808d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4818d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.mHostAuthRecv = setupSimpleHostAuth("pop3");
4828d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.save(mProviderContext);
4834be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
4848d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account4 = ProviderTestUtils.setupAccount("account4", false,
4858d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4868d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.mHostAuthRecv = setupSimpleHostAuth("smtp");
4878d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.save(mProviderContext);
4884be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
4898d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // There should be values for all of these accounts in the legacy map
4904be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account1.mId));
4914be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account2.mId));
4924be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account3.mId));
4934be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account4.mId));
4948d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // The map should have the expected values
4954be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account1.mId));
4964be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account2.mId));
4974be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account3.mId));
4984be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account4.mId));
4998d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // This second pass should pull values from the cache
5004be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
5014be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5024be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5034be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5048d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
5056ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
5066ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
5078d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * TODO: releasing associated data (e.g. attachments, embedded images)
5086ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
5097c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler}
510