17143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/*
27143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Copyright (C) 2009 The Android Open Source Project
37143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * Licensed under the Apache License, Version 2.0 (the "License"); you may not
517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * use this file except in compliance with the License. You may obtain a copy of
617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * the License at
77143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * http://www.apache.org/licenses/LICENSE-2.0
97143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Unless required by applicable law or agreed to in writing, software
1117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * License for the specific language governing permissions and limitations under
1417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie * the License.
157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpackage com.android.email.provider;
187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
196e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentResolver;
206e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentUris;
216e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.ContentValues;
226e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.Context;
2332bed4bb8e23d7322ab338773d135845f392d3cfBen Komaloimport android.content.ContextWrapper;
246e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.database.Cursor;
256e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.database.sqlite.SQLiteDatabase;
266e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.net.Uri;
276e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Bundle;
286e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Environment;
296e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.os.Parcel;
306e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.MoreAsserts;
316e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.ProviderTestCase2;
3252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.LargeTest;
3352e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.MediumTest;
3452e66110d8934cf0a3dd632101a56d4ef45b549aBen Komaloimport android.test.suitebuilder.annotation.SmallTest;
357037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xieimport android.test.suitebuilder.annotation.Suppress;
366e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
373d16e5d4b994d92db51962c8c461c53bee04309fAnthony Leeimport com.android.email.provider.EmailProvider.EmailAttachmentService;
38f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
39a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
40a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
41a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
42a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AttachmentColumns;
43a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Body;
44a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.BodyColumns;
45a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MailboxColumns;
46a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
47a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MessageColumns;
482bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blankimport com.android.emailcommon.provider.EmailContent.PolicyColumns;
4912b82d9374947c9268217f45befe8a74bd9b60d7Ben Komaloimport com.android.emailcommon.provider.HostAuth;
5053ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
516e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport com.android.emailcommon.provider.Policy;
5276f614720db6a282c3e890969a600585122cdcc5Marc Blankimport com.android.emailcommon.utility.TextUtilities;
5331d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.utility.Utility;
547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
55758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.File;
56758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.IOException;
57758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.util.ArrayList;
58758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
597143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/**
607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Tests of the Email provider.
61758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank *
627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * You can run this entire test case with:
637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *   runtest -c com.android.email.provider.ProviderTests email
64261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki *
65261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * TODO: Add tests for cursor notification mechanism.  (setNotificationUri and notifyChange)
66261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * We can't test the entire notification mechanism with a mock content resolver, because which URI
67261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * to notify when notifyChange() is called is in the actual content resolver.
68261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * Implementing the same mechanism in a mock one is pointless.  Instead what we could do is check
69261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * what notification URI each cursor has, and with which URI is notified when
70261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * inserting/updating/deleting.  (The former require a new method from AbstractCursor)
717143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
727037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie@Suppress
7352e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo@LargeTest
747143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpublic class ProviderTests extends ProviderTestCase2<EmailProvider> {
75758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
769d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private EmailProvider mProvider;
779d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private Context mMockContext;
787143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
797143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public ProviderTests() {
8031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
82758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
8317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // TODO: move this out to a common place. There are other places that have
8417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // similar mocks.
8532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    /**
8632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo     * Private context wrapper used to add back getPackageName() for these tests.
8732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo     */
8832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    private static class MockContext2 extends ContextWrapper {
8932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        private final Context mRealContext;
9132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public MockContext2(Context mockContext, Context realContext) {
9332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            super(mockContext);
9432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            mRealContext = realContext;
9532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
9632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
9732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
9832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public Context getApplicationContext() {
9932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return this;
10032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
10132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
10232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
10332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public String getPackageName() {
10432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return mRealContext.getPackageName();
10532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
10632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
10732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        @Override
10832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        public Object getSystemService(String name) {
10932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            return mRealContext.getSystemService(name);
11032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        }
11132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
11232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
1133d16e5d4b994d92db51962c8c461c53bee04309fAnthony Lee    private static final EmailAttachmentService MOCK_ATTACHMENT_SERVICE =
1143d16e5d4b994d92db51962c8c461c53bee04309fAnthony Lee            new EmailAttachmentService() {
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
14117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // ////////////////////////////////////////////////////////
14217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // //// Utility methods
14317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // ////////////////////////////////////////////////////////
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
15017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // EmailProvider.update() doesn't allow updating messageCount, so
15117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // directly use the DB.
15222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
15322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        db.update(Mailbox.TABLE_NAME, values, null, null);
15422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
15522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
15622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Returns the number of messages in a mailbox. */
15722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private int getMessageCount(long mailboxId) {
15822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return Utility.getFirstRowInt(mMockContext,
15922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
16017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                new String[] {MailboxColumns.MESSAGE_COUNT},
16117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                null,
16217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                null,
16317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                null,
16417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                0);
16522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
16622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
16722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates a new message. */
16817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    private static Message createMessage(
16917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            Context c, Mailbox b, boolean starred, boolean read, int flagLoaded) {
17017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message = ProviderTestUtils.setupMessage("1",
17117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                b.mAccountKey,
17217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                b.mId,
17317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
17417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
17517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                c,
17617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                starred,
17717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                read);
17822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        message.mFlagLoaded = flagLoaded;
17922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        message.save(c);
18022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return message;
18122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
18222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
18317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // ////////////////////////////////////////////////////////
18417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // //// The tests
18517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    // ////////////////////////////////////////////////////////
18622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
1870d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler    /**
1887143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple account save/retrieve
1897143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
19052e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
1917143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountSave() {
19228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-save", true, mMockContext);
1937143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
194758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
195f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        Account account2 = Account.restoreAccountWithId(mMockContext, account1Id);
196758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
19728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account2);
1987143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
19941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
2004a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    /**
201da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     * Test simple account save/retrieve with predefined hostauth records
202da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
20352e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
204da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    public void testAccountSaveHostAuth() {
205da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
206da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // add hostauth data, which should be saved the first time
20717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account1.mHostAuthRecv =
20817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false, mMockContext);
20917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account1.mHostAuthSend =
21017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false, mMockContext);
211da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.save(mMockContext);
212da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        long account1Id = account1.mId;
213da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
214da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm account reads back correctly
215f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        Account account1get = Account.restoreAccountWithId(mMockContext, account1Id);
216da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account1get);
217da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
218da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm hostauth fields can be accessed & read back correctly
21917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        HostAuth hostAuth1get =
22017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                HostAuth.restoreHostAuthWithId(mMockContext, account1get.mHostAuthKeyRecv);
22117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        ProviderTestUtils.assertHostAuthEqual(
22217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                "testAccountSaveHostAuth-recv", account1.mHostAuthRecv, hostAuth1get);
22317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        HostAuth hostAuth2get =
22417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                HostAuth.restoreHostAuthWithId(mMockContext, account1get.mHostAuthKeySend);
22517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        ProviderTestUtils.assertHostAuthEqual(
22617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                "testAccountSaveHostAuth-send", account1.mHostAuthSend, hostAuth2get);
227da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    }
228da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
229040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testAccountGetHostAuthSend() {
230040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
23117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account.mHostAuthSend =
23217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false, mMockContext);
233040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.save(mMockContext);
234040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authGet;
235040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authTest;
236040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
237040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authTest = account.mHostAuthSend;
238040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authTest);
239040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(account.mHostAuthKeySend != 0);
240040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
241040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // HostAuth is not changed
242040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
243040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(authGet == authTest); // return the same object
244040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
245040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; based upon mHostAuthKeyRecv
24617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        authTest = HostAuth.restoreHostAuthWithId(mMockContext, account.mHostAuthKeySend);
247040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthSend = null;
248040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
249040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
250040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthSend);
251040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthSend-1", authTest, authGet);
252040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
253040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; completely empty
25412b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = new HostAuth();
255040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthSend = null;
256040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthKeySend = 0;
257040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthSend(mMockContext);
258040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
259040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthSend);
260040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthSendv-2", authTest, authGet);
261040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
262040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
263040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testAccountGetHostAuthRecv() {
264040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Account account = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
26517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account.mHostAuthRecv =
26617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false, mMockContext);
267040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.save(mMockContext);
268040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authGet;
269040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth authTest;
270040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
271040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authTest = account.mHostAuthRecv;
272040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authTest);
273040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(account.mHostAuthKeyRecv != 0);
274040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
275040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // HostAuth is not changed
276040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
277040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertTrue(authGet == authTest); // return the same object
278040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
279040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; based upon mHostAuthKeyRecv
28017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        authTest = HostAuth.restoreHostAuthWithId(mMockContext, account.mHostAuthKeyRecv);
281040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthRecv = null;
282040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
283040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
284040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthRecv);
285040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthRecv-1", authTest, authGet);
286040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
287040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        // New HostAuth; completely empty
28812b82d9374947c9268217f45befe8a74bd9b60d7Ben Komalo        authTest = new HostAuth();
289040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthRecv = null;
290040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        account.mHostAuthKeyRecv = 0;
291040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        authGet = account.getOrCreateHostAuthRecv(mMockContext);
292040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(authGet);
293040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        assertNotNull(account.mHostAuthRecv);
294040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        ProviderTestUtils.assertHostAuthEqual("testAccountGetHostAuthRecv-2", authTest, authGet);
295040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    }
296040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
297da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
298040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy     * Simple test of account parceling.  The rather torturous path is to ensure that the
2994a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     * account is really flattened all the way down to a parcel and back.
3004a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     */
3014a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    public void testAccountParcel() {
3024a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("parcel", false, mMockContext);
3034a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b = new Bundle();
3044a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.putParcelable("account", account1);
3054a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Parcel p = Parcel.obtain();
3064a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.writeToParcel(p, 0);
30717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        p.setDataPosition(0); // rewind it for reading
3084a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b2 = new Bundle(Account.class.getClassLoader());
3094a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b2.readFromParcel(p);
3104a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account2 = (Account) b2.getParcelable("account");
3114a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        p.recycle();
3124a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
3134a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountParcel", account1, account2);
3144a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    }
3154a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
316e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    private static Uri getEclairStyleShortcutUri(Account account) {
317e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // We used _id instead of UUID only on Eclair(2.0-2.1).
318e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        return Account.CONTENT_URI.buildUpon().appendEncodedPath("" + account.mId).build();
319e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    }
320e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
3218d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testGetProtocol() {
3228d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
3238d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // add hostauth data, with protocol
32417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth(
32517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                "eas", "account-hostauth-recv", false, mMockContext);
32617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note that getProtocol uses the receive host auth, so the protocol
32717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // here shouldn't matter
3288d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // to the test result
32917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth(
33017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                "foo", "account-hostauth-send", false, mMockContext);
3318d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mMockContext);
33225144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", Account.getProtocol(mMockContext, account1.mId));
33325144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", account1.getProtocol(mMockContext));
33417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Account account2 =
33517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupAccount("account-nohostauth", false, mMockContext);
3368d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mMockContext);
3378d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // Make sure that we return null when there's no host auth
3388d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, account2.mId));
3398d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(account2.getProtocol(mMockContext));
3408d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // And when there's no account
3418d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, 0));
3428d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
3438d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
344652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    public void testAccountIsValidId() {
345652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account1 = ProviderTestUtils.setupAccount("account-1", true, mMockContext);
346652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account2 = ProviderTestUtils.setupAccount("account-2", true, mMockContext);
347652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
348652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account1.mId));
349652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account2.mId));
350652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
351652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertFalse(Account.isValidId(mMockContext, 1234567)); // Some random ID
352c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -1));
353c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -500));
354652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    }
355652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
35617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    private final static String[] MAILBOX_UNREAD_COUNT_PROJECTION =
35717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            new String[] {MailboxColumns.UNREAD_COUNT};
35841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private final static int MAILBOX_UNREAD_COUNT_COLMUN = 0;
35941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
36041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    /**
36141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * Get the value of the unread count in the mailbox of the account.
36241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * This can be different from the actual number of unread messages in that mailbox.
36341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     */
36441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private int getUnreadCount(long mailboxId) {
36541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        String text = null;
36641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        Cursor c = null;
36741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        try {
36817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            c = mMockContext.getContentResolver().query(Mailbox.CONTENT_URI,
36917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    MAILBOX_UNREAD_COUNT_PROJECTION, EmailContent.RECORD_ID + "=?",
37017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    new String[] {String.valueOf(mailboxId)}, null);
37141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.moveToFirst();
37241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            text = c.getString(MAILBOX_UNREAD_COUNT_COLMUN);
37341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        } finally {
37441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.close();
37541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        }
37641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        return Integer.valueOf(text);
37741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    }
37841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
3794119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static String[] expectedAttachmentNames =
38017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            new String[] {"attachment1.doc", "attachment2.xls", "attachment3"};
381976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    // The lengths need to be kept in ascending order
3824119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static long[] expectedAttachmentSizes = new long[] {31415L, 97701L, 151213L};
383976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
384fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /*
385fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Returns null if the message has no body.
386fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
387fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    private Body loadBodyForMessageId(long messageId) {
388fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
389fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        try {
39017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            c = mMockContext.getContentResolver().query(EmailContent.Body.CONTENT_URI,
3913dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantler                    EmailContent.Body.CONTENT_PROJECTION, BodyColumns.MESSAGE_KEY + "=?",
39217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    new String[] {String.valueOf(messageId)}, null);
393fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            int numBodies = c.getCount();
394fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            assertTrue("at most one body", numBodies < 2);
3952f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            return c.moveToFirst() ? EmailContent.getContent(mMockContext, c, Body.class) : null;
396fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        } finally {
397fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            c.close();
398fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        }
399fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
400fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
4017143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
4027143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple message save/retrieve
403758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
4047143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: serverId vs. serverIntId
4057143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
40652e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @MediumTest
4077143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageSave() {
40828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
4097143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
41028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
4117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
4127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a simple message (saved with no body)
41417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
41517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
41617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
41717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
41817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
41917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
4207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
4217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message1get = EmailContent.Message.restoreMessageWithId(mMockContext, message1Id);
42228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message1, message1get);
4237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a message saved with a body
42517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note that it will read back w/o the text & html so we must extract
42617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // those
42717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message1",
42817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
42917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
43017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
43117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
43217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
4337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
4347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String text2 = message2.mText;
4357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String html2 = message2.mHtml;
4366c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long sourceKey2 = message2.mSourceKey;
4377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mText = null;
4387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mHtml = null;
439e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        message2.mSourceKey = 0;
4407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message2get = EmailContent.Message.restoreMessageWithId(mMockContext, message2Id);
44128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message2, message2get);
442758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
4437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Now see if there's a body saved with the right stuff
444fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Body body2 = loadBodyForMessageId(message2Id);
445fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body text", text2, body2.mTextContent);
446fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body html", html2, body2.mHtmlContent);
4476c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals("source key", sourceKey2, body2.mSourceKey);
44832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
44932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
45032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    @MediumTest
45132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    public void testMessageWithAttachment() {
45232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
45332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long account1Id = account1.mId;
45432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
45532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long box1Id = box1.mId;
456976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
4574119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments and body
45817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message3 = ProviderTestUtils.setupMessage("message3",
45917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
46017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
46117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
46217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
46317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
464976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        ArrayList<Attachment> atts = new ArrayList<Attachment>();
465976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        for (int i = 0; i < 3; i++) {
4664119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
46717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i], false,
46817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    mMockContext));
469976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
470976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        message3.mAttachments = atts;
4719e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message3.save(mMockContext);
472976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        long message3Id = message3.mId;
473976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
47417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Now check the attachments; there should be three and they should
47517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // match name and size
476fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
477976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
47817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // Note that there is NO guarantee of the order of returned records
47917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // in the general case,
48017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // so we specifically ask for ordering by size. The
48117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // expectedAttachmentSizes array must
482976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // be kept sorted by size (ascending) for this test to work properly
48317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            c = mMockContext.getContentResolver().query(Attachment.CONTENT_URI,
484845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                    Attachment.CONTENT_PROJECTION, AttachmentColumns.MESSAGE_KEY + "=?",
485845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                    new String[] {String.valueOf(message3Id)}, AttachmentColumns.SIZE);
486976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int numAtts = c.getCount();
487976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(3, numAtts);
488976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int i = 0;
489976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            while (c.moveToNext()) {
4902f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler                Attachment actual = EmailContent.getContent(mMockContext, c, Attachment.class);
4914119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message3", atts.get(i), actual);
4924119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                i++;
4934119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            }
4944119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
4954119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
4964119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
49732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    }
49832bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
49932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo
50032bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    @MediumTest
50132bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo    public void testMessageSaveWithJustAttachments() {
50232bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
50332bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long account1Id = account1.mId;
50432bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
50532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        long box1Id = box1.mId;
50632bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        Cursor c = null;
5074119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
5084119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments but no body
50917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message4 = ProviderTestUtils.setupMessage("message4",
51017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
51117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
51217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
51317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
51417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
51532bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        ArrayList<Attachment> atts = new ArrayList<Attachment>();
5164119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        for (int i = 0; i < 3; i++) {
5174119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
51817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i], false,
51917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    mMockContext));
5204119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
5214119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        message4.mAttachments = atts;
5229e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message4.save(mMockContext);
5234119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        long message4Id = message4.mId;
5244119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
52517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Now check the attachments; there should be three and they should
52617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // match name and size
5274119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        c = null;
52841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
5294119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
53017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // Note that there is NO guarantee of the order of returned records
53117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // in the general case,
53217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // so we specifically ask for ordering by size. The
53317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // expectedAttachmentSizes array must
5344119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // be kept sorted by size (ascending) for this test to work properly
53517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            c = mMockContext.getContentResolver().query(Attachment.CONTENT_URI,
536845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                    Attachment.CONTENT_PROJECTION, AttachmentColumns.MESSAGE_KEY + "=?",
537845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                    new String[] {String.valueOf(message4Id)}, AttachmentColumns.SIZE);
5384119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int numAtts = c.getCount();
5394119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            assertEquals(3, numAtts);
5404119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int i = 0;
5414119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            while (c.moveToNext()) {
5422f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler                Attachment actual = EmailContent.getContent(mMockContext, c, Attachment.class);
5434119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), actual);
544976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                i++;
545976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
546976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
547976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            c.close();
5487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        }
54944144d0301213536b02f2080237b63d8271b2d0bMihai Preda
55044144d0301213536b02f2080237b63d8271b2d0bMihai Preda        // test EmailContent.restoreAttachmentsWitdMessageId()
55144144d0301213536b02f2080237b63d8271b2d0bMihai Preda        Attachment[] attachments =
55217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                Attachment.restoreAttachmentsWithMessageId(mMockContext, message4Id);
55344144d0301213536b02f2080237b63d8271b2d0bMihai Preda        int size = attachments.length;
55444144d0301213536b02f2080237b63d8271b2d0bMihai Preda        assertEquals(3, size);
55544144d0301213536b02f2080237b63d8271b2d0bMihai Preda        for (int i = 0; i < size; ++i) {
55644144d0301213536b02f2080237b63d8271b2d0bMihai Preda            ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), attachments[i]);
55744144d0301213536b02f2080237b63d8271b2d0bMihai Preda        }
5587143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
559758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
561e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     * Test that saving a message creates the proper snippet for that message
562e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     */
563e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    public void testMessageSaveAddsSnippet() {
564e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Account account = ProviderTestUtils.setupAccount("message-snippet", true, mMockContext);
565e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Mailbox box = ProviderTestUtils.setupMailbox("box1", account.mId, true, mMockContext);
566e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
567e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Create a message without a body, unsaved
56817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message = ProviderTestUtils.setupMessage("message",
56917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account.mId,
57017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box.mId,
57117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
57217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
57317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
574e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = "This is some text";
575e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
576e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
577e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
578e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
57917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(
58017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                restoredMessage.mSnippet, TextUtilities.makeSnippetFromPlainText(message.mText));
581e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
582e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Start again
58317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        message = ProviderTestUtils.setupMessage("message",
58417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account.mId,
58517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box.mId,
58617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
58717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
58817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
589e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = null;
590e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
591e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
592e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
593e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
59417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(
59517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                restoredMessage.mSnippet, TextUtilities.makeSnippetFromHtmlText(message.mHtml));
596e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    }
597e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
598e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    /**
5997143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update account
6007143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
601758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6027143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6037143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update mailbox
6047143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
605758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6067143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6077143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update message
6087143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
609758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete account
6127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
6137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
6147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountDelete() {
61528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-delete-1", true, mMockContext);
6167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
61728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account2 = ProviderTestUtils.setupAccount("account-delete-2", true, mMockContext);
6187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account2Id = account2.mId;
6197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two accounts
6217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numBoxes);
6237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
6257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
6267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one account now
6297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
6317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
6337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
6347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts now
6377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
6397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
640758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6429627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.lookupBodyIdWithMessageId()
6439627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Verifies that:
6449627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a message without body, -1 is returned.
6459627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a mesage with body, the id matches the one from loadBodyForMessageId.
6469627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6479627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testLookupBodyIdWithMessageId() {
6489627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
6499627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6509627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6519627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6529627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
6539627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6549627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1. create message with no body, check that returned bodyId is -1
65517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
65617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
65717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
65817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
65917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
66017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
6619627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
662bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId1 = Body.lookupBodyIdWithMessageId(mMockContext, message1Id);
6639627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(bodyId1, -1);
6649627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6659627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2. create message with body, check that returned bodyId is correct
66617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message1",
66717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
66817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
66917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
67017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
67117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
6729627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
673bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId2 = Body.lookupBodyIdWithMessageId(mMockContext, message2Id);
6749627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body = loadBodyForMessageId(message2Id);
6759627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body);
6769627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body.mId, bodyId2);
6779627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
6789627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6799627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
6809627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.updateBodyWithMessageId().
6819627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 1. - create message without body,
6829627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update its body (set TEXT_CONTENT)
6839627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6849627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *
6859627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 2. - create message with body,
6869627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update body (set TEXT_CONTENT)
6879627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6889627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6899627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testUpdateBodyWithMessageId() {
6909627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6919627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6929627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6939627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
6949627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6959627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final String textContent = "foobar some odd text";
696936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String htmlContent = "and some html";
6979627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6989627d014e16235eadf981b9165807dc72a14a383Mihai Preda        ContentValues values = new ContentValues();
6999627d014e16235eadf981b9165807dc72a14a383Mihai Preda        values.put(BodyColumns.TEXT_CONTENT, textContent);
700936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.HTML_CONTENT, htmlContent);
701e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        values.put(BodyColumns.SOURCE_MESSAGE_KEY, 17);
7029627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7039627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1
70417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
70517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
70617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
70717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
70817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
70917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
7109627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
7119627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body1 = loadBodyForMessageId(message1Id);
7129627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNull(body1);
7139627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message1Id, values);
7149627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body1 = loadBodyForMessageId(message1Id);
7159627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body1);
7169627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body1.mTextContent, textContent);
717936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mHtmlContent, htmlContent);
718e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body1.mSourceKey, 17);
7199627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7209627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2
72117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message1",
72217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
72317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
72417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
72517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
72617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
7279627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
7289627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body2 = loadBodyForMessageId(message2Id);
7299627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7309627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertTrue(!body2.mTextContent.equals(textContent));
7319627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message2Id, values);
7329627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body2 = loadBodyForMessageId(message1Id);
7339627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7349627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body2.mTextContent, textContent);
735936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mHtmlContent, htmlContent);
736e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body2.mSourceKey, 17);
7379627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
7389627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7399627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
740c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     * Test body retrieve methods
741c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     */
742c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    public void testBodyRetrieve() {
743c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No account needed
744c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No mailbox needed
74517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 =
74617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupMessage("bodyretrieve", 1, 1, true, true, mMockContext);
747c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        long messageId = message1.mId;
748c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
74917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(message1.mText, Body.restoreBodyTextWithMessageId(mMockContext, messageId));
75017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(message1.mHtml, Body.restoreBodyHtmlWithMessageId(mMockContext, messageId));
75117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(message1.mSourceKey, Body.restoreBodySourceKey(mMockContext, messageId));
752c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    }
753c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
754c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    /**
755fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete body.
756fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
757fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. The body has _id 1 and messageKey 2).
758fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
759fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. verify that body for message 2 has not been deleted.
760fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. delete message 2, verify body is deleted.
761fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
762fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteBody() {
763fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
764fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
765fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // Create account and mailboxes
766fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
767fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
768fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
769fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
770fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
771fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
77217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
77317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
77417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
77517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
77617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
77717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
778fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
779fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
780fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
78117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message1",
78217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
78317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
78417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
78517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
78617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
787fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
788fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // verify body is there
789fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
790fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
791fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
792fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
793c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
794fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. verify body for second message wasn't deleted
795fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
796fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
797fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 5. delete second message, check its body is deleted
798fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message2Id), null, null);
799fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNull(loadBodyForMessageId(message2Id));
800fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
801fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
802fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
803fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete orphan bodies.
804fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
805fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
806fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
807fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. delete some other mailbox -- this triggers delete orphan bodies.
808fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. verify that body for message 2 has not been deleted.
809fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
810fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteOrphanBodies() {
811fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
812fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
813ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
814fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
815fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
816fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
817fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
818fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mMockContext);
819fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box2Id = box2.mId;
820fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
821fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
82217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
82317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
82417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
82517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
82617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
82717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
828fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
829fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
830fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
83117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message1",
83217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
83317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
83417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
83517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
83617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
837fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
83817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // verify body is there
839fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
840fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
841fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
842fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
843fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
844fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. delete some mailbox (because it triggers "delete orphan bodies")
845fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Mailbox.CONTENT_URI, box2Id), null, null);
846fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
84717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // 5. verify body for second message wasn't deleted during
84817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // "delete orphan bodies"
849fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
850fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
851fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
852fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
8530efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * Note that we can't use EmailContent.count() here because it uses a projection including
8540efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * count(*), and count(*) is incompatible with a LIMIT (i.e. the limit would be applied to the
8550efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * single column returned with count(*), rather than to the query itself)
8560efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     */
8570efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    private int count(Context context, Uri uri, String selection, String[] selectionArgs) {
85817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Cursor c = context.getContentResolver()
85917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                .query(uri, EmailContent.ID_PROJECTION, selection, selectionArgs, null);
8600efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        try {
8610efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            return c.getCount();
8620efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        } finally {
8630efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            c.close();
8640efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        }
8650efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
8660efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8670efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    public void testMessageQueryWithLimit() {
8680efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        final Context context = mMockContext;
8690efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8700efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create account and two mailboxes
8710efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
8720efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
8730efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
8740efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8750efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box1
8760efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, false, true, context);
8770efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, false, true, context);
8780efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, false, true, context);
8790efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, false, true, context);
8800efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8810efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box2
8820efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box2.mId, false, true, context);
8830efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box2.mId, false, true, context);
8840efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box2.mId, false, true, context);
8850efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box2.mId, false, true, context);
8860efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8870efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check normal case, special case (limit 1), and arbitrary limits
8880efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, Message.CONTENT_URI, null, null));
88917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(1,
89017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 1), null, null));
89117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(3,
89217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 3), null, null));
8930efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 100),
8940efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8950efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8960efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check that it works with selection/selection args
8970efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        String[] args = new String[] {Long.toString(box1.mId)};
89817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(4,
89917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                count(mMockContext, Message.CONTENT_URI, MessageColumns.MAILBOX_KEY + "=?", args));
90017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(1, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 1),
9010efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                MessageColumns.MAILBOX_KEY + "=?", args));
9020efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
9030efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
9040efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    /**
905ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * Test delete orphan messages
906ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 1. create message without body (message id 1)
907ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
908ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 3. delete first message.
909ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 4. delete some other mailbox -- this triggers delete orphan bodies.
910ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 5. verify that body for message 2 has not been deleted.
911ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     */
91217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    public void testDeleteOrphanMessages() {
913ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
914ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final Context context = mMockContext;
915ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
916ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
917ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
918ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
919ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
920ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
921ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box1
92217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg1_1 = ProviderTestUtils.setupMessage("message1",
92317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
92417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1.mId,
92517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
92617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
92717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
92817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg1_2 = ProviderTestUtils.setupMessage("message2",
92917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
93017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1.mId,
93117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
93217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
93317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
93417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg1_3 = ProviderTestUtils.setupMessage("message3",
93517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
93617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1.mId,
93717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
93817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
93917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
94017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg1_4 = ProviderTestUtils.setupMessage("message4",
94117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
94217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1.mId,
94317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
94417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
94517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
946ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
947ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box2
94817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg2_1 = ProviderTestUtils.setupMessage("message1",
94917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
95017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box2.mId,
95117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
95217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
95317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
95417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg2_2 = ProviderTestUtils.setupMessage("message2",
95517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
95617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box2.mId,
95717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
95817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
95917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
96017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg2_3 = ProviderTestUtils.setupMessage("message3",
96117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
96217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box2.mId,
96317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
96417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
96517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
96617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msg2_4 = ProviderTestUtils.setupMessage("message4",
96717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
96817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box2.mId,
96917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
97017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
97117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
972ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
973ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete 2 from each mailbox
97417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
97517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_1.mId), null, null);
97617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
97717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_2.mId), null, null);
97817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
97917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_1.mId), null, null);
98017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
98117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_2.mId), null, null);
982ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
983ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 4 items in the deleted item table
984ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
985ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
986ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update 2 from each mailbox
987ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues v = new ContentValues();
988ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        v.put(MessageColumns.DISPLAY_NAME, "--updated--");
98917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(
99017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_3.mId), v, null, null);
99117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(
99217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_4.mId), v, null, null);
99317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(
99417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_3.mId), v, null, null);
99517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(
99617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_4.mId), v, null, null);
99717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie
99817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // There should be 4 items in the updated item table
999ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
1000ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
100117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Manually add 2 messages from a "deleted" mailbox to deleted and
100217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // updated tables
1003ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Use a value > 2 for the deleted box id
1004ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long delBoxId = 10;
1005ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in the "deleted" mailbox
100617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msgX_A = ProviderTestUtils.setupMessage("messageA",
100717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
100817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                delBoxId,
100917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
101017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
101117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
101217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msgX_B = ProviderTestUtils.setupMessage("messageB",
101317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
101417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                delBoxId,
101517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
101617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
101717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
101817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msgX_C = ProviderTestUtils.setupMessage("messageC",
101917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
102017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                delBoxId,
102117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
102217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
102317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
102417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message msgX_D = ProviderTestUtils.setupMessage("messageD",
102517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                acct.mId,
102617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                delBoxId,
102717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
102817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
102917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                context);
1030ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1031ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv;
103217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // We have to assign id's manually because there are no autoincrement
103317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // id's for these tables
103417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Start with an id that won't exist, since id's in these tables must be
103517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // unique
1036ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long msgId = 10;
103717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // It's illegal to manually insert these, so we need to catch the
103817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // exception
1039ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // NOTE: The insert succeeds, and then throws the exception
1040ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1041ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_A.toContentValues();
1042ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1043ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
1044ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1045ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1046ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1047ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_B.toContentValues();
1048ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1049ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
1050ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1051ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1052ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1053ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_C.toContentValues();
1054ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1055ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
1056ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1057ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1058ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
1059ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_D.toContentValues();
1060ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
1061ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
1062ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
1063ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
1064ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1065ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 6 items in the deleted and updated tables
1066ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
1067ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
1068ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1069ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete the orphans
107017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        EmailProvider.deleteMessageOrphans(
107117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                getProvider().getDatabase(context), Message.DELETED_TABLE_NAME);
107217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        EmailProvider.deleteMessageOrphans(
107317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                getProvider().getDatabase(context), Message.UPDATED_TABLE_NAME);
1074ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
107517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // There should now be 4 messages in each of the deleted and updated
107617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // tables again
1077ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
1078ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
1079ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    }
1080ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1081ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    /**
10827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete message
10837143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
10847143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
10857143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
10867143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageDelete() {
108728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mMockContext);
10887143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
108928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
10907143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
109117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
109217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
109317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
109417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
109517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
109617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
10977143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
109817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message2",
109917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
110017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
110117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
110217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
110317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
11047143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
11057143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
110617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
110717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
110817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String[] selArgs = new String[] {String.valueOf(account1Id), String.valueOf(box1Id)};
11097143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
11107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two messages
11117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
11127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
11137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
11147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
11157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
11167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
11177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
11187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one message now
11197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
11207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numMessages);
11217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
11227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
11237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
11247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
11257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
11267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no messages now
11277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
11287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
11297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1130758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
11317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
1132ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test delete synced message
1133ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1134ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1135ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1136ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testSyncedMessageDelete() {
113717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Account account1 =
113817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupAccount("synced-message-delete", true, mMockContext);
1139ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
114028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1141ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
114217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
114317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
114417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
114517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
114617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
114717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
1148ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
114917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message2",
115017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
115117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
115217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
115317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
115417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
1155ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1156ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1157ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1158ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
115917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String[] selArgs = new String[] {String.valueOf(account1Id), String.valueOf(box1Id)};
1160ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1161ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1162ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1163ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1164ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1165ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure we start with no synced deletions
116617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
116717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1168ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1169ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1170ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete one of them SYNCED
1171ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1Id);
1172ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1173ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1174ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's only one message now
1175ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1176ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1177ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1178ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one synced deletion now
117917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
118017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1181ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1182ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1183ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete the other one NOT SYNCED
1184ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
1185ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1186ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1187ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are no messages now
1188ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1189ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1190ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1191ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's still one deletion now
119217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
119317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1194ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1195ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1196ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1197ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
1198ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test message update
1199ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1200ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1201ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1202ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testMessageUpdate() {
120328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-update", true, mMockContext);
1204ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
120528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1206ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
120717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
120817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
120917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
121017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
121117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
121217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
1213ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
121417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message2",
121517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
121617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
121717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
121817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
121917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
1220ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1221ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentResolver cr = mMockContext.getContentResolver();
1222ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1223ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1224ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
122517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String[] selArgs = new String[] {String.valueOf(account1Id), String.valueOf(box1Id)};
1226ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1227ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1228ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1229ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1230ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1231ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the first one
1232ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
1233ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentValues cv = new ContentValues();
1234ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1235ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1236ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1237ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's no updated message
123817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
123917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection, selArgs);
1240ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1241ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1242ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck"
1243ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message1Id);
1244ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1245ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1246ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the second one
1247ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id);
1248ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv = new ContentValues();
1249ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1250ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1251ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1252ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one updated message
125317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
125417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection, selArgs);
1255ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1256ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1257ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck",
1258ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // as before
1259ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        restoredMessage = Message.restoreMessageWithId(mMockContext, message2Id);
1260ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1261ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1262ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the original message back from the provider
126317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Cursor c =
126417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                cr.query(Message.UPDATED_CONTENT_URI, Message.CONTENT_PROJECTION, null, null, null);
1265ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        try {
1266ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertTrue(c.moveToFirst());
12672f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            Message originalMessage = EmailContent.getContent(mMockContext, c, Message.class);
1268ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // make sure this has the original value
1269ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertEquals("from message2", originalMessage.mFrom);
1270ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // Should only be one
1271ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertFalse(c.moveToNext());
1272ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        } finally {
1273ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            c.close();
1274ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        }
1275ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1276ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // delete the second message
1277ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id), null, null);
1278ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1279ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // hey, presto! the change should be gone
128017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
128117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection, selArgs);
1282ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1283ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1284ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // and there should now be a deleted record
128517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
128617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1287ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1288ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1289ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1290ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
12917143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: cascaded delete account
12927143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
12937143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
12947143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
12957143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other account, mailbox & messages and confirm the right objects were deleted
12967143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
12977143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteAccount() {
129817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Account account1 =
129917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupAccount("account-delete-cascade", true, mMockContext);
13007143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
130128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
13027143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
130317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        /* Message message1 = */ProviderTestUtils.setupMessage("message1",
130417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
130517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
130617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
130717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
130817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
130917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        /* Message message2 = */ProviderTestUtils.setupMessage("message2",
131017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
131117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
131217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
131317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
131417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
13157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
13167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there is one account, one mailbox, and two messages
13177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
13187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numAccounts);
13197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
13207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
13217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
13227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
13237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
13247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // delete the account
13257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
13267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
13277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
13287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts, mailboxes, or messages
13297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
13307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numAccounts);
13317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
13327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
13337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
13347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
13357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1336758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
13377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
13387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test cascaded delete mailbox
13397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
13407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
13417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other mailbox & messages and confirm the right objects were deleted
13427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
13437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteMailbox() {
134417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Account account1 =
134517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupAccount("mailbox-delete-cascade", true, mMockContext);
13467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
134728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
13487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
134917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
135017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
135117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
135217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
135317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
135417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
135517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message2",
135617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
135717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
135817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
135917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
136017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
136117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message3 = ProviderTestUtils.setupMessage("message3",
136217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
136317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
136417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
136517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
136617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
136717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message4 = ProviderTestUtils.setupMessage("message4",
136817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
136917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
137017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
137117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
137217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
1373ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message5", account1Id, box1Id, false, true, mMockContext);
1374ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message6", account1Id, box1Id, false, true, mMockContext);
13757143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
137617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
137717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
137817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String[] selArgs = new String[] {String.valueOf(account1Id), String.valueOf(box1Id)};
13797143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
13800e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // make sure there are six messages
13817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1382ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, numMessages);
1383ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1384ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv = new ContentValues();
1385845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler        cv.put(MessageColumns.SERVER_ID, "SERVER_ID");
1386ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentResolver resolver = mMockContext.getContentResolver();
1387ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1388ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update two messages
138917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1.mId), cv,
1390ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
139117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2.mId), cv,
1392ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
139317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Delete two messages
139417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
139517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message3.mId), null, null);
139617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        resolver.delete(
139717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message4.mId), null, null);
1398ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
139917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // There should now be two messages in updated/deleted, and 4 in
140017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // messages
1401ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1402ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, numMessages);
140317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
140417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1405ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(2, numMessages);
140617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
140717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection, selArgs);
14087143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
1409758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
14107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the mailbox
14117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box1Id);
1412ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(uri, null, null);
1413758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1414ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // there should now be zero messages in all three tables
14157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
14167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
141717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
141817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection, selArgs);
1419ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
142017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numMessages =
142117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection, selArgs);
1422ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
14237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1424758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
14257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
14266c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test cascaded delete message
14276c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Confirms that deleting a message will also delete its body & attachments
14287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
14296c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testCascadeMessageDelete() {
14306c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-cascade", true, mMockContext);
14316c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long account1Id = account1.mId;
14326c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
14336c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long box1Id = box1.mId;
1434bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
14356c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Each message has a body, and also give each 2 attachments
143617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 = ProviderTestUtils.setupMessage("message1",
143717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
143817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
143917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
144017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
144117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
14426c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ArrayList<Attachment> atts = new ArrayList<Attachment>();
14436c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
14446c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
144517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i], false,
144617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    mMockContext));
14476c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
14486c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.mAttachments = atts;
14496c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.save(mMockContext);
14506c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message1Id = message1.mId;
14516c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
145217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 = ProviderTestUtils.setupMessage("message2",
145317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                account1Id,
145417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                box1Id,
145517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
145617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                false,
145717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext);
14586c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        atts = new ArrayList<Attachment>();
14596c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
14606c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
146117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i], false,
146217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                    mMockContext));
14636c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
14646c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.mAttachments = atts;
14656c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.save(mMockContext);
14666c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message2Id = message2.mId;
14676c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
146817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Set up to test total counts of bodies & attachments for our test
146917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // messages
14706c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String bodySelection = BodyColumns.MESSAGE_KEY + " IN (?,?)";
14716c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String attachmentSelection = AttachmentColumns.MESSAGE_KEY + " IN (?,?)";
147217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String[] selArgs = new String[] {String.valueOf(message1Id), String.valueOf(message2Id)};
1473bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
14746c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are two bodies
14756c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        int numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
14766c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numBodies);
14776c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14786c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are four attachments
147917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        int numAttachments = EmailContent.count(
148017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext, Attachment.CONTENT_URI, attachmentSelection, selArgs);
14816c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(4, numAttachments);
14826c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14836c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete one of the messages
14846c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
14856c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
14866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // there should be one body and two attachments
14886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
14896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(1, numBodies);
14906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
149117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numAttachments = EmailContent.count(
149217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext, Attachment.CONTENT_URI, attachmentSelection, selArgs);
14936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numAttachments);
14946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete the other message
14966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
14976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
14986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are no bodies or attachments
15006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
15016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numBodies);
15026c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
150317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        numAttachments = EmailContent.count(
150417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                mMockContext, Attachment.CONTENT_URI, attachmentSelection, selArgs);
15056c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numAttachments);
15066c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
15077143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
1508976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    /**
1509976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * Test that our unique file name algorithm works as expected.  Since this test requires an
1510976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * SD card, we check the environment first, and return immediately if none is mounted.
1511976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * @throws IOException
1512976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     */
1513976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    public void testCreateUniqueFile() throws IOException {
1514976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        // Delete existing files, if they exist
1515976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
1516976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            return;
1517976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1518976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
1519976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String fileName = "A11achm3n1.doc";
1520976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File uniqueFile = Attachment.createUniqueFile(fileName);
1521976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1522976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1523976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1524976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2.doc", uniqueFile.getName());
1525976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (uniqueFile.createNewFile()) {
1526976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    uniqueFile = Attachment.createUniqueFile(fileName);
1527976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    assertEquals("A11achm3n1-3.doc", uniqueFile.getName());
1528976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
152917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            }
1530976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            fileName = "A11achm3n1";
1531976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            uniqueFile = Attachment.createUniqueFile(fileName);
1532976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1533976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1534976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1535976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2", uniqueFile.getName());
1536976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1537976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
1538976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File directory = Environment.getExternalStorageDirectory();
153917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // These are the files that should be created earlier in the test.
154017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            // Make sure
1541976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // they are deleted for the next go-around
1542976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String[] fileNames = new String[] {"A11achm3n1.doc", "A11achm3n1-2.doc", "A11achm3n1"};
1543976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int length = fileNames.length;
1544976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            for (int i = 0; i < length; i++) {
1545976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                File file = new File(directory, fileNames[i]);
1546976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (file.exists()) {
1547976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    file.delete();
1548976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
1549976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1550976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1551976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    }
15524119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
15534119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    /**
15544119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     * Test retrieving attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
15554119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     */
15564119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    public void testGetAttachmentByMessageIdUri() {
15574119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
155817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note, we don't strictly need accounts, mailboxes or messages to run
155917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // this test.
15604119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a1 = ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
15614119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a2 = ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
1562758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
1563758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
15644119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
15654119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Now ask for the attachments of message id=1
156617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note: Using the "sort by size" trick to bring them back in expected
156717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // order
15684119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
156917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Cursor c = mMockContext.getContentResolver()
1570845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                .query(uri, Attachment.CONTENT_PROJECTION, null, null, AttachmentColumns.SIZE);
15714119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        assertEquals(2, c.getCount());
15724119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
15734119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
15744119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToFirst();
15752f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            Attachment a1Get = EmailContent.getContent(mMockContext, c, Attachment.class);
15764119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-1", a1, a1Get);
15774119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToNext();
15782f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            Attachment a2Get = EmailContent.getContent(mMockContext, c, Attachment.class);
15794119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-2", a2, a2Get);
15804119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
15814119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
15824119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
15834119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    }
158454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
158554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    /**
15866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test deleting attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
15876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     */
15886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testDeleteAttachmentByMessageIdUri() {
15896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ContentResolver mockResolver = mMockContext.getContentResolver();
15906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
159117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note, we don't strictly need accounts, mailboxes or messages to run
159217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // this test.
15936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
15946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
15956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a3 = ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
15966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a4 = ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
15976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
15986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Delete all attachments for message id=1
15996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
16006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mockResolver.delete(uri, null, null);
16016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
160217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Read back all attachments and confirm that we have the expected
160317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // remaining attachments
160417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // (the attachments that are set for message id=2). Note order-by size
160517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // to simplify test.
160617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Cursor c = mockResolver.query(
1607845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                Attachment.CONTENT_URI, Attachment.CONTENT_PROJECTION, null, null,
1608845db9711917ad8936926fc7a1a179fade8e00d5Tony Mantler                AttachmentColumns.SIZE);
16096c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, c.getCount());
16106c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
16116c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        try {
16126c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToFirst();
16132f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            Attachment a3Get = EmailContent.getContent(mMockContext, c, Attachment.class);
16146c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-3", a3, a3Get);
16156c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToNext();
16162f288864b621cfb5aee44eda27df463460d33dd3Tony Mantler            Attachment a4Get = EmailContent.getContent(mMockContext, c, Attachment.class);
16176c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-4", a4, a4Get);
16186c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        } finally {
16196c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.close();
16206c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
16216c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
16226c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
162352e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo    @SmallTest
162463537746479f4b65517bd217c1a5f76d697367ebMarc Blank    public void testGetDefaultAccountNoneExplicitlySet() {
162563537746479f4b65517bd217c1a5f76d697367ebMarc Blank        Account account1 = ProviderTestUtils.setupAccount("account-default-1", false, mMockContext);
162663537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account1.save(mMockContext);
162763537746479f4b65517bd217c1a5f76d697367ebMarc Blank
162863537746479f4b65517bd217c1a5f76d697367ebMarc Blank        // We should find account1 as default
162917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        long defaultAccountId = Account.getDefaultAccountId(mMockContext, Account.NO_ACCOUNT);
163063537746479f4b65517bd217c1a5f76d697367ebMarc Blank        assertEquals(defaultAccountId, account1.mId);
163163537746479f4b65517bd217c1a5f76d697367ebMarc Blank
163252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        Account account2 = ProviderTestUtils.setupAccount("account-default-2", false, mMockContext);
163363537746479f4b65517bd217c1a5f76d697367ebMarc Blank        account2.save(mMockContext);
163463537746479f4b65517bd217c1a5f76d697367ebMarc Blank
163552e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        Account account3 = ProviderTestUtils.setupAccount("account-default-3", false, mMockContext);
163652e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        account3.save(mMockContext);
163752e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo
163817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // We should find the earliest one as the default, so that it can be
163917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // consistent on
164052e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        // repeated calls.
164117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, Account.NO_ACCOUNT);
164252e66110d8934cf0a3dd632101a56d4ef45b549aBen Komalo        assertTrue(defaultAccountId == account1.mId);
164363537746479f4b65517bd217c1a5f76d697367ebMarc Blank    }
164463537746479f4b65517bd217c1a5f76d697367ebMarc Blank
16456c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    /**
164617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie     * Tests of default account behavior. Note that default account behavior is handled differently
164717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie     * now. If there is no last used account, the first account found by our account query is the
164817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie     * default. If there is a last used account, the last used account is our default.
1649758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
165054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 1.  Simple set/get
165154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 2.  Moving default between 3 accounts
165254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 3.  Delete default, make sure another becomes default
165354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     */
165417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    public void testGetDefaultAccountWithLastUsedAccount() {
165517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        long lastUsedAccountId = Account.NO_ACCOUNT;
165617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie
165754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // There should be no default account if there are no accounts
165817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        long defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1659acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        assertEquals(Account.NO_ACCOUNT, defaultAccountId);
166054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1661acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account1 = ProviderTestUtils.setupAccount("account-default-1", false, mMockContext);
1662acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account1.save(mMockContext);
166354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account1Id = account1.mId;
1664acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account2 = ProviderTestUtils.setupAccount("account-default-2", false, mMockContext);
1665acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account2.save(mMockContext);
166654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account2Id = account2.mId;
1667acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        Account account3 = ProviderTestUtils.setupAccount("account-default-3", false, mMockContext);
1668acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        account3.save(mMockContext);
166954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account3Id = account3.mId;
167054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
167117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // With three accounts, but none marked default, confirm that the first
167217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // one is the default.
167317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1674acd985efb4b29da28953308ba3d5c8f43b760379Ben Komalo        assertTrue(defaultAccountId == account1Id);
167554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
167617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // updating lastUsedAccountId locally instead of updating through
167717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Preferences
167817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        lastUsedAccountId = defaultAccountId;
167917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
16809e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertEquals(account1Id, defaultAccountId);
168154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
168217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // updating lastUsedAccountId locally instead of updating through
168317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Preferences
168417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        lastUsedAccountId = account2Id;
168517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1686531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1687531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank
168817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // updating lastUsedAccountId locally instead of updating through
168917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Preferences
169017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        lastUsedAccountId = account3Id;
169117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1692531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
169354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
169454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // Now delete a non-default account and confirm no change
169554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
169654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
169754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
169817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1699531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
170054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
170117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Now confirm deleting the default account and it switches to another
170217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // one
170354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account3Id);
170454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
170554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
170617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
1707531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1708758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
170917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // updating lastUsedAccountId locally instead of updating through
171017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Preferences
171117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        lastUsedAccountId = defaultAccountId;
171217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie
171317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Now delete the final account and confirm there are no default
171417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // accounts again
17159e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
17169e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
17179e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler
171817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        defaultAccountId = Account.getDefaultAccountId(mMockContext, lastUsedAccountId);
171917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(Account.NO_ACCOUNT, defaultAccountId);
17209e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler    }
1721758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
172217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    public static Message setupUnreadMessage(String name,
172317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            long accountId,
172417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            long mailboxId,
172517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            boolean addBody,
172617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            boolean saveIt,
172717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            Context context) {
1728758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message msg =
172917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                ProviderTestUtils.setupMessage(name, accountId, mailboxId, addBody, false, context);
1730758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        msg.mFlagRead = false;
1731758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        if (saveIt) {
1732758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            msg.save(context);
1733758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        }
1734758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        return msg;
1735758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
1736758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1737758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    public void testUnreadCountTriggers() {
1738758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Start with one account and three mailboxes
1739758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Account account = ProviderTestUtils.setupAccount("triggers", true, mMockContext);
1740758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxA = ProviderTestUtils.setupMailbox("boxA", account.mId, true, mMockContext);
1741758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxB = ProviderTestUtils.setupMailbox("boxB", account.mId, true, mMockContext);
1742758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxC = ProviderTestUtils.setupMailbox("boxC", account.mId, true, mMockContext);
1743758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1744758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure there are no unreads
1745758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1746758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1747758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxC.mId));
1748758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1749758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Create 4 unread messages (only 3 named) in boxA
175017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message1 =
175117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                setupUnreadMessage("message1", account.mId, boxA.mId, false, true, mMockContext);
175217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message2 =
175317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                setupUnreadMessage("message2", account.mId, boxA.mId, false, true, mMockContext);
175417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        Message message3 =
175517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                setupUnreadMessage("message3", account.mId, boxA.mId, false, true, mMockContext);
1756758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        setupUnreadMessage("message4", account.mId, boxC.mId, false, true, mMockContext);
1757758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1758758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure the unreads are where we expect them
1759758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(3, getUnreadCount(boxA.mId));
1760758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1761758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1762758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
176317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // After deleting message 1, the count in box A should be decremented
176417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // (to 2)
1765758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentResolver cr = mMockContext.getContentResolver();
1766758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1.mId);
1767758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.delete(uri, null, null);
1768758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxA.mId));
1769758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1770758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1771758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1772758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 2 to box B, leaving 1 in box A and 1 in box B
1773758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message2.mMailboxKey = boxB.mId;
1774758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentValues cv = new ContentValues();
1775758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxB.mId);
1776758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message2.mId), cv, null, null);
1777758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxA.mId));
1778758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1779758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1780758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1781758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Mark message 3 (from box A) read, leaving 0 in box A
1782758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1783758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 1);
1784758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1785758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1786758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1787758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1788758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1789758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 3 to box C; should be no change (it's read)
1790758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message3.mMailboxKey = boxC.mId;
1791758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1792758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxC.mId);
1793758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1794758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1795758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1796758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1797758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
179817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Mark message 3 unread; it's now in box C, so that box's count should
179917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // go up to 3
1800758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1801758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 0);
1802758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1803758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1804758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1805758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxC.mId));
1806758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
18079627d014e16235eadf981b9165807dc72a14a383Mihai Preda
18089627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
18099627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for EmailProvider.createIndex().
18109627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Check that it returns exacly the same string as the one used previously for index creation.
18119627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
18129627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testCreateIndex() {
181317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String oldStr = "create index message_" + MessageColumns.TIMESTAMP + " on "
181417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                + Message.TABLE_NAME + " (" + MessageColumns.TIMESTAMP + ");";
181517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        String newStr = DBHelper.createIndex(Message.TABLE_NAME, MessageColumns.TIMESTAMP);
18169627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(newStr, oldStr);
18179627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
1818c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
18190e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testDatabaseCorruptionRecovery() {
18200e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
18210e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
18220e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18230e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
18240e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
18250e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
18260e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18270e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
18280e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
18290e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
18300e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
18310e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
18320e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18330e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
18340e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
18350e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
18360e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
18370e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
18380e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
18390e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18400e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
18410e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
184217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // The EmailProvider.db database should exist (the provider creates it
184317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // automatically)
18440e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
18450e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
18460e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
18470e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
18480e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
18490e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18500e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
18510e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
18520e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
18530e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
18540e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
18550e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18560e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
185717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // This simulates the Provider starting up again (otherwise, it will
185817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // still be pointing to
18590e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
186017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note that we only have access to the EmailProvider via the
186117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // ContentResolver; therefore,
18620e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
18630e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
18640e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
186517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // TODO We should check for the deletion of attachment files once this
186617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // is implemented in
18670e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
1868bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
18690e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
187017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // The next time the database is created by the provider, it will notice
187117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // that there's
187217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // already a EmailProviderBody.db file. In this case, it will delete
187317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // that database to
18740e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
18750e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18760e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
18770e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
18780e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
18790e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18800e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
18810e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
18820e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
18830e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
18840e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18850e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testBodyDatabaseCorruptionRecovery() {
18860e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
18870e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
18880e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18890e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
18900e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
18910e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
18920e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18930e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
18940e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
18950e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
18960e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
18970e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
18980e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
18990e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
19000e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
19010e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
19020e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
19030e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
19040e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
19050e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19060e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
19070e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
190817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // The EmailProviderBody.db database should exist (the provider creates
190917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // it automatically)
19100e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
19110e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
19120e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
19130e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
19140e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
19150e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19160e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
19170e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
19180e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
19190e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
19200e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
19210e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19220e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
192317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // This simulates the Provider starting up again (otherwise, it will
192417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // still be pointing to
19250e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
192617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // Note that we only have access to the EmailProvider via the
192717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // ContentResolver; therefore,
19280e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
19290e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
19300e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
193117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // TODO We should check for the deletion of attachment files once this
193217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // is implemented in
19330e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
19340e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19350e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
193617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // The next time the body database is created by the provider, it will
193717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // notice that there's
193817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // already a populated EmailProvider.db file. In this case, it will
193917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // delete that database to
19400e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
19410e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19420e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
19430e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
19440e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
19450e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
19460e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
19470e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
19480e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
19490e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
1950694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1951bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testAccountIsSecurityHold() {
1952bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        final Context context = mMockContext;
1953bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
1954bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1955bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct2 = ProviderTestUtils.setupAccount("acct2", false, context);
1956bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.mFlags |= Account.FLAGS_SECURITY_HOLD;
1957bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.save(context);
1958bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1959bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertFalse(Account.isSecurityHold(context, acct1.mId));
1960bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertTrue(Account.isSecurityHold(context, acct2.mId));
196117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertFalse(Account.isSecurityHold(context, 9999999)); // No such
196217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                                                               // account
196317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    }
1964bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1965bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testClearAccountHoldFlags() {
1966bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext);
196717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        a1.mFlags = Account.FLAGS_SUPPORTS_SEARCH;
19686e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a1.mPolicy = new Policy();
1969bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a1.save(mMockContext);
1970bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext);
197117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        a2.mFlags = Account.FLAGS_SUPPORTS_SMART_FORWARD | Account.FLAGS_SECURITY_HOLD;
19726e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        a2.mPolicy = new Policy();
1973bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a2.save(mMockContext);
1974bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1975bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        // bulk clear
1976bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account.clearSecurityHoldOnAllAccounts(mMockContext);
1977bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
197817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // confirm new values as expected - no hold flags; other flags
197917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // unmolested
1980bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
198117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(Account.FLAGS_SUPPORTS_SEARCH, a1a.mFlags);
1982bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
198317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        assertEquals(Account.FLAGS_SUPPORTS_SMART_FORWARD, a2a.mFlags);
1984bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    }
1985574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1986833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki    private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read) {
198717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        return ProviderTestUtils.setupMessage("1",
198817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                b.mAccountKey,
198917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                b.mId,
199017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
199117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                true,
199217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                c,
199317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                starred,
199417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                read);
19956d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki    }
1996bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
1997bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    public void testGetKeyColumnLong() {
1998bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        final Context c = mMockContext;
1999bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Account a = ProviderTestUtils.setupAccount("acct", true, c);
2000bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a.mId, true, c, Mailbox.TYPE_MAIL);
2001bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a.mId, true, c, Mailbox.TYPE_MAIL);
2002bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m1 = createMessage(c, b1, false, false);
2003bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m2 = createMessage(c, b2, false, false);
2004bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.ACCOUNT_KEY));
2005bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.ACCOUNT_KEY));
2006bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b1.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.MAILBOX_KEY));
2007bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b2.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.MAILBOX_KEY));
2008bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    }
2009bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
2010aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    public void testGetAccountIdForMessageId() {
2011aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        final Context c = mMockContext;
2012aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", true, c);
2013aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
2014aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_MAIL);
2015aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a2.mId, true, c, Mailbox.TYPE_MAIL);
2016aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m1 = createMessage(c, b1, false, false);
2017aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m2 = createMessage(c, b2, false, false);
2018aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2019aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a1.mId, Account.getAccountIdForMessageId(c, m1.mId));
2020aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a2.mId, Account.getAccountIdForMessageId(c, m2.mId));
2021aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2022aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        // message desn't exist
2023aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(-1, Account.getAccountIdForMessageId(c, 12345));
2024aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    }
2025aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2026200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy    public void testGetAccountForMessageId() {
2027200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        final Context c = mMockContext;
2028200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Account a = ProviderTestUtils.setupAccount("acct", true, c);
2029200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Message m1 = ProviderTestUtils.setupMessage("1", a.mId, 1, true, true, c, false, false);
2030200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        Message m2 = ProviderTestUtils.setupMessage("1", a.mId, 2, true, true, c, false, false);
2031200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m1.mId));
2032200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m2.mId));
2033200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy    }
2034200c6bd9fa19b78acc2c1664f858521aa9885353Todd Kennedy
2035e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testGetAccountGetInboxIdTest() {
2036e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final Context c = mMockContext;
2037e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2038e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Prepare some data with red-herrings.
2039e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
2040e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b2i = ProviderTestUtils.setupMailbox("b2b", a2.mId, true, c, Mailbox.TYPE_INBOX);
2041e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2042e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertEquals(b2i.mId, Account.getInboxId(c, a2.mId));
2043d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki
2044d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        // No account found.
2045d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        assertEquals(-1, Account.getInboxId(c, 999999));
2046e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
2047e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2048261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    /**
2049d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * Check that we're handling illegal uri's properly (by throwing an exception unless it's a
2050d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * query for an id of -1, in which case we return a zero-length cursor)
2051d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     */
2052d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    public void testIllegalUri() {
2053d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        final ContentResolver cr = mMockContext.getContentResolver();
2054d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank
2055d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        ContentValues cv = new ContentValues();
2056d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Uri uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/fooble");
2057d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2058d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.insert(uri, cv);
2059d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Insert should have thrown exception");
2060d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2061d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2062d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2063d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.update(uri, cv, null, null);
2064d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Update should have thrown exception");
2065d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2066d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2067d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2068d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.delete(uri, null, null);
2069d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Delete should have thrown exception");
2070d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2071d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2072d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2073d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2074d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2075d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2076d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2077d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/fred");
2078d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2079d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2080d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2081d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2082d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2083d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/-1");
2084d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Cursor c = cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2085d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertNotNull(c);
2086d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertEquals(0, c.getCount());
2087d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        c.close();
2088d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    }
208922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
209022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
209122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Verify {@link EmailProvider#recalculateMessageCount(android.database.sqlite.SQLiteDatabase)}
209222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
209322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    public void testRecalculateMessageCounts() {
209422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        final Context c = mMockContext;
209522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
209622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create accounts
209722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", true, c);
209822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", true, c);
209922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
210022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create mailboxes for each account
210122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
210222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a1.mId, true, c, Mailbox.TYPE_OUTBOX);
210322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b3 = ProviderTestUtils.setupMailbox("box3", a2.mId, true, c, Mailbox.TYPE_INBOX);
210422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox b4 = ProviderTestUtils.setupMailbox("box4", a2.mId, true, c, Mailbox.TYPE_OUTBOX);
210522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox bt = ProviderTestUtils.setupMailbox("boxT", a2.mId, true, c, Mailbox.TYPE_TRASH);
210622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
210722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Create some messages
210822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b1 (account 1, inbox): 1 message, including 1 starred
210922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m11 = createMessage(c, b1, true, false, Message.FLAG_LOADED_COMPLETE);
211022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
211122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b2 (account 1, outbox): 2 message, including 1 starred
211222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m21 = createMessage(c, b2, false, false, Message.FLAG_LOADED_COMPLETE);
211322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m22 = createMessage(c, b2, true, true, Message.FLAG_LOADED_COMPLETE);
211422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
211522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b3 (account 2, inbox): 3 message, including 1 starred
211622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m31 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
211722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m32 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
211822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message m33 = createMessage(c, b3, true, true, Message.FLAG_LOADED_COMPLETE);
211922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
212022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // b4 (account 2, outbox) has no messages.
212122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
212222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // bt (account 2, trash) has 3 messages, including 2 starred
212322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt1 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
212422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt2 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
212522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Message mt3 = createMessage(c, bt, false, false, Message.FLAG_LOADED_COMPLETE);
212622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
212722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Verifiy initial message counts
212822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(1, getMessageCount(b1.mId));
212922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(2, getMessageCount(b2.mId));
213022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(b3.mId));
213122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(0, getMessageCount(b4.mId));
213222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(bt.mId));
213322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
213422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Whew. The setup is done; now let's actually get to the test
213522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
213622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // First, invalidate the message counts.
213722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        setMinusOneToMessageCounts();
213822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b1.mId));
213922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b2.mId));
214022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b3.mId));
214122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(b4.mId));
214222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(-1, getMessageCount(bt.mId));
214322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
214422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Batch update.
214522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
214617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        DBHelper.recalculateMessageCount(db);
214722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
214822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Check message counts are valid again
214922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(1, getMessageCount(b1.mId));
215022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(2, getMessageCount(b2.mId));
215122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(b3.mId));
215222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(0, getMessageCount(b4.mId));
215322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(3, getMessageCount(bt.mId));
215422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
215522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
215622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates an account */
215722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private Account createAccount(Context c, String name, HostAuth recvAuth, HostAuth sendAuth) {
215822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Account account = ProviderTestUtils.setupAccount(name, false, c);
215922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (recvAuth != null) {
216022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            account.mHostAuthKeyRecv = recvAuth.mId;
216122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            if (sendAuth == null) {
216222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy                account.mHostAuthKeySend = recvAuth.mId;
216322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            }
216422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        }
216522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (sendAuth != null) {
216622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy            account.mHostAuthKeySend = sendAuth.mId;
216722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        }
216822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        account.save(c);
216922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return account;
217022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
217122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
217222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /** Creates a mailbox; redefine as we need version 17 mailbox values */
217317d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    private Mailbox createMailbox(
217417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            Context c, String displayName, String serverId, long parentKey, long accountId) {
217522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        Mailbox box = new Mailbox();
217622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
217722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mDisplayName = displayName;
217822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mServerId = serverId;
217922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mParentKey = parentKey;
218022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mAccountKey = accountId;
218122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        // Don't care about the fields below ... set them for giggles
218222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mType = Mailbox.TYPE_MAIL;
218322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mDelimiter = '/';
218422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncKey = "sync-key";
218522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncLookback = 2;
2186f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        box.mSyncInterval = Account.CHECK_INTERVAL_NEVER;
218722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mSyncTime = 3;
218822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mFlagVisible = true;
218922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mFlags = 5;
219022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.save(c);
219122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        return box;
219222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
219322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
219422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
219522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Asserts equality between two mailboxes. We define this as we don't have implementations
219622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * for Mailbox#equals().
219722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
219822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private void assertEquals(Mailbox expected, Mailbox actual) {
219922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (expected == null && actual == null) return;
220022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertTrue(expected != null && actual != null);
220122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEqualsExceptServerId(expected, actual, expected.mServerId);
220222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
220322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
220422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    /**
220522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * Asserts equality between the two mailboxes EXCEPT for the server id. The given server
220622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     * ID is the expected value.
220722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy     */
220822208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    private void assertEqualsExceptServerId(Mailbox expected, Mailbox actual, String serverId) {
220922208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        if (expected == null && actual == null) return;
221022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
221122208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertTrue(expected != null && actual != null);
221222208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mDisplayName, actual.mDisplayName);
221322208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(serverId, actual.mServerId);
221422208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mParentKey, actual.mParentKey);
221522208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        assertEquals(expected.mAccountKey, actual.mAccountKey);
221622208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy    }
221722208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy
2218f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    /**
2219f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * Determine whether a list of AccountManager accounts includes a given EmailProvider account
2220f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param amAccountList a list of AccountManager accounts
2221f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param account an EmailProvider account
2222f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @param context the caller's context (our test provider's context)
2223f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     * @return whether or not the EmailProvider account is represented in AccountManager
2224f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank     */
222517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie    private boolean amAccountListHasAccount(
222617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie            android.accounts.Account[] amAccountList, Account account, Context context) {
222732bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo        String email = account.mEmailAddress;
222817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        for (android.accounts.Account amAccount : amAccountList) {
222932bed4bb8e23d7322ab338773d135845f392d3cfBen Komalo            if (amAccount.name.equals(email)) {
2230f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank                return true;
2231f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank            }
2232f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        }
2233f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank        return false;
2234f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank    }
2235f3ff0ba91076ef1fb087fc30fe65d9504011c2b3Marc Blank
22366e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    /** Creates a mailbox; redefine as we need version 17 mailbox values */
22376e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    private Mailbox createTypeMailbox(Context c, long accountId, int type) {
22386e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        Mailbox box = new Mailbox();
22396e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
22406e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mDisplayName = "foo";
22416e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mServerId = "1:1";
22426e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mParentKey = 0;
22436e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mAccountKey = accountId;
22446e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        // Don't care about the fields below ... set them for giggles
22456e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.mType = type;
22466e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        box.save(c);
22476e418aa41a17136be0dddb816d843428a0a1e722Marc Blank        return box;
22486e418aa41a17136be0dddb816d843428a0a1e722Marc Blank    }
22496e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
22502bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank    public void testCleanupOrphans() {
22512bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        EmailProvider ep = getProvider();
22522bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        SQLiteDatabase db = ep.getDatabase(mMockContext);
22532bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
22542bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Account a = ProviderTestUtils.setupAccount("account1", true, mMockContext);
22552bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Mailbox a1 and a3 won't have a valid account
22562bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a1 = createTypeMailbox(mMockContext, -1, Mailbox.TYPE_INBOX);
22572bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a2 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_MAIL);
22582bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a3 = createTypeMailbox(mMockContext, -1, Mailbox.TYPE_DRAFTS);
22592bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a4 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_SENT);
22602bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox a5 = createTypeMailbox(mMockContext, a.mId, Mailbox.TYPE_TRASH);
22612bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Mailbox ax isn't even saved; use an obviously invalid id
22622bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Mailbox ax = new Mailbox();
22632bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ax.mId = 69105;
22642bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
22652bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Message mt2 is an orphan, as is mt4
22662bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m1 = createMessage(mMockContext, a1, true, false, Message.FLAG_LOADED_COMPLETE);
22672bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m2 = createMessage(mMockContext, a2, true, false, Message.FLAG_LOADED_COMPLETE);
22682bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m3 = createMessage(mMockContext, a3, true, false, Message.FLAG_LOADED_COMPLETE);
22692bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m4 = createMessage(mMockContext, a4, true, false, Message.FLAG_LOADED_COMPLETE);
22702bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message m5 = createMessage(mMockContext, a5, true, false, Message.FLAG_LOADED_COMPLETE);
22712bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Message mx = createMessage(mMockContext, ax, true, false, Message.FLAG_LOADED_COMPLETE);
22722bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
22732bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Two orphan policies
22742bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy p1 = new Policy();
22752bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        p1.save(mMockContext);
22762bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        Policy p2 = new Policy();
22772bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        p2.save(mMockContext);
22782bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
227917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // We don't want anything cached or the tests below won't work. Note
228017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // that
228117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // deleteUnlinked is only called by EmailProvider when the caches are
228217d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        // empty
22832bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        ContentCache.invalidateAllCaches();
22842bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Delete orphaned mailboxes/messages/policies
228517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        EmailProvider.deleteUnlinked(db, Mailbox.TABLE_NAME, MailboxColumns.ACCOUNT_KEY,
22863dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantler                AccountColumns._ID, Account.TABLE_NAME);
228717d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie        EmailProvider.deleteUnlinked(db, Message.TABLE_NAME, MessageColumns.ACCOUNT_KEY,
22883dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantler                AccountColumns._ID, Account.TABLE_NAME);
22893dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantler        EmailProvider.deleteUnlinked(db, Policy.TABLE_NAME, PolicyColumns._ID,
229017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie                AccountColumns.POLICY_KEY, Account.TABLE_NAME);
22912bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
22922bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure the orphaned mailboxes are gone
22932bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, a1.mId));
22942bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a2.mId));
22952bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, a3.mId));
22962bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a4.mId));
22972bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Mailbox.restoreMailboxWithId(mMockContext, a5.mId));
22982bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Mailbox.restoreMailboxWithId(mMockContext, ax.mId));
22992bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
23002bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure orphaned messages are gone
23012bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, m1.mId));
23022bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m2.mId));
23032bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, m3.mId));
23042bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m4.mId));
23052bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Message.restoreMessageWithId(mMockContext, m5.mId));
23062bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Message.restoreMessageWithId(mMockContext, mx.mId));
23072bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank
23082bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        // Make sure orphaned policies are gone
23092bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Policy.restorePolicyWithId(mMockContext, p1.mId));
23102bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNull(Policy.restorePolicyWithId(mMockContext, p2.mId));
23112bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        a = Account.restoreAccountWithId(mMockContext, a.mId);
23122bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank        assertNotNull(Policy.restorePolicyWithId(mMockContext, a.mPolicyKey));
23132bdf7ee0f0f4a2b11b5f7c0f8b193080600fefd8Marc Blank    }
23147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler}
2315