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