1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.emailcommon.provider;
18 
19 import android.content.ContentUris;
20 import android.content.ContentValues;
21 import android.content.Context;
22 import android.net.Uri;
23 import android.os.Parcel;
24 import android.test.MoreAsserts;
25 import android.test.ProviderTestCase2;
26 import android.test.suitebuilder.annotation.SmallTest;
27 import android.test.suitebuilder.annotation.Suppress;
28 
29 import com.android.email.provider.ContentCache;
30 import com.android.email.provider.EmailProvider;
31 import com.android.email.provider.ProviderTestUtils;
32 import com.android.emailcommon.provider.EmailContent.MailboxColumns;
33 import com.android.emailcommon.provider.EmailContent.Message;
34 import com.android.emailcommon.provider.EmailContent.MessageColumns;
35 import com.android.emailcommon.utility.Utility;
36 
37 import java.util.Arrays;
38 
39 /**
40  * Unit tests for the Mailbox inner class.
41  * These tests must be locally complete - no server(s) required.
42  */
43 @Suppress
44 @SmallTest
45 public class MailboxTests extends ProviderTestCase2<EmailProvider> {
46     private static final String TEST_DISPLAY_NAME = "display-name";
47     private static final String TEST_PARENT_SERVER_ID = "parent-server-id";
48     private static final String TEST_SERVER_ID = "server-id";
49     private static final String TEST_SYNC_KEY = "sync-key";
50     private static final String TEST_SYNC_STATUS = "sync-status";
51 
52     private Context mMockContext;
53     private EmailProvider mProvider;
54 
MailboxTests()55     public MailboxTests() {
56         super(EmailProvider.class, EmailContent.AUTHORITY);
57     }
58 
59     @Override
setUp()60     public void setUp() throws Exception {
61         super.setUp();
62         mMockContext = getMockContext();
63         mProvider = getProvider();
64         // Invalidate all caches, since we reset the database for each test
65         ContentCache.invalidateAllCaches();
66     }
67 
68     //////////////////////////////////////////////////////////
69     ////// Utility methods
70     //////////////////////////////////////////////////////////
71 
72     /** Returns the number of messages in a mailbox. */
getMessageCount(long mailboxId)73     private int getMessageCount(long mailboxId) {
74         return Utility.getFirstRowInt(mMockContext,
75                 ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
76                 new String[] {MailboxColumns.MESSAGE_COUNT}, null, null, null, 0);
77     }
78 
79     /** Creates a new message. */
createMessage(Context c, Mailbox b, boolean starred, boolean read, int flagLoaded)80     private static Message createMessage(Context c, Mailbox b, boolean starred, boolean read,
81             int flagLoaded) {
82         Message message = ProviderTestUtils.setupMessage(
83                 "1", b.mAccountKey, b.mId, true, false, c, starred, read);
84         message.mFlagLoaded = flagLoaded;
85         message.save(c);
86         return message;
87     }
88 
89     //////////////////////////////////////////////////////////
90     ////// The tests
91     //////////////////////////////////////////////////////////
92 
93     /**
94      * Test simple mailbox save/retrieve
95      */
testSave()96     public void testSave() {
97         final Context c = mMockContext;
98 
99         Account account1 = ProviderTestUtils.setupAccount("mailbox-save", true, c);
100         long account1Id = account1.mId;
101         Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, c);
102         long box1Id = box1.mId;
103 
104         Mailbox box2 = Mailbox.restoreMailboxWithId(c, box1Id);
105 
106         ProviderTestUtils.assertMailboxEqual("testMailboxSave", box1, box2);
107     }
108 
109     /**
110      * Test delete mailbox
111      */
testDelete()112     public void testDelete() {
113         final Context c = mMockContext;
114 
115         Account account1 = ProviderTestUtils.setupAccount("mailbox-delete", true, c);
116         long account1Id = account1.mId;
117         Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, c);
118         long box1Id = box1.mId;
119         Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, true, c);
120         long box2Id = box2.mId;
121 
122         String selection = EmailContent.MailboxColumns.ACCOUNT_KEY + "=?";
123         String[] selArgs = new String[] { String.valueOf(account1Id) };
124 
125         // make sure there are two mailboxes
126         int numBoxes = EmailContent.count(c, Mailbox.CONTENT_URI, selection, selArgs);
127         assertEquals(2, numBoxes);
128 
129         // now delete one of them
130         Uri uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box1Id);
131         c.getContentResolver().delete(uri, null, null);
132 
133         // make sure there's only one mailbox now
134         numBoxes = EmailContent.count(c, Mailbox.CONTENT_URI, selection, selArgs);
135         assertEquals(1, numBoxes);
136 
137         // now delete the other one
138         uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, box2Id);
139         c.getContentResolver().delete(uri, null, null);
140 
141         // make sure there are no mailboxes now
142         numBoxes = EmailContent.count(c, Mailbox.CONTENT_URI, selection, selArgs);
143         assertEquals(0, numBoxes);
144     }
145 
testGetMailboxType()146     public void testGetMailboxType() {
147         final Context c = mMockContext;
148 
149         Account a = ProviderTestUtils.setupAccount("acct1", true, c);
150         Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
151         Mailbox bm = ProviderTestUtils.setupMailbox("b2", a.mId, true, c, Mailbox.TYPE_MAIL);
152 
153         assertEquals(Mailbox.TYPE_INBOX, Mailbox.getMailboxType(c, bi.mId));
154         assertEquals(Mailbox.TYPE_MAIL, Mailbox.getMailboxType(c, bm.mId));
155         assertEquals(-1, Mailbox.getMailboxType(c, 999999)); // mailbox not found
156     }
157 
testGetDisplayName()158     public void testGetDisplayName() {
159         final Context c = mMockContext;
160 
161         Account a = ProviderTestUtils.setupAccount("acct1", true, c);
162         Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
163         Mailbox bm = ProviderTestUtils.setupMailbox("b2", a.mId, true, c, Mailbox.TYPE_MAIL);
164 
165         assertEquals("b1", Mailbox.getDisplayName(c, bi.mId));
166         assertEquals("b2", Mailbox.getDisplayName(c, bm.mId));
167         assertEquals(null, Mailbox.getDisplayName(c, 999999)); // mailbox not found
168     }
169 
testIsRefreshable()170     public void testIsRefreshable() {
171         final Context c = mMockContext;
172 
173         Account a = ProviderTestUtils.setupAccount("acct1", true, c);
174         Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
175         Mailbox bm = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_MAIL);
176         Mailbox bd = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_DRAFTS);
177         Mailbox bo = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_OUTBOX);
178 
179         assertTrue(Mailbox.isRefreshable(c, bi.mId));
180         assertTrue(Mailbox.isRefreshable(c, bm.mId));
181         assertFalse(Mailbox.isRefreshable(c, bd.mId));
182         assertFalse(Mailbox.isRefreshable(c, bo.mId));
183 
184         // No such mailbox
185         assertFalse(Mailbox.isRefreshable(c, 9999999));
186 
187         // Magic mailboxes can't be refreshed.
188         assertFalse(Mailbox.isRefreshable(c, Mailbox.QUERY_ALL_DRAFTS));
189         assertFalse(Mailbox.isRefreshable(c, Mailbox.QUERY_ALL_INBOXES));
190     }
191 
testCanMoveFrom()192     public void testCanMoveFrom() {
193         final Context c = mMockContext;
194 
195         Account a = ProviderTestUtils.setupAccount("acct1", true, c);
196         Mailbox bi = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_INBOX);
197         Mailbox bm = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_MAIL);
198         Mailbox bd = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_DRAFTS);
199         Mailbox bo = ProviderTestUtils.setupMailbox("b1", a.mId, true, c, Mailbox.TYPE_OUTBOX);
200 
201         assertTrue(bi.canHaveMessagesMoved());
202         assertTrue(bm.canHaveMessagesMoved());
203         assertFalse(bd.canHaveMessagesMoved());
204         assertFalse(bo.canHaveMessagesMoved());
205     }
206 
testGetMailboxForMessageId()207     public void testGetMailboxForMessageId() {
208         final Context c = mMockContext;
209         Mailbox b1 = ProviderTestUtils.setupMailbox("box1", 1, true, c, Mailbox.TYPE_MAIL);
210         Mailbox b2 = ProviderTestUtils.setupMailbox("box2", 1, true, c, Mailbox.TYPE_MAIL);
211         Message m1 = ProviderTestUtils.setupMessage("1", b1.mAccountKey, b1.mId,
212                 true, true, c, false, false);
213         Message m2 = ProviderTestUtils.setupMessage("1", b2.mAccountKey, b2.mId,
214                 true, true, c, false, false);
215         ProviderTestUtils.assertMailboxEqual("x", b1, Mailbox.getMailboxForMessageId(c, m1.mId));
216         ProviderTestUtils.assertMailboxEqual("x", b2, Mailbox.getMailboxForMessageId(c, m2.mId));
217     }
218 
testRestoreMailboxWithId()219     public void testRestoreMailboxWithId() {
220         final Context c = mMockContext;
221         Mailbox testMailbox;
222 
223         testMailbox = ProviderTestUtils.setupMailbox("box1", 1, true, c, Mailbox.TYPE_MAIL);
224         ProviderTestUtils.assertMailboxEqual(
225                 "x", testMailbox, Mailbox.restoreMailboxWithId(c, testMailbox.mId));
226         testMailbox = ProviderTestUtils.setupMailbox("box2", 1, true, c, Mailbox.TYPE_MAIL);
227         ProviderTestUtils.assertMailboxEqual(
228                 "x", testMailbox, Mailbox.restoreMailboxWithId(c, testMailbox.mId));
229         // Unknown IDs
230         assertNull(Mailbox.restoreMailboxWithId(c, 8));
231         assertNull(Mailbox.restoreMailboxWithId(c, -1));
232         assertNull(Mailbox.restoreMailboxWithId(c, Long.MAX_VALUE));
233     }
234 
testRestoreMailboxForPath()235     public void testRestoreMailboxForPath() {
236         final Context c = mMockContext;
237         Mailbox testMailbox;
238         testMailbox = ProviderTestUtils.setupMailbox("a/b/c/box", 1, true, c, Mailbox.TYPE_MAIL);
239         ProviderTestUtils.assertMailboxEqual(
240                 "x", testMailbox, Mailbox.restoreMailboxForPath(c, 1, "a/b/c/box"));
241         // Same name, different account; no match
242         assertNull(Mailbox.restoreMailboxForPath(c, 2, "a/b/c/box"));
243         // Substring; no match
244         assertNull(Mailbox.restoreMailboxForPath(c, 1, "a/b/c"));
245         // Wild cards not supported; no match
246         assertNull(Mailbox.restoreMailboxForPath(c, 1, "a/b/c/%"));
247     }
248 
testFindMailboxOfType()249     public void testFindMailboxOfType() {
250         final Context context = mMockContext;
251 
252         // Create two accounts and a variety of mailbox types
253         Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
254         Mailbox acct1Inbox =
255             ProviderTestUtils.setupMailbox("Inbox1", acct1.mId, true, context, Mailbox.TYPE_INBOX);
256         Mailbox acct1Calendar =
257             ProviderTestUtils.setupMailbox("Cal1", acct1.mId, true, context, Mailbox.TYPE_CALENDAR);
258         Mailbox acct1Contacts =
259             ProviderTestUtils.setupMailbox("Con1", acct1.mId, true, context, Mailbox.TYPE_CONTACTS);
260         Account acct2 = ProviderTestUtils.setupAccount("acct1", true, context);
261         Mailbox acct2Inbox =
262             ProviderTestUtils.setupMailbox("Inbox2", acct2.mId, true, context, Mailbox.TYPE_INBOX);
263         Mailbox acct2Calendar =
264             ProviderTestUtils.setupMailbox("Cal2", acct2.mId, true, context, Mailbox.TYPE_CALENDAR);
265         Mailbox acct2Contacts =
266             ProviderTestUtils.setupMailbox("Con2", acct2.mId, true, context, Mailbox.TYPE_CONTACTS);
267 
268         // Check that we can find them by type
269         assertEquals(acct1Inbox.mId,
270                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
271         assertEquals(acct2Inbox.mId,
272                 Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_INBOX));
273         assertEquals(acct1Calendar.mId,
274                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
275         assertEquals(acct2Calendar.mId,
276                 Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_CALENDAR));
277         assertEquals(acct1Contacts.mId,
278                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
279         assertEquals(acct2Contacts.mId,
280                 Mailbox.findMailboxOfType(context, acct2.mId, Mailbox.TYPE_CONTACTS));
281 
282         // Check that nonexistent mailboxes are not returned
283         assertEquals(Mailbox.NO_MAILBOX,
284                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_DRAFTS));
285         assertEquals(Mailbox.NO_MAILBOX,
286                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_OUTBOX));
287 
288         // delete account 1 and confirm no mailboxes are returned
289         context.getContentResolver().delete(
290                 ContentUris.withAppendedId(Account.CONTENT_URI, acct1.mId), null, null);
291         assertEquals(Mailbox.NO_MAILBOX,
292                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
293         assertEquals(Mailbox.NO_MAILBOX,
294                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
295         assertEquals(Mailbox.NO_MAILBOX,
296                 Mailbox.findMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
297     }
298 
testRestoreMailboxOfType()299     public void testRestoreMailboxOfType() {
300         final Context context = getMockContext();
301 
302         // Create two accounts and a variety of mailbox types
303         Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
304         Mailbox acct1Inbox =
305             ProviderTestUtils.setupMailbox("Inbox1", acct1.mId, true, context, Mailbox.TYPE_INBOX);
306         Mailbox acct1Calendar =
307             ProviderTestUtils.setupMailbox("Cal1", acct1.mId, true, context, Mailbox.TYPE_CALENDAR);
308         Mailbox acct1Contacts =
309             ProviderTestUtils.setupMailbox("Con1", acct1.mId, true, context, Mailbox.TYPE_CONTACTS);
310         Account acct2 =ProviderTestUtils.setupAccount("acct1", true, context);
311         Mailbox acct2Inbox =
312             ProviderTestUtils.setupMailbox("Inbox2", acct2.mId, true, context, Mailbox.TYPE_INBOX);
313         Mailbox acct2Calendar =
314             ProviderTestUtils.setupMailbox("Cal2", acct2.mId, true, context, Mailbox.TYPE_CALENDAR);
315         Mailbox acct2Contacts =
316             ProviderTestUtils.setupMailbox("Con2", acct2.mId, true, context, Mailbox.TYPE_CONTACTS);
317 
318         // Check that we can find them by type
319         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Inbox,
320                 Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_INBOX));
321         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Inbox,
322                 Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_INBOX));
323         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Calendar,
324                 Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_CALENDAR));
325         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Calendar,
326                 Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_CALENDAR));
327         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct1Contacts,
328                 Mailbox.restoreMailboxOfType(context, acct1.mId, Mailbox.TYPE_CONTACTS));
329         ProviderTestUtils.assertMailboxEqual("testRestoreMailboxOfType", acct2Contacts,
330                 Mailbox.restoreMailboxOfType(context, acct2.mId, Mailbox.TYPE_CONTACTS));
331     }
332 
333     /**
334      * Test for the message count triggers (insert/delete/move mailbox), and also
335      * {@link EmailProvider#recalculateMessageCount}.
336      *
337      * It also covers:
338      * - {@link Message#getFavoriteMessageCount(Context)}
339      * - {@link Message#getFavoriteMessageCount(Context, long)}
340      */
testMessageCount()341     public void testMessageCount() {
342         final Context c = mMockContext;
343 
344         // Create 2 accounts
345         Account a1 = ProviderTestUtils.setupAccount("holdflag-1", true, c);
346         Account a2 = ProviderTestUtils.setupAccount("holdflag-2", true, c);
347 
348         // Create 2 mailboxes for each account
349         Mailbox b1 = ProviderTestUtils.setupMailbox("box1", a1.mId, true, c, Mailbox.TYPE_INBOX);
350         Mailbox b2 = ProviderTestUtils.setupMailbox("box2", a1.mId, true, c, Mailbox.TYPE_OUTBOX);
351         Mailbox b3 = ProviderTestUtils.setupMailbox("box3", a2.mId, true, c, Mailbox.TYPE_INBOX);
352         Mailbox b4 = ProviderTestUtils.setupMailbox("box4", a2.mId, true, c, Mailbox.TYPE_OUTBOX);
353         Mailbox bt = ProviderTestUtils.setupMailbox("boxT", a2.mId, true, c, Mailbox.TYPE_TRASH);
354 
355         // 0. Check the initial values, just in case.
356 
357         assertEquals(0, getMessageCount(b1.mId));
358         assertEquals(0, getMessageCount(b2.mId));
359         assertEquals(0, getMessageCount(b3.mId));
360         assertEquals(0, getMessageCount(b4.mId));
361         assertEquals(0, getMessageCount(bt.mId));
362 
363         assertEquals(0, Message.getFavoriteMessageCount(c));
364         assertEquals(0, Message.getFavoriteMessageCount(c, a1.mId));
365         assertEquals(0, Message.getFavoriteMessageCount(c, a2.mId));
366 
367         // 1. Test for insert triggers.
368 
369         // Create some messages
370         // b1 (account 1, inbox): 1 message, including 1 starred
371         Message m11 = createMessage(c, b1, true, false, Message.FLAG_LOADED_COMPLETE);
372 
373         // b2 (account 1, outbox): 2 message, including 1 starred
374         Message m21 = createMessage(c, b2, false, false, Message.FLAG_LOADED_COMPLETE);
375         Message m22 = createMessage(c, b2, true, true, Message.FLAG_LOADED_COMPLETE);
376 
377         // b3 (account 2, inbox): 3 message, including 1 starred
378         Message m31 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
379         Message m32 = createMessage(c, b3, false, false, Message.FLAG_LOADED_COMPLETE);
380         Message m33 = createMessage(c, b3, true, true, Message.FLAG_LOADED_COMPLETE);
381 
382         // b4 (account 2, outbox) has no messages.
383 
384         // bt (account 2, trash) has 3 messages, including 2 starred
385         Message mt1 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
386         Message mt2 = createMessage(c, bt, true, false, Message.FLAG_LOADED_COMPLETE);
387         Message mt3 = createMessage(c, bt, false, false, Message.FLAG_LOADED_COMPLETE);
388 
389         // Check message counts
390         assertEquals(1, getMessageCount(b1.mId));
391         assertEquals(2, getMessageCount(b2.mId));
392         assertEquals(3, getMessageCount(b3.mId));
393         assertEquals(0, getMessageCount(b4.mId));
394         assertEquals(3, getMessageCount(bt.mId));
395 
396         // Check the simple counting methods.
397         assertEquals(3, Message.getFavoriteMessageCount(c)); // excludes starred in trash
398         assertEquals(2, Message.getFavoriteMessageCount(c, a1.mId));
399         assertEquals(1, Message.getFavoriteMessageCount(c, a2.mId)); // excludes starred in trash
400 
401         // 2. Check the "move mailbox" trigger.
402 
403         // Move m32 (in mailbox 3) to mailbox 4.
404         ContentValues values = new ContentValues();
405         values.put(MessageColumns.MAILBOX_KEY, b4.mId);
406 
407         getProvider().update(Message.CONTENT_URI, values, EmailContent.ID_SELECTION,
408                 new String[] {"" + m32.mId});
409 
410         // Check message counts
411         assertEquals(1, getMessageCount(b1.mId));
412         assertEquals(2, getMessageCount(b2.mId));
413         assertEquals(2, getMessageCount(b3.mId));
414         assertEquals(1, getMessageCount(b4.mId));
415 
416         // 3. Check the delete trigger.
417 
418         // Delete m11 (in mailbox 1)
419         getProvider().delete(Message.CONTENT_URI, EmailContent.ID_SELECTION,
420                 new String[] {"" + m11.mId});
421         // Delete m21 (in mailbox 2)
422         getProvider().delete(Message.CONTENT_URI, EmailContent.ID_SELECTION,
423                 new String[] {"" + m21.mId});
424 
425         // Check message counts
426         assertEquals(0, getMessageCount(b1.mId));
427         assertEquals(1, getMessageCount(b2.mId));
428         assertEquals(2, getMessageCount(b3.mId));
429         assertEquals(1, getMessageCount(b4.mId));
430     }
431 
buildTestMailbox(String serverId)432     private Mailbox buildTestMailbox(String serverId) {
433         return buildTestMailbox(serverId, null);
434     }
435 
buildTestMailbox(String serverId, String name)436     private Mailbox buildTestMailbox(String serverId, String name) {
437         Mailbox testMailbox = new Mailbox();
438         testMailbox.mServerId = serverId;
439         testMailbox.mDisplayName = (name == null) ? TEST_DISPLAY_NAME : name;
440         testMailbox.mParentServerId = TEST_PARENT_SERVER_ID;
441         testMailbox.mSyncKey = TEST_SYNC_KEY;
442         testMailbox.mSyncStatus = TEST_SYNC_STATUS;
443         testMailbox.mAccountKey = 1L;
444         testMailbox.mDelimiter = '/';
445         testMailbox.mFlags = 2;
446         testMailbox.mFlagVisible = true;
447         testMailbox.mParentKey = 3L;
448         testMailbox.mSyncInterval = 4;
449         testMailbox.mSyncLookback = 5;
450         testMailbox.mSyncTime = 6L;
451         testMailbox.mType = 7;
452         testMailbox.mLastTouchedTime = 10L;
453 
454         return testMailbox;
455     }
456 
testGetHashes()457     public void testGetHashes() {
458         final Context c = mMockContext;
459         Mailbox testMailbox = buildTestMailbox(TEST_SERVER_ID);
460         testMailbox.save(c);
461 
462         Object[] testHash;
463         testHash = new Object[] {
464                 testMailbox.mId, TEST_DISPLAY_NAME, TEST_SERVER_ID,
465                 TEST_PARENT_SERVER_ID, 1L /*mAccountKey*/, 7 /*mType */,
466                 (int)'/' /*mDelimiter */, TEST_SYNC_KEY, 5 /*mSyncLookback*/,
467                 4 /*mSyncInterval*/,  6L /*mSyncTime*/, true /*mFlagVisible*/, 2 /*mFlags*/,
468                 8 /*mVisibleLimit*/, TEST_SYNC_STATUS, 3L /*mParentKey*/, 9L /*mLastSeen*/,
469                 10L /*mLastTouchedTime*/,
470         };
471         MoreAsserts.assertEquals(testHash, testMailbox.getHashes());
472 
473         // Verify null checks happen correctly
474         testMailbox.mDisplayName = null;
475         testMailbox.mParentServerId = null;
476         testMailbox.mServerId = null;
477         testMailbox.mSyncKey = null;
478         testMailbox.mSyncStatus = null;
479         testMailbox.mFlagVisible = false;
480 
481         testHash = new Object[] {
482                 testMailbox.mId, null /*mDisplayname*/, null /*mServerId*/,
483                 null /*mParentServerId*/, 1L /*mAccountKey*/, 7 /*mType */,
484                 (int)'/' /*mDelimiter */, null /*mSyncKey*/, 5 /*mSyncLookback*/,
485                 4 /*mSyncInterval*/,  6L /*mSyncTime*/, false /*mFlagVisible*/, 2 /*mFlags*/,
486                 8 /*mVisibleLimit*/, null /*mSyncStatus*/, 3L /*mParentKey*/, 9L /*mLastSeen*/,
487                 10L /*mLastTouchedTime*/,
488         };
489         MoreAsserts.assertEquals(testHash, testMailbox.getHashes());
490     }
491 
testParcelling()492     public void testParcelling() {
493         Mailbox original = buildTestMailbox("serverId", "display name for mailbox");
494 
495         Parcel p = Parcel.obtain();
496         original.writeToParcel(p, 0 /* flags */);
497 
498         // Reset.
499         p.setDataPosition(0);
500 
501         Mailbox unparcelled = Mailbox.CREATOR.createFromParcel(p);
502         MoreAsserts.assertEquals(original.getHashes(), unparcelled.getHashes());
503 
504         Mailbox phony = buildTestMailbox("different ID", "display name for mailbox");
505         assertFalse(Arrays.equals(phony.getHashes(), unparcelled.getHashes()));
506 
507         p.recycle();
508     }
509 
testParcellingWithPartialMailbox()510     public void testParcellingWithPartialMailbox() {
511         Mailbox unpopulated = new Mailbox();
512         unpopulated.mDisplayName = "the only thing filled in for some reason";
513 
514         Parcel p = Parcel.obtain();
515         unpopulated.writeToParcel(p, 0 /* flags */);
516 
517         // Reset.
518         p.setDataPosition(0);
519 
520         Mailbox unparcelled = Mailbox.CREATOR.createFromParcel(p);
521         MoreAsserts.assertEquals(unpopulated.getHashes(), unparcelled.getHashes());
522 
523         p.recycle();
524     }
525 }
526 
527