ProviderTests.java revision 31d9acbf0623872f9d4a2b3210b5970854b654c7
17143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/*
27143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Copyright (C) 2009 The Android Open Source Project
37143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
47143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
57143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * you may not use this file except in compliance with the License.
67143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * You may obtain a copy of the License at
77143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
87143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
97143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *
107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Unless required by applicable law or agreed to in writing, software
117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * See the License for the specific language governing permissions and
147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * limitations under the License.
157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpackage com.android.email.provider;
187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
192193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.Snippet;
20a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
21a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Account;
22a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
23a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.AttachmentColumns;
25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Body;
26a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.BodyColumns;
27a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.HostAuth;
28a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Mailbox;
29a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MailboxColumns;
30a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
31a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MessageColumns;
3231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.utility.Utility;
337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
34ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadlerimport android.content.ContentResolver;
357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerimport android.content.ContentUris;
36ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadlerimport android.content.ContentValues;
377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerimport android.content.Context;
387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerimport android.database.Cursor;
39574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onukiimport android.database.sqlite.SQLiteDatabase;
407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerimport android.net.Uri;
414a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadlerimport android.os.Bundle;
42976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blankimport android.os.Environment;
434a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadlerimport android.os.Parcel;
44e37881aac562c066e6e666349749e40b7c116a21Makoto Onukiimport android.test.MoreAsserts;
457143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerimport android.test.ProviderTestCase2;
467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
47758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.File;
48758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.io.IOException;
49758a532fce2f672673d38b2daa5f67eb757b118bMarc Blankimport java.util.ArrayList;
50758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler/**
527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * Tests of the Email provider.
53758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank *
547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler * You can run this entire test case with:
557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler *   runtest -c com.android.email.provider.ProviderTests email
56261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki *
57261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * TODO: Add tests for cursor notification mechanism.  (setNotificationUri and notifyChange)
58261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * We can't test the entire notification mechanism with a mock content resolver, because which URI
59261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * to notify when notifyChange() is called is in the actual content resolver.
60261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * Implementing the same mechanism in a mock one is pointless.  Instead what we could do is check
61261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * what notification URI each cursor has, and with which URI is notified when
62261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki * inserting/updating/deleting.  (The former require a new method from AbstractCursor)
637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler */
647143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadlerpublic class ProviderTests extends ProviderTestCase2<EmailProvider> {
65758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
669d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private EmailProvider mProvider;
679d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    private Context mMockContext;
687143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
697143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public ProviderTests() {
7031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
717143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
72758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
737143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    @Override
747143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void setUp() throws Exception {
757143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        super.setUp();
767143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext = getMockContext();
779d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider = getProvider();
78349055aad47184b72cd86de1f37ac1b7557d2e70Marc Blank        // Invalidate all caches, since we reset the database for each test
79349055aad47184b72cd86de1f37ac1b7557d2e70Marc Blank        ContentCache.invalidateAllCachesForTest();
807143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    @Override
837143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void tearDown() throws Exception {
847143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        super.tearDown();
857143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
867143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
880d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler     * TODO: Database upgrade tests
890d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler     */
900d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler
910d00889f83fc8c1d69039a2c849b630fb4dd28ddAndrew Stadler    /**
927143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple account save/retrieve
937143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
947143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountSave() {
9528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-save", true, mMockContext);
967143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
97758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
987143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Account account2 = EmailContent.Account.restoreAccountWithId(mMockContext, account1Id);
99758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
10028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account2);
1017143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
10241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
1034a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    /**
104da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     * Test simple account save/retrieve with predefined hostauth records
105da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler     */
106da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    public void testAccountSaveHostAuth() {
107da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
108da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // add hostauth data, which should be saved the first time
109da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth("account-hostauth-recv", -1, false,
110da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                mMockContext);
111da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth("account-hostauth-send", -1, false,
112da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                mMockContext);
113da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        account1.save(mMockContext);
114da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        long account1Id = account1.mId;
115da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
116da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm account reads back correctly
117da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        Account account1get = EmailContent.Account.restoreAccountWithId(mMockContext, account1Id);
118da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountSave", account1, account1get);
119da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
120da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        // Confirm hostauth fields can be accessed & read back correctly
121da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        HostAuth hostAuth1get = EmailContent.HostAuth.restoreHostAuthWithId(mMockContext,
122da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1get.mHostAuthKeyRecv);
123da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertHostAuthEqual("testAccountSaveHostAuth-recv",
124da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1.mHostAuthRecv, hostAuth1get);
125da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        HostAuth hostAuth2get = EmailContent.HostAuth.restoreHostAuthWithId(mMockContext,
126da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1get.mHostAuthKeySend);
127da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler        ProviderTestUtils.assertHostAuthEqual("testAccountSaveHostAuth-send",
128da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler                account1.mHostAuthSend, hostAuth2get);
129da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    }
130da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler
131da8836a76cd8a6eaa7e3693eeacc6393870b2066Andrew Stadler    /**
1324a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     * Simple test of account parceling.  The rather tortuous path is to ensure that the
1334a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     * account is really flattened all the way down to a parcel and back.
1344a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler     */
1354a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    public void testAccountParcel() {
1364a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("parcel", false, mMockContext);
1374a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b = new Bundle();
1384a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.putParcelable("account", account1);
1394a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Parcel p = Parcel.obtain();
1404a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b.writeToParcel(p, 0);
1414a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        p.setDataPosition(0);       // rewind it for reading
1424a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Bundle b2 = new Bundle(Account.class.getClassLoader());
1434a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        b2.readFromParcel(p);
1444a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        Account account2 = (Account) b2.getParcelable("account");
1454a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        p.recycle();
1464a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
1474a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler        ProviderTestUtils.assertAccountEqual("testAccountParcel", account1, account2);
1484a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler    }
1494a8c70c09be3914ded18031b4cca5a6d867de0d3Andrew Stadler
150e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    /**
151e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki     * Test for {@link Account#getShortcutSafeUri()} and
152e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki     * {@link Account#getAccountIdForShortcutSafeUri}.
153e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki     */
154e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    public void testAccountShortcutSafeUri() {
155e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Account account1 = ProviderTestUtils.setupAccount("account-1", true, mMockContext);
156e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Account account2 = ProviderTestUtils.setupAccount("account-2", true, mMockContext);
157e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final long account1Id = account1.mId;
158e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final long account2Id = account2.mId;
159e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
160e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Uri uri1 = account1.getShortcutSafeUri();
161e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        final Uri uri2 = account2.getShortcutSafeUri();
162e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
163e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // Check the path part of the URIs.
164e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        MoreAsserts.assertEquals(new String[] {"account", account1.mCompatibilityUuid},
165e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                uri1.getPathSegments().toArray());
166e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        MoreAsserts.assertEquals(new String[] {"account", account2.mCompatibilityUuid},
167e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                uri2.getPathSegments().toArray());
168e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
169e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account1Id, Account.getAccountIdFromShortcutSafeUri(mMockContext, uri1));
170e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account2Id, Account.getAccountIdFromShortcutSafeUri(mMockContext, uri2));
171e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
172e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // Test for the Eclair(2.0-2.1) style URI.
173e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account1Id, Account.getAccountIdFromShortcutSafeUri(mMockContext,
174e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                getEclairStyleShortcutUri(account1)));
175e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        assertEquals(account2Id, Account.getAccountIdFromShortcutSafeUri(mMockContext,
176e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki                getEclairStyleShortcutUri(account2)));
177e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    }
178e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
179e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    private static Uri getEclairStyleShortcutUri(Account account) {
180e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        // We used _id instead of UUID only on Eclair(2.0-2.1).
181e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki        return Account.CONTENT_URI.buildUpon().appendEncodedPath("" + account.mId).build();
182e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki    }
183e37881aac562c066e6e666349749e40b7c116a21Makoto Onuki
1848d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    public void testGetProtocol() {
1858d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account-hostauth", false, mMockContext);
1868d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // add hostauth data, with protocol
1878d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth("eas", "account-hostauth-recv", -1,
1888d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                false, mMockContext);
1898d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // Note that getProtocol uses the receive host auth, so the protocol here shouldn't matter
1908d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // to the test result
1918d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth("foo", "account-hostauth-send", -1,
1928d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                false, mMockContext);
1938d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account1.save(mMockContext);
19425144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", Account.getProtocol(mMockContext, account1.mId));
19525144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals("eas", account1.getProtocol(mMockContext));
1968d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account-nohostauth", false,
1978d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank                mMockContext);
1988d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        account2.save(mMockContext);
1998d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // Make sure that we return null when there's no host auth
2008d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, account2.mId));
2018d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(account2.getProtocol(mMockContext));
2028d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        // And when there's no account
2038d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank        assertNull(Account.getProtocol(mMockContext, 0));
2048d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank    }
2058d8f86e899165772a7d91250b98dfc3c0d78b538Marc Blank
206652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    public void testAccountIsValidId() {
207652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account1 = ProviderTestUtils.setupAccount("account-1", true, mMockContext);
208652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        final Account account2 = ProviderTestUtils.setupAccount("account-2", true, mMockContext);
209652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
210652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account1.mId));
211652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertTrue(Account.isValidId(mMockContext, account2.mId));
212652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
213652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki        assertFalse(Account.isValidId(mMockContext, 1234567)); // Some random ID
214c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -1));
215c133e6f1858e33fabaa6ffa173c1402bf9a98e31Makoto Onuki        assertFalse(Account.isValidId(mMockContext, -500));
216652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki    }
217652be6fb3d04a4ceba6b765cd3160cdaef9e6107Makoto Onuki
21841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private final static String[] MAILBOX_UNREAD_COUNT_PROJECTION = new String [] {
21941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        MailboxColumns.UNREAD_COUNT
22041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    };
22141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private final static int MAILBOX_UNREAD_COUNT_COLMUN = 0;
22241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
22341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    /**
22441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * Get the value of the unread count in the mailbox of the account.
22541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * This can be different from the actual number of unread messages in that mailbox.
22641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * @param accountId
22741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * @param mailboxId
22841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     * @return
22941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok     */
23041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    private int getUnreadCount(long mailboxId) {
23141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        String text = null;
23241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        Cursor c = null;
23341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        try {
23441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c = mMockContext.getContentResolver().query(
23541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    Mailbox.CONTENT_URI,
23641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    MAILBOX_UNREAD_COUNT_PROJECTION,
23741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    EmailContent.RECORD_ID + "=?",
23841f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    new String[] { String.valueOf(mailboxId) },
23941f775bbc731b25854da9f5a80c66a4aa1eb0af9satok                    null);
24041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.moveToFirst();
24141f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            text = c.getString(MAILBOX_UNREAD_COUNT_COLMUN);
24241f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        } finally {
24341f775bbc731b25854da9f5a80c66a4aa1eb0af9satok            c.close();
24441f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        }
24541f775bbc731b25854da9f5a80c66a4aa1eb0af9satok        return Integer.valueOf(text);
24641f775bbc731b25854da9f5a80c66a4aa1eb0af9satok    }
24741f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
2487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
2497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: HostAuth tests
2507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
251758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
2527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
253e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler     * Test the various combinations of SSL, TLS, and trust-certificates encoded as Uris
254e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler     */
255ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    @SuppressWarnings("deprecation")
256e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    public void testHostAuthSecurityUri() {
257e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        HostAuth ha = ProviderTestUtils.setupHostAuth("uri-security", 1, false, mMockContext);
258e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
259e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        final int MASK =
260e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler            HostAuth.FLAG_SSL | HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL_CERTIFICATES;
261e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
262e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Set various URIs and check the resulting flags
263e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("protocol://user:password@server:123");
264e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(0, ha.mFlags & MASK);
265e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("protocol+ssl+://user:password@server:123");
266e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(HostAuth.FLAG_SSL, ha.mFlags & MASK);
267e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("protocol+ssl+trustallcerts://user:password@server:123");
268e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL_CERTIFICATES, ha.mFlags & MASK);
269e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("protocol+tls+://user:password@server:123");
270e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(HostAuth.FLAG_TLS, ha.mFlags & MASK);
271e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("protocol+tls+trustallcerts://user:password@server:123");
272e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL_CERTIFICATES, ha.mFlags & MASK);
273e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
274e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Now check the retrival method (building URI from flags)
275e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags &= ~MASK;
276e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        String uriString = ha.getStoreUri();
277e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertTrue(uriString.startsWith("protocol://"));
278e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags |= HostAuth.FLAG_SSL;
279e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        uriString = ha.getStoreUri();
280e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertTrue(uriString.startsWith("protocol+ssl+://"));
281e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags |= HostAuth.FLAG_TRUST_ALL_CERTIFICATES;
282e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        uriString = ha.getStoreUri();
283e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertTrue(uriString.startsWith("protocol+ssl+trustallcerts://"));
284e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags &= ~MASK;
285e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags |= HostAuth.FLAG_TLS;
286e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        uriString = ha.getStoreUri();
287e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertTrue(uriString.startsWith("protocol+tls+://"));
288e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.mFlags |= HostAuth.FLAG_TRUST_ALL_CERTIFICATES;
289e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        uriString = ha.getStoreUri();
290e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertTrue(uriString.startsWith("protocol+tls+trustallcerts://"));
291e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    }
292e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
293e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    /**
294e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler     * Test port assignments made from Uris
295e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler     */
296ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    @SuppressWarnings("deprecation")
297e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    public void testHostAuthPortAssignments() {
298e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        HostAuth ha = ProviderTestUtils.setupHostAuth("uri-port", 1, false, mMockContext);
299e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
300e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Set various URIs and check the resulting flags
301e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Hardwired port
302e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap://user:password@server:123");
303e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(123, ha.mPort);
304e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Auto-assigned ports
305e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap://user:password@server");
306e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(143, ha.mPort);
307e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap+ssl://user:password@server");
308e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(993, ha.mPort);
309e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap+ssl+trustallcerts://user:password@server");
310e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(993, ha.mPort);
311e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap+tls://user:password@server");
312e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(143, ha.mPort);
313e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("imap+tls+trustallcerts://user:password@server");
314e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(143, ha.mPort);
315e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
316e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Hardwired port
317e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3://user:password@server:123");
318e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(123, ha.mPort);
319e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Auto-assigned ports
320e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3://user:password@server");
321e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(110, ha.mPort);
322e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3+ssl://user:password@server");
323e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(995, ha.mPort);
324e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3+ssl+trustallcerts://user:password@server");
325e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(995, ha.mPort);
326e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3+tls://user:password@server");
327e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(110, ha.mPort);
328e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("pop3+tls+trustallcerts://user:password@server");
329e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(110, ha.mPort);
330e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
331e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Hardwired port
332e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("eas://user:password@server:123");
333e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(123, ha.mPort);
334e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Auto-assigned ports
335e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("eas://user:password@server");
336e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(80, ha.mPort);
337e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("eas+ssl://user:password@server");
338e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(443, ha.mPort);
339e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("eas+ssl+trustallcerts://user:password@server");
340e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(443, ha.mPort);
341e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
342e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Hardwired port
343e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp://user:password@server:123");
344e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(123, ha.mPort);
345e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        // Auto-assigned ports
346e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp://user:password@server");
347e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(587, ha.mPort);
348e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp+ssl://user:password@server");
349e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(465, ha.mPort);
350e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp+ssl+trustallcerts://user:password@server");
351e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(465, ha.mPort);
352e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp+tls://user:password@server");
353e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(587, ha.mPort);
354e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        ha.setStoreUri("smtp+tls+trustallcerts://user:password@server");
355e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler        assertEquals(587, ha.mPort);
356e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    }
357e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler
358e4a7cc440f081ef9c4375a2bd2f82680cc11b152Andrew Stadler    /**
3599128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler     * Test preservation of username & password in URI
3609128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler     */
3619128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler    @SuppressWarnings("deprecation")
3629128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler    public void testHostAuthUri() {
3639128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        HostAuth ha = new HostAuth();
3649128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        ha.setStoreUri("protocol://user:password@server:123");
3659128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        String getUri = ha.getStoreUri();
3669128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        assertEquals("protocol://user:password@server:123", getUri);
3679128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler
3689128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        // Now put spaces in/around username (they are trimmed)
3699128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        ha.setStoreUri("protocol://%20us%20er%20:password@server:123");
3709128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        getUri = ha.getStoreUri();
3719128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        assertEquals("protocol://us%20er:password@server:123", getUri);
3729128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler
3739128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        // Now put spaces around password (should not be trimmed)
3749128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        ha.setStoreUri("protocol://user:%20pass%20word%20@server:123");
3759128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        getUri = ha.getStoreUri();
3769128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler        assertEquals("protocol://user:%20pass%20word%20@server:123", getUri);
3779128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler    }
3789128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler
3799128217da1f8ae53f1c44f369934ff075ae5057bAndy Stadler    /**
3807143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple mailbox save/retrieve
3817143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
3827143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMailboxSave() {
38328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("mailbox-save", true, mMockContext);
3847143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
38528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true,
38628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
3877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
388758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
3897143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Mailbox box2 = EmailContent.Mailbox.restoreMailboxWithId(mMockContext, box1Id);
390758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
39128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMailboxEqual("testMailboxSave", box1, box2);
3927143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
393758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
3944119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static String[] expectedAttachmentNames =
395976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        new String[] {"attachment1.doc", "attachment2.xls", "attachment3"};
396976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    // The lengths need to be kept in ascending order
3974119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    private static long[] expectedAttachmentSizes = new long[] {31415L, 97701L, 151213L};
398976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
399fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /*
400fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Returns null if the message has no body.
401fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
402fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    private Body loadBodyForMessageId(long messageId) {
403fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
404fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        try {
405fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            c = mMockContext.getContentResolver().query(
406fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.CONTENT_URI,
407fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.CONTENT_PROJECTION,
408fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    EmailContent.Body.MESSAGE_KEY + "=?",
409fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    new String[] {String.valueOf(messageId)},
410fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                    null);
411fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            int numBodies = c.getCount();
412fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            assertTrue("at most one body", numBodies < 2);
413fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            return c.moveToFirst() ? EmailContent.getContent(c, Body.class) : null;
414fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        } finally {
415fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda            c.close();
416fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        }
417fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
418fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
4197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
4207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test simple message save/retrieve
421758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
4227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: serverId vs. serverIntId
4237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
4247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageSave() {
42528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-save", true, mMockContext);
4267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
42728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
4287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
4297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a simple message (saved with no body)
43128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
43228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
4337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
4347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message1get = EmailContent.Message.restoreMessageWithId(mMockContext, message1Id);
43528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message1, message1get);
4367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
4377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Test a message saved with a body
4387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Note that it will read back w/o the text & html so we must extract those
43928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
44028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
4417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
4427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String text2 = message2.mText;
4437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String html2 = message2.mHtml;
444936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        String textReply2 = message2.mTextReply;
445936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        String htmlReply2 = message2.mHtmlReply;
4466c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long sourceKey2 = message2.mSourceKey;
4475fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        String introText2 = message2.mIntroText;
4487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mText = null;
4497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        message2.mHtml = null;
450936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        message2.mTextReply = null;
451936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        message2.mHtmlReply = null;
452e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        message2.mSourceKey = 0;
4535fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        message2.mIntroText = null;
4547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Message message2get = EmailContent.Message.restoreMessageWithId(mMockContext, message2Id);
45528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        ProviderTestUtils.assertMessageEqual("testMessageSave", message2, message2get);
456758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
4577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // Now see if there's a body saved with the right stuff
458fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Body body2 = loadBodyForMessageId(message2Id);
459fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body text", text2, body2.mTextContent);
460fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertEquals("body html", html2, body2.mHtmlContent);
461936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals("reply text", textReply2, body2.mTextReply);
462936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals("reply html", htmlReply2, body2.mHtmlReply);
4636c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals("source key", sourceKey2, body2.mSourceKey);
4645fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals("intro text", introText2, body2.mIntroText);
465976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
4664119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments and body
467976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        Message message3 = ProviderTestUtils.setupMessage("message3", account1Id, box1Id, true,
468976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                false, mMockContext);
469976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        ArrayList<Attachment> atts = new ArrayList<Attachment>();
470976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        for (int i = 0; i < 3; i++) {
4714119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
4724119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
4734119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    false, mMockContext));
474976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
475976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        message3.mAttachments = atts;
4769e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message3.save(mMockContext);
477976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        long message3Id = message3.mId;
478976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank
479976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        // Now check the attachments; there should be three and they should match name and size
480fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Cursor c = null;
481976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
482976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // Note that there is NO guarantee of the order of returned records in the general case,
483976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // so we specifically ask for ordering by size.  The expectedAttachmentSizes array must
484976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // be kept sorted by size (ascending) for this test to work properly
485976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            c = mMockContext.getContentResolver().query(
486976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.CONTENT_URI,
487976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.CONTENT_PROJECTION,
488976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.MESSAGE_KEY + "=?",
489976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    new String[] {
490976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                            String.valueOf(message3Id)
491976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    },
492976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    Attachment.SIZE);
493976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int numAtts = c.getCount();
494976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(3, numAtts);
495976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int i = 0;
496976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            while (c.moveToNext()) {
4974119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                Attachment actual = EmailContent.getContent(c, Attachment.class);
4984119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message3", atts.get(i), actual);
4994119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                i++;
5004119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            }
5014119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
5024119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
5034119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
5044119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
5054119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Message with attachments but no body
5064119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Message message4 = ProviderTestUtils.setupMessage("message4", account1Id, box1Id, false,
5074119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                false, mMockContext);
5084119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        atts = new ArrayList<Attachment>();
5094119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        for (int i = 0; i < 3; i++) {
5104119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
5114119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
5124119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    false, mMockContext));
5134119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
5144119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        message4.mAttachments = atts;
5159e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        message4.save(mMockContext);
5164119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        long message4Id = message4.mId;
5174119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
5184119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Now check the attachments; there should be three and they should match name and size
5194119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        c = null;
52041f775bbc731b25854da9f5a80c66a4aa1eb0af9satok
5214119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
5224119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // Note that there is NO guarantee of the order of returned records in the general case,
5234119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // so we specifically ask for ordering by size.  The expectedAttachmentSizes array must
5244119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            // be kept sorted by size (ascending) for this test to work properly
5254119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c = mMockContext.getContentResolver().query(
5264119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.CONTENT_URI,
5274119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.CONTENT_PROJECTION,
5284119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.MESSAGE_KEY + "=?",
5294119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    new String[] {
5304119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                            String.valueOf(message4Id)
5314119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    },
5324119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                    Attachment.SIZE);
5334119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int numAtts = c.getCount();
5344119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            assertEquals(3, numAtts);
5354119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            int i = 0;
5364119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            while (c.moveToNext()) {
5374119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                Attachment actual = EmailContent.getContent(c, Attachment.class);
5384119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), actual);
539976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                i++;
540976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
541976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
542976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            c.close();
5437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        }
54444144d0301213536b02f2080237b63d8271b2d0bMihai Preda
54544144d0301213536b02f2080237b63d8271b2d0bMihai Preda        // test EmailContent.restoreAttachmentsWitdMessageId()
54644144d0301213536b02f2080237b63d8271b2d0bMihai Preda        Attachment[] attachments =
54744144d0301213536b02f2080237b63d8271b2d0bMihai Preda            Attachment.restoreAttachmentsWithMessageId(mMockContext, message4Id);
54844144d0301213536b02f2080237b63d8271b2d0bMihai Preda        int size = attachments.length;
54944144d0301213536b02f2080237b63d8271b2d0bMihai Preda        assertEquals(3, size);
55044144d0301213536b02f2080237b63d8271b2d0bMihai Preda        for (int i = 0; i < size; ++i) {
55144144d0301213536b02f2080237b63d8271b2d0bMihai Preda            ProviderTestUtils.assertAttachmentEqual("save-message4", atts.get(i), attachments[i]);
55244144d0301213536b02f2080237b63d8271b2d0bMihai Preda        }
5537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
554758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
556e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     * Test that saving a message creates the proper snippet for that message
557e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank     */
558e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    public void testMessageSaveAddsSnippet() {
559e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Account account = ProviderTestUtils.setupAccount("message-snippet", true, mMockContext);
560e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Mailbox box = ProviderTestUtils.setupMailbox("box1", account.mId, true, mMockContext);
561e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
562e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Create a message without a body, unsaved
563e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Message message = ProviderTestUtils.setupMessage("message", account.mId, box.mId, false,
564e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank                false, mMockContext);
565e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = "This is some text";
566e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
567e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
568e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
569e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
570e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        assertEquals(restoredMessage.mSnippet, Snippet.fromPlainText(message.mText));
571e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
572e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // Start again
573e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message = ProviderTestUtils.setupMessage("message", account.mId, box.mId, false,
574e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank                false, mMockContext);
575e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mText = null;
576e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.mHtml = "<html>This is some text</html>";
577e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        message.save(mMockContext);
578e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        restoredMessage = Message.restoreMessageWithId(mMockContext, message.mId);
579e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        // We should have the plain text as the snippet
580e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank        assertEquals(restoredMessage.mSnippet, Snippet.fromHtmlText(message.mHtml));
581e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    }
582e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank
583e7b9e4ab94093127002f4cddd3ffcc3deb1c0b41Marc Blank    /**
5847143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update account
5857143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
586758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
5887143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update mailbox
5897143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
590758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5917143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
5927143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: update message
5937143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
594758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
5957143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
5967143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete account
5977143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
5987143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
5997143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testAccountDelete() {
60028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-delete-1", true, mMockContext);
6017143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
60228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account2 = ProviderTestUtils.setupAccount("account-delete-2", true, mMockContext);
6037143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account2Id = account2.mId;
6047143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6057143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two accounts
6067143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6077143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numBoxes);
6087143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6097143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
6107143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
6117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6127143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one account now
6147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
6167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
6187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
6197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
6207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
6217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts now
6227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
6237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
6247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
625758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
6267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
6279627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.lookupBodyIdWithMessageId()
6289627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Verifies that:
6299627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a message without body, -1 is returned.
6309627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * - for a mesage with body, the id matches the one from loadBodyForMessageId.
6319627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6329627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testLookupBodyIdWithMessageId() {
6339627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
6349627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6359627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6369627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6379627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
6389627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6399627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1. create message with no body, check that returned bodyId is -1
6409627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
6419627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
6429627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
643bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId1 = Body.lookupBodyIdWithMessageId(mMockContext, message1Id);
6449627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(bodyId1, -1);
6459627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6469627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2. create message with body, check that returned bodyId is correct
6479627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
6489627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
6499627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
650bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        long bodyId2 = Body.lookupBodyIdWithMessageId(mMockContext, message2Id);
6519627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body = loadBodyForMessageId(message2Id);
6529627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body);
6539627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body.mId, bodyId2);
6549627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
6559627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6569627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
6579627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for Body.updateBodyWithMessageId().
6589627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 1. - create message without body,
6599627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update its body (set TEXT_CONTENT)
6609627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6619627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *
6629627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * 2. - create message with body,
6639627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - update body (set TEXT_CONTENT)
6649627d014e16235eadf981b9165807dc72a14a383Mihai Preda     *    - check correct updated body is read back
6659627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
6669627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testUpdateBodyWithMessageId() {
6679627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
6689627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long account1Id = account1.mId;
6699627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
6709627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long box1Id = box1.mId;
6719627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6729627d014e16235eadf981b9165807dc72a14a383Mihai Preda        final String textContent = "foobar some odd text";
673936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String htmlContent = "and some html";
674936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String textReply = "plain text reply";
675936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        final String htmlReply = "or the html reply";
6765fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        final String introText = "fred wrote:";
6779627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6789627d014e16235eadf981b9165807dc72a14a383Mihai Preda        ContentValues values = new ContentValues();
6799627d014e16235eadf981b9165807dc72a14a383Mihai Preda        values.put(BodyColumns.TEXT_CONTENT, textContent);
680936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.HTML_CONTENT, htmlContent);
681936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.TEXT_REPLY, textReply);
682936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        values.put(BodyColumns.HTML_REPLY, htmlReply);
683e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        values.put(BodyColumns.SOURCE_MESSAGE_KEY, 17);
6845fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        values.put(BodyColumns.INTRO_TEXT, introText);
6859627d014e16235eadf981b9165807dc72a14a383Mihai Preda
6869627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 1
6879627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
6889627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
6899627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message1Id = message1.mId;
6909627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body1 = loadBodyForMessageId(message1Id);
6919627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNull(body1);
6929627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message1Id, values);
6939627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body1 = loadBodyForMessageId(message1Id);
6949627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body1);
6959627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body1.mTextContent, textContent);
696936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mHtmlContent, htmlContent);
697936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mTextReply, textReply);
698936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body1.mHtmlReply, htmlReply);
699e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body1.mSourceKey, 17);
7005fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals(body1.mIntroText, introText);
7019627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7029627d014e16235eadf981b9165807dc72a14a383Mihai Preda        // 2
7039627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
7049627d014e16235eadf981b9165807dc72a14a383Mihai Preda                true, mMockContext);
7059627d014e16235eadf981b9165807dc72a14a383Mihai Preda        long message2Id = message2.mId;
7069627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body body2 = loadBodyForMessageId(message2Id);
7079627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7089627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertTrue(!body2.mTextContent.equals(textContent));
7099627d014e16235eadf981b9165807dc72a14a383Mihai Preda        Body.updateBodyWithMessageId(mMockContext, message2Id, values);
7109627d014e16235eadf981b9165807dc72a14a383Mihai Preda        body2 = loadBodyForMessageId(message1Id);
7119627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertNotNull(body2);
7129627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(body2.mTextContent, textContent);
713936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mHtmlContent, htmlContent);
714936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mTextReply, textReply);
715936babc145e2e6eb2e222f2ce5e3da8f9e4fb9f2Andrew Stadler        assertEquals(body2.mHtmlReply, htmlReply);
716e25698319325d5e9619bc45ae85d861b0f1c5954Marc Blank        assertEquals(body2.mSourceKey, 17);
7175fc57eccefeba517fe5e6f093786f37c6c4d50e6Marc Blank        assertEquals(body2.mIntroText, introText);
7189627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
7199627d014e16235eadf981b9165807dc72a14a383Mihai Preda
7209627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
721c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     * Test body retrieve methods
722c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler     */
723c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    public void testBodyRetrieve() {
724c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No account needed
725c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        // No mailbox needed
726c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        Message message1 = ProviderTestUtils.setupMessage("bodyretrieve", 1, 1, true,
727c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                true, mMockContext);
728c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        long messageId = message1.mId;
729c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
730c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mText,
731c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreBodyTextWithMessageId(mMockContext, messageId));
732c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mHtml,
733c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreBodyHtmlWithMessageId(mMockContext, messageId));
734c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mTextReply,
735c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreReplyTextWithMessageId(mMockContext, messageId));
736c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mHtmlReply,
737c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreReplyHtmlWithMessageId(mMockContext, messageId));
738c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler        assertEquals(message1.mIntroText,
739c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler                Body.restoreIntroTextWithMessageId(mMockContext, messageId));
7401575e7860d2259f1aed201ab23d526cddf787365Mihai Preda        assertEquals(message1.mSourceKey,
7411575e7860d2259f1aed201ab23d526cddf787365Mihai Preda                Body.restoreBodySourceKey(mMockContext, messageId));
742c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    }
743c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler
744c41c47fa07a22f8a7612fb0191f152a36d95b7a5Andrew Stadler    /**
745fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete body.
746fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
747fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. The body has _id 1 and messageKey 2).
748fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
749fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. verify that body for message 2 has not been deleted.
750fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. delete message 2, verify body is deleted.
751fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
752fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteBody() {
753fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
754fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
755fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // Create account and mailboxes
756fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
757fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
758fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
759fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
760fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
761fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
762fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
763fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
764fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
765fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
766fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
767fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
768fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
769fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
770fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // verify body is there
771fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
772fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
773fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
774fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
775c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
776fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. verify body for second message wasn't deleted
777fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
778fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
779fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 5. delete second message, check its body is deleted
780fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message2Id), null, null);
781fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNull(loadBodyForMessageId(message2Id));
782fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
783fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
784fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
785fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * Test delete orphan bodies.
786fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 1. create message without body (message id 1)
787fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
788fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 3. delete first message.
789fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 4. delete some other mailbox -- this triggers delete orphan bodies.
790fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     * 5. verify that body for message 2 has not been deleted.
791fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda     */
792fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    public void testDeleteOrphanBodies() {
793fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        final ContentResolver resolver = mMockContext.getContentResolver();
794fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
795ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
796fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Account account1 = ProviderTestUtils.setupAccount("orphaned body", true, mMockContext);
797fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long account1Id = account1.mId;
798fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
799fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box1Id = box1.mId;
800fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mMockContext);
801fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long box2Id = box2.mId;
802fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
803fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 1. create message without body
804fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
805fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
806fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message1Id = message1.mId;
807fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
808fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 2. create message with body
809fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
810fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda                true, mMockContext);
811fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        long message2Id = message2.mId;
812fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        //verify body is there
813fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
814fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
815fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 3. delete first message
816fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Message.CONTENT_URI, message1Id), null, null);
817fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
818fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 4. delete some mailbox (because it triggers "delete orphan bodies")
819fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        resolver.delete(ContentUris.withAppendedId(Mailbox.CONTENT_URI, box2Id), null, null);
820fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
821fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        // 5. verify body for second message wasn't deleted during "delete orphan bodies"
822fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda        assertNotNull(loadBodyForMessageId(message2Id));
823fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    }
824fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda
825fb7974f5bfb6275fb856b0f7ff386ef10680c83aMihai Preda    /**
8260efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * Note that we can't use EmailContent.count() here because it uses a projection including
8270efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * count(*), and count(*) is incompatible with a LIMIT (i.e. the limit would be applied to the
8280efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     * single column returned with count(*), rather than to the query itself)
8290efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank     */
8300efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    private int count(Context context, Uri uri, String selection, String[] selectionArgs) {
8310efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Cursor c = context.getContentResolver().query(uri, EmailContent.ID_PROJECTION, selection,
8320efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                selectionArgs, null);
8330efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        try {
8340efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            return c.getCount();
8350efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        } finally {
8360efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank            c.close();
8370efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        }
8380efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
8390efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8400efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    public void testMessageQueryWithLimit() {
8410efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        final Context context = mMockContext;
8420efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8430efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create account and two mailboxes
8440efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
8450efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
8460efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
8470efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8480efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box1
8490efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, false, true, context);
8500efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, false, true, context);
8510efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, false, true, context);
8520efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, false, true, context);
8530efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8540efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Create 4 messages in box2
8550efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box2.mId, false, true, context);
8560efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box2.mId, false, true, context);
8570efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box2.mId, false, true, context);
8580efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box2.mId, false, true, context);
8590efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8600efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check normal case, special case (limit 1), and arbitrary limits
8610efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, Message.CONTENT_URI, null, null));
8620efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(1, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 1),
8630efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8640efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(3, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 3),
8650efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8660efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(8, count(mMockContext, EmailContent.uriWithLimit(Message.CONTENT_URI, 100),
8670efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                null, null));
8680efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8690efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        // Check that it works with selection/selection args
8700efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        String[] args = new String[] {Long.toString(box1.mId)};
8710efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(4, count(mMockContext, Message.CONTENT_URI,
8720efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                MessageColumns.MAILBOX_KEY + "=?", args));
8730efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank        assertEquals(1, count(mMockContext,
8740efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                EmailContent.uriWithLimit(Message.CONTENT_URI, 1),
8750efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank                MessageColumns.MAILBOX_KEY + "=?", args));
8760efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    }
8770efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank
8780efe738e05a31e0c1ebfba645bd2364a373a3f33Marc Blank    /**
879ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * Test delete orphan messages
880ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 1. create message without body (message id 1)
881ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 2. create message with body (message id 2. Body has _id 1 and messageKey 2).
882ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 3. delete first message.
883ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 4. delete some other mailbox -- this triggers delete orphan bodies.
884ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     * 5. verify that body for message 2 has not been deleted.
885ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     */
886ef83299b99288c00b9d661260d19715e73e6889cMarc Blank     public void testDeleteOrphanMessages() {
887ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
888ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        final Context context = mMockContext;
889ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
890ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create account and two mailboxes
891ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Account acct = ProviderTestUtils.setupAccount("orphaned body", true, context);
892ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
893ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct.mId, true, context);
894ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
895ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box1
896ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_1 =
897ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, false, true, context);
898ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_2 =
899ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, false, true, context);
900ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_3 =
901ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, false, true, context);
902ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg1_4 =
903ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, false, true, context);
904ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
905ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in box2
906ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_1 =
907ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message1", acct.mId, box2.mId, false, true, context);
908ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_2 =
909ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message2", acct.mId, box2.mId, false, true, context);
910ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_3 =
911ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message3", acct.mId, box2.mId, false, true, context);
912ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msg2_4 =
913ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("message4", acct.mId, box2.mId, false, true, context);
914ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
915ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete 2 from each mailbox
916ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_1.mId),
917ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
918ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_2.mId),
919ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
920ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_1.mId),
921ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
922ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_2.mId),
923ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
924ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
925ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 4 items in the deleted item table
926ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
927ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
928ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update 2 from each mailbox
929ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues v = new ContentValues();
930ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        v.put(MessageColumns.DISPLAY_NAME, "--updated--");
931ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_3.mId),
932ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
933ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg1_4.mId),
934ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
935ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_3.mId),
936ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
937ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg2_4.mId),
938ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                v, null, null);
939ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
940ef83299b99288c00b9d661260d19715e73e6889cMarc Blank         // There should be 4 items in the updated item table
941ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
942ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
943ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Manually add 2 messages from a "deleted" mailbox to deleted and updated tables
944ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Use a value > 2 for the deleted box id
945ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long delBoxId = 10;
946ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Create 4 messages in the "deleted" mailbox
947ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_A =
948ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageA", acct.mId, delBoxId, false, false, context);
949ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_B =
950ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageB", acct.mId, delBoxId, false, false, context);
951ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_C =
952ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageC", acct.mId, delBoxId, false, false, context);
953ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message msgX_D =
954ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            ProviderTestUtils.setupMessage("messageD", acct.mId, delBoxId, false, false, context);
955ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
956ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv;
957ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // We have to assign id's manually because there are no autoincrement id's for these tables
958ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Start with an id that won't exist, since id's in these tables must be unique
959ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        long msgId = 10;
960ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // It's illegal to manually insert these, so we need to catch the exception
961ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // NOTE: The insert succeeds, and then throws the exception
962ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
963ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_A.toContentValues();
964ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
965ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
966ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
967ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
968ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
969ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_B.toContentValues();
970ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
971ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.DELETED_CONTENT_URI, cv);
972ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
973ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
974ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
975ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_C.toContentValues();
976ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
977ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
978ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
979ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
980ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        try {
981ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv = msgX_D.toContentValues();
982ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            cv.put(EmailContent.RECORD_ID, msgId++);
983ef83299b99288c00b9d661260d19715e73e6889cMarc Blank            resolver.insert(Message.UPDATED_CONTENT_URI, cv);
984ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        } catch (IllegalArgumentException e) {
985ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        }
986ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
987ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should be 6 items in the deleted and updated tables
988ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
989ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
990ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
991ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete the orphans
992ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        EmailProvider.deleteOrphans(EmailProvider.getReadableDatabase(context),
993ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                Message.DELETED_TABLE_NAME);
994ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        EmailProvider.deleteOrphans(EmailProvider.getReadableDatabase(context),
995ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                Message.UPDATED_TABLE_NAME);
996ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
997ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should now be 4 messages in each of the deleted and updated tables again
998ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.UPDATED_CONTENT_URI, null, null));
999ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, EmailContent.count(context, Message.DELETED_CONTENT_URI, null, null));
1000ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    }
1001ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1002ef83299b99288c00b9d661260d19715e73e6889cMarc Blank    /**
10037143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete mailbox
10047143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
10057143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMailboxDelete() {
100628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("mailbox-delete", true, mMockContext);
10077143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
100828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
10097143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
101028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, mMockContext);
10117143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box2Id = box2.mId;
1012758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
10137143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String selection = EmailContent.MailboxColumns.ACCOUNT_KEY + "=?";
10147143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String[] selArgs = new String[] { String.valueOf(account1Id) };
10157143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10167143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two mailboxes
10177143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, selection, selArgs);
10187143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numBoxes);
10197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10207143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
10217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box1Id);
10227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10237143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10247143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one mailbox now
10257143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, selection, selArgs);
10267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
10277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
10297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box2Id);
10307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no mailboxes now
10337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, selection, selArgs);
10347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
10357143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1036758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
10377143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
10387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test delete message
10397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
10407143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
10417143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
10427143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testMessageDelete() {
104328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mMockContext);
10447143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
104528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
10467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
104728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
104828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
10497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message1Id = message1.mId;
105028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
105128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
10527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long message2Id = message2.mId;
10537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND " +
10557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler                EmailContent.MessageColumns.MAILBOX_KEY + "=?";
10567143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String[] selArgs = new String[] { String.valueOf(account1Id), String.valueOf(box1Id) };
10577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10587143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are two messages
10597143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
10617143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete one of them
10637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
10647143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10657143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10667143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there's only one message now
10677143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10687143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numMessages);
10697143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10707143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the other one
10717143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
10727143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
10737143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
10747143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no messages now
10757143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
10767143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
10777143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1078758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
10797143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
1080ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test delete synced message
1081ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1082ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1083ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1084ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testSyncedMessageDelete() {
108528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("synced-message-delete", true,
108628448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
1087ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
108828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1089ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
109028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
109128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1092ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
109328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
109428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1095ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1096ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1097ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1098ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
1099ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String[] selArgs = new String[] {
1100ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            String.valueOf(account1Id), String.valueOf(box1Id)
1101ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        };
1102ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1103ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1104ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1105ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1106ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1107ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure we start with no synced deletions
1108ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1109ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1110ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1111ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1112ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete one of them SYNCED
1113ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1Id);
1114ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1115ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1116ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's only one message now
1117ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1118ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1119ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1120ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one synced deletion now
1121ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1122ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1123ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1124ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1125ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // now delete the other one NOT SYNCED
1126ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
1127ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
1128ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1129ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are no messages now
1130ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1131ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1132ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1133ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's still one deletion now
1134ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1135ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1136ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1137ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1138ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1139ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
1140ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * Test message update
1141ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: body
1142ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     * TODO: attachments
1143ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler     */
1144ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    public void testMessageUpdate() {
114528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-update", true, mMockContext);
1146ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long account1Id = account1.mId;
114728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
1148ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long box1Id = box1.mId;
114928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
115028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1151ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message1Id = message1.mId;
115228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
115328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                true, mMockContext);
1154ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        long message2Id = message2.mId;
1155ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentResolver cr = mMockContext.getContentResolver();
1156ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1157ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
1158ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                + EmailContent.MessageColumns.MAILBOX_KEY + "=?";
1159ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        String[] selArgs = new String[] {
1160ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            String.valueOf(account1Id), String.valueOf(box1Id)
1161ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        };
1162ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1163ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there are two messages
1164ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1165ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(2, numMessages);
1166ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1167ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the first one
1168ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
1169ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        ContentValues cv = new ContentValues();
1170ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1171ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1172ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1173ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's no updated message
1174ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1175ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1176ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1177ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1178ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck"
1179ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Message restoredMessage = Message.restoreMessageWithId(mMockContext, message1Id);
1180ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1181ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1182ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // change the second one
1183ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id);
1184ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv = new ContentValues();
1185ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cv.put(MessageColumns.FROM_LIST, "from-list");
1186ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.update(uri, cv, null, null);
1187ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1188ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // make sure there's one updated message
1189ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1190ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1191ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1192ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1193ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the message back from the provider, make sure the change "stuck",
1194ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // as before
1195ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        restoredMessage = Message.restoreMessageWithId(mMockContext, message2Id);
1196ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals("from-list", restoredMessage.mFrom);
1197ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1198ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // get the original message back from the provider
1199ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        Cursor c = cr.query(Message.UPDATED_CONTENT_URI, Message.CONTENT_PROJECTION, null, null,
1200ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                null);
1201ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        try {
1202ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertTrue(c.moveToFirst());
1203ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            Message originalMessage = EmailContent.getContent(c, Message.class);
1204ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // make sure this has the original value
1205ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertEquals("from message2", originalMessage.mFrom);
1206ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            // Should only be one
1207ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            assertFalse(c.moveToNext());
1208ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        } finally {
1209ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler            c.close();
1210ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        }
1211ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1212ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // delete the second message
1213ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        cr.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id), null, null);
1214ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1215ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // hey, presto! the change should be gone
1216ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1217ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1218ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(0, numMessages);
1219ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1220ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        // and there should now be a deleted record
1221ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1222ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler                selArgs);
1223ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler        assertEquals(1, numMessages);
1224ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    }
1225ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler
1226ddc871d9eddd088c0200a30dbfeb24812a81cf80Andrew Stadler    /**
12277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: cascaded delete account
12287143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: hostauth
12297143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
12307143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
12317143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other account, mailbox & messages and confirm the right objects were deleted
12327143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
12337143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteAccount() {
123428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-delete-cascade", true,
123528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
12367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
123728448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
12387143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
123928448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        /* Message message1 = */ ProviderTestUtils.setupMessage("message1", account1Id, box1Id,
124028448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
124128448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        /* Message message2 = */ ProviderTestUtils.setupMessage("message2", account1Id, box1Id,
124228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
12437143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12447143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there is one account, one mailbox, and two messages
12457143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
12467143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numAccounts);
12477143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
12487143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(1, numBoxes);
12497143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
12507143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
12517143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12527143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // delete the account
12537143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
12547143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
12557143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12567143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // make sure there are no accounts, mailboxes, or messages
12577143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numAccounts = EmailContent.count(mMockContext, Account.CONTENT_URI, null, null);
12587143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numAccounts);
12597143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numBoxes = EmailContent.count(mMockContext, Mailbox.CONTENT_URI, null, null);
12607143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numBoxes);
12617143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
12627143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
12637143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1264758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
12657143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
12667143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * Test cascaded delete mailbox
12677143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: body
12687143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: attachments
12697143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     * TODO: create other mailbox & messages and confirm the right objects were deleted
12707143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
12717143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    public void testCascadeDeleteMailbox() {
127228448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("mailbox-delete-cascade", true,
127328448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                mMockContext);
12747143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long account1Id = account1.mId;
127528448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
12767143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        long box1Id = box1.mId;
1277ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id,
127828448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
1279ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id,
1280ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                false, true, mMockContext);
1281ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message3 = ProviderTestUtils.setupMessage("message3", account1Id, box1Id,
1282ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                false, true, mMockContext);
1283ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        Message message4 = ProviderTestUtils.setupMessage("message4", account1Id, box1Id,
128428448e782b825d1978c0923003a2cf91efe733dcAndrew Stadler                false, true, mMockContext);
1285ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message5", account1Id, box1Id, false, true, mMockContext);
1286ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ProviderTestUtils.setupMessage("message6", account1Id, box1Id, false, true, mMockContext);
12877143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12887143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND " +
12897143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler                EmailContent.MessageColumns.MAILBOX_KEY + "=?";
12907143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        String[] selArgs = new String[] { String.valueOf(account1Id), String.valueOf(box1Id) };
12917143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
12920e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // make sure there are six messages
12937143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1294ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(6, numMessages);
1295ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1296ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentValues cv = new ContentValues();
1297ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        cv.put(Message.SERVER_ID, "SERVER_ID");
1298ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        ContentResolver resolver = mMockContext.getContentResolver();
1299ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1300ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Update two messages
1301ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1.mId),
1302ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                cv, null, null);
1303ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.update(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2.mId),
1304ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                cv, null, null);
1305ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // Delete two messages
1306ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message3.mId),
1307ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
1308ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message4.mId),
1309ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                null, null);
1310ef83299b99288c00b9d661260d19715e73e6889cMarc Blank
1311ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // There should now be two messages in updated/deleted, and 4 in messages
1312ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
1313ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(4, numMessages);
1314ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1315ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1316ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(2, numMessages);
1317ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1318ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
13197143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(2, numMessages);
1320758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
13217143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        // now delete the mailbox
13227143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        Uri uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box1Id);
1323ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        resolver.delete(uri, null, null);
1324758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1325ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        // there should now be zero messages in all three tables
13267143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
13277143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler        assertEquals(0, numMessages);
1328ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
1329ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1330ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
1331ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
1332ef83299b99288c00b9d661260d19715e73e6889cMarc Blank                selArgs);
1333ef83299b99288c00b9d661260d19715e73e6889cMarc Blank        assertEquals(0, numMessages);
13347143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    }
1335758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
13367143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler    /**
13376c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test cascaded delete message
13386c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Confirms that deleting a message will also delete its body & attachments
13397143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler     */
13406c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testCascadeMessageDelete() {
13416c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Account account1 = ProviderTestUtils.setupAccount("message-cascade", true, mMockContext);
13426c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long account1Id = account1.mId;
13436c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext);
13446c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long box1Id = box1.mId;
1345bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
13466c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Each message has a body, and also give each 2 attachments
13476c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true,
13486c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                false, mMockContext);
13496c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ArrayList<Attachment> atts = new ArrayList<Attachment>();
13506c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
13516c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
13526c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
13536c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    false, mMockContext));
13546c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
13556c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.mAttachments = atts;
13566c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message1.save(mMockContext);
13576c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message1Id = message1.mId;
13586c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13596c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, true,
13606c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                false, mMockContext);
13616c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        atts = new ArrayList<Attachment>();
13626c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        for (int i = 0; i < 2; i++) {
13636c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            atts.add(ProviderTestUtils.setupAttachment(
13646c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    -1, expectedAttachmentNames[i], expectedAttachmentSizes[i],
13656c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                    false, mMockContext));
13666c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
13676c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.mAttachments = atts;
13686c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        message2.save(mMockContext);
13696c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        long message2Id = message2.mId;
13706c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13716c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Set up to test total counts of bodies & attachments for our test messages
13726c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String bodySelection = BodyColumns.MESSAGE_KEY + " IN (?,?)";
13736c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String attachmentSelection = AttachmentColumns.MESSAGE_KEY + " IN (?,?)";
13746c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        String[] selArgs = new String[] { String.valueOf(message1Id), String.valueOf(message2Id) };
1375bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
13766c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are two bodies
13776c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        int numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
13786c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numBodies);
13796c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13806c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are four attachments
13816c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        int numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
13826c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
13836c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(4, numAttachments);
13846c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13856c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete one of the messages
13866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
13876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
13886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // there should be one body and two attachments
13906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
13916c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(1, numBodies);
13926c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
13946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
13956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, numAttachments);
13966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
13976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // now delete the other message
13986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
13996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
14006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // make sure there are no bodies or attachments
14026c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numBodies = EmailContent.count(mMockContext, Body.CONTENT_URI, bodySelection, selArgs);
14036c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numBodies);
14046c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14056c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        numAttachments = EmailContent.count(mMockContext, Attachment.CONTENT_URI,
14066c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                attachmentSelection, selArgs);
14076c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(0, numAttachments);
14086c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
14097143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler
1410976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    /**
1411976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * Test that our unique file name algorithm works as expected.  Since this test requires an
1412976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * SD card, we check the environment first, and return immediately if none is mounted.
1413976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     * @throws IOException
1414976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank     */
1415976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    public void testCreateUniqueFile() throws IOException {
1416976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        // Delete existing files, if they exist
1417976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
1418976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            return;
1419976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1420976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        try {
1421976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String fileName = "A11achm3n1.doc";
1422976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File uniqueFile = Attachment.createUniqueFile(fileName);
1423976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1424976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1425976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1426976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2.doc", uniqueFile.getName());
1427976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (uniqueFile.createNewFile()) {
1428976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    uniqueFile = Attachment.createUniqueFile(fileName);
1429976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    assertEquals("A11achm3n1-3.doc", uniqueFile.getName());
1430976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
1431976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank           }
1432976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            fileName = "A11achm3n1";
1433976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            uniqueFile = Attachment.createUniqueFile(fileName);
1434976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            assertEquals(fileName, uniqueFile.getName());
1435976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            if (uniqueFile.createNewFile()) {
1436976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                uniqueFile = Attachment.createUniqueFile(fileName);
1437976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                assertEquals("A11achm3n1-2", uniqueFile.getName());
1438976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1439976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        } finally {
1440976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            File directory = Environment.getExternalStorageDirectory();
1441976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // These are the files that should be created earlier in the test.  Make sure
1442976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            // they are deleted for the next go-around
1443976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            String[] fileNames = new String[] {"A11achm3n1.doc", "A11achm3n1-2.doc", "A11achm3n1"};
1444976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            int length = fileNames.length;
1445976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            for (int i = 0; i < length; i++) {
1446976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                File file = new File(directory, fileNames[i]);
1447976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                if (file.exists()) {
1448976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                    file.delete();
1449976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank                }
1450976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank            }
1451976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank        }
1452976f92908dd2f69f21f62690632ff24b08d9f5d3Marc Blank    }
14534119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14544119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    /**
14554119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     * Test retrieving attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
14564119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler     */
14574119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    public void testGetAttachmentByMessageIdUri() {
14584119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14594119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Note, we don't strictly need accounts, mailboxes or messages to run this test.
14604119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a1 = ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
14614119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Attachment a2 = ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
1462758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
1463758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
14644119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14654119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Now ask for the attachments of message id=1
14664119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        // Note: Using the "sort by size" trick to bring them back in expected order
14674119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
14684119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        Cursor c = mMockContext.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION,
14694119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler                null, null, Attachment.SIZE);
14704119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        assertEquals(2, c.getCount());
14714119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler
14724119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        try {
14734119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToFirst();
14744119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            Attachment a1Get = EmailContent.getContent(c, Attachment.class);
14754119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-1", a1, a1Get);
14764119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.moveToNext();
14774119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            Attachment a2Get = EmailContent.getContent(c, Attachment.class);
14784119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-2", a2, a2Get);
14794119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        } finally {
14804119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler            c.close();
14814119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler        }
14824119218e2fd64341ac946fb8f2cbdb796a444cb8Andrew Stadler    }
148354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
148454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    /**
14856c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     * Test deleting attachments by message ID (using EmailContent.Attachment.MESSAGE_ID_URI)
14866c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler     */
14876c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    public void testDeleteAttachmentByMessageIdUri() {
14886c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ContentResolver mockResolver = mMockContext.getContentResolver();
14896c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14906c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Note, we don't strictly need accounts, mailboxes or messages to run this test.
14916c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a1", 100, true, mMockContext);
14926c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        ProviderTestUtils.setupAttachment(1, "a2", 200, true, mMockContext);
14936c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a3 = ProviderTestUtils.setupAttachment(2, "a3", 300, true, mMockContext);
14946c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Attachment a4 = ProviderTestUtils.setupAttachment(2, "a4", 400, true, mMockContext);
14956c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
14966c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Delete all attachments for message id=1
14976c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, 1);
14986c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        mockResolver.delete(uri, null, null);
14996c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
15006c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // Read back all attachments and confirm that we have the expected remaining attachments
15016c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        // (the attachments that are set for message id=2).  Note order-by size to simplify test.
15026c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        Cursor c = mockResolver.query(Attachment.CONTENT_URI, Attachment.CONTENT_PROJECTION,
15036c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler                null, null, Attachment.SIZE);
15046c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        assertEquals(2, c.getCount());
15056c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
15066c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        try {
15076c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToFirst();
15086c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            Attachment a3Get = EmailContent.getContent(c, Attachment.class);
15096c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-3", a3, a3Get);
15106c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.moveToNext();
15116c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            Attachment a4Get = EmailContent.getContent(c, Attachment.class);
15126c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            ProviderTestUtils.assertAttachmentEqual("getAttachByUri-4", a4, a4Get);
15136c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        } finally {
15146c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler            c.close();
15156c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler        }
15166c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    }
15176c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler
15186c21942ec45f561d711b3d74ecca8e62afb735c4Andrew Stadler    /**
151954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * Tests of default account behavior
1520758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank     *
152154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 1.  Simple set/get
152254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 2.  Moving default between 3 accounts
152354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     * 3.  Delete default, make sure another becomes default
152454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler     */
152554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    public void testSetGetDefaultAccount() {
152654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // There should be no default account if there are no accounts
152754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long defaultAccountId = Account.getDefaultAccountId(mMockContext);
152854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        assertEquals(-1, defaultAccountId);
152954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
153054c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Account account1 = ProviderTestUtils.setupAccount("account-default-1", true, mMockContext);
153154c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account1Id = account1.mId;
153254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Account account2 = ProviderTestUtils.setupAccount("account-default-2", true, mMockContext);
153354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account2Id = account2.mId;
153454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Account account3 = ProviderTestUtils.setupAccount("account-default-3", true, mMockContext);
153554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        long account3Id = account3.mId;
153654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
15379e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        // With three accounts, but none marked default, confirm that some default account
15389e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        // is returned.  Which one is undefined here.
153954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
15409e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertTrue(defaultAccountId == account1Id
15419e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler                    || defaultAccountId == account2Id
15429e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler                    || defaultAccountId == account3Id);
154354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
15449e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        updateIsDefault(account1, true);
154554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
15469e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertEquals(account1Id, defaultAccountId);
154754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1548531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        updateIsDefault(account2, true);
1549531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1550531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1551531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank
1552531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        updateIsDefault(account3, true);
1553531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1554531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
155554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
155654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // Now delete a non-default account and confirm no change
155754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, account1Id);
155854c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
155954c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1560531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1561531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account3Id, defaultAccountId);
156254c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
156354c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        // Now confirm deleting the default account and it switches to another one
156454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account3Id);
156554c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
156654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
1567531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        defaultAccountId = Account.getDefaultAccountId(mMockContext);
1568531ae9d25f4310e4774e136ed74ed9749f940861Marc Blank        assertEquals(account2Id, defaultAccountId);
1569758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
15709e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        // Now delete the final account and confirm there are no default accounts again
15719e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        uri = ContentUris.withAppendedId(Account.CONTENT_URI, account2Id);
15729e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        mMockContext.getContentResolver().delete(uri, null, null);
15739e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler
157454c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler        defaultAccountId = Account.getDefaultAccountId(mMockContext);
15759e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        assertEquals(-1, defaultAccountId);
157654c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler    }
157754c1f2bf9a6574240b7c9af253f83a2b566442abAndrew Stadler
15789e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler    private void updateIsDefault(Account account, boolean newState) {
15799e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        account.setDefaultAccount(newState);
15809e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        ContentValues cv = new ContentValues();
15819e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        cv.put(AccountColumns.IS_DEFAULT, account.mIsDefault);
15829e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler        account.update(mMockContext, cv);
15839e2c6bd5f21f2d19eef7ebfe30e6fdf94ede0857Andrew Stadler    }
1584758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1585758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    public static Message setupUnreadMessage(String name, long accountId, long mailboxId,
1586758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            boolean addBody, boolean saveIt, Context context) {
1587758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message msg =
1588758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            ProviderTestUtils.setupMessage(name, accountId, mailboxId, addBody, false, context);
1589758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        msg.mFlagRead = false;
1590758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        if (saveIt) {
1591758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank            msg.save(context);
1592758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        }
1593758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        return msg;
1594758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
1595758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1596758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    public void testUnreadCountTriggers() {
1597758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Start with one account and three mailboxes
1598758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Account account = ProviderTestUtils.setupAccount("triggers", true, mMockContext);
1599758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxA = ProviderTestUtils.setupMailbox("boxA", account.mId, true, mMockContext);
1600758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxB = ProviderTestUtils.setupMailbox("boxB", account.mId, true, mMockContext);
1601758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Mailbox boxC = ProviderTestUtils.setupMailbox("boxC", account.mId, true, mMockContext);
1602758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1603758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure there are no unreads
1604758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1605758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1606758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxC.mId));
1607758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1608758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Create 4 unread messages (only 3 named) in boxA
1609758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message1 = setupUnreadMessage("message1", account.mId, boxA.mId,
1610758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1611758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message2= setupUnreadMessage("message2", account.mId, boxA.mId,
1612758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1613758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Message message3 =  setupUnreadMessage("message3", account.mId, boxA.mId,
1614758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank                false, true, mMockContext);
1615758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        setupUnreadMessage("message4", account.mId, boxC.mId, false, true, mMockContext);
1616758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1617758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Make sure the unreads are where we expect them
1618758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(3, getUnreadCount(boxA.mId));
1619758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1620758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1621758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1622758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // After deleting message 1, the count in box A should be decremented (to 2)
1623758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentResolver cr = mMockContext.getContentResolver();
1624758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1.mId);
1625758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.delete(uri, null, null);
1626758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxA.mId));
1627758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxB.mId));
1628758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1629758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1630758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 2 to box B, leaving 1 in box A and 1 in box B
1631758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message2.mMailboxKey = boxB.mId;
1632758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        ContentValues cv = new ContentValues();
1633758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxB.mId);
1634758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message2.mId), cv, null, null);
1635758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxA.mId));
1636758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1637758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1638758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1639758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Mark message 3 (from box A) read, leaving 0 in box A
1640758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1641758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 1);
1642758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1643758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1644758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1645758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1646758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1647758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Move message 3 to box C; should be no change (it's read)
1648758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        message3.mMailboxKey = boxC.mId;
1649758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1650758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.MAILBOX_KEY, boxC.mId);
1651758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1652758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1653758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1654758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxC.mId));
1655758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank
1656758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        // Mark message 3 unread; it's now in box C, so that box's count should go up to 3
1657758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.clear();
1658758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cv.put(MessageColumns.FLAG_READ, 0);
1659758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        cr.update(ContentUris.withAppendedId(Message.CONTENT_URI, message3.mId), cv, null, null);
1660758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(0, getUnreadCount(boxA.mId));
1661758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(1, getUnreadCount(boxB.mId));
1662758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank        assertEquals(2, getUnreadCount(boxC.mId));
1663758a532fce2f672673d38b2daa5f67eb757b118bMarc Blank    }
16649627d014e16235eadf981b9165807dc72a14a383Mihai Preda
16659627d014e16235eadf981b9165807dc72a14a383Mihai Preda    /**
16669627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Test for EmailProvider.createIndex().
16679627d014e16235eadf981b9165807dc72a14a383Mihai Preda     * Check that it returns exacly the same string as the one used previously for index creation.
16689627d014e16235eadf981b9165807dc72a14a383Mihai Preda     */
16699627d014e16235eadf981b9165807dc72a14a383Mihai Preda    public void testCreateIndex() {
16709627d014e16235eadf981b9165807dc72a14a383Mihai Preda        String oldStr = "create index message_" + MessageColumns.TIMESTAMP
16719627d014e16235eadf981b9165807dc72a14a383Mihai Preda            + " on " + Message.TABLE_NAME + " (" + MessageColumns.TIMESTAMP + ");";
16729627d014e16235eadf981b9165807dc72a14a383Mihai Preda        String newStr = EmailProvider.createIndex(Message.TABLE_NAME, MessageColumns.TIMESTAMP);
16739627d014e16235eadf981b9165807dc72a14a383Mihai Preda        assertEquals(newStr, oldStr);
16749627d014e16235eadf981b9165807dc72a14a383Mihai Preda    }
1675c0c9c33322deecace00a32766e0a1b355aad4b31Marc Blank
16760e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testDatabaseCorruptionRecovery() {
16770e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
16780e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
16790e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
16800e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
16810e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
16820e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
16830e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
16840e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
16850e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
16860e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
16870e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
16880e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
16890e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
16900e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
16910e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
16920e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
16930e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
16940e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
16950e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
16960e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
16970e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
16980e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
16990e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProvider.db database should exist (the provider creates it automatically)
17000e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17010e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17020e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
17030e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
17040e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
17050e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17060e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
17070e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
17080e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
17090e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17100e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17110e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17120e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
17130e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // This simulates the Provider starting up again (otherwise, it will still be pointing to
17140e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
17150e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Note that we only have access to the EmailProvider via the ContentResolver; therefore,
17160e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
17170e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
17180e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17190e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // TODO We should check for the deletion of attachment files once this is implemented in
17200e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
1721bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
17220e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
17230e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The next time the database is created by the provider, it will notice that there's
17240e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // already a EmailProviderBody.db file.  In this case, it will delete that database to
17250e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
17260e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17270e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
17280e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17290e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17300e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17310e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
17320e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17330e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17340e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
17350e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17360e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    public void testBodyDatabaseCorruptionRecovery() {
17370e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final ContentResolver resolver = mMockContext.getContentResolver();
17380e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        final Context context = mMockContext;
17390e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17400e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create account and two mailboxes
17410e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Account acct = ProviderTestUtils.setupAccount("acct1", true, context);
17420e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct.mId, true, context);
17430e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17440e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Create 4 messages in box1 with bodies
17450e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message1", acct.mId, box1.mId, true, true, context);
17460e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message2", acct.mId, box1.mId, true, true, context);
17470e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message3", acct.mId, box1.mId, true, true, context);
17480e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        ProviderTestUtils.setupMessage("message4", acct.mId, box1.mId, true, true, context);
17490e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17500e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four messages
17510e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        int count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17520e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17530e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are four bodies
17540e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17550e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(4, count);
17560e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17570e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProviderBody.db file
17580e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        File dbFile = mMockContext.getDatabasePath(EmailProvider.BODY_DATABASE_NAME);
17590e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should exist (the provider creates it automatically)
17600e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17610e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17620e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Delete it, and confirm it is gone
17630e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.delete());
17640e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertFalse(dbFile.exists());
17650e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17660e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Find the EmailProvider.db file
17670e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        dbFile = mMockContext.getDatabasePath(EmailProvider.DATABASE_NAME);
17680e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The EmailProviderBody.db database should still exist
17690e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile != null);
17700e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertTrue(dbFile.exists());
17710e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17720e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // URI to uncache the databases
17730e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // This simulates the Provider starting up again (otherwise, it will still be pointing to
17740e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the already opened files)
17750e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Note that we only have access to the EmailProvider via the ContentResolver; therefore,
17760e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // we cannot directly call into the provider and use a URI for this
17770e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        resolver.update(EmailProvider.INTEGRITY_CHECK_URI, null, null, null);
17780e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17790e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // TODO We should check for the deletion of attachment files once this is implemented in
17800e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // the provider
17810e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17820e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Explanation for what happens below...
17830e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // The next time the body database is created by the provider, it will notice that there's
17840e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // already a populated EmailProvider.db file.  In this case, it will delete that database to
17850e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // ensure that both are in sync (and empty)
17860e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17870e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no messages
17880e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Message.CONTENT_URI, null, null);
17890e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17900e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank
17910e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        // Confirm there are no bodies
17920e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        count = EmailContent.count(mMockContext, Body.CONTENT_URI, null, null);
17930e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank        assertEquals(0, count);
17940e1595c177e40428b267a8696dfc05d015ce6a2fMarc Blank    }
1795694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1796694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank    public void testFindMailboxOfType() {
1797694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        final Context context = mMockContext;
1798694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1799694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        // Create two accounts and a variety of mailbox types
1800694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
1801694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Inbox =
1802694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Inbox1", acct1.mId, true, context, Mailbox.TYPE_INBOX);
1803694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Calendar
1804694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        = ProviderTestUtils.setupMailbox("Cal1", acct1.mId, true, context, Mailbox.TYPE_CALENDAR);
1805694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Contacts =
1806694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Con1", acct1.mId, true, context, Mailbox.TYPE_CONTACTS);
1807694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Account acct2 = ProviderTestUtils.setupAccount("acct1", true, context);
1808694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Inbox =
1809694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Inbox2", acct2.mId, true, context, Mailbox.TYPE_INBOX);
1810694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Calendar =
1811694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Cal2", acct2.mId, true, context, Mailbox.TYPE_CALENDAR);
1812694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Contacts =
1813694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Con2", acct2.mId, true, context, Mailbox.TYPE_CONTACTS);
1814694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1815694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        // Check that we can find them by type
1816694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct1Inbox.mId,
1817694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
1818694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct2Inbox.mId,
1819694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_INBOX));
1820694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct1Calendar.mId,
1821694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
1822694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct2Calendar.mId,
1823694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_CALENDAR));
1824694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct1Contacts.mId,
1825694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
1826694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        assertEquals(acct2Contacts.mId,
1827694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_CONTACTS));
18286ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler
18296ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        // Check that nonexistent mailboxes are not returned
18306ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        assertEquals(Mailbox.NO_MAILBOX,
18316ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_DRAFTS));
18326ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        assertEquals(Mailbox.NO_MAILBOX,
18336ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_OUTBOX));
18346ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler
18356ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        // delete account 1 and confirm no mailboxes are returned
18366ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        context.getContentResolver().delete(
18376ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                ContentUris.withAppendedId(Account.CONTENT_URI, acct1.mId), null, null);
18386ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        assertEquals(Mailbox.NO_MAILBOX,
18396ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
18406ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        assertEquals(Mailbox.NO_MAILBOX,
18416ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
18426ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler        assertEquals(Mailbox.NO_MAILBOX,
18436ebaa90847e6e9c7624c18905971a003b2ee902bAndy Stadler                Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
1844694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank    }
1845694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1846694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank    public void testRestoreMailboxOfType() {
1847694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        final Context context = mMockContext;
1848694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1849694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        // Create two accounts and a variety of mailbox types
1850694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
1851694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Inbox =
1852694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Inbox1", acct1.mId, true, context, Mailbox.TYPE_INBOX);
1853694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Calendar
1854694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        = ProviderTestUtils.setupMailbox("Cal1", acct1.mId, true, context, Mailbox.TYPE_CALENDAR);
1855694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct1Contacts =
1856694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Con1", acct1.mId, true, context, Mailbox.TYPE_CONTACTS);
1857694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Account acct2 = ProviderTestUtils.setupAccount("acct1", true, context);
1858694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Inbox =
1859694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Inbox2", acct2.mId, true, context, Mailbox.TYPE_INBOX);
1860694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Calendar =
1861694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Cal2", acct2.mId, true, context, Mailbox.TYPE_CALENDAR);
1862694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        Mailbox acct2Contacts =
1863694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank            ProviderTestUtils.setupMailbox("Con2", acct2.mId, true, context, Mailbox.TYPE_CONTACTS);
1864694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank
1865694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        // Check that we can find them by type
1866694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Inbox,
1867694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
1868694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Inbox,
1869694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_INBOX));
1870694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Calendar,
1871694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
1872694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Calendar,
1873694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_CALENDAR));
1874694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Contacts,
1875694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
1876694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank        ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Contacts,
1877694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank                Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_CONTACTS));
1878694257cb7e7a191b3314cb209b6c38a8a07583efMarc Blank    }
1879bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1880bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testAccountIsSecurityHold() {
1881bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        final Context context = mMockContext;
1882bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
1883bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1884bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account acct2 = ProviderTestUtils.setupAccount("acct2", false, context);
1885bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.mFlags |= Account.FLAGS_SECURITY_HOLD;
1886bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        acct2.save(context);
1887bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1888bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertFalse(Account.isSecurityHold(context, acct1.mId));
1889bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertTrue(Account.isSecurityHold(context, acct2.mId));
1890bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertFalse(Account.isSecurityHold(context, 9999999)); // No such account
1891bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki   }
1892bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1893bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    public void testClearAccountHoldFlags() {
1894bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext);
1895bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a1.mFlags = Account.FLAGS_NOTIFY_NEW_MAIL;
1896bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a1.save(mMockContext);
1897bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext);
1898bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a2.mFlags = Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD;
1899bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        a2.save(mMockContext);
1900bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1901bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        // bulk clear
1902bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account.clearSecurityHoldOnAllAccounts(mMockContext);
1903bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki
1904bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        // confirm new values as expected - no hold flags; other flags unmolested
1905bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
1906bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL, a1a.mFlags);
1907bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
1908bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki        assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2a.mFlags);
1909bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki    }
1910574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1911574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    /**
1912574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki     * @return the number of messages in a mailbox.
1913574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki     */
1914574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    private int getMessageCount(long mailboxId) {
1915fab77f147f85766d2f75d8aece0aaa4ffb3838e8Marc Blank        return Utility.getFirstRowInt(mMockContext,
1916fab77f147f85766d2f75d8aece0aaa4ffb3838e8Marc Blank                ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
1917fab77f147f85766d2f75d8aece0aaa4ffb3838e8Marc Blank                new String[] {MailboxColumns.MESSAGE_COUNT}, null, null, null, 0);
1918574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    }
1919574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1920574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    /** Set -1 to the message count of all mailboxes for the recalculateMessageCount test. */
1921574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    private void setMinusOneToMessageCounts() {
1922574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        ContentValues values = new ContentValues();
1923574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        values.put(MailboxColumns.MESSAGE_COUNT, -1);
1924574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
19255b0c2c7f344e72915ac63ff45cf3d65885373a39Makoto Onuki        // EmailProvider.update() doesn't allow updating messageCount, so directly use the DB.
19265b0c2c7f344e72915ac63ff45cf3d65885373a39Makoto Onuki        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
19275b0c2c7f344e72915ac63ff45cf3d65885373a39Makoto Onuki        db.update(Mailbox.TABLE_NAME, values, null, null);
1928574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    }
1929574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1930574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    /**
1931833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     * Test for the message count triggers (insert/delete/move mailbox), and also
1932574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki     * {@link EmailProvider#recalculateMessageCount}.
1933833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     *
1934833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     * It also covers:
1935833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     * - {@link Mailbox#getMessageCountByMailboxType(Context, int)}
19362ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki     * - {@link Mailbox#getUnreadCountByAccountAndMailboxType(Context, long, int)}
1937833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     * - {@link Mailbox#getUnreadCountByMailboxType(Context, int)}
1938833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki     * - {@link Message#getFavoriteMessageCount(Context)}
19399c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki     * - {@link Message#getFavoriteMessageCount(Context, long)}
1940574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki     */
1941574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    public void testMessageCount() {
1942574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        final Context c = mMockContext;
1943574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1944574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Create 2 accounts
1945574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", true, c);
1946574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", true, c);
1947574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1948574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Create 2 mailboxes for each account
1949833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
1950833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a1.mId, true, c, Mailbox.TYPE_OUTBOX);
1951833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        Mailbox b3 = ProviderTestUtils.setupMailbox("box3", a2.mId, true, c, Mailbox.TYPE_INBOX);
1952833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        Mailbox b4 = ProviderTestUtils.setupMailbox("box4", a2.mId, true, c, Mailbox.TYPE_OUTBOX);
1953d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        Mailbox bt = ProviderTestUtils.setupMailbox("boxT", a2.mId, true, c, Mailbox.TYPE_TRASH);
1954574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1955574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // 0. Check the initial values, just in case.
1956574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1957574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b1.mId));
1958574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b2.mId));
1959574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b3.mId));
1960574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b4.mId));
1961d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(0, getMessageCount(bt.mId));
1962574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1963833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(0, Message.getFavoriteMessageCount(c));
19649c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        assertEquals(0, Message.getFavoriteMessageCount(c, a1.mId));
19659c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        assertEquals(0, Message.getFavoriteMessageCount(c, a2.mId));
1966833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByMailboxType(c, Mailbox.TYPE_INBOX));
1967833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByMailboxType(c, Mailbox.TYPE_OUTBOX));
1968833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(0, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_INBOX));
1969833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(0, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_OUTBOX));
1970d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(0, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_TRASH));
1971833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki
19722ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
19732ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a1.mId, Mailbox.TYPE_INBOX));
19742ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
19752ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a1.mId, Mailbox.TYPE_OUTBOX));
19762ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
1977d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki                a1.mId, Mailbox.TYPE_TRASH));
1978d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
19792ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a2.mId, Mailbox.TYPE_INBOX));
19802ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
19812ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a2.mId, Mailbox.TYPE_OUTBOX));
1982d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
1983d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki                a2.mId, Mailbox.TYPE_TRASH));
19842ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki
1985574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // 1. Test for insert triggers.
1986574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
1987574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Create some messages
19889c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        // b1 (account 1, inbox): 1 message, including 1 starred
1989543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m11 = createMessage(c, b1, true, false, Message.FLAG_LOADED_COMPLETE);
1990574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
19919c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        // b2 (account 1, outbox): 2 message, including 1 starred
1992543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m21 = createMessage(c, b2, false, false, Message.FLAG_LOADED_COMPLETE);
1993543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m22 = createMessage(c, b2, true, true, Message.FLAG_LOADED_COMPLETE);
1994574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
19959c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        // b3 (account 2, inbox): 3 message, including 1 starred
1996543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m31 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
1997543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m32 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
1998543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message m33 = createMessage(c, b3, true, true, Message.FLAG_LOADED_COMPLETE);
1999574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
20002ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        // b4 (account 2, outbox) has no messages.
2001574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2002d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        // bt (account 2, trash) has 3 messages, including 2 starred
2003543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message mt1 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
2004543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message mt2 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
2005543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message mt3 = createMessage(c, bt, false, false, Message.FLAG_LOADED_COMPLETE);
2006d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki
2007574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Check message counts
2008574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b1.mId));
2009574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(2, getMessageCount(b2.mId));
2010574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(3, getMessageCount(b3.mId));
2011574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b4.mId));
2012d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(3, getMessageCount(bt.mId));
2013574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2014833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        // Check the simple counting methods.
2015d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(3, Message.getFavoriteMessageCount(c)); // excludes starred in trash
20169c0da8b84f2e52b38134719fcbf80c9d3c777970Makoto Onuki        assertEquals(2, Message.getFavoriteMessageCount(c, a1.mId));
2017d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(1, Message.getFavoriteMessageCount(c, a2.mId)); // excludes starred in trash
2018833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(3, Mailbox.getUnreadCountByMailboxType(c, Mailbox.TYPE_INBOX));
2019833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(1, Mailbox.getUnreadCountByMailboxType(c, Mailbox.TYPE_OUTBOX));
2020833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(4, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_INBOX));
2021833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki        assertEquals(2, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_OUTBOX));
2022d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(3, Mailbox.getMessageCountByMailboxType(c, Mailbox.TYPE_TRASH));
2023833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki
20242ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(1, Mailbox.getUnreadCountByAccountAndMailboxType(c,
20252ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a1.mId, Mailbox.TYPE_INBOX));
20262ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(1, Mailbox.getUnreadCountByAccountAndMailboxType(c,
20272ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a1.mId, Mailbox.TYPE_OUTBOX));
2028d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
2029d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki                a1.mId, Mailbox.TYPE_TRASH));
20302ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(2, Mailbox.getUnreadCountByAccountAndMailboxType(c,
20312ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a2.mId, Mailbox.TYPE_INBOX));
20322ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
20332ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                a2.mId, Mailbox.TYPE_OUTBOX));
2034d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki        assertEquals(3, Mailbox.getUnreadCountByAccountAndMailboxType(c,
2035d072f9905d8572f454be1f2ea5d7ba173d2b57d1Makoto Onuki                a2.mId, Mailbox.TYPE_TRASH));
20362ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki
2037574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // 2. test for recalculateMessageCount.
2038574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2039574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // First, invalidate the message counts.
2040574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        setMinusOneToMessageCounts();
2041574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(-1, getMessageCount(b1.mId));
2042574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(-1, getMessageCount(b2.mId));
2043574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(-1, getMessageCount(b3.mId));
2044574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(-1, getMessageCount(b4.mId));
2045574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2046574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Batch update.
2047574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        SQLiteDatabase db = getProvider().getDatabase(mMockContext);
2048574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        EmailProvider.recalculateMessageCount(db);
2049574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2050574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Check message counts
2051574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b1.mId));
2052574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(2, getMessageCount(b2.mId));
2053574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(3, getMessageCount(b3.mId));
2054574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b4.mId));
2055574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2056574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // 3. Check the "move mailbox" trigger.
2057574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2058574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Move m32 (in mailbox 3) to mailbox 4.
2059574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        ContentValues values = new ContentValues();
2060574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        values.put(MessageColumns.MAILBOX_KEY, b4.mId);
2061574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2062574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        getProvider().update(Message.CONTENT_URI, values, EmailContent.ID_SELECTION,
2063574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki                new String[] {"" + m32.mId});
2064574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2065574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Check message counts
2066574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b1.mId));
2067574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(2, getMessageCount(b2.mId));
2068574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(2, getMessageCount(b3.mId));
2069574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b4.mId));
2070574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2071574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // 4. Check the delete trigger.
2072574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2073574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Delete m11 (in mailbox 1)
2074574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        getProvider().delete(Message.CONTENT_URI, EmailContent.ID_SELECTION,
2075574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki                new String[] {"" + m11.mId});
2076574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Delete m21 (in mailbox 2)
2077574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        getProvider().delete(Message.CONTENT_URI, EmailContent.ID_SELECTION,
2078574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki                new String[] {"" + m21.mId});
2079574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki
2080574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        // Check message counts
2081574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(0, getMessageCount(b1.mId));
2082574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b2.mId));
2083574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(2, getMessageCount(b3.mId));
2084574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki        assertEquals(1, getMessageCount(b4.mId));
2085d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki
2086d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        // No such mailbox type.
2087d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        assertEquals(0, Mailbox.getMessageCountByMailboxType(c, 99999));
20882ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c, a1.mId, 99999));
2089d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        assertEquals(0, Mailbox.getUnreadCountByMailboxType(c, 99999));
20902ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki
20912ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        // No such account
20922ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki        assertEquals(0, Mailbox.getUnreadCountByAccountAndMailboxType(c,
20932ac1eaf8c3f7122da7900f0ea5a1198264631d74Makoto Onuki                99999, Mailbox.TYPE_INBOX));
2094574854b528163f3bf1a7cb974aa80082d1768edfMakoto Onuki    }
2095833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki
2096833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki    private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read) {
2097543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        return ProviderTestUtils.setupMessage(
2098543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy                "1", b.mAccountKey, b.mId, true, true, c, starred, read);
2099543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy    }
2100543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy
2101543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy    private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read,
2102543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy            int flagLoaded) {
2103543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        Message message = ProviderTestUtils.setupMessage(
2104543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy                "1", b.mAccountKey, b.mId, true, false, c, starred, read);
2105543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        message.mFlagLoaded = flagLoaded;
2106543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        message.save(c);
2107543953ad87a12d251fcec82c57d00383225b4149Todd Kennedy        return message;
2108833fe73b99e62ad9cf6e80c782717c7de1ff12e4Makoto Onuki    }
21096d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki
21105247ab8cae802272b1e29e81d3b31a1c4e710da5Makoto Onuki    public void testAccountIsEasAccount() {
21116d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki        Account account = new Account();
211225144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        // No hostauth
21135247ab8cae802272b1e29e81d3b31a1c4e710da5Makoto Onuki        assertFalse(account.isEasAccount(mMockContext));
21146d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki
211525144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount(null, false);
211625144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("", false);
211725144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("x", false);
211825144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        checkAccountIsEasAccount("eas", true);
211925144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki    }
21206d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki
212125144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki    private void checkAccountIsEasAccount(String protocol, boolean expected) {
212225144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        Account account = ProviderTestUtils.setupAccount("account", false, mMockContext);
212325144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        account.mHostAuthRecv = ProviderTestUtils.setupHostAuth(protocol, "account-hostauth-recv",
212425144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki                account.mId, false, mMockContext);
212525144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        account.save(mMockContext);
212625144e2b7990c50bb3650faf1aec341837c05348Makoto Onuki        assertEquals(expected, account.isEasAccount(mMockContext));
21276d8bfa67c438ee18921d13d8bfba876aacaa9ff6Makoto Onuki    }
2128bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
2129bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    public void testGetKeyColumnLong() {
2130bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        final Context c = mMockContext;
2131bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Account a = ProviderTestUtils.setupAccount("acct", true, c);
2132bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a.mId, true, c, Mailbox.TYPE_MAIL);
2133bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a.mId, true, c, Mailbox.TYPE_MAIL);
2134bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m1 = createMessage(c, b1, false, false);
2135bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m2 = createMessage(c, b2, false, false);
2136bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.ACCOUNT_KEY));
2137bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(a.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.ACCOUNT_KEY));
2138bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b1.mId, Message.getKeyColumnLong(c, m1.mId, MessageColumns.MAILBOX_KEY));
2139bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        assertEquals(b2.mId, Message.getKeyColumnLong(c, m2.mId, MessageColumns.MAILBOX_KEY));
2140bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    }
2141bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank
2142aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    public void testGetAccountIdForMessageId() {
2143aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        final Context c = mMockContext;
2144aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", true, c);
2145aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
2146aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_MAIL);
2147aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a2.mId, true, c, Mailbox.TYPE_MAIL);
2148aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m1 = createMessage(c, b1, false, false);
2149aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        Message m2 = createMessage(c, b2, false, false);
2150aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2151aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a1.mId, Account.getAccountIdForMessageId(c, m1.mId));
2152aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(a2.mId, Account.getAccountIdForMessageId(c, m2.mId));
2153aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2154aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        // message desn't exist
2155aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki        assertEquals(-1, Account.getAccountIdForMessageId(c, 12345));
2156aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki    }
2157aef9515ee70f1f0b6cc4fa601078597b55831331Makoto Onuki
2158bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    public void testGetAccountMailboxFromMessageId() {
2159bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        final Context c = mMockContext;
2160bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Account a = ProviderTestUtils.setupAccount("acct", true, c);
2161bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a.mId, true, c, Mailbox.TYPE_MAIL);
2162bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a.mId, true, c, Mailbox.TYPE_MAIL);
2163bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m1 = createMessage(c, b1, false, false);
2164bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        Message m2 = createMessage(c, b2, false, false);
2165bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m1.mId));
2166bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        ProviderTestUtils.assertAccountEqual("x", a, Account.getAccountForMessageId(c, m2.mId));
2167bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        // Restore the mailboxes, since the unread & total counts will have changed
2168bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        b1 = Mailbox.restoreMailboxWithId(c, b1.mId);
2169bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        b2 = Mailbox.restoreMailboxWithId(c, b2.mId);
2170bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        ProviderTestUtils.assertMailboxEqual("x", b1, Mailbox.getMailboxForMessageId(c, m1.mId));
2171bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank        ProviderTestUtils.assertMailboxEqual("x", b2, Mailbox.getMailboxForMessageId(c, m2.mId));
2172bca4e6e70b53ca7db0ac14522f0d26a7b465cf24Marc Blank    }
2173e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2174e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testGetAccountGetInboxIdTest() {
2175e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final Context c = mMockContext;
2176e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2177e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Prepare some data with red-herrings.
2178e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", true, c);
2179e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", true, c);
2180e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b1i = ProviderTestUtils.setupMailbox("b1i", a1.mId, true, c, Mailbox.TYPE_INBOX);
2181e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b2a = ProviderTestUtils.setupMailbox("b2a", a2.mId, true, c, Mailbox.TYPE_MAIL);
2182e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox b2i = ProviderTestUtils.setupMailbox("b2b", a2.mId, true, c, Mailbox.TYPE_INBOX);
2183e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2184e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertEquals(b2i.mId, Account.getInboxId(c, a2.mId));
2185d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki
2186d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        // No account found.
2187d25d87c7ba8bbbbcad771695a7085f227bac8a1bMakoto Onuki        assertEquals(-1, Account.getInboxId(c, 999999));
2188e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
2189e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2190a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki    public void testGetMailboxType() {
2191a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        final Context c = mMockContext;
2192a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki
2193a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        Account a = ProviderTestUtils.setupAccount("acct1", true, c);
2194a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
2195a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        Mailbox bm = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_MAIL);
2196a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki
2197a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        assertEquals(Mailbox.TYPE_INBOX, Mailbox.getMailboxType(c, bi.mId));
2198a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        assertEquals(Mailbox.TYPE_MAIL, Mailbox.getMailboxType(c, bm.mId));
2199a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        assertEquals(-1, Mailbox.getMailboxType(c, 999999)); // mailbox not found
2200a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki    }
2201a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki
2202ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki    public void testGetDisplayName() {
2203ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        final Context c = mMockContext;
2204ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
2205ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Account a = ProviderTestUtils.setupAccount("acct1", true, c);
2206ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
2207ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Mailbox bm = ProviderTestUtils.setupMailbox("b2", a.mId, true, c, Mailbox.TYPE_MAIL);
2208ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
2209ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals("b1", Mailbox.getDisplayName(c, bi.mId));
2210ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals("b2", Mailbox.getDisplayName(c, bm.mId));
2211ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals(null, Mailbox.getDisplayName(c, 999999)); // mailbox not found
2212ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki    }
2213ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
2214e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testMailboxIsRefreshable() {
2215e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final Context c = mMockContext;
2216e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2217e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Account a = ProviderTestUtils.setupAccount("acct1", true, c);
2218e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
2219e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox bm = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_MAIL);
2220e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox bd = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_DRAFTS);
2221e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        Mailbox bo = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_OUTBOX);
2222e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2223e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(Mailbox.isRefreshable(c, bi.mId));
2224e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(Mailbox.isRefreshable(c, bm.mId));
2225e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(Mailbox.isRefreshable(c, bd.mId));
2226e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(Mailbox.isRefreshable(c, bo.mId));
2227e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2228e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // No such mailbox
2229a25aa613f79a94d0dea395234ba383de63d03727Makoto Onuki        assertFalse(Mailbox.isRefreshable(c, 9999999));
2230e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
2231e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Magic mailboxes can't be refreshed.
2232e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(Mailbox.isRefreshable(c, Mailbox.QUERY_ALL_DRAFTS));
2233e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(Mailbox.isRefreshable(c, Mailbox.QUERY_ALL_INBOXES));
2234e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
2235767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki
2236767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki    public void testMailboxCanMoveFrom() {
2237767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        final Context c = mMockContext;
2238767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki
2239767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        Account a = ProviderTestUtils.setupAccount("acct1", true, c);
2240767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
2241767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        Mailbox bm = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_MAIL);
2242767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        Mailbox bd = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_DRAFTS);
2243767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        Mailbox bo = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_OUTBOX);
2244767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki
2245767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        assertTrue(Mailbox.canMoveFrom(c, bi.mId));
2246767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        assertTrue(Mailbox.canMoveFrom(c, bm.mId));
2247767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        assertFalse(Mailbox.canMoveFrom(c, bd.mId));
2248767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki        assertFalse(Mailbox.canMoveFrom(c, bo.mId));
2249767f9fe2ebcca7eee20f2a048f33a96ad4bf53daMakoto Onuki    }
2250261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2251261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    /**
2252261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki     * Check if update to {@link Account#RESET_NEW_MESSAGE_COUNT_URI} resets the new message count.
2253261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki     */
2254261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    public void testResetNewMessageCount() {
2255261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        final Context c = mMockContext;
2256261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        final ContentResolver cr = c.getContentResolver();
2257261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2258261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // Prepare test data
2259261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("acct1", false, c);
2260261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a1.mNewMessageCount = 1;
2261261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a1.save(c);
2262261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("acct2", false, c);
2263261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a2.mNewMessageCount = 2;
2264261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a2.save(c);
2265261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a3 = ProviderTestUtils.setupAccount("acct3", false, c);
2266261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a3.mNewMessageCount = 3;
2267261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a3.save(c);
2268261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a4 = ProviderTestUtils.setupAccount("acct4", false, c);
2269261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a4.mNewMessageCount = 4;
2270261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a4.save(c);
2271261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        Account a5 = ProviderTestUtils.setupAccount("acct5", false, c);
2272261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a5.mNewMessageCount = 5;
2273261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        a5.save(c);
2274261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2275261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // With ID in URI, no selection
2276261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a1.mId),
2277261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                null, null, null);
2278261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
2279261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(2, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
2280261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(3, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
2281261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
2282261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
2283261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2284261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // No ID in URI, with selection
2285261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null,
2286261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                EmailContent.ID_SELECTION, new String[] {Long.toString(a2.mId)});
2287261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
2288261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
2289261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(3, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
2290261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
2291261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
2292261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2293261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // With ID, with selection
2294261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a3.mId), null,
2295261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki                EmailContent.ID_SELECTION, new String[] {Long.toString(a3.mId)});
2296261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
2297261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
2298261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
2299261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(4, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
2300261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(5, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
2301261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki
2302261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        // No ID in URI, no selection
2303261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        cr.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null, null, null);
2304261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
2305261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a2.mId).mNewMessageCount);
2306261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a3.mId).mNewMessageCount);
2307261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a4.mId).mNewMessageCount);
2308261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a5.mId).mNewMessageCount);
2309261d6c3f0c97a12256519a2c3b131a56e57ab45fMakoto Onuki    }
2310899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2311899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki    private static Message createMessageWithTimestamp(Context c, Mailbox b, long timestamp) {
2312899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Message m = ProviderTestUtils.setupMessage("1", b.mAccountKey, b.mId, true, false, c, false,
2313899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki                false);
2314899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        m.mTimeStamp = timestamp;
2315899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        m.save(c);
2316899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        return m;
2317899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki    }
2318899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
23196f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki    public void testMessageGetLatestIncomingMessage() {
2320899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        final Context c = mMockContext;
2321899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2322899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        // Create 2 accounts with a inbox.
2323899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
2324899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Account a2 = ProviderTestUtils.setupAccount("a2", true, c);
2325899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2326899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
23276f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Mailbox b1d = ProviderTestUtils.setupMailbox("box1d", a1.mId, true, c, Mailbox.TYPE_DRAFTS);
23286f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Mailbox b1o = ProviderTestUtils.setupMailbox("box1o", a1.mId, true, c, Mailbox.TYPE_OUTBOX);
23296f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Mailbox b1s = ProviderTestUtils.setupMailbox("box1s", a1.mId, true, c, Mailbox.TYPE_SENT);
23306f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a2.mId, true, c, Mailbox.TYPE_MAIL);
2331899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2332899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        // Create some messages
2333899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Message m11 = createMessageWithTimestamp(c, b1, 33);
2334899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Message m12 = createMessageWithTimestamp(c, b1, 10);
23356f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Message m13 = createMessageWithTimestamp(c, b1, 1000); // latest incoming
23366f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Message m1d = createMessageWithTimestamp(c, b1d, 2000);
23376f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Message m1o = createMessageWithTimestamp(c, b1o, 2000);
23386f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Message m1s = createMessageWithTimestamp(c, b1s, 2000);
2339899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
23406f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        Message m21 = createMessageWithTimestamp(c, b2, 99); // latest incoming
2341899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Message m22 = createMessageWithTimestamp(c, b2, 1);
2342899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        Message m23 = createMessageWithTimestamp(c, b2, 2);
2343899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2344899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        // Check!
23456f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        assertEquals(m13.mId, Message.getLatestIncomingMessage(c, a1.mId).mId);
23466f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        assertEquals(m21.mId, Message.getLatestIncomingMessage(c, a2.mId).mId);
2347899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki
2348899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki        // No such account
23496f3d167cfa948d20153c2172c34cbede5ec83a1dMakoto Onuki        assertEquals(null, Message.getLatestIncomingMessage(c, 9999999L));
2350899c5b866192a4c4a12413446d10e5d98dbf94faMakoto Onuki    }
23519d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23529d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
23539d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_ID_ADD_TO_FIELD updates the cache properly.
23549d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
23559d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountIdAddToField() {
23569d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
23579d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
23589d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23599d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        int start = Account.restoreAccountWithId(c, a1.mId).mNewMessageCount;
23609d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23619d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // +1 to NEW_MESSAGE_COUNT
23629d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        ContentValues cv = new ContentValues();
23639d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.FIELD_COLUMN_NAME, AccountColumns.NEW_MESSAGE_COUNT);
23649d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.ADD_COLUMN_NAME, 1);
23659d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(ContentUris.withAppendedId(Account.ADD_TO_FIELD_URI, a1.mId), cv,
23669d5aaeacd6b222877f25924818317c9153708261Makoto Onuki                null, null);
23679d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23689d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
23699d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(start + 1, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
23709d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
23719d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23729d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
23739d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_RESET_NEW_COUNT updates the cache properly.
23749d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
23759d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountResetNewCount() {
23769d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
23779d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
23789d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23799d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // precondition
23809d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertTrue(Account.restoreAccountWithId(c, a1.mId).mNewMessageCount > 0);
23819d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23829d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Reset
23839d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(Account.RESET_NEW_MESSAGE_COUNT_URI, null, null, null);
23849d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23859d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
23869d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
23879d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
23889d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23899d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
23909d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on ACCOUNT_RESET_NEW_COUNT_ID updates the cache properly.
23919d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
23929d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheAccountResetNewCountId() {
23939d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
23949d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
23959d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23969d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // precondition
23979d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertTrue(Account.restoreAccountWithId(c, a1.mId).mNewMessageCount > 0);
23989d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
23999d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Reset
24009d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(ContentUris.withAppendedId(Account.RESET_NEW_MESSAGE_COUNT_URI, a1.mId),
24019d5aaeacd6b222877f25924818317c9153708261Makoto Onuki                null, null, null);
24029d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
24039d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
24049d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(0, Account.restoreAccountWithId(c, a1.mId).mNewMessageCount);
24059d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
24069d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
24079d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    /**
24089d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     * Check if update on MAILBOX_ID_ADD_TO_FIELD updates the cache properly.
24099d5aaeacd6b222877f25924818317c9153708261Makoto Onuki     */
24109d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    public void testUpdateCacheMailboxIdAddToField() {
24119d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        final Context c = mMockContext;
24129d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Account a1 = ProviderTestUtils.setupAccount("a1", true, c);
24139d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
24149d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
24159d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        int start = Mailbox.restoreMailboxWithId(c, b1.mId).mSyncInterval;
24169d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
24179d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // +1 to SYNC_INTERVAL
24189d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        ContentValues cv = new ContentValues();
24199d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.FIELD_COLUMN_NAME, MailboxColumns.SYNC_INTERVAL);
24209d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        cv.put(EmailContent.ADD_COLUMN_NAME, 1);
24219d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        mProvider.update(ContentUris.withAppendedId(Mailbox.ADD_TO_FIELD_URI, a1.mId), cv,
24229d5aaeacd6b222877f25924818317c9153708261Makoto Onuki                null, null);
24239d5aaeacd6b222877f25924818317c9153708261Makoto Onuki
24249d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        // Check
24259d5aaeacd6b222877f25924818317c9153708261Makoto Onuki        assertEquals(start + 1, Mailbox.restoreMailboxWithId(c, b1.mId).mSyncInterval);
24269d5aaeacd6b222877f25924818317c9153708261Makoto Onuki    }
2427d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank
2428d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    /**
2429d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * Check that we're handling illegal uri's properly (by throwing an exception unless it's a
2430d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     * query for an id of -1, in which case we return a zero-length cursor)
2431d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank     */
2432d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    public void testIllegalUri() {
2433d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        final ContentResolver cr = mMockContext.getContentResolver();
2434d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank
2435d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        ContentValues cv = new ContentValues();
2436d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Uri uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/fooble");
2437d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2438d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.insert(uri, cv);
2439d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Insert should have thrown exception");
2440d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2441d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2442d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2443d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.update(uri, cv, null, null);
2444d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Update should have thrown exception");
2445d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2446d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2447d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2448d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.delete(uri, null, null);
2449d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Delete should have thrown exception");
2450d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2451d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2452d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2453d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2454d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2455d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2456d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2457d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/fred");
2458d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        try {
2459d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2460d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank            fail("Query should have thrown exception");
2461d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        } catch (IllegalArgumentException e) {
2462d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        }
2463d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        uri = Uri.parse("content://" + EmailContent.AUTHORITY + "/mailbox/-1");
2464d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        Cursor c = cr.query(uri, EmailContent.ID_PROJECTION, null, null, null);
2465d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertNotNull(c);
2466d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        assertEquals(0, c.getCount());
2467d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank        c.close();
2468d306ba34387f3a7e77a4b8d98c6ac45cc14b95adMarc Blank    }
24697143d969dde180b7a44bdc42ade6ca2878d0760dAndrew Stadler}
2470