ProviderTests.java revision 32bed4bb8e23d7322ab338773d135845f392d3cf
17143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/*
27143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Copyright (C) 2009 The Android Open Source Project
37143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
47143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
57143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * you may not use this file except in compliance with the License.
67143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * You may obtain a copy of the License at
77143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
87143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
97143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Unless required by applicable law or agreed to in writing, software
117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * See the License for the specific language governing permissions and
147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * limitations under the License.
157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpackage com.android.email.provider;
187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
196e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.accounts.AccountManager;
206e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.accounts.AuthenticatorException;
216e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.accounts.OperationCanceledException;
226e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentResolver;
236e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentUris;
246e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentValues;
256e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.Context;
2632bed4bb8e23d7322ab338773d135845f392d3cfBen Komaloimport android.content.ContextWrapper;
276e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.database.Cursor;
286e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.database.sqlite.SQLiteDatabase;
296e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.net.Uri;
306e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Bundle;
316e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Environment;
326e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Parcel;
336e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.MoreAsserts;
346e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.ProviderTestCase2;
3552e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.LargeTest;
3652e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.MediumTest;
3752e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.SmallTest;
386e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
3932bed4bb8e23d7322ab338773d135845f392d3cfBen Komaloimport com.android.email.provider.EmailProvider.AttachmentService;
40f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blankimport com.android.emailcommon.AccountManagerTypes;
41f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
42a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
43a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
44a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
45a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AttachmentColumns;
46a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Body;
47a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.BodyColumns;
48a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MailboxColumns;
49a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
50a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MessageColumns;
512bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blankimport com.android.emailcommon.provider.EmailContent.PolicyColumns;
5212b82d9374947c9268217f45befe8a74bd9b60d7Ben Komaloimport com.android.emailcommon.provider.HostAuth;
5353ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
546e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport com.android.emailcommon.provider.Policy;
5576f614720db6a282c3e890969a600585122cdcc5Marc Blankimport com.android.emailcommon.utility.TextUtilities;
5631d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.utility.Utility;
577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
58758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.File;
59758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.IOException;
60758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.util.ArrayList;
61758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/**
637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Tests of the Email provider.
64758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank *
657143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * You can run this entire test case with:
667143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *   runtest -c com.android.email.provider.ProviderTests email
67261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki *
68261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * TODO: Add tests for cursor notification mechanism.  (setNotificationUri and notifyChange)
69261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * We can't test the entire notification mechanism with a mock content resolver, because which URI
70261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * to notify when notifyChange() is called is in the actual content resolver.
71261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * Implementing the same mechanism in a mock one is pointless.  Instead what we could do is check
72261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * what notification URI each cursor has, and with which URI is notified when
73261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * inserting/updating/deleting.  (The former require a new method from AbstractCursor)
747143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
7552e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo@LargeTest
767143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpublic class ProviderTests extends ProviderTestCase2<EmailProvider> {
77758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
789d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private EmailProvider mProvider;
799d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private Context mMockContext;
807143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public ProviderTests() {
8231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
837143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
84758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
8532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    // TODO: move this out to a common place. There are other places that have similar mocks.
8632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    /**
8732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo     * Private context wrapper used to add back getPackageName() for these tests.
8832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo     */
8932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    private static class MockContext2 extends ContextWrapper {
9032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        private final Context mRealContext;
9232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public MockContext2(Context mockContext, Context realContext) {
9432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            super(mockContext);
9532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            mRealContext = realContext;
9632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
9732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
9932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public Context getApplicationContext() {
10032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return this;
10132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
10232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
10332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
10432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public String getPackageName() {
10532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return mRealContext.getPackageName();
10632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
10732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
10832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
10932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public Object getSystemService(String name) {
11032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return mRealContext.getSystemService(name);
11132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
11232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
11332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
11432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    private static final AttachmentService MOCK_ATTACHMENT_SERVICE = new AttachmentService() {
11532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
11632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public void attachmentChanged(Context context, long id, int flags) {
11732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            // Noop. Don't download attachments.
11832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
11932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    };
12032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
1217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    @Override
1227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void setUp() throws Exception {
1237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        super.setUp();
12432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        mMockContext = new MockContext2(getMockContext(), getContext());
1259d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider = getProvider();
12632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        mProvider.injectAttachmentService(MOCK_ATTACHMENT_SERVICE);
127349055aad47184b72cd86de1f37ac1b7557d2e70Marc Blank        // Invalidate all caches, since we reset the database for each test
1286e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        ContentCache.invalidateAllCaches();
1297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
1317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    @Override
1327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void tearDown() throws Exception {
1337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        super.tearDown();
13432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        mProvider.injectAttachmentService(null);
1357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
1377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
1380d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler     * TODO: Database upgrade tests
1390d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler     */
1400d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler
14122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    //////////////////////////////////////////////////////////
14222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    ////// Utility methods
14322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    //////////////////////////////////////////////////////////
14422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
14522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Sets the message count of all mailboxes to {@code -1}. */
14622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private void setMinusOneToMessageCounts() {
14722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        ContentValues values = new ContentValues();
14822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        values.put(MailboxColumns.MESSAGE_COUNT, -1);
14922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
15022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // EmailProvider.update() doesn't allow updating messageCount, so directly use the DB.
15122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
15222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        db.update(Mailbox.TABLE_NAME, values, null, null);
15322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
15422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
15522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Returns the number of messages in a mailbox. */
15622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private int getMessageCount(long mailboxId) {
15722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return Utility.getFirstRowInt(mMockContext,
15822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
15922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                new String[] {MailboxColumns.MESSAGE_COUNT}, null, null, null, 0);
16022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
16122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
16222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates a new message. */
16322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read,
16422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            int flagLoaded) {
16522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message message = ProviderTestUtils.setupMessage(
16622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                "1", b.mAccountKey, b.mId, true, false, c, starred, read);
16722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        message.mFlagLoaded = flagLoaded;
16822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        message.save(c);
16922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return message;
17022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
17122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
17222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    //////////////////////////////////////////////////////////
17322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    ////// The tests
17422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    //////////////////////////////////////////////////////////
17522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
1760d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler    /**
1777143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple account save/retrieve
1787143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
17952e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
1807143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountSave() {
18128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-save", true, mMockContext);
1827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
183758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
184f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        Account account2 = Account.restoreAccountWithId(mMockContext, account1Id);
185758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
18628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account2);
1877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
18841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
1894a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    /**
190da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     * Test simple account save/retrieve with predefined hostauth records
191da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
19252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
193da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    public void testAccountSaveHostAuth() {
194da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
195da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // add hostauth data, which should be saved the first time
196da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false,
197da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                mMockContext);
198da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false,
199da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                mMockContext);
200da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.save(mMockContext);
201da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        long account1Id = account1.mId;
202da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
203da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm account reads back correctly
204f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        Account account1get = Account.restoreAccountWithId(mMockContext, account1Id);
205da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account1get);
206da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
207da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm hostauth fields can be accessed & read back correctly
20812b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        HostAuth hostAuth1get = HostAuth.restoreHostAuthWithId(mMockContext,
209da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1get.mHostAuthKeyRecv);
210da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertHostAuthEqual("testAccountSaveHostAuth-recv",
211da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1.mHostAuthRecv, hostAuth1get);
21212b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        HostAuth hostAuth2get = HostAuth.restoreHostAuthWithId(mMockContext,
213da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1get.mHostAuthKeySend);
214da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertHostAuthEqual("testAccountSaveHostAuth-send",
215da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1.mHostAuthSend, hostAuth2get);
216da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    }
217da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
218040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testAccountGetHostAuthSend() {
219040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
220040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false,
221040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                mMockContext);
222040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.save(mMockContext);
223040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authGet;
224040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authTest;
225040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
226040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authTest = account.mHostAuthSend;
227040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authTest);
228040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(account.mHostAuthKeySend != 0);
229040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
230040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // HostAuth is not changed
231040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
232040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(authGet == authTest); // return the same object
233040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
234040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; based upon mHostAuthKeyRecv
23512b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = HostAuth.restoreHostAuthWithId(mMockContext,
236040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                account.mHostAuthKeySend);
237040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthSend = null;
238040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
239040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
240040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthSend);
241040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthSend-1", authTest, authGet);
242040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
243040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; completely empty
24412b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = new HostAuth();
245040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthSend = null;
246040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthKeySend = 0;
247040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
248040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
249040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthSend);
250040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthSendv-2", authTest, authGet);
251040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
252040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
253040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testAccountGetHostAuthRecv() {
254040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
255040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false,
256040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                mMockContext);
257040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.save(mMockContext);
258040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authGet;
259040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authTest;
260040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
261040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authTest = account.mHostAuthRecv;
262040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authTest);
263040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(account.mHostAuthKeyRecv != 0);
264040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
265040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // HostAuth is not changed
266040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
267040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(authGet == authTest); // return the same object
268040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
269040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; based upon mHostAuthKeyRecv
27012b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = HostAuth.restoreHostAuthWithId(mMockContext,
271040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy                account.mHostAuthKeyRecv);
272040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthRecv = null;
273040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
274040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
275040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthRecv);
276040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthRecv-1", authTest, authGet);
277040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
278040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; completely empty
27912b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = new HostAuth();
280040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthRecv = null;
281040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthKeyRecv = 0;
282040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
283040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
284040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthRecv);
285040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthRecv-2", authTest, authGet);
286040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
287040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
288da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
289040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy     * Simple test of account parceling.  The rather torturous path is to ensure that the
2904a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     * account is really flattened all the way down to a parcel and back.
2914a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     */
2924a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    public void testAccountParcel() {
2934a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("parcel", false, mMockContext);
2944a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b = new Bundle();
2954a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.putParcelable("account", account1);
2964a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Parcel p = Parcel.obtain();
2974a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.writeToParcel(p, 0);
2984a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        p.setDataPosition(0);       // rewind it for reading
2994a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b2 = new Bundle(Account.class.getClassLoader());
3004a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b2.readFromParcel(p);
3014a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account2 = (Account) b2.getParcelable("account");
3024a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        p.recycle();
3034a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
3044a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountParcel", account1, account2);
3054a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    }
3064a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
307e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    /**
308e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki     * Test for {@link Account#getShortcutSafeUri()} and
309040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy     * {@link Account#getAccountIdFromShortcutSafeUri}.
310e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki     */
311e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    public void testAccountShortcutSafeUri() {
312e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Account account1 = ProviderTestUtils.setupAccount("account-1", true, mMockContext);
313e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Account account2 = ProviderTestUtils.setupAccount("account-2", true, mMockContext);
314e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final long account1Id = account1.mId;
315e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final long account2Id = account2.mId;
316e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
317e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Uri uri1 = account1.getShortcutSafeUri();
318e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Uri uri2 = account2.getShortcutSafeUri();
319e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
320e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // Check the path part of the URIs.
321e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        MoreAsserts.assertEquals(new String[] {"account", account1.mCompatibilityUuid},
322e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                uri1.getPathSegments().toArray());
323e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        MoreAsserts.assertEquals(new String[] {"account", account2.mCompatibilityUuid},
324e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                uri2.getPathSegments().toArray());
325e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
326e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account1Id, Account.getAccountIdFromShortcutSafeUri(mMockContext, uri1));
327e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account2Id, Account.getAccountIdFromShortcutSafeUri(mMockContext, uri2));
328e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
329e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // Test for the Eclair(2.0-2.1) style URI.
330e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account1Id, Account.getAccountIdFromShortcutSafeUri(mMockContext,
331e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                getEclairStyleShortcutUri(account1)));
332e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account2Id, Account.getAccountIdFromShortcutSafeUri(mMockContext,
333e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                getEclairStyleShortcutUri(account2)));
334e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    }
335e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
336e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    private static Uri getEclairStyleShortcutUri(Account account) {
337e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // We used _id instead of UUID only on Eclair(2.0-2.1).
338e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        return Account.CONTENT_URI.buildUpon().appendEncodedPath("" + account.mId).build();
339e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    }
340e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
3418d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testGetProtocol() {
3428d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
3438d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // add hostauth data, with protocol
344fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth("eas", "account-hostauth-recv",
3458d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                false, mMockContext);
3468d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // Note that getProtocol uses the receive host auth, so the protocol here shouldn't matter
3478d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // to the test result
348fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth("foo", "account-hostauth-send",
3498d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                false, mMockContext);
3508d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mMockContext);
35125144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", Account.getProtocol(mMockContext, account1.mId));
35225144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", account1.getProtocol(mMockContext));
3538d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account-nohostauth", false,
3548d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mMockContext);
3558d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mMockContext);
3568d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // Make sure that we return null when there's no host auth
3578d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, account2.mId));
3588d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(account2.getProtocol(mMockContext));
3598d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // And when there's no account
3608d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, 0));
3618d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
3628d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
363652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    public void testAccountIsValidId() {
364652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account1 = ProviderTestUtils.setupAccount("account-1", true, mMockContext);
365652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account2 = ProviderTestUtils.setupAccount("account-2", true, mMockContext);
366652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
367652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account1.mId));
368652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account2.mId));
369652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
370652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertFalse(Account.isValidId(mMockContext, 1234567)); // Some random ID
371c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -1));
372c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -500));
373652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    }
374652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
37541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private final static String[] MAILBOX_UNREAD_COUNT_PROJECTION = new String [] {
37641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        MailboxColumns.UNREAD_COUNT
37741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    };
37841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private final static int MAILBOX_UNREAD_COUNT_COLMUN = 0;
37941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
38041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    /**
38141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * Get the value of the unread count in the mailbox of the account.
38241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * This can be different from the actual number of unread messages in that mailbox.
38341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     */
38441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private int getUnreadCount(long mailboxId) {
38541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        String text = null;
38641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        Cursor c = null;
38741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        try {
38841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c = mMockContext.getContentResolver().query(
38941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    Mailbox.CONTENT_URI,
39041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    MAILBOX_UNREAD_COUNT_PROJECTION,
39141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    EmailContent.RECORD_ID + "=?",
39241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    new String[] { String.valueOf(mailboxId) },
39341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    null);
39441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.moveToFirst();
39541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            text = c.getString(MAILBOX_UNREAD_COUNT_COLMUN);
39641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        } finally {
39741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.close();
39841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        }
39941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        return Integer.valueOf(text);
40041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    }
40141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
4024119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static String[] expectedAttachmentNames =
403976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        new String[] {"attachment1.doc", "attachment2.xls", "attachment3"};
404976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    // The lengths need to be kept in ascending order
4054119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static long[] expectedAttachmentSizes = new long[] {31415L, 97701L, 151213L};
406976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
407fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /*
408fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Returns null if the message has no body.
409fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
410fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    private Body loadBodyForMessageId(long messageId) {
411fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
412fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        try {
413fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            c = mMockContext.getContentResolver().query(
414fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.CONTENT_URI,
415fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.CONTENT_PROJECTION,
416fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.MESSAGE_KEY + "=?",
417fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    new String[] {String.valueOf(messageId)},
418fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    null);
419fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            int numBodies = c.getCount();
420fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            assertTrue("at most one body", numBodies < 2);
421fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            return c.moveToFirst() ? EmailContent.getContent(c, Body.class) : null;
422fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        } finally {
423fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            c.close();
424fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        }
425fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
426fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
4277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
4287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple message save/retrieve
429758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
4307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: serverId vs. serverIntId
4317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
43252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @MediumTest
4337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageSave() {
43428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
4357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
43628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
4377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
4387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a simple message (saved with no body)
44028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
44128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
4427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
4437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message1get = EmailContent.Message.restoreMessageWithId(mMockContext, message1Id);
44428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message1, message1get);
4457143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a message saved with a body
4477143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Note that it will read back w/o the text & html so we must extract those
44828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
44928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
4507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
4517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String text2 = message2.mText;
4527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String html2 = message2.mHtml;
453936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        String textReply2 = message2.mTextReply;
454936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        String htmlReply2 = message2.mHtmlReply;
4556c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long sourceKey2 = message2.mSourceKey;
4565fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        String introText2 = message2.mIntroText;
4577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mText = null;
4587143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mHtml = null;
459936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        message2.mTextReply = null;
460936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        message2.mHtmlReply = null;
461e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        message2.mSourceKey = 0;
4625fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        message2.mIntroText = null;
4637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message2get = EmailContent.Message.restoreMessageWithId(mMockContext, message2Id);
46428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message2, message2get);
465758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
4667143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Now see if there's a body saved with the right stuff
467fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Body body2 = loadBodyForMessageId(message2Id);
468fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body text", text2, body2.mTextContent);
469fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body html", html2, body2.mHtmlContent);
470936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals("reply text", textReply2, body2.mTextReply);
471936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals("reply html", htmlReply2, body2.mHtmlReply);
4726c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals("source key", sourceKey2, body2.mSourceKey);
4735fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals("intro text", introText2, body2.mIntroText);
47432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
47532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
47632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    @MediumTest
47732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    public void testMessageWithAttachment() {
47832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
47932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long account1Id = account1.mId;
48032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
48132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long box1Id = box1.mId;
482976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
4834119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments and body
484976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        Message message3 = ProviderTestUtils.setupMessage("message3", account1Id, box1Id, true,
485976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                false, mMockContext);
486976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        ArrayList<Attachment> atts = new ArrayList<Attachment>();
487976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        for (int i = 0; i < 3; i++) {
4884119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
4894119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
4904119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    false, mMockContext));
491976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
492976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        message3.mAttachments = atts;
4939e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message3.save(mMockContext);
494976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        long message3Id = message3.mId;
495976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
496976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        // Now check the attachments; there should be three and they should match name and size
497fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
498976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
499976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // Note that there is NO guarantee of the order of returned records in the general case,
500976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // so we specifically ask for ordering by size.  The expectedAttachmentSizes array must
501976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // be kept sorted by size (ascending) for this test to work properly
502976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            c = mMockContext.getContentResolver().query(
503976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.CONTENT_URI,
504976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.CONTENT_PROJECTION,
505976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.MESSAGE_KEY + "=?",
506976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    new String[] {
507976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                            String.valueOf(message3Id)
508976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    },
509976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.SIZE);
510976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int numAtts = c.getCount();
511976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(3, numAtts);
512976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int i = 0;
513976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            while (c.moveToNext()) {
5144119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                Attachment actual = EmailContent.getContent(c, Attachment.class);
5154119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message3", atts.get(i), actual);
5164119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                i++;
5174119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            }
5184119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
5194119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
5204119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
52132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
52232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
52332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
52432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    @MediumTest
52532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    public void testMessageSaveWithJustAttachments() {
52632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
52732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long account1Id = account1.mId;
52832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
52932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long box1Id = box1.mId;
53032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Cursor c = null;
5314119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
5324119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments but no body
5334119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Message message4 = ProviderTestUtils.setupMessage("message4", account1Id, box1Id, false,
5344119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                false, mMockContext);
53532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        ArrayList<Attachment> atts = new ArrayList<Attachment>();
5364119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        for (int i = 0; i < 3; i++) {
5374119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
5384119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
5394119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    false, mMockContext));
5404119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
5414119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        message4.mAttachments = atts;
5429e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message4.save(mMockContext);
5434119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        long message4Id = message4.mId;
5444119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
5454119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Now check the attachments; there should be three and they should match name and size
5464119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        c = null;
54741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
5484119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
5494119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // Note that there is NO guarantee of the order of returned records in the general case,
5504119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // so we specifically ask for ordering by size.  The expectedAttachmentSizes array must
5514119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // be kept sorted by size (ascending) for this test to work properly
5524119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c = mMockContext.getContentResolver().query(
5534119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.CONTENT_URI,
5544119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.CONTENT_PROJECTION,
5554119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.MESSAGE_KEY + "=?",
5564119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    new String[] {
5574119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                            String.valueOf(message4Id)
5584119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    },
5594119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.SIZE);
5604119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int numAtts = c.getCount();
5614119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            assertEquals(3, numAtts);
5624119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int i = 0;
5634119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            while (c.moveToNext()) {
5644119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                Attachment actual = EmailContent.getContent(c, Attachment.class);
5654119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), actual);
566976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                i++;
567976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
568976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
569976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            c.close();
5707143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        }
57144144d0301213536b02f2080237b63d8271b2d0bMihai Preda
57244144d0301213536b02f2080237b63d8271b2d0bMihai Preda        // test EmailContent.restoreAttachmentsWitdMessageId()
57344144d0301213536b02f2080237b63d8271b2d0bMihai Preda        Attachment[] attachments =
57444144d0301213536b02f2080237b63d8271b2d0bMihai Preda            Attachment.restoreAttachmentsWithMessageId(mMockContext, message4Id);
57544144d0301213536b02f2080237b63d8271b2d0bMihai Preda        int size = attachments.length;
57644144d0301213536b02f2080237b63d8271b2d0bMihai Preda        assertEquals(3, size);
57744144d0301213536b02f2080237b63d8271b2d0bMihai Preda        for (int i = 0; i < size; ++i) {
57844144d0301213536b02f2080237b63d8271b2d0bMihai Preda            ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), attachments[i]);
57944144d0301213536b02f2080237b63d8271b2d0bMihai Preda        }
5807143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
581758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
583e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     * Test that saving a message creates the proper snippet for that message
584e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     */
585e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    public void testMessageSaveAddsSnippet() {
586e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Account account = ProviderTestUtils.setupAccount("message-snippet", true, mMockContext);
587e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Mailbox box = ProviderTestUtils.setupMailbox("box1", account.mId, true, mMockContext);
588e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
589e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Create a message without a body, unsaved
590e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Message message = ProviderTestUtils.setupMessage("message", account.mId, box.mId, false,
591e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank                false, mMockContext);
592e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = "This is some text";
593e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
594e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
595e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
596e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
59776f614720db6a282c3e890969a600585122cdcc5Marc Blank        assertEquals(restoredMessage.mSnippet,
59876f614720db6a282c3e890969a600585122cdcc5Marc Blank                TextUtilities.makeSnippetFromPlainText(message.mText));
599e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
600e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Start again
601e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message = ProviderTestUtils.setupMessage("message", account.mId, box.mId, false,
602e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank                false, mMockContext);
603e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = null;
604e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
605e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
606e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
607e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
60876f614720db6a282c3e890969a600585122cdcc5Marc Blank        assertEquals(restoredMessage.mSnippet,
60976f614720db6a282c3e890969a600585122cdcc5Marc Blank                TextUtilities.makeSnippetFromHtmlText(message.mHtml));
610e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    }
611e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
612e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    /**
6137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update account
6147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
615758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update mailbox
6187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
619758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update message
6227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
623758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete account
6267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
6277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
6287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountDelete() {
62928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-delete-1", true, mMockContext);
6307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
63128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account2 = ProviderTestUtils.setupAccount("account-delete-2", true, mMockContext);
6327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account2Id = account2.mId;
6337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two accounts
6357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numBoxes);
6377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
6397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
6407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one account now
6437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6447143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
6457143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
6477143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
6487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts now
6517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
6537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
654758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6569627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.lookupBodyIdWithMessageId()
6579627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Verifies that:
6589627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a message without body, -1 is returned.
6599627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a mesage with body, the id matches the one from loadBodyForMessageId.
6609627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6619627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testLookupBodyIdWithMessageId() {
6629627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
6639627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6649627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6659627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6669627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
6679627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6689627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1. create message with no body, check that returned bodyId is -1
6699627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
6709627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
6719627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
672bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId1 = Body.lookupBodyIdWithMessageId(mMockContext, message1Id);
6739627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(bodyId1, -1);
6749627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6759627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2. create message with body, check that returned bodyId is correct
6769627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
6779627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
6789627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
679bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId2 = Body.lookupBodyIdWithMessageId(mMockContext, message2Id);
6809627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body = loadBodyForMessageId(message2Id);
6819627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body);
6829627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body.mId, bodyId2);
6839627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
6849627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6859627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
6869627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.updateBodyWithMessageId().
6879627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 1. - create message without body,
6889627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update its body (set TEXT_CONTENT)
6899627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6909627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *
6919627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 2. - create message with body,
6929627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update body (set TEXT_CONTENT)
6939627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6949627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6959627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testUpdateBodyWithMessageId() {
6969627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6979627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6989627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6999627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
7009627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7019627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final String textContent = "foobar some odd text";
702936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String htmlContent = "and some html";
703936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String textReply = "plain text reply";
704936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String htmlReply = "or the html reply";
7055fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        final String introText = "fred wrote:";
7069627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7079627d014e16235eadf981b9165807dc72a14a383Mihai Preda        ContentValues values = new ContentValues();
7089627d014e16235eadf981b9165807dc72a14a383Mihai Preda        values.put(BodyColumns.TEXT_CONTENT, textContent);
709936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.HTML_CONTENT, htmlContent);
710936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.TEXT_REPLY, textReply);
711936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.HTML_REPLY, htmlReply);
712e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        values.put(BodyColumns.SOURCE_MESSAGE_KEY, 17);
7135fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        values.put(BodyColumns.INTRO_TEXT, introText);
7149627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7159627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1
7169627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
7179627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
7189627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
7199627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body1 = loadBodyForMessageId(message1Id);
7209627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNull(body1);
7219627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message1Id, values);
7229627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body1 = loadBodyForMessageId(message1Id);
7239627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body1);
7249627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body1.mTextContent, textContent);
725936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mHtmlContent, htmlContent);
726936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mTextReply, textReply);
727936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mHtmlReply, htmlReply);
728e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body1.mSourceKey, 17);
7295fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals(body1.mIntroText, introText);
7309627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7319627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2
7329627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
7339627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
7349627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
7359627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body2 = loadBodyForMessageId(message2Id);
7369627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7379627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertTrue(!body2.mTextContent.equals(textContent));
7389627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message2Id, values);
7399627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body2 = loadBodyForMessageId(message1Id);
7409627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7419627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body2.mTextContent, textContent);
742936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mHtmlContent, htmlContent);
743936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mTextReply, textReply);
744936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mHtmlReply, htmlReply);
745e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body2.mSourceKey, 17);
7465fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals(body2.mIntroText, introText);
7479627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
7489627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7499627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
750c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     * Test body retrieve methods
751c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     */
752c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    public void testBodyRetrieve() {
753c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No account needed
754c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No mailbox needed
755c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        Message message1 = ProviderTestUtils.setupMessage("bodyretrieve", 1, 1, true,
756c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                true, mMockContext);
757c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        long messageId = message1.mId;
758c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
759c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mText,
760c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreBodyTextWithMessageId(mMockContext, messageId));
761c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mHtml,
762c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreBodyHtmlWithMessageId(mMockContext, messageId));
763c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mTextReply,
764c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreReplyTextWithMessageId(mMockContext, messageId));
765c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mHtmlReply,
766c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreReplyHtmlWithMessageId(mMockContext, messageId));
767c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mIntroText,
768c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreIntroTextWithMessageId(mMockContext, messageId));
7691575e7860d2259f1aed201ab23d526cddf787365Mihai Preda        assertEquals(message1.mSourceKey,
7701575e7860d2259f1aed201ab23d526cddf787365Mihai Preda                Body.restoreBodySourceKey(mMockContext, messageId));
771c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    }
772c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
773c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    /**
774fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete body.
775fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
776fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. The body has _id 1 and messageKey 2).
777fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
778fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. verify that body for message 2 has not been deleted.
779fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. delete message 2, verify body is deleted.
780fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
781fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteBody() {
782fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
783fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
784fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // Create account and mailboxes
785fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
786fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
787fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
788fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
789fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
790fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
791fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
792fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
793fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
794fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
795fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
796fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
797fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
798fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
799fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // verify body is there
800fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
801fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
802fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
803fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
804c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
805fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. verify body for second message wasn't deleted
806fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
807fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
808fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 5. delete second message, check its body is deleted
809fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message2Id), null, null);
810fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNull(loadBodyForMessageId(message2Id));
811fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
812fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
813fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
814fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete orphan bodies.
815fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
816fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
817fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
818fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. delete some other mailbox -- this triggers delete orphan bodies.
819fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. verify that body for message 2 has not been deleted.
820fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
821fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteOrphanBodies() {
822fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
823fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
824ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
825fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
826fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
827fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
828fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
829fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mMockContext);
830fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box2Id = box2.mId;
831fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
832fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
833fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
834fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
835fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
836fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
837fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
838fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
839fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
840fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
841fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        //verify body is there
842fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
843fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
844fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
845fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
846fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
847fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. delete some mailbox (because it triggers "delete orphan bodies")
848fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Mailbox.CONTENT_URI, box2Id), null, null);
849fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
850fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 5. verify body for second message wasn't deleted during "delete orphan bodies"
851fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
852fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
853fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
854fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
8550efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * Note that we can't use EmailContent.count() here because it uses a projection including
8560efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * count(*), and count(*) is incompatible with a LIMIT (i.e. the limit would be applied to the
8570efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * single column returned with count(*), rather than to the query itself)
8580efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     */
8590efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    private int count(Context context, Uri uri, String selection, String[] selectionArgs) {
8600efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Cursor c = context.getContentResolver().query(uri, EmailContent.ID_PROJECTION, selection,
8610efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                selectionArgs, null);
8620efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        try {
8630efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            return c.getCount();
8640efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        } finally {
8650efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            c.close();
8660efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        }
8670efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
8680efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8690efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    public void testMessageQueryWithLimit() {
8700efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        final Context context = mMockContext;
8710efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8720efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create account and two mailboxes
8730efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
8740efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
8750efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
8760efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8770efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box1
8780efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, false, true, context);
8790efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, false, true, context);
8800efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, false, true, context);
8810efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, false, true, context);
8820efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8830efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box2
8840efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box2.mId, false, true, context);
8850efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box2.mId, false, true, context);
8860efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box2.mId, false, true, context);
8870efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box2.mId, false, true, context);
8880efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8890efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check normal case, special case (limit 1), and arbitrary limits
8900efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, Message.CONTENT_URI, null, null));
8910efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(1, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 1),
8920efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8930efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(3, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 3),
8940efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8950efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 100),
8960efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8970efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8980efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check that it works with selection/selection args
8990efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        String[] args = new String[] {Long.toString(box1.mId)};
9000efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(4, count(mMockContext, Message.CONTENT_URI,
9010efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                MessageColumns.MAILBOX_KEY + "=?", args));
9020efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(1, count(mMockContext,
9030efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                EmailContent.uriWithLimit(Message.CONTENT_URI, 1),
9040efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                MessageColumns.MAILBOX_KEY + "=?", args));
9050efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
9060efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
9070efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    /**
908ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * Test delete orphan messages
909ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 1. create message without body (message id 1)
910ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
911ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 3. delete first message.
912ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 4. delete some other mailbox -- this triggers delete orphan bodies.
913ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 5. verify that body for message 2 has not been deleted.
914ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     */
915ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     public void testDeleteOrphanMessages() {
916ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
917ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final Context context = mMockContext;
918ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
919ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
920ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
921ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
922ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
923ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
924ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box1
925ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_1 =
926ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, false, true, context);
927ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_2 =
928ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, false, true, context);
929ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_3 =
930ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, false, true, context);
931ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_4 =
932ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, false, true, context);
933ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
934ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box2
935ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_1 =
936ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message1", acct.mId, box2.mId, false, true, context);
937ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_2 =
938ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message2", acct.mId, box2.mId, false, true, context);
939ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_3 =
940ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message3", acct.mId, box2.mId, false, true, context);
941ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_4 =
942ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message4", acct.mId, box2.mId, false, true, context);
943ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
944ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete 2 from each mailbox
945ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_1.mId),
946ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
947ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_2.mId),
948ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
949ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_1.mId),
950ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
951ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_2.mId),
952ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
953ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
954ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 4 items in the deleted item table
955ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
956ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
957ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update 2 from each mailbox
958ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues v = new ContentValues();
959ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        v.put(MessageColumns.DISPLAY_NAME, "--updated--");
960ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_3.mId),
961ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
962ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_4.mId),
963ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
964ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_3.mId),
965ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
966ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_4.mId),
967ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
968ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
969ef83299b99288c00b9d661260d19715e73e6889cMarc Blank         // There should be 4 items in the updated item table
970ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
971ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
972ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Manually add 2 messages from a "deleted" mailbox to deleted and updated tables
973ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Use a value > 2 for the deleted box id
974ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long delBoxId = 10;
975ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in the "deleted" mailbox
976ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_A =
977ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageA", acct.mId, delBoxId, false, false, context);
978ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_B =
979ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageB", acct.mId, delBoxId, false, false, context);
980ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_C =
981ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageC", acct.mId, delBoxId, false, false, context);
982ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_D =
983ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageD", acct.mId, delBoxId, false, false, context);
984ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
985ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv;
986ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // We have to assign id's manually because there are no autoincrement id's for these tables
987ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Start with an id that won't exist, since id's in these tables must be unique
988ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long msgId = 10;
989ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // It's illegal to manually insert these, so we need to catch the exception
990ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // NOTE: The insert succeeds, and then throws the exception
991ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
992ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_A.toContentValues();
993ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
994ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
995ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
996ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
997ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
998ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_B.toContentValues();
999ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1000ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
1001ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1002ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1003ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1004ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_C.toContentValues();
1005ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1006ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
1007ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1008ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1009ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1010ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_D.toContentValues();
1011ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1012ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
1013ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1014ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1015ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1016ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 6 items in the deleted and updated tables
1017ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
1018ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
1019ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1020ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete the orphans
10212bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        EmailProvider.deleteMessageOrphans(EmailProvider.getReadableDatabase(context),
1022ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                Message.DELETED_TABLE_NAME);
10232bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        EmailProvider.deleteMessageOrphans(EmailProvider.getReadableDatabase(context),
1024ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                Message.UPDATED_TABLE_NAME);
1025ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1026ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should now be 4 messages in each of the deleted and updated tables again
1027ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
1028ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
1029ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    }
1030ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1031ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    /**
10327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete message
10337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
10347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
10357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
10367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageDelete() {
103728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mMockContext);
10387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
103928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
10407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
104128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
104228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
10437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
104428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
104528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
10467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
10477143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND " +
10497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler                EmailContent.MessageColumns.MAILBOX_KEY + "=?";
10507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String[] selArgs = new String[] { String.valueOf(account1Id), String.valueOf(box1Id) };
10517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two messages
10537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
10557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10567143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
10577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
10587143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10597143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one message now
10617143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numMessages);
10637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10647143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
10657143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
10667143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10677143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10687143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no messages now
10697143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10707143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
10717143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1072758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
10737143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
1074ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test delete synced message
1075ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1076ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1077ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1078ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testSyncedMessageDelete() {
107928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("synced-message-delete", true,
108028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
1081ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
108228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1083ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
108428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
108528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1086ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
108728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
108828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1089ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1090ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1091ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1092ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
1093ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String[] selArgs = new String[] {
1094ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            String.valueOf(account1Id), String.valueOf(box1Id)
1095ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        };
1096ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1097ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1098ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1099ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1100ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1101ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure we start with no synced deletions
1102ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1103ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1104ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1105ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1106ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete one of them SYNCED
1107ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1Id);
1108ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1109ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1110ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's only one message now
1111ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1112ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1113ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1114ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one synced deletion now
1115ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1116ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1117ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1118ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1119ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete the other one NOT SYNCED
1120ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
1121ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1122ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1123ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are no messages now
1124ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1125ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1126ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1127ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's still one deletion now
1128ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1129ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1130ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1131ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1132ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1133ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
1134ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test message update
1135ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1136ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1137ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1138ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testMessageUpdate() {
113928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-update", true, mMockContext);
1140ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
114128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1142ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
114328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
114428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1145ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
114628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
114728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1148ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1149ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentResolver cr = mMockContext.getContentResolver();
1150ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1151ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1152ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
1153ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String[] selArgs = new String[] {
1154ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            String.valueOf(account1Id), String.valueOf(box1Id)
1155ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        };
1156ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1157ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1158ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1159ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1160ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1161ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the first one
1162ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
1163ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentValues cv = new ContentValues();
1164ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1165ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1166ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1167ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's no updated message
1168ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1169ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1170ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1171ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1172ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck"
1173ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message1Id);
1174ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1175ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1176ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the second one
1177ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id);
1178ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv = new ContentValues();
1179ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1180ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1181ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1182ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one updated message
1183ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1184ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1185ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1186ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1187ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck",
1188ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // as before
1189ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        restoredMessage = Message.restoreMessageWithId(mMockContext, message2Id);
1190ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1191ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1192ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the original message back from the provider
1193ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Cursor c = cr.query(Message.UPDATED_CONTENT_URI, Message.CONTENT_PROJECTION, null, null,
1194ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                null);
1195ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        try {
1196ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertTrue(c.moveToFirst());
1197ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            Message originalMessage = EmailContent.getContent(c, Message.class);
1198ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // make sure this has the original value
1199ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertEquals("from message2", originalMessage.mFrom);
1200ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // Should only be one
1201ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertFalse(c.moveToNext());
1202ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        } finally {
1203ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            c.close();
1204ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        }
1205ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1206ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // delete the second message
1207ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id), null, null);
1208ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1209ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // hey, presto! the change should be gone
1210ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1211ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1212ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1213ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1214ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // and there should now be a deleted record
1215ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1216ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1217ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1218ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1219ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1220ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
12217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: cascaded delete account
12227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
12237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
12247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
12257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other account, mailbox & messages and confirm the right objects were deleted
12267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
12277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteAccount() {
122828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-delete-cascade", true,
122928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
12307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
123128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
12327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
123328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        /* Message message1 = */ ProviderTestUtils.setupMessage("message1", account1Id, box1Id,
123428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
123528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        /* Message message2 = */ ProviderTestUtils.setupMessage("message2", account1Id, box1Id,
123628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
12377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there is one account, one mailbox, and two messages
12397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
12407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numAccounts);
12417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
12427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
12437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
12447143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
12457143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // delete the account
12477143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
12487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
12497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts, mailboxes, or messages
12517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
12527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numAccounts);
12537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
12547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
12557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
12567143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
12577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1258758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
12597143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
12607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test cascaded delete mailbox
12617143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
12627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
12637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other mailbox & messages and confirm the right objects were deleted
12647143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
12657143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteMailbox() {
126628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("mailbox-delete-cascade", true,
126728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
12687143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
126928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
12707143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
1271ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id,
127228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
1273ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id,
1274ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                false, true, mMockContext);
1275ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message3 = ProviderTestUtils.setupMessage("message3", account1Id, box1Id,
1276ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                false, true, mMockContext);
1277ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message4 = ProviderTestUtils.setupMessage("message4", account1Id, box1Id,
127828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
1279ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message5", account1Id, box1Id, false, true, mMockContext);
1280ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message6", account1Id, box1Id, false, true, mMockContext);
12817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND " +
12837143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler                EmailContent.MessageColumns.MAILBOX_KEY + "=?";
12847143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String[] selArgs = new String[] { String.valueOf(account1Id), String.valueOf(box1Id) };
12857143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12860e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // make sure there are six messages
12877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1288ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, numMessages);
1289ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1290ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv = new ContentValues();
1291ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        cv.put(Message.SERVER_ID, "SERVER_ID");
1292ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentResolver resolver = mMockContext.getContentResolver();
1293ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1294ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update two messages
1295ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1.mId),
1296ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                cv, null, null);
1297ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2.mId),
1298ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                cv, null, null);
1299ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete two messages
1300ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message3.mId),
1301ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
1302ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message4.mId),
1303ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
1304ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1305ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should now be two messages in updated/deleted, and 4 in messages
1306ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1307ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, numMessages);
1308ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1309ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1310ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(2, numMessages);
1311ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1312ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
13137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
1314758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
13157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the mailbox
13167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box1Id);
1317ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(uri, null, null);
1318758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1319ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // there should now be zero messages in all three tables
13207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
13217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
1322ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1323ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1324ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
1325ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1326ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1327ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
13287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1329758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
13307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
13316c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test cascaded delete message
13326c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Confirms that deleting a message will also delete its body & attachments
13337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
13346c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testCascadeMessageDelete() {
13356c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-cascade", true, mMockContext);
13366c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long account1Id = account1.mId;
13376c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
13386c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long box1Id = box1.mId;
1339bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
13406c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Each message has a body, and also give each 2 attachments
13416c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
13426c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                false, mMockContext);
13436c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ArrayList<Attachment> atts = new ArrayList<Attachment>();
13446c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
13456c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
13466c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
13476c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    false, mMockContext));
13486c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
13496c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.mAttachments = atts;
13506c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.save(mMockContext);
13516c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message1Id = message1.mId;
13526c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13536c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, true,
13546c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                false, mMockContext);
13556c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        atts = new ArrayList<Attachment>();
13566c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
13576c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
13586c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
13596c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    false, mMockContext));
13606c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
13616c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.mAttachments = atts;
13626c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.save(mMockContext);
13636c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message2Id = message2.mId;
13646c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13656c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Set up to test total counts of bodies & attachments for our test messages
13666c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String bodySelection = BodyColumns.MESSAGE_KEY + " IN (?,?)";
13676c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String attachmentSelection = AttachmentColumns.MESSAGE_KEY + " IN (?,?)";
13686c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String[] selArgs = new String[] { String.valueOf(message1Id), String.valueOf(message2Id) };
1369bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
13706c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are two bodies
13716c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        int numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
13726c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numBodies);
13736c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13746c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are four attachments
13756c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        int numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
13766c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
13776c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(4, numAttachments);
13786c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13796c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete one of the messages
13806c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
13816c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
13826c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13836c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // there should be one body and two attachments
13846c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
13856c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(1, numBodies);
13866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
13886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
13896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numAttachments);
13906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13916c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete the other message
13926c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
13936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
13946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are no bodies or attachments
13966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
13976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numBodies);
13986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
14006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
14016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numAttachments);
14026c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
14037143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
1404976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    /**
1405976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * Test that our unique file name algorithm works as expected.  Since this test requires an
1406976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * SD card, we check the environment first, and return immediately if none is mounted.
1407976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * @throws IOException
1408976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     */
1409976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    public void testCreateUniqueFile() throws IOException {
1410976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        // Delete existing files, if they exist
1411976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
1412976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            return;
1413976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1414976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
1415976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String fileName = "A11achm3n1.doc";
1416976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File uniqueFile = Attachment.createUniqueFile(fileName);
1417976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1418976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1419976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1420976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2.doc", uniqueFile.getName());
1421976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (uniqueFile.createNewFile()) {
1422976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    uniqueFile = Attachment.createUniqueFile(fileName);
1423976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    assertEquals("A11achm3n1-3.doc", uniqueFile.getName());
1424976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
1425976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank           }
1426976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            fileName = "A11achm3n1";
1427976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            uniqueFile = Attachment.createUniqueFile(fileName);
1428976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1429976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1430976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1431976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2", uniqueFile.getName());
1432976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1433976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
1434976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File directory = Environment.getExternalStorageDirectory();
1435976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // These are the files that should be created earlier in the test.  Make sure
1436976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // they are deleted for the next go-around
1437976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String[] fileNames = new String[] {"A11achm3n1.doc", "A11achm3n1-2.doc", "A11achm3n1"};
1438976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int length = fileNames.length;
1439976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            for (int i = 0; i < length; i++) {
1440976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                File file = new File(directory, fileNames[i]);
1441976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (file.exists()) {
1442976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    file.delete();
1443976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
1444976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1445976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1446976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    }
14474119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14484119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    /**
14494119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     * Test retrieving attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
14504119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     */
14514119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    public void testGetAttachmentByMessageIdUri() {
14524119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14534119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Note, we don't strictly need accounts, mailboxes or messages to run this test.
14544119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a1 = ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
14554119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a2 = ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
1456758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
1457758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
14584119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14594119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Now ask for the attachments of message id=1
14604119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Note: Using the "sort by size" trick to bring them back in expected order
14614119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
14624119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Cursor c = mMockContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
14634119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                null, null, Attachment.SIZE);
14644119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        assertEquals(2, c.getCount());
14654119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14664119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
14674119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToFirst();
14684119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            Attachment a1Get = EmailContent.getContent(c, Attachment.class);
14694119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-1", a1, a1Get);
14704119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToNext();
14714119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            Attachment a2Get = EmailContent.getContent(c, Attachment.class);
14724119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-2", a2, a2Get);
14734119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
14744119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
14754119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
14764119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    }
147754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
147854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    /**
14796c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test deleting attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
14806c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     */
14816c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testDeleteAttachmentByMessageIdUri() {
14826c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ContentResolver mockResolver = mMockContext.getContentResolver();
14836c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14846c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Note, we don't strictly need accounts, mailboxes or messages to run this test.
14856c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
14866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
14876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a3 = ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
14886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a4 = ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
14896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Delete all attachments for message id=1
14916c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
14926c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mockResolver.delete(uri, null, null);
14936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Read back all attachments and confirm that we have the expected remaining attachments
14956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // (the attachments that are set for message id=2).  Note order-by size to simplify test.
14966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Cursor c = mockResolver.query(Attachment.CONTENT_URI, Attachment.CONTENT_PROJECTION,
14976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                null, null, Attachment.SIZE);
14986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, c.getCount());
14996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
15006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        try {
15016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToFirst();
15026c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            Attachment a3Get = EmailContent.getContent(c, Attachment.class);
15036c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-3", a3, a3Get);
15046c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToNext();
15056c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            Attachment a4Get = EmailContent.getContent(c, Attachment.class);
15066c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-4", a4, a4Get);
15076c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        } finally {
15086c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.close();
15096c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
15106c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
15116c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
151252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
151363537746479f4b65517bd217c1a5f76d697367ebMarc Blank    public void testGetDefaultAccountNoneExplicitlySet() {
151463537746479f4b65517bd217c1a5f76d697367ebMarc Blank        Account account1 = ProviderTestUtils.setupAccount("account-default-1", false, mMockContext);
151563537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account1.mIsDefault = false;
151663537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account1.save(mMockContext);
151763537746479f4b65517bd217c1a5f76d697367ebMarc Blank
151863537746479f4b65517bd217c1a5f76d697367ebMarc Blank        // We should find account1 as default
151963537746479f4b65517bd217c1a5f76d697367ebMarc Blank        long defaultAccountId = Account.getDefaultAccountId(mMockContext);
152063537746479f4b65517bd217c1a5f76d697367ebMarc Blank        assertEquals(defaultAccountId, account1.mId);
152163537746479f4b65517bd217c1a5f76d697367ebMarc Blank
152252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        Account account2 = ProviderTestUtils.setupAccount("account-default-2", false, mMockContext);
152363537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account2.mIsDefault = false;
152463537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account2.save(mMockContext);
152563537746479f4b65517bd217c1a5f76d697367ebMarc Blank
152652e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        Account account3 = ProviderTestUtils.setupAccount("account-default-3", false, mMockContext);
152752e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        account3.mIsDefault = false;
152852e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        account3.save(mMockContext);
152952e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo
153052e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        // We should find the earliest one as the default, so that it can be consistent on
153152e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        // repeated calls.
153263537746479f4b65517bd217c1a5f76d697367ebMarc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
153352e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        assertTrue(defaultAccountId == account1.mId);
153463537746479f4b65517bd217c1a5f76d697367ebMarc Blank    }
153563537746479f4b65517bd217c1a5f76d697367ebMarc Blank
15366c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    /**
153754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * Tests of default account behavior
1538758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
153954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 1.  Simple set/get
154054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 2.  Moving default between 3 accounts
154154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 3.  Delete default, make sure another becomes default
154254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     */
154354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    public void testSetGetDefaultAccount() {
154454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // There should be no default account if there are no accounts
154554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long defaultAccountId = Account.getDefaultAccountId(mMockContext);
1546acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        assertEquals(Account.NO_ACCOUNT, defaultAccountId);
154754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1548acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account1 = ProviderTestUtils.setupAccount("account-default-1", false, mMockContext);
1549acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account1.mIsDefault = false;
1550acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account1.save(mMockContext);
155154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account1Id = account1.mId;
1552acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account2 = ProviderTestUtils.setupAccount("account-default-2", false, mMockContext);
1553acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account2.mIsDefault = false;
1554acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account2.save(mMockContext);
155554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account2Id = account2.mId;
1556acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account3 = ProviderTestUtils.setupAccount("account-default-3", false, mMockContext);
1557acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account3.mIsDefault = false;
1558acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account3.save(mMockContext);
155954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account3Id = account3.mId;
156054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1561acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        // With three accounts, but none marked default, confirm that the first one is the default.
156254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1563acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        assertTrue(defaultAccountId == account1Id);
156454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
15659e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        updateIsDefault(account1, true);
156654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
15679e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertEquals(account1Id, defaultAccountId);
156854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1569531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        updateIsDefault(account2, true);
1570531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1571531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1572531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank
1573531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        updateIsDefault(account3, true);
1574531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1575531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
157654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
157754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // Now delete a non-default account and confirm no change
157854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
157954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
158054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1581531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1582531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
158354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
158454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // Now confirm deleting the default account and it switches to another one
158554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account3Id);
158654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
158754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1588531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1589531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1590758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
15919e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        // Now delete the final account and confirm there are no default accounts again
15929e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
15939e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
15949e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler
159554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
15969e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertEquals(-1, defaultAccountId);
159754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    }
159854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
15999e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler    private void updateIsDefault(Account account, boolean newState) {
16009e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        account.setDefaultAccount(newState);
16019e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        ContentValues cv = new ContentValues();
16029e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        cv.put(AccountColumns.IS_DEFAULT, account.mIsDefault);
16039e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        account.update(mMockContext, cv);
16049e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler    }
1605758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1606758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    public static Message setupUnreadMessage(String name, long accountId, long mailboxId,
1607758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            boolean addBody, boolean saveIt, Context context) {
1608758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message msg =
1609758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            ProviderTestUtils.setupMessage(name, accountId, mailboxId, addBody, false, context);
1610758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        msg.mFlagRead = false;
1611758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        if (saveIt) {
1612758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            msg.save(context);
1613758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        }
1614758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        return msg;
1615758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
1616758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1617758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    public void testUnreadCountTriggers() {
1618758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Start with one account and three mailboxes
1619758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Account account = ProviderTestUtils.setupAccount("triggers", true, mMockContext);
1620758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxA = ProviderTestUtils.setupMailbox("boxA", account.mId, true, mMockContext);
1621758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxB = ProviderTestUtils.setupMailbox("boxB", account.mId, true, mMockContext);
1622758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxC = ProviderTestUtils.setupMailbox("boxC", account.mId, true, mMockContext);
1623758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1624758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure there are no unreads
1625758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1626758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1627758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxC.mId));
1628758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1629758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Create 4 unread messages (only 3 named) in boxA
1630758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message1 = setupUnreadMessage("message1", account.mId, boxA.mId,
1631758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1632758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message2= setupUnreadMessage("message2", account.mId, boxA.mId,
1633758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1634758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message3 =  setupUnreadMessage("message3", account.mId, boxA.mId,
1635758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1636758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        setupUnreadMessage("message4", account.mId, boxC.mId, false, true, mMockContext);
1637758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1638758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure the unreads are where we expect them
1639758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(3, getUnreadCount(boxA.mId));
1640758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1641758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1642758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1643758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // After deleting message 1, the count in box A should be decremented (to 2)
1644758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentResolver cr = mMockContext.getContentResolver();
1645758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1.mId);
1646758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.delete(uri, null, null);
1647758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxA.mId));
1648758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1649758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1650758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1651758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 2 to box B, leaving 1 in box A and 1 in box B
1652758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message2.mMailboxKey = boxB.mId;
1653758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentValues cv = new ContentValues();
1654758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxB.mId);
1655758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message2.mId), cv, null, null);
1656758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxA.mId));
1657758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1658758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1659758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1660758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Mark message 3 (from box A) read, leaving 0 in box A
1661758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1662758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 1);
1663758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1664758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1665758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1666758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1667758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1668758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 3 to box C; should be no change (it's read)
1669758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message3.mMailboxKey = boxC.mId;
1670758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1671758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxC.mId);
1672758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1673758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1674758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1675758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1676758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1677758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Mark message 3 unread; it's now in box C, so that box's count should go up to 3
1678758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1679758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 0);
1680758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1681758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1682758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1683758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxC.mId));
1684758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
16859627d014e16235eadf981b9165807dc72a14a383Mihai Preda
16869627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
16879627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for EmailProvider.createIndex().
16889627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Check that it returns exacly the same string as the one used previously for index creation.
16899627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
16909627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testCreateIndex() {
16919627d014e16235eadf981b9165807dc72a14a383Mihai Preda        String oldStr = "create index message_" + MessageColumns.TIMESTAMP
16929627d014e16235eadf981b9165807dc72a14a383Mihai Preda            + " on " + Message.TABLE_NAME + " (" + MessageColumns.TIMESTAMP + ");";
16939627d014e16235eadf981b9165807dc72a14a383Mihai Preda        String newStr = EmailProvider.createIndex(Message.TABLE_NAME, MessageColumns.TIMESTAMP);
16949627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(newStr, oldStr);
16959627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
1696c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
16970e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testDatabaseCorruptionRecovery() {
16980e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
16990e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
17000e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17010e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
17020e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
17030e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
17040e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17050e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
17060e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
17070e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
17080e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
17090e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
17100e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17110e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
17120e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17130e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17140e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
17150e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17160e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17170e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17180e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
17190e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
17200e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProvider.db database should exist (the provider creates it automatically)
17210e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17220e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17230e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
17240e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
17250e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
17260e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17270e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
17280e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
17290e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
17300e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17310e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17320e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17330e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
17340e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // This simulates the Provider starting up again (otherwise, it will still be pointing to
17350e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
17360e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Note that we only have access to the EmailProvider via the ContentResolver; therefore,
17370e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
17380e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
17390e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17400e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // TODO We should check for the deletion of attachment files once this is implemented in
17410e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
1742bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
17430e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
17440e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The next time the database is created by the provider, it will notice that there's
17450e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // already a EmailProviderBody.db file.  In this case, it will delete that database to
17460e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
17470e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17480e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
17490e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17500e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17510e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17520e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
17530e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17540e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17550e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
17560e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17570e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testBodyDatabaseCorruptionRecovery() {
17580e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
17590e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
17600e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17610e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
17620e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
17630e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
17640e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17650e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
17660e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
17670e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
17680e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
17690e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
17700e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17710e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
17720e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17730e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17740e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
17750e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17760e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17770e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17780e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
17790e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
17800e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should exist (the provider creates it automatically)
17810e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17820e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17830e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
17840e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
17850e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
17860e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17870e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
17880e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
17890e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
17900e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17910e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17920e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17930e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
17940e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // This simulates the Provider starting up again (otherwise, it will still be pointing to
17950e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
17960e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Note that we only have access to the EmailProvider via the ContentResolver; therefore,
17970e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
17980e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
17990e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18000e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // TODO We should check for the deletion of attachment files once this is implemented in
18010e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
18020e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18030e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
18040e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The next time the body database is created by the provider, it will notice that there's
18050e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // already a populated EmailProvider.db file.  In this case, it will delete that database to
18060e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
18070e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18080e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
18090e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
18100e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
18110e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18120e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
18130e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
18140e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
18150e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
1816694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1817bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testAccountIsSecurityHold() {
1818bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        final Context context = mMockContext;
1819bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
1820bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1821bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct2 = ProviderTestUtils.setupAccount("acct2", false, context);
1822bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.mFlags |= Account.FLAGS_SECURITY_HOLD;
1823bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.save(context);
1824bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1825bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertFalse(Account.isSecurityHold(context, acct1.mId));
1826bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertTrue(Account.isSecurityHold(context, acct2.mId));
1827bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertFalse(Account.isSecurityHold(context, 9999999)); // No such account
1828bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki   }
1829bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1830bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testClearAccountHoldFlags() {
1831bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext);
1832bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a1.mFlags = Account.FLAGS_NOTIFY_NEW_MAIL;
18336e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a1.mPolicy = new Policy();
1834bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a1.save(mMockContext);
1835bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext);
1836bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a2.mFlags = Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD;
18376e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a2.mPolicy = new Policy();
1838bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a2.save(mMockContext);
1839bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1840bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        // bulk clear
1841bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account.clearSecurityHoldOnAllAccounts(mMockContext);
1842bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1843bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        // confirm new values as expected - no hold flags; other flags unmolested
1844bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
1845bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL, a1a.mFlags);
1846bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
1847bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2a.mFlags);
1848bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    }
1849574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1850833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki    private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read) {
1851543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        return ProviderTestUtils.setupMessage(
1852543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy                "1", b.mAccountKey, b.mId, true, true, c, starred, read);
1853543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy    }
1854543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy
18555247ab8cae802272b1e29e81d3b31a1c4e710da5Makoto Onuki    public void testAccountIsEasAccount() {
18566d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki        Account account = new Account();
185725144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        // No hostauth
18585247ab8cae802272b1e29e81d3b31a1c4e710da5Makoto Onuki        assertFalse(account.isEasAccount(mMockContext));
18596d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki
186025144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount(null, false);
186125144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("", false);
186225144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("x", false);
186325144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("eas", true);
186425144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki    }
18656d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki
186625144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki    private void checkAccountIsEasAccount(String protocol, boolean expected) {
186725144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        Account account = ProviderTestUtils.setupAccount("account", false, mMockContext);
186825144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        account.mHostAuthRecv = ProviderTestUtils.setupHostAuth(protocol, "account-hostauth-recv",
1869fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy                false, mMockContext);
187025144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        account.save(mMockContext);
187125144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals(expected, account.isEasAccount(mMockContext));
18726d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki    }
1873bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
1874bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    public void testGetKeyColumnLong() {
1875bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        final Context c = mMockContext;
1876bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Account a = ProviderTestUtils.setupAccount("acct", true, c);
1877bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a.mId, true, c, Mailbox.TYPE_MAIL);
1878bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a.mId, true, c, Mailbox.TYPE_MAIL);
1879bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m1 = createMessage(c, b1, false, false);
1880bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m2 = createMessage(c, b2, false, false);
1881bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.ACCOUNT_KEY));
1882bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.ACCOUNT_KEY));
1883bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b1.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.MAILBOX_KEY));
1884bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b2.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.MAILBOX_KEY));
1885bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    }
1886bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
1887aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    public void testGetAccountIdForMessageId() {
1888aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        final Context c = mMockContext;
1889aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", true, c);
1890aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
1891aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_MAIL);
1892aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a2.mId, true, c, Mailbox.TYPE_MAIL);
1893aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m1 = createMessage(c, b1, false, false);
1894aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m2 = createMessage(c, b2, false, false);
1895aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
1896aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a1.mId, Account.getAccountIdForMessageId(c, m1.mId));
1897aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a2.mId, Account.getAccountIdForMessageId(c, m2.mId));
1898aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
1899aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        // message desn't exist
1900aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(-1, Account.getAccountIdForMessageId(c, 12345));
1901aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    }
1902aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
1903200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy    public void testGetAccountForMessageId() {
1904200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        final Context c = mMockContext;
1905200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Account a = ProviderTestUtils.setupAccount("acct", true, c);
1906200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Message m1 = ProviderTestUtils.setupMessage("1", a.mId, 1, true, true, c, false, false);
1907200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Message m2 = ProviderTestUtils.setupMessage("1", a.mId, 2, true, true, c, false, false);
1908200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m1.mId));
1909200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m2.mId));
1910200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy    }
1911200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy
1912e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testGetAccountGetInboxIdTest() {
1913e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final Context c = mMockContext;
1914e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
1915e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Prepare some data with red-herrings.
1916e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", true, c);
1917e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
1918e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b1i = ProviderTestUtils.setupMailbox("b1i", a1.mId, true, c, Mailbox.TYPE_INBOX);
1919e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b2a = ProviderTestUtils.setupMailbox("b2a", a2.mId, true, c, Mailbox.TYPE_MAIL);
1920e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b2i = ProviderTestUtils.setupMailbox("b2b", a2.mId, true, c, Mailbox.TYPE_INBOX);
1921e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
1922e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertEquals(b2i.mId, Account.getInboxId(c, a2.mId));
1923d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki
1924d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        // No account found.
1925d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        assertEquals(-1, Account.getInboxId(c, 999999));
1926e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
1927e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
1928261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    /**
1929261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki     * Check if update to {@link Account#RESET_NEW_MESSAGE_COUNT_URI} resets the new message count.
1930261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki     */
1931261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    public void testResetNewMessageCount() {
1932261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        final Context c = mMockContext;
1933261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        final ContentResolver cr = c.getContentResolver();
1934261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
1935261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // Prepare test data
1936261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", false, c);
1937261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a1.mNewMessageCount = 1;
1938261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a1.save(c);
1939261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", false, c);
1940261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a2.mNewMessageCount = 2;
1941261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a2.save(c);
1942261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a3 = ProviderTestUtils.setupAccount("acct3", false, c);
1943261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a3.mNewMessageCount = 3;
1944261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a3.save(c);
1945261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a4 = ProviderTestUtils.setupAccount("acct4", false, c);
1946261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a4.mNewMessageCount = 4;
1947261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a4.save(c);
1948261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a5 = ProviderTestUtils.setupAccount("acct5", false, c);
1949261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a5.mNewMessageCount = 5;
1950261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a5.save(c);
1951261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
1952261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // With ID in URI, no selection
1953261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a1.mId),
1954261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                null, null, null);
1955261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
1956261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(2, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
1957261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(3, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
1958261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
1959261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
1960261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
1961261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // No ID in URI, with selection
1962261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null,
1963261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                EmailContent.ID_SELECTION, new String[] {Long.toString(a2.mId)});
1964261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
1965261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
1966261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(3, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
1967261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
1968261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
1969261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
1970261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // With ID, with selection
1971261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a3.mId), null,
1972261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                EmailContent.ID_SELECTION, new String[] {Long.toString(a3.mId)});
1973261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
1974261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
1975261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
1976261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
1977261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
1978261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
1979261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // No ID in URI, no selection
1980261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null, null, null);
1981261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
1982261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
1983261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
1984261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
1985261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
1986261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    }
1987899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
19889d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
19899d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_ID_ADD_TO_FIELD updates the cache properly.
19909d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
19919d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountIdAddToField() {
19929d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
19939d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
19949d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
19959d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        int start = Account.restoreAccountWithId(c, a1.mId).mNewMessageCount;
19969d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
19979d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // +1 to NEW_MESSAGE_COUNT
19989d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        ContentValues cv = new ContentValues();
19999d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.FIELD_COLUMN_NAME, AccountColumns.NEW_MESSAGE_COUNT);
20009d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.ADD_COLUMN_NAME, 1);
20019d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(ContentUris.withAppendedId(Account.ADD_TO_FIELD_URI, a1.mId), cv,
20029d5aaeacd6b222877f25924818317c9153708261Makoto Onuki                null, null);
20039d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20049d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
20059d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(start + 1, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
20069d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
20079d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20089d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
20099d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_RESET_NEW_COUNT updates the cache properly.
20109d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
20119d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountResetNewCount() {
20129d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
20139d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
20149d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20159d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // precondition
20169d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertTrue(Account.restoreAccountWithId(c, a1.mId).mNewMessageCount > 0);
20179d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20189d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Reset
20199d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null, null, null);
20209d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20219d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
20229d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
20239d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
20249d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20259d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
20269d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_RESET_NEW_COUNT_ID updates the cache properly.
20279d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
20289d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountResetNewCountId() {
20299d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
20309d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
20319d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20329d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // precondition
20339d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertTrue(Account.restoreAccountWithId(c, a1.mId).mNewMessageCount > 0);
20349d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20359d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Reset
20369d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a1.mId),
20379d5aaeacd6b222877f25924818317c9153708261Makoto Onuki                null, null, null);
20389d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20399d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
20409d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
20419d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
20429d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
20439d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
2044d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * Check that we're handling illegal uri's properly (by throwing an exception unless it's a
2045d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * query for an id of -1, in which case we return a zero-length cursor)
2046d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     */
2047d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    public void testIllegalUri() {
2048d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        final ContentResolver cr = mMockContext.getContentResolver();
2049d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank
2050d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        ContentValues cv = new ContentValues();
2051d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Uri uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/fooble");
2052d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2053d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.insert(uri, cv);
2054d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Insert should have thrown exception");
2055d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2056d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2057d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2058d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.update(uri, cv, null, null);
2059d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Update should have thrown exception");
2060d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2061d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2062d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2063d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.delete(uri, null, null);
2064d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Delete should have thrown exception");
2065d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2066d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2067d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2068d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2069d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2070d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2071d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2072d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/fred");
2073d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2074d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2075d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2076d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2077d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2078d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/-1");
2079d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Cursor c = cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2080d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertNotNull(c);
2081d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertEquals(0, c.getCount());
2082d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        c.close();
2083d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    }
208422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
208522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
208622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Verify {@link EmailProvider#recalculateMessageCount(android.database.sqlite.SQLiteDatabase)}
208722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
208822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    public void testRecalculateMessageCounts() {
208922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        final Context c = mMockContext;
209022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
209122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create accounts
209222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", true, c);
209322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", true, c);
209422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
209522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create mailboxes for each account
209622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
209722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a1.mId, true, c, Mailbox.TYPE_OUTBOX);
209822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b3 = ProviderTestUtils.setupMailbox("box3", a2.mId, true, c, Mailbox.TYPE_INBOX);
209922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b4 = ProviderTestUtils.setupMailbox("box4", a2.mId, true, c, Mailbox.TYPE_OUTBOX);
210022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox bt = ProviderTestUtils.setupMailbox("boxT", a2.mId, true, c, Mailbox.TYPE_TRASH);
210122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
210222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create some messages
210322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b1 (account 1, inbox): 1 message, including 1 starred
210422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m11 = createMessage(c, b1, true, false, Message.FLAG_LOADED_COMPLETE);
210522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
210622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b2 (account 1, outbox): 2 message, including 1 starred
210722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m21 = createMessage(c, b2, false, false, Message.FLAG_LOADED_COMPLETE);
210822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m22 = createMessage(c, b2, true, true, Message.FLAG_LOADED_COMPLETE);
210922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
211022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b3 (account 2, inbox): 3 message, including 1 starred
211122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m31 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
211222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m32 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
211322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m33 = createMessage(c, b3, true, true, Message.FLAG_LOADED_COMPLETE);
211422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
211522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b4 (account 2, outbox) has no messages.
211622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
211722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // bt (account 2, trash) has 3 messages, including 2 starred
211822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt1 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
211922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt2 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
212022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt3 = createMessage(c, bt, false, false, Message.FLAG_LOADED_COMPLETE);
212122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
212222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Verifiy initial message counts
212322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(1, getMessageCount(b1.mId));
212422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(2, getMessageCount(b2.mId));
212522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(b3.mId));
212622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(0, getMessageCount(b4.mId));
212722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(bt.mId));
212822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
212922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Whew. The setup is done; now let's actually get to the test
213022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
213122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // First, invalidate the message counts.
213222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        setMinusOneToMessageCounts();
213322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b1.mId));
213422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b2.mId));
213522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b3.mId));
213622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b4.mId));
213722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(bt.mId));
213822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
213922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Batch update.
214022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
214122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        EmailProvider.recalculateMessageCount(db);
214222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
214322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Check message counts are valid again
214422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(1, getMessageCount(b1.mId));
214522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(2, getMessageCount(b2.mId));
214622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(b3.mId));
214722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(0, getMessageCount(b4.mId));
214822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(bt.mId));
214922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
215022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
215122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates an account */
215222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private Account createAccount(Context c, String name, HostAuth recvAuth, HostAuth sendAuth) {
215322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account account = ProviderTestUtils.setupAccount(name, false, c);
215422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (recvAuth != null) {
215522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            account.mHostAuthKeyRecv = recvAuth.mId;
215622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            if (sendAuth == null) {
215722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                account.mHostAuthKeySend = recvAuth.mId;
215822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            }
215922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        }
216022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (sendAuth != null) {
216122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            account.mHostAuthKeySend = sendAuth.mId;
216222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        }
216322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        account.save(c);
216422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return account;
216522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
216622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
216722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates a mailbox; redefine as we need version 17 mailbox values */
216822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private Mailbox createMailbox(Context c, String displayName, String serverId, long parentKey,
216922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            long accountId) {
217022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox box = new Mailbox();
217122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
217222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mDisplayName = displayName;
217322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mServerId = serverId;
217422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mParentKey = parentKey;
217522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mAccountKey = accountId;
217622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Don't care about the fields below ... set them for giggles
217722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mType = Mailbox.TYPE_MAIL;
217822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mDelimiter = '/';
217922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncKey = "sync-key";
218022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncLookback = 2;
2181f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        box.mSyncInterval = Account.CHECK_INTERVAL_NEVER;
218222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncTime = 3;
218322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mFlagVisible = true;
218422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mFlags = 5;
218522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mVisibleLimit = 6;
218622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.save(c);
218722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return box;
218822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
218922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
219022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
219122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Asserts equality between two mailboxes. We define this as we don't have implementations
219222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * for Mailbox#equals().
219322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
219422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private void assertEquals(Mailbox expected, Mailbox actual) {
219522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (expected == null && actual == null) return;
219622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertTrue(expected != null && actual != null);
219722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(expected, actual, expected.mServerId);
219822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
219922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
220022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
220122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Asserts equality between the two mailboxes EXCEPT for the server id. The given server
220222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * ID is the expected value.
220322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
220422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private void assertEqualsExceptServerId(Mailbox expected, Mailbox actual, String serverId) {
220522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (expected == null && actual == null) return;
220622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
220722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertTrue(expected != null && actual != null);
220822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mDisplayName, actual.mDisplayName);
220922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(serverId, actual.mServerId);
221022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mParentKey, actual.mParentKey);
221122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mAccountKey, actual.mAccountKey);
221222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
221322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
221422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Verifies updating the DB from v17 to v18 works as expected */
221522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    public void testUpgradeFromVersion17ToVersion18() {
221622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        final Context c = mMockContext;
221722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create accounts
22186e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Account a1 = createAccount(c, "exchange",
221922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ProviderTestUtils.setupHostAuth("eas", "exchange.host.com", true, c),
222022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                null);
222122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a2 = createAccount(c, "imap",
222222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ProviderTestUtils.setupHostAuth("imap", "imap.host.com", true, c),
222322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ProviderTestUtils.setupHostAuth("smtp", "smtp.host.com", true, c));
222422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a3 = createAccount(c, "pop3",
222522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ProviderTestUtils.setupHostAuth("pop3", "imap.host.com", true, c),
222622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ProviderTestUtils.setupHostAuth("smtp", "smtp.host.com", true, c));
222722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
222822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create mailboxes; some w/ valid parent IDs, others without
222922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b11 = createMailbox(c, "box1", "12", 0L, a1.mId);
223022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b12 = createMailbox(c, "box2", "67", -1L, a1.mId);
223122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b13 = createMailbox(c, "box3", "18", b12.mId, a1.mId);
223222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
223322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b21 = createMailbox(c, "box4", null, 0L, a2.mId);
223422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b22 = createMailbox(c, "box4/foo/bar", "will-be-replaced", 0L, a2.mId);
223522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b23 = createMailbox(c, "box5", null, -1L, a2.mId);
223622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b24 = createMailbox(c, "box6", "box5/box6", b23.mId, a2.mId);
223722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
223822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b31 = createMailbox(c, "box7", "12", 0L, a3.mId);
223922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b32 = createMailbox(c, "box8/foo/bar", "will-be-replaced", 0L, a3.mId);
224022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b33 = createMailbox(c, "box9", "box9", -1L, a3.mId);
224122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b34 = createMailbox(c, "boxA", "box9/boxA", b33.mId, a3.mId);
224222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
224322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Sanity check the mailboxes that were just added
224422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox testMailbox;
224522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b11.mId);
224622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b11, testMailbox);
224722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b12.mId);
224822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b12, testMailbox);
224922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b13.mId);
225022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b13, testMailbox);
225122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b21.mId);
225222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b21, testMailbox, null);
225322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b22.mId);
225422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b22, testMailbox, "will-be-replaced");
225522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b23.mId);
225622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b23, testMailbox);
225722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b24.mId);
225822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b24, testMailbox);
225922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b31.mId);
226022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b31, testMailbox, "12");
226122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b32.mId);
226222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b32, testMailbox, "will-be-replaced");
226322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b33.mId);
226422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b33, testMailbox);
226522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b34.mId);
226622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b34, testMailbox);
226722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
226822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
226922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        EmailProvider.upgradeFromVersion17ToVersion18(db);
227022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
227122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Verify that only IMAP/POP3 mailboxes w/ a parent key of '0' are changed
227222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Exchange mailboxes; none should be changed
227322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b11.mId);
227422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b11, testMailbox);
227522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b12.mId);
227622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b12, testMailbox);
227722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b13.mId);
227822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b13, testMailbox);
227922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
228022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // IMAP mailboxes; only mailboxes w/ a parent id of '0' are changed
228122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b21.mId);
228222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b21, testMailbox, "box4");
228322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b22.mId);
228422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b22, testMailbox, "box4/foo/bar");
228522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b23.mId);
228622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b23, testMailbox);
228722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b24.mId);
228822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b24, testMailbox);
228922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
229022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // POP3 mailboxes; only mailboxes w/ a parent id of '0' are changed
229122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b31.mId);
229222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b31, testMailbox, "box7");
229322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b32.mId);
229422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(b32, testMailbox, "box8/foo/bar");
229522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b33.mId);
229622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b33, testMailbox);
229722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        testMailbox = Mailbox.restoreMailboxWithId(c, b34.mId);
229822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(b34, testMailbox);
229922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
23004c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23014c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki    public void testBuildMessageListSelection() {
23024c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        final Context c = mMockContext;
23034c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23044c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.ALL_INBOX_SELECTION, Message.buildMessageListSelection(c,
23054c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                     Mailbox.QUERY_ALL_INBOXES));
23064c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23074c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.ALL_DRAFT_SELECTION, Message.buildMessageListSelection(c,
23084c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.QUERY_ALL_DRAFTS));
23094c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23104c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.ALL_OUTBOX_SELECTION, Message.buildMessageListSelection(c,
23114c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.QUERY_ALL_OUTBOX));
23124c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23134c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.ALL_UNREAD_SELECTION, Message.buildMessageListSelection(c,
23144c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.QUERY_ALL_UNREAD));
23154c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23164c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.ALL_FAVORITE_SELECTION, Message.buildMessageListSelection(c,
23174c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.QUERY_ALL_FAVORITES));
23184c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23194c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        final Account account = ProviderTestUtils.setupAccount("1", true, mMockContext);
23204c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        final Mailbox in = ProviderTestUtils.setupMailbox("i", account.mId, true, c,
23214c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.TYPE_INBOX);
23224c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        final Mailbox out = ProviderTestUtils.setupMailbox("o", account.mId, true, c,
23234c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Mailbox.TYPE_OUTBOX);
23244c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23254c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.MAILBOX_KEY + "=" + in.mId + " AND " + Message.FLAG_LOADED_SELECTION,
23264c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Message.buildMessageListSelection(c, in.mId));
23274c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki
23284c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        // No LOADED check for outboxes.
23294c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki        assertEquals(Message.MAILBOX_KEY + "=" + out.mId,
23304c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki                Message.buildMessageListSelection(c, out.mId));
23314c4e4c3515c3e3300e03f90e02a0c520dc2dff32Makoto Onuki    }
2332f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2333f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    /**
2334f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * Determine whether a list of AccountManager accounts includes a given EmailProvider account
2335f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param amAccountList a list of AccountManager accounts
2336f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param account an EmailProvider account
2337f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param context the caller's context (our test provider's context)
2338f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @return whether or not the EmailProvider account is represented in AccountManager
2339f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     */
2340f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    private boolean amAccountListHasAccount(android.accounts.Account[] amAccountList,
2341f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            Account account, Context context) {
234232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        String email = account.mEmailAddress;
2343f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        for (android.accounts.Account amAccount: amAccountList) {
234432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            if (amAccount.name.equals(email)) {
2345f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                return true;
2346f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            }
2347f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        }
2348f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        return false;
2349f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    }
2350f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
23516e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    public void testAutoCacheNewContent() {
23526e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Account account = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
23536e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // add hostauth data, which should be saved the first time
23546e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        account.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false,
23556e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23566e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        account.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false,
23576e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23586e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        account.save(mMockContext);
23596e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, account.mId));
23606e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, account.mHostAuthRecv.mId));
23616e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, account.mHostAuthSend.mId));
23626e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    }
23636e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
23646e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    /** Creates a mailbox; redefine as we need version 17 mailbox values */
23656e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    private Mailbox createTypeMailbox(Context c, long accountId, int type) {
23666e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox box = new Mailbox();
23676e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
23686e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mDisplayName = "foo";
23696e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mServerId = "1:1";
23706e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mParentKey = 0;
23716e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mAccountKey = accountId;
23726e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Don't care about the fields below ... set them for giggles
23736e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mType = type;
23746e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.save(c);
23756e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        return box;
23766e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    }
23776e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
23786e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    public void testAutoCacheInvalidate() {
23796e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Create 3 accounts with hostauth and 3 mailboxes each (2 of which are pre-cached)
23806e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Account a = ProviderTestUtils.setupAccount("account1", false, mMockContext);
23816e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-recv", -1, false,
23826e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23836e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-send", -1, false,
23846e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23856e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a.save(mMockContext);
23866e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox a1 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_INBOX);
23876e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox a2 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_MAIL);
23886e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox a3 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_DRAFTS);
23896e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Account b = ProviderTestUtils.setupAccount("account2", false, mMockContext);
23906e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        b.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-recv", -1, false,
23916e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23926e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        b.mHostAuthSend = ProviderTestUtils.setupHostAuth("accoun-send", -1, false,
23936e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
23946e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        b.save(mMockContext);
23956e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox b1 = createTypeMailbox(mMockContext, b.mId, Mailbox.TYPE_OUTBOX);
23966e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox b2 = createTypeMailbox(mMockContext, b.mId, Mailbox.TYPE_MAIL);
23976e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox b3 = createTypeMailbox(mMockContext, b.mId, Mailbox.TYPE_SENT);
23986e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Account c = ProviderTestUtils.setupAccount("account3", false, mMockContext);
23996e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        c.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-recv", -1, false,
24006e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
24016e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        c.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-send", -1, false,
24026e418aa41a17136be0dddb816d843428a0a1e722Marc Blank                mMockContext);
24036e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        c.save(mMockContext);
24046e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox c1 = createTypeMailbox(mMockContext, c.mId, Mailbox.TYPE_SEARCH);
24056e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox c2 = createTypeMailbox(mMockContext, c.mId, Mailbox.TYPE_MAIL);
24066e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox c3 = createTypeMailbox(mMockContext, c.mId, Mailbox.TYPE_TRASH);
24076e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24086e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Confirm expected cache state
24096e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, a.mId));
24106e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, a.mHostAuthRecv.mId));
24116e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, a.mHostAuthSend.mId));
24126e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, b.mId));
24136e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, b.mHostAuthRecv.mId));
24146e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, b.mHostAuthSend.mId));
24156e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, c.mId));
24166e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, c.mHostAuthRecv.mId));
24176e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, c.mHostAuthSend.mId));
24186e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24196e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, a1.mId));
24206e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, a2.mId));
24216e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, a3.mId));
24226e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, b1.mId));
24236e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, b2.mId));
24246e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, b3.mId));
24256e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, c1.mId));
24266e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, c2.mId));
24276e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, c3.mId));
24286e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24296e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Delete account b
24306e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        EmailContent.delete(mMockContext, Account.CONTENT_URI, b.mId);
24316e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24326e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Confirm cache state
24336e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, a.mId));
24346e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, a.mHostAuthRecv.mId));
24356e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, a.mHostAuthSend.mId));
24366e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Account.CONTENT_URI, b.mId));
24376e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(HostAuth.CONTENT_URI, b.mHostAuthRecv.mId));
24386e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(HostAuth.CONTENT_URI, b.mHostAuthSend.mId));
24396e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Account.CONTENT_URI, c.mId));
24406e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, c.mHostAuthRecv.mId));
24416e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(HostAuth.CONTENT_URI, c.mHostAuthSend.mId));
24426e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24436e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, a1.mId));
24446e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, a2.mId));
24456e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, a3.mId));
24466e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, b1.mId));
24476e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, b2.mId));
24486e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, b3.mId));
24496e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, c1.mId));
24506e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertFalse(mProvider.isCached(Mailbox.CONTENT_URI, c2.mId));
24516e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        assertTrue(mProvider.isCached(Mailbox.CONTENT_URI, c3.mId));
24526e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    }
24536e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
2454f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    /**
2455f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * Remove a single pop/imap account from the AccountManager
2456f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param accountManager our AccountManager
2457f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param name the name of the test account to remove
2458f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     */
2459f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    private void removeAccountManagerAccount(AccountManager accountManager, String name) {
2460f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        try {
2461f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            accountManager.removeAccount(
2462f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                    new android.accounts.Account(name, AccountManagerTypes.TYPE_POP_IMAP),
2463f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                    null, null).getResult();
2464f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        } catch (OperationCanceledException e) {
2465f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        } catch (AuthenticatorException e) {
2466f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        } catch (IOException e) {
2467f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        }
2468f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    }
2469f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2470f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    /**
2471f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * Remove all test accounts from the AccountManager
2472f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param accountManager the AccountManager
2473f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     */
2474f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    private void cleanupTestAccountManagerAccounts(AccountManager accountManager) {
2475f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        android.accounts.Account[] amAccountList =
2476f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            accountManager.getAccountsByType(AccountManagerTypes.TYPE_POP_IMAP);
2477f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        for (android.accounts.Account account: amAccountList) {
2478f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            if (account.name.startsWith(AccountReconciler.ACCOUNT_MANAGER_ACCOUNT_TEST_PREFIX)) {
2479f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                removeAccountManagerAccount(accountManager, account.name);
2480f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            }
2481f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        }
2482f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    }
2483f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2484f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    /** Verifies updating the DB from v21 to v22 works as expected */
2485f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    public void testUpgradeFromVersion21ToVersion22() {
2486f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        String imapTestLogin =
2487f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            AccountReconciler.ACCOUNT_MANAGER_ACCOUNT_TEST_PREFIX + "imap.host.com";
2488f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        String pop3TestLogin =
2489f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            AccountReconciler.ACCOUNT_MANAGER_ACCOUNT_TEST_PREFIX + "pop3.host.com";
2490f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        AccountManager accountManager = AccountManager.get(mContext);
2491f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2492f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        // Create provider accounts (one of each type)
2493f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        Account a1 = createAccount(mMockContext, "exchange",
2494f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                ProviderTestUtils.setupHostAuth("eas", "exchange.host.com", true, mMockContext),
2495f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                null);
2496f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        HostAuth h2 =
2497f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            ProviderTestUtils.setupHostAuth("imap", "imap.host.com", false, mMockContext);
2498f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        h2.mLogin = imapTestLogin;
2499f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        h2.save(mMockContext);
2500f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        Account a2 = createAccount(mMockContext, "imap", h2,
2501f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                ProviderTestUtils.setupHostAuth("smtp", "smtp.host.com", true, mMockContext));
2502f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        HostAuth h3 =
2503f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            ProviderTestUtils.setupHostAuth("pop3", "pop3.host.com", false, mMockContext);
2504f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        h3.mLogin = pop3TestLogin;
2505f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        h3.save(mMockContext);
2506f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        Account a3 = createAccount(mMockContext, "pop3", h3,
2507f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                ProviderTestUtils.setupHostAuth("smtp", "smtp.host.com", true, mMockContext));
2508f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2509f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        // Get the current list of AccountManager accounts (we have to use the real context here),
2510f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        // whereas we use the mock context for EmailProvider (this is because the mock context
2511f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        // doesn't implement AccountManager hooks)
2512f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        android.accounts.Account[] amAccountList =
2513f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            accountManager.getAccountsByType(AccountManagerTypes.TYPE_POP_IMAP);
2514f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        // There shouldn't be AccountManager accounts for these
2515f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        assertFalse(amAccountListHasAccount(amAccountList, a1, mMockContext));
2516f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        assertFalse(amAccountListHasAccount(amAccountList, a2, mMockContext));
2517f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        assertFalse(amAccountListHasAccount(amAccountList, a3, mMockContext));
2518f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2519f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        amAccountList = null;
2520f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        try {
2521f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            // Upgrade the database
2522f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            SQLiteDatabase db = getProvider().getDatabase(mMockContext);
2523f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            EmailProvider.upgradeFromVersion21ToVersion22(db, getContext());
2524f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
2525f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            // The pop3 and imap account should now be in account manager
2526f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            amAccountList = accountManager.getAccountsByType(AccountManagerTypes.TYPE_POP_IMAP);
2527f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            assertFalse(amAccountListHasAccount(amAccountList, a1, mMockContext));
2528f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            assertTrue(amAccountListHasAccount(amAccountList, a2, mMockContext));
2529f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            assertTrue(amAccountListHasAccount(amAccountList, a3, mMockContext));
2530f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        } finally {
2531f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            cleanupTestAccountManagerAccounts(accountManager);
2532f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        }
2533f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    }
25342bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25352bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank    public void testCleanupOrphans() {
25362bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        EmailProvider ep = getProvider();
25372bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        SQLiteDatabase db = ep.getDatabase(mMockContext);
25382bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25392bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Account a = ProviderTestUtils.setupAccount("account1", true, mMockContext);
25402bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Mailbox a1 and a3 won't have a valid account
25412bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a1 = createTypeMailbox(mMockContext, -1, Mailbox.TYPE_INBOX);
25422bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a2 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_MAIL);
25432bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a3 = createTypeMailbox(mMockContext, -1, Mailbox.TYPE_DRAFTS);
25442bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a4 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_SENT);
25452bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a5 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_TRASH);
25462bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Mailbox ax isn't even saved; use an obviously invalid id
25472bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox ax = new Mailbox();
25482bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ax.mId = 69105;
25492bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25502bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Message mt2 is an orphan, as is mt4
25512bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m1 = createMessage(mMockContext, a1, true, false, Message.FLAG_LOADED_COMPLETE);
25522bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m2 = createMessage(mMockContext, a2, true, false, Message.FLAG_LOADED_COMPLETE);
25532bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m3 = createMessage(mMockContext, a3, true, false, Message.FLAG_LOADED_COMPLETE);
25542bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m4 = createMessage(mMockContext, a4, true, false, Message.FLAG_LOADED_COMPLETE);
25552bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m5 = createMessage(mMockContext, a5, true, false, Message.FLAG_LOADED_COMPLETE);
25562bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message mx = createMessage(mMockContext, ax, true, false, Message.FLAG_LOADED_COMPLETE);
25572bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25582bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Two orphan policies
25592bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy p1 = new Policy();
25602bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        p1.save(mMockContext);
25612bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy p2 = new Policy();
25622bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        p2.save(mMockContext);
25632bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy p3 = new Policy();
25642bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy.setAccountPolicy(mMockContext, a.mId, p3, "0");
25652bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25662bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // We don't want anything cached or the tests below won't work.  Note that
25672bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // deleteUnlinked is only called by EmailProvider when the caches are empty
25682bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ContentCache.invalidateAllCaches();
25692bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Delete orphaned mailboxes/messages/policies
25702bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ep.deleteUnlinked(db, Mailbox.TABLE_NAME, MailboxColumns.ACCOUNT_KEY, AccountColumns.ID,
25712bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank                Account.TABLE_NAME);
25722bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ep.deleteUnlinked(db, Message.TABLE_NAME, MessageColumns.ACCOUNT_KEY, AccountColumns.ID,
25732bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank                Account.TABLE_NAME);
25742bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ep.deleteUnlinked(db, Policy.TABLE_NAME, PolicyColumns.ID, AccountColumns.POLICY_KEY,
25752bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank                Account.TABLE_NAME);
25762bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25772bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure the orphaned mailboxes are gone
25782bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, a1.mId));
25792bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a2.mId));
25802bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, a3.mId));
25812bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a4.mId));
25822bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a5.mId));
25832bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, ax.mId));
25842bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25852bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure orphaned messages are gone
25862bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, m1.mId));
25872bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m2.mId));
25882bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, m3.mId));
25892bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m4.mId));
25902bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m5.mId));
25912bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, mx.mId));
25922bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
25932bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure orphaned policies are gone
25942bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Policy.restorePolicyWithId(mMockContext, p1.mId));
25952bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Policy.restorePolicyWithId(mMockContext, p2.mId));
25962bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        a = Account.restoreAccountWithId(mMockContext, a.mId);
25972bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Policy.restorePolicyWithId(mMockContext, a.mPolicyKey));
25982bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank    }
25997143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler}
2600