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
19b81a31b29b22b1b11e8ad636638d2b8213e9f199Marc Blankimport android.content.Context;
20b81a31b29b22b1b11e8ad636638d2b8213e9f199Marc Blankimport android.net.Uri;
21b81a31b29b22b1b11e8ad636638d2b8213e9f199Marc Blankimport android.test.ProviderTestCase2;
22b81a31b29b22b1b11e8ad636638d2b8213e9f199Marc Blank
23e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadlerimport com.android.email.provider.ContentCache;
2469af769688acc28a20cdbad046cea2565456801cMarc Blankimport com.android.email.provider.EmailProvider;
2569af769688acc28a20cdbad046cea2565456801cMarc Blankimport com.android.email.provider.ProviderTestUtils;
26f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
27a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
28a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Body;
29a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
3012b82d9374947c9268217f45befe8a74bd9b60d7Ben Komaloimport com.android.emailcommon.provider.HostAuth;
3153ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
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
646e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        ContentCache.invalidateAllCaches();
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() {
88e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("", Controller.getMailboxServerName(mContext, -1));
89fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler
90e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Inbox", Controller.getMailboxServerName(mContext, Mailbox.TYPE_INBOX));
91e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Outbox", Controller.getMailboxServerName(mContext, Mailbox.TYPE_OUTBOX));
92e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Trash", Controller.getMailboxServerName(mContext, Mailbox.TYPE_TRASH));
93e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Sent", Controller.getMailboxServerName(mContext, Mailbox.TYPE_SENT));
94e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Junk", Controller.getMailboxServerName(mContext, Mailbox.TYPE_JUNK));
95fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler
96fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        // Now try again with translation
97fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Locale savedLocale = Locale.getDefault();
98fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Locale.setDefault(Locale.FRANCE);
99e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Inbox", Controller.getMailboxServerName(mContext, Mailbox.TYPE_INBOX));
100e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Outbox", Controller.getMailboxServerName(mContext, Mailbox.TYPE_OUTBOX));
101e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Trash", Controller.getMailboxServerName(mContext, Mailbox.TYPE_TRASH));
102e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Sent", Controller.getMailboxServerName(mContext, Mailbox.TYPE_SENT));
103e71a19a52313a0fb615700e52a336b65f3c305daBen Komalo        assertEquals("Junk", Controller.getMailboxServerName(mContext, 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() {
1139d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        // safety check that system mailboxes don't exist ...
1149d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(Mailbox.NO_MAILBOX,
1159d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy                Mailbox.findMailboxOfType(mProviderContext, 1L, Mailbox.TYPE_DRAFTS));
1169d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(Mailbox.NO_MAILBOX,
1179d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy                Mailbox.findMailboxOfType(mProviderContext, 1L, Mailbox.TYPE_SENT));
1189d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy
1199d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        long testMailboxId;
1209d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        Mailbox testMailbox;
1219d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy
1229d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        // Test creating "drafts" mailbox
1239d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        mTestController.createMailbox(1L, Mailbox.TYPE_DRAFTS);
1249d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        testMailboxId = Mailbox.findMailboxOfType(mProviderContext, 1L, Mailbox.TYPE_DRAFTS);
1259d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertTrue(testMailboxId != Mailbox.NO_MAILBOX);
1269d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(mProviderContext, testMailboxId);
1279d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertNotNull(testMailbox);
1289d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(8, testMailbox.mFlags);        // Flags should be "holds mail"
1299d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(-1L, testMailbox.mParentKey);  // Parent is off the top-level
1309d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy
1319d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        // Test creating "sent" mailbox; same as drafts
1329d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        mTestController.createMailbox(1L, Mailbox.TYPE_SENT);
1339d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        testMailboxId = Mailbox.findMailboxOfType(mProviderContext, 1L, Mailbox.TYPE_SENT);
1349d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertTrue(testMailboxId != Mailbox.NO_MAILBOX);
1359d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(mProviderContext, testMailboxId);
1369d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertNotNull(testMailbox);
1379d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(8, testMailbox.mFlags);        // Flags should be "holds mail"
1389d2dae67506983c64f72350a4fb5967cfd85b9a8Todd Kennedy        assertEquals(-1L, testMailbox.mParentKey);  // Parent is off the top-level
139c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
140206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki
141206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    /**
142c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Test of Controller.findOrCreateMailboxOfType().
143c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * Checks:
144c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - finds correctly the ID of existing mailbox
145c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - creates non-existing mailbox
146c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - creates only once a new mailbox
147c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     * - when accountId or mailboxType are -1, returns NO_MAILBOX
148c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda     */
149c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    public void testFindOrCreateMailboxOfType() {
150c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Account account = ProviderTestUtils.setupAccount("mailboxid", true, mProviderContext);
151c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long accountId = account.mId;
152c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Mailbox box = ProviderTestUtils.setupMailbox("box", accountId, false, mProviderContext);
153c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        final int boxType = Mailbox.TYPE_TRASH;
154c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        box.mType = boxType;
155c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        box.save(mProviderContext);
156c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        long boxId = box.mId;
157c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1584be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long testBoxId = mTestController.findOrCreateMailboxOfType(accountId, boxType);
159c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
160c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check it found the right mailbox id
161c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertEquals(boxId, testBoxId);
162c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1634be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long boxId2 = mTestController.findOrCreateMailboxOfType(accountId, Mailbox.TYPE_DRAFTS);
164c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertTrue("mailbox created", boxId2 != Mailbox.NO_MAILBOX);
165c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertTrue("with different id", testBoxId != boxId2);
166c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
167c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check it doesn't create twice when existing
1684be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        long boxId3 = mTestController.findOrCreateMailboxOfType(accountId, Mailbox.TYPE_DRAFTS);
169c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        assertEquals("don't create if exists", boxId3, boxId2);
170206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki
171c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        // check invalid aruments
1724be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals(Mailbox.NO_MAILBOX,
1734be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki                mTestController.findOrCreateMailboxOfType(-1, Mailbox.TYPE_DRAFTS));
1744be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertEquals(Mailbox.NO_MAILBOX, mTestController.findOrCreateMailboxOfType(accountId, -1));
175c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
176c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
1777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
178b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     * Test the "move message" function.
179b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank     */
180b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    public void testMoveMessage() throws InterruptedException, ExecutionException {
181b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Account account1 = ProviderTestUtils.setupAccount("message-move", true, mProviderContext);
182b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long account1Id = account1.mId;
183b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
184b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box1Id = box1.mId;
185b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
186b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long box2Id = box2.mId;
18711aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Mailbox boxDest = ProviderTestUtils.setupMailbox("d", account1Id, true, mProviderContext);
18811aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long boxDestId = boxDest.mId;
189b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
190b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
191b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank                true, mProviderContext);
19211aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
19311aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                true, mProviderContext);
194b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        long message1Id = message1.mId;
19511aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        long message2Id = message2.mId;
196b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
197b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // Because moveMessage runs asynchronously, call get() to force it to complete
1980bb7f1c37c99beb2a91bd98e64fcc9656877e034Ben Komalo        mTestController.moveMessages(new long[] { message1Id, message2Id }, boxDestId).get();
199b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
200b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank        // now read back a fresh copy and confirm it's in the trash
20111aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
20211aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message1Id).mMailboxKey);
20311aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki        assertEquals(boxDestId, EmailContent.Message.restoreMessageWithId(mProviderContext,
20411aea1efe45b23c1217b31be029a527c9dc460b8Makoto Onuki                message2Id).mMailboxKey);
205b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    }
206b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank
207b53b1501055cbf5040bfd7b88a9cda084574c398Marc Blank    /**
2087c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test the "delete message" function.  Sunny day:
2097c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - message/mailbox/account all exist
2107c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     *    - trash mailbox exists
2117c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
212e87ff6c3cbbfc5e3636f9827b58820652e3ea1c5Todd Kennedy    public void testDeleteMessage() {
2137c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mProviderContext);
2147c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
21577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox box = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
21677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long boxId = box.mId;
2177c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
21877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox trashBox = ProviderTestUtils.setupMailbox("box2", account1Id, false,
21977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
22053ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        trashBox.mType = Mailbox.TYPE_TRASH;
22177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        trashBox.save(mProviderContext);
22277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long trashBoxId = trashBox.mId;
22377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
22477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        Mailbox draftBox = ProviderTestUtils.setupMailbox("box3", account1Id, false,
22577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                mProviderContext);
22653ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        draftBox.mType = Mailbox.TYPE_DRAFTS;
22777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        draftBox.save(mProviderContext);
22877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        long draftBoxId = draftBox.mId;
22977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
23077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
23177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Case 1: Message in a regular mailbox, account known.
23277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message1", account1Id, boxId, false,
23377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    true, mProviderContext);
23477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
23577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
2363096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
23777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
23877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // now read back a fresh copy and confirm it's in the trash
23977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
24077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    messageId);
24177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertEquals(trashBoxId, restored.mMailboxKey);
24277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2437c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
24477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
2453096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            // Case 2: Already in trash
24677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId,
24777aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
24877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
2497c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2503096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
25177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
25277aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
25377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
25477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
25577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
25677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        {
2573096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            // Case 3: Draft
25877aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId,
25977aabd951992057a543f1699150971bf1f2d4394Makoto Onuki                    false, true, mProviderContext);
26077aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            long messageId = message.mId;
26177aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
2623096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki            mTestController.deleteMessageSync(messageId);
26377aabd951992057a543f1699150971bf1f2d4394Makoto Onuki
26477aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            // Message should be deleted.
26577aabd951992057a543f1699150971bf1f2d4394Makoto Onuki            assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
26677aabd951992057a543f1699150971bf1f2d4394Makoto Onuki        }
2677c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2687c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2697c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2707c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     * Test deleting message when there is no trash mailbox
2717c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
272e87ff6c3cbbfc5e3636f9827b58820652e3ea1c5Todd Kennedy    public void testDeleteMessageNoTrash() {
2737c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Account account1 =
2747c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupAccount("message-delete-notrash", true, mProviderContext);
2757c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long account1Id = account1.mId;
2767c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
2777c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long box1Id = box1.mId;
2787c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2797c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1 =
2807c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
2817c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                        mProviderContext);
2827c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        long message1Id = message1.mId;
2837c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2843096b4ae18f55c9ebf04d83c534da4d5e3370932Makoto Onuki        mTestController.deleteMessageSync(message1Id);
2857c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2867c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // now read back a fresh copy and confirm it's in the trash
2877c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        Message message1get =
2887c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                EmailContent.Message.restoreMessageWithId(mProviderContext, message1Id);
2897c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2907c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        // check the new mailbox and see if it looks right
2917c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(-1 == message1get.mMailboxKey);
2927c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler        assertFalse(box1Id == message1get.mMailboxKey);
29353ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        Mailbox mailbox2get = Mailbox.restoreMailboxWithId(mProviderContext,
2947c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler                message1get.mMailboxKey);
29553ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        assertEquals(Mailbox.TYPE_TRASH, mailbox2get.mType);
2967c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    }
2977c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler
2987c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler    /**
2996ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test read/unread flag
3006ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3013b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testReadUnread() throws InterruptedException, ExecutionException {
302fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("read-unread", false, mProviderContext);
303fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
304fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("read-unread", 0, false, mProviderContext);
305fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
306fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3076ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3086ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3096ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3106ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3116ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3126ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3136ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3146ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "read"
3153b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3166ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3176ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagRead);
3186ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3196ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "unread"
3203b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, false).get();
3216ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3226ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagRead);
3233b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3243b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "read"
3253b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageRead(message1Id, true).get();
3263b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3273b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagRead);
3286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3296ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3306ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
3316ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     * Test favorites flag
3326ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
3333b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler    public void testFavorites() throws InterruptedException, ExecutionException {
334fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("favorites", false, mProviderContext);
335fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.mHostAuthRecv
336fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler                = ProviderTestUtils.setupHostAuth("favorites", 0, false, mProviderContext);
337fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        account1.save(mProviderContext);
338fa52e6c95674aef6461a5cfc670a052e1c5b7f2fAndrew Stadler        long account1Id = account1.mId;
3396ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long box1Id = 2;
3406ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3416ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1 =
3426ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true,
3436ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler                        mProviderContext);
3446ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        long message1Id = message1.mId;
3456ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3466ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "favorite"
3473b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3486ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        Message message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3496ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertTrue(message1get.mFlagFavorite);
3506ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
3516ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        // test setting to "not favorite"
3523b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, false).get();
3536ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3546ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler        assertFalse(message1get.mFlagFavorite);
3553b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler
3563b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        // test setting to "favorite"
3573b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        mTestController.setMessageFavorite(message1Id, true).get();
3583b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        message1get = Message.restoreMessageWithId(mProviderContext, message1Id);
3593b1cccf234cd95c3e1c4c568bc588ab06b06d3aaAndy Stadler        assertTrue(message1get.mFlagFavorite);
3606ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    }
3616ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
362391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    public void testGetAndDeleteAttachmentMailbox() {
3634be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
364391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
3654be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox anotherBox = mTestController.getAttachmentMailbox();
366391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(anotherBox);
367391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // We should always get back the same Mailbox row
368391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, anotherBox.mId);
369391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Add two messages to this mailbox
370391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message1", 0, box.mId, false, true,
371391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
372391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        ProviderTestUtils.setupMessage("message2", 0, box.mId, false, true,
373391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                mProviderContext);
374391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure we can find them where they are expected
375391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(2, EmailContent.count(mProviderContext, Message.CONTENT_URI,
376391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
377391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Delete them
3784be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        mTestController.deleteAttachmentMessages();
379391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Make sure they're gone
380391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, EmailContent.count(mProviderContext, Message.CONTENT_URI,
381391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank                Message.MAILBOX_KEY + "=?", new String[] {Long.toString(box.mId)}));
382391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
383391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
384e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    /**
385d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Test wiping an account's synced data.  Everything should go, but account & empty inbox.
386d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * Also ensures that the remaining account and the remaining inbox have cleared their
387d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler     * server sync keys, to force refresh eventually.
388e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler     */
389e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    public void testWipeSyncedData() {
390d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account1 = ProviderTestUtils.setupAccount("wipe-synced-1", false, mProviderContext);
391d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.mSyncKey = "account-1-sync-key";
392d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1.save(mProviderContext);
393e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account1Id = account1.mId;
394d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, false, mProviderContext);
395d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mType = Mailbox.TYPE_INBOX;
396d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.mSyncKey = "box-1-sync-key";
397d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box1.save(mProviderContext);
398e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box1Id = box1.mId;
399e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mProviderContext);
400e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box2Id = box2.mId;
40169af769688acc28a20cdbad046cea2565456801cMarc Blank        // An EAS account mailbox
40269af769688acc28a20cdbad046cea2565456801cMarc Blank        Mailbox eas = ProviderTestUtils.setupMailbox("eas", account1Id, false, mProviderContext);
40369af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.mType = Mailbox.TYPE_EAS_ACCOUNT_MAILBOX;
40469af769688acc28a20cdbad046cea2565456801cMarc Blank        eas.save(mProviderContext);
405e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
406d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Account account2 = ProviderTestUtils.setupAccount("wipe-synced-2", false, mProviderContext);
407d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.mSyncKey = "account-2-sync-key";
408d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account2.save(mProviderContext);
409e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long account2Id = account2.mId;
410d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        Mailbox box3 = ProviderTestUtils.setupMailbox("box3", account2Id, false, mProviderContext);
411d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mSyncKey = "box-3-sync-key";
412d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.mType = Mailbox.TYPE_INBOX;
413d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        box3.save(mProviderContext);
414e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box3Id = box3.mId;
415e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Mailbox box4 = ProviderTestUtils.setupMailbox("box4", account2Id, true, mProviderContext);
416e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long box4Id = box4.mId;
417e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
41869af769688acc28a20cdbad046cea2565456801cMarc Blank        // Now populate the 4 non-account boxes with messages
419e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        Message message = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
420e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
421e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message1Id = message.mId;
422e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message2", account1Id, box2Id, false,
423e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
424e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message2Id = message.mId;
425e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message3", account2Id, box3Id, false,
426e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
427e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message3Id = message.mId;
428e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        message = ProviderTestUtils.setupMessage("message4", account2Id, box4Id, false,
429e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler                true, mProviderContext);
430e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        long message4Id = message.mId;
431e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
432e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Now wipe account 1's data
433e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        mTestController.deleteSyncedDataSync(account1Id);
434e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
43569af769688acc28a20cdbad046cea2565456801cMarc Blank        // Confirm:  Mailboxes gone (except account box), all messages gone, account survives
43669af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box1Id));
437e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Mailbox.restoreMailboxWithId(mProviderContext, box2Id));
43869af769688acc28a20cdbad046cea2565456801cMarc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, eas.mId));
439e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message1Id));
440e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNull(Message.restoreMessageWithId(mProviderContext, message2Id));
441d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        account1 = Account.restoreAccountWithId(mProviderContext, account1Id);
442d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNotNull(account1);
443d3a9ab946caef4cdc8ef81f7fd8f445fdba3782fAndy Stadler        assertNull(account1.mSyncKey);
444e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
445e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        // Confirm:  Other account survived
446e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box3Id));
447e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Mailbox.restoreMailboxWithId(mProviderContext, box4Id));
448e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message3Id));
449e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Message.restoreMessageWithId(mProviderContext, message4Id));
450e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler        assertNotNull(Account.restoreAccountWithId(mProviderContext, account2Id));
451e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler    }
452e29189e3eeea9c629777b3deed6ea2be67caa737Andy Stadler
453206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki    public void testLoadMessageFromUri() throws Exception {
454391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Create a simple message
455391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        Message msg = new Message();
456391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String text = "This is some text";
457391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mText = text;
458391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String sender = "sender@host.com";
459391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.mFrom = sender;
460391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Save this away
461391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        msg.save(mProviderContext);
462391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
463206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki        Uri fileUri = ProviderTestUtils.createTempEmlFile(mProviderContext, msg,
464206d4e842d287a7a4e6bedf4963fb7f0f58e113fMakoto Onuki                mContext.getFilesDir());
465391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
466391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Load the message via Controller and a Uri
4674be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Message loadedMsg = mTestController.loadMessageFromUri(fileUri);
468391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
469391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check server id, mailbox key, account key, and from
470391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(loadedMsg);
471391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertTrue(loadedMsg.mServerId.startsWith(Controller.ATTACHMENT_MESSAGE_UID_PREFIX));
4724be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        Mailbox box = mTestController.getAttachmentMailbox();
473391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertNotNull(box);
474391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(box.mId, loadedMsg.mMailboxKey);
475391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(0, loadedMsg.mAccountKey);
476391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(loadedMsg.mFrom, sender);
477391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        // Check body text
478391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        String loadedMsgText = Body.restoreBodyTextWithMessageId(mProviderContext, loadedMsg.mId);
479391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank        assertEquals(text, loadedMsgText);
480391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank    }
481391ae25c43a38829cc0990af18c36bdc7cc374cfMarc Blank
4826ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
4838d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * Create a simple HostAuth with protocol
4847c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler     */
4858d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    private HostAuth setupSimpleHostAuth(String protocol) {
4868d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        HostAuth hostAuth = new HostAuth();
4878d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        hostAuth.mProtocol = protocol;
4888d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        return hostAuth;
4898d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
4908d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
4918d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testIsMessagingController() {
4928d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account1", false,
4938d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4948d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthRecv = setupSimpleHostAuth("eas");
4958d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mProviderContext);
4964be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
4978d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account2", false,
4988d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
4998d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.mHostAuthRecv = setupSimpleHostAuth("imap");
5008d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mProviderContext);
5014be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5028d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account3 = ProviderTestUtils.setupAccount("account3", false,
5038d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
5048d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.mHostAuthRecv = setupSimpleHostAuth("pop3");
5058d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account3.save(mProviderContext);
5064be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5078d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account4 = ProviderTestUtils.setupAccount("account4", false,
5088d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mProviderContext);
5098d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.mHostAuthRecv = setupSimpleHostAuth("smtp");
5108d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account4.save(mProviderContext);
5114be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5128d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // There should be values for all of these accounts in the legacy map
5134be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account1.mId));
5144be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account2.mId));
5154be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account3.mId));
5164be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertNotNull(mTestController.mLegacyControllerMap.get(account4.mId));
5178d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // The map should have the expected values
5184be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account1.mId));
5194be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account2.mId));
5204be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.mLegacyControllerMap.get(account3.mId));
5214be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.mLegacyControllerMap.get(account4.mId));
5228d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // This second pass should pull values from the cache
5234be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account1));
5244be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account2));
5254be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertTrue(mTestController.isMessagingController(account3));
5264be3bc1ec8a52308ee1998f0a31d7e491e06b3c1Makoto Onuki        assertFalse(mTestController.isMessagingController(account4));
5278d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
5286ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler
5296ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler    /**
5308d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank     * TODO: releasing associated data (e.g. attachments, embedded images)
5316ae38e4a3937898c5d3fec11a9dc2fb4bab8eab6Andrew Stadler     */
5327c3cca80a0b4dacb7bcb48c65a9999138b5df82bAndrew Stadler}
533