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 17package com.android.email.activity; 18 19import android.content.ContentValues; 20import android.content.Context; 21import android.test.AndroidTestCase; 22import android.test.suitebuilder.annotation.MediumTest; 23 24import com.android.email.Controller; 25import com.android.email.DBTestHelper; 26import com.android.email.MockClock; 27import com.android.email.provider.ContentCache; 28import com.android.email.provider.ProviderTestUtils; 29import com.android.emailcommon.provider.EmailContent.MailboxColumns; 30import com.android.emailcommon.provider.Mailbox; 31 32import java.util.ArrayList; 33import java.util.HashSet; 34import java.util.Set; 35 36/** 37 * Tests for the recent mailbox manager. 38 * 39 * You can run this entire test case with: 40 * runtest -c com.android.email.activity.RecentMailboxManagerTest email 41 */ 42@MediumTest 43public class RecentMailboxManagerTest extends AndroidTestCase { 44 45 private Context mMockContext; 46 private MockClock mMockClock; 47 private RecentMailboxManager mManager; 48 private Mailbox[] mMailboxArray; 49 50 public RecentMailboxManagerTest() { 51 } 52 53 @Override 54 public void setUp() throws Exception { 55 super.setUp(); 56 mMockContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext( 57 getContext()); 58 mMockClock = new MockClock(); 59 RecentMailboxManager.sClock = mMockClock; 60 mManager = RecentMailboxManager.getInstance(mMockContext); 61 Controller.getInstance(mMockContext).setProviderContext(mMockContext); 62 mMailboxArray = new Mailbox[] { 63 ProviderTestUtils.setupMailbox("inbox", 1L, true, mMockContext, Mailbox.TYPE_INBOX), 64 ProviderTestUtils.setupMailbox("drafts", 1L, true, mMockContext, Mailbox.TYPE_DRAFTS), 65 ProviderTestUtils.setupMailbox("outbox", 1L, true, mMockContext, Mailbox.TYPE_OUTBOX), 66 ProviderTestUtils.setupMailbox("sent", 1L, true, mMockContext, Mailbox.TYPE_SENT), 67 ProviderTestUtils.setupMailbox("trash", 1L, true, mMockContext, Mailbox.TYPE_TRASH), 68 ProviderTestUtils.setupMailbox("junk", 1L, true, mMockContext, Mailbox.TYPE_JUNK), 69 ProviderTestUtils.setupMailbox("abbott", 1L, true, mMockContext, Mailbox.TYPE_MAIL), 70 ProviderTestUtils.setupMailbox("costello", 1L, true, mMockContext, Mailbox.TYPE_MAIL), 71 ProviderTestUtils.setupMailbox("bud_lou", 1L, true, mMockContext, Mailbox.TYPE_MAIL), 72 ProviderTestUtils.setupMailbox("laurel", 1L, true, mMockContext, Mailbox.TYPE_MAIL), 73 ProviderTestUtils.setupMailbox("hardy", 1L, true, mMockContext, Mailbox.TYPE_MAIL) 74 }; 75 // Invalidate all caches, since we reset the database for each test 76 ContentCache.invalidateAllCaches(); 77 } 78 79 @Override 80 protected void tearDown() throws Exception { 81 RecentMailboxManager.sInstance = null; 82 super.tearDown(); 83 } 84 85 public void testTouch() throws Exception { 86 Set<Integer> defaultRecents = new HashSet<Integer>() {{ 87 for (int type : RecentMailboxManager.DEFAULT_RECENT_TYPES) { 88 add(type); 89 } 90 }}; 91 92 // Ensure all accounts can be touched 93 for (Mailbox mailbox : mMailboxArray) { 94 // Safety ... default touch time 95 Mailbox untouchedMailbox = Mailbox.restoreMailboxWithId(mMockContext, mailbox.mId); 96 if (!defaultRecents.contains(mailbox.mType)) { 97 assertEquals(0L, untouchedMailbox.mLastTouchedTime); 98 } 99 100 // Touch the mailbox 101 mManager.touch(1L, mailbox.mId).get(); 102 103 // Touch time is actually set 104 Mailbox touchedMailbox = Mailbox.restoreMailboxWithId(mMockContext, mailbox.mId); 105 assertEquals(mMockClock.getTime(), touchedMailbox.mLastTouchedTime); 106 107 mMockClock.advance(1000L); 108 } 109 // Now ensure touching one didn't affect the others 110 long touchTime = MockClock.DEFAULT_TIME; 111 for (Mailbox mailbox : mMailboxArray) { 112 // Touch time is actually set 113 Mailbox touchedMailbox = Mailbox.restoreMailboxWithId(mMockContext, mailbox.mId); 114 assertEquals(touchTime, touchedMailbox.mLastTouchedTime); 115 touchTime += 1000L; 116 } 117 } 118 119 /** Test default list */ 120 public void testGetMostRecent01() throws Exception { 121 ArrayList<Long> testList; 122 123 // test default list 124 // With exclusions 125 testList = mManager.getMostRecent(1L, true); 126 assertEquals("w/ exclusions", 0, testList.size()); 127 128 // Without exclusions -- we'll get "default" list. 129 testList = mManager.getMostRecent(1L, false); 130 assertEquals("w/o exclusions", 2, testList.size()); 131 132 assertEquals(mMailboxArray[1].mId, (long) testList.get(0)); // Drafts 133 assertEquals(mMailboxArray[3].mId, (long) testList.get(1)); // Sent 134 } 135 136 /** Test recent list not full */ 137 public void testGetMostRecent02() throws Exception { 138 ArrayList<Long> testList; 139 // need to wait for the last one to ensure getMostRecent() has something to work on 140 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[7].mId).get(); // costello 141 142 // test recent list not full, so is padded with default mailboxes 143 testList = mManager.getMostRecent(1L, false); 144 assertEquals(3, testList.size()); 145 assertEquals(mMailboxArray[7].mId, (long) testList.get(0)); // costello 146 assertEquals(mMailboxArray[1].mId, (long) testList.get(1)); // Drafts 147 assertEquals(mMailboxArray[3].mId, (long) testList.get(2)); // Sent 148 testList = mManager.getMostRecent(1L, true); 149 assertEquals(1, testList.size()); 150 assertEquals(mMailboxArray[7].mId, (long) testList.get(0)); 151 } 152 153 /** Test full recent list */ 154 public void testGetMostRecent03() throws Exception { 155 ArrayList<Long> testList; 156 157 // touch some more mailboxes 158 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[3].mId); // sent 159 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[4].mId); // trash 160 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[2].mId); // outbox 161 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[8].mId); // bud_lou 162 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[7].mId); // costello 163 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[9].mId).get(); // laurel 164 165 // test full recent list 166 testList = mManager.getMostRecent(1L, false); 167 assertEquals(5, testList.size()); 168 assertEquals(mMailboxArray[8].mId, (long) testList.get(0)); // bud_lou 169 assertEquals(mMailboxArray[7].mId, (long) testList.get(1)); // costello 170 assertEquals(mMailboxArray[9].mId, (long) testList.get(2)); // laurel 171 assertEquals(mMailboxArray[2].mId, (long) testList.get(3)); // outbox 172 assertEquals(mMailboxArray[4].mId, (long) testList.get(4)); // trash 173 testList = mManager.getMostRecent(1L, true); 174 assertEquals(3, testList.size()); 175 assertEquals(mMailboxArray[8].mId, (long) testList.get(0)); 176 assertEquals(mMailboxArray[7].mId, (long) testList.get(1)); 177 assertEquals(mMailboxArray[9].mId, (long) testList.get(2)); 178 } 179 180 /** Test limit for system mailboxes */ 181 public void testGetMostRecent04() throws Exception { 182 ArrayList<Long> testList; 183 184 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[0].mId); // inbox 185 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[1].mId); // drafts 186 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[2].mId); // outbox 187 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[3].mId); // sent 188 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[4].mId).get(); // trash 189 190 // nothing but system mailboxes, but inbox is never included 191 testList = mManager.getMostRecent(1L, false); 192 assertEquals(4, testList.size()); 193 assertEquals(mMailboxArray[1].mId, (long) testList.get(0)); 194 assertEquals(mMailboxArray[2].mId, (long) testList.get(1)); 195 assertEquals(mMailboxArray[3].mId, (long) testList.get(2)); 196 assertEquals(mMailboxArray[4].mId, (long) testList.get(3)); 197 testList = mManager.getMostRecent(1L, true); 198 assertEquals(0, testList.size()); 199 } 200 201 /** Test limit for user mailboxes */ 202 public void testGetMostRecent05() throws Exception { 203 ArrayList<Long> testList; 204 205 // test limit for the filtered list 206 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[6].mId); // abbott 207 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[7].mId); // costello 208 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[8].mId); // bud_lou 209 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[9].mId); // laurel 210 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[10].mId); // hardy 211 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[1].mId); // drafts 212 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[2].mId); // outbox 213 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[3].mId); // sent 214 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[4].mId); // trash 215 mMockClock.advance(1000L); mManager.touch(1L, mMailboxArray[5].mId).get(); // junk 216 217 // nothing but user mailboxes 218 testList = mManager.getMostRecent(1L, false); 219 assertEquals(5, testList.size()); 220 assertEquals(mMailboxArray[1].mId, (long) testList.get(0)); 221 assertEquals(mMailboxArray[5].mId, (long) testList.get(1)); 222 assertEquals(mMailboxArray[2].mId, (long) testList.get(2)); 223 assertEquals(mMailboxArray[3].mId, (long) testList.get(3)); 224 assertEquals(mMailboxArray[4].mId, (long) testList.get(4)); 225 testList = mManager.getMostRecent(1L, true); 226 assertEquals(5, testList.size()); 227 assertEquals(mMailboxArray[6].mId, (long) testList.get(0)); 228 assertEquals(mMailboxArray[8].mId, (long) testList.get(1)); 229 assertEquals(mMailboxArray[7].mId, (long) testList.get(2)); 230 assertEquals(mMailboxArray[10].mId, (long) testList.get(3)); 231 assertEquals(mMailboxArray[9].mId, (long) testList.get(4)); 232 } 233 234 public void testDoesNotIncludeExtraMailboxes() throws Exception { 235 ArrayList<Long> testList; 236 237 // The search mailbox should not be visible. 238 Mailbox searchMailbox = ProviderTestUtils.setupMailbox( 239 "search", 1L, true, mMockContext, Mailbox.TYPE_SEARCH); 240 ContentValues cv = new ContentValues(); 241 cv.put(MailboxColumns.FLAG_VISIBLE, false); 242 searchMailbox.mFlagVisible = false; 243 searchMailbox.update(mMockContext, cv); 244 245 mMockClock.advance(1000L); mManager.touch(1L, searchMailbox.mId).get(); 246 247 // Ensure search mailbox isn't returned 248 testList = mManager.getMostRecent(1L, false); 249 assertFalse(testList.contains(searchMailbox.mId)); 250 testList = mManager.getMostRecent(1L, true); 251 assertFalse(testList.contains(searchMailbox.mId)); 252 } 253} 254