1/*
2 * Copyright (C) 2010 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 com.android.email.Clock;
20import com.android.email.Controller;
21import com.android.email.MockClock;
22import com.android.email.RefreshManager;
23
24import android.content.Context;
25import android.os.Handler;
26import android.test.AndroidTestCase;
27import android.test.suitebuilder.annotation.SmallTest;
28
29import junit.framework.Assert;
30
31/**
32 * Tests for {@link UIControllerTwoPane.RefreshTask}.
33 *
34 * TOOD Add more tests.
35 * Right now, it only has tests for the "shouldXxx" methods, because it's hard to notice when
36 * they're subtly broken.  (And the spec may change.)
37 */
38@SmallTest
39public class UIControllerTwoPaneRefreshTaskTest extends AndroidTestCase {
40    private MockClock mClock = new MockClock();
41    private MockRefreshManager mRefreshManager;
42
43    @Override
44    protected void setUp() throws Exception {
45        super.setUp();
46        mRefreshManager = new MockRefreshManager(getContext(), Controller.getInstance(getContext()),
47                mClock, null);
48    }
49
50    @Override
51    protected void tearDown() throws Exception {
52        super.tearDown();
53        mRefreshManager.cleanUpForTest();
54    }
55
56    public void testShouldRefreshMailboxList() {
57        final long ACCOUNT_ID = 5;
58        final long MAILBOX_ID = 10;
59
60        UIControllerTwoPane.RefreshTask task = new UIControllerTwoPane.RefreshTask(null,
61                getContext(), ACCOUNT_ID, MAILBOX_ID, mClock, mRefreshManager);
62
63        mRefreshManager.mExpectedAccountId = ACCOUNT_ID;
64
65        mClock.mTime = 123456789;
66
67        // Not refreshing, never refreshed == should sync
68        mRefreshManager.mIsMailboxListRefreshing = false;
69        mRefreshManager.mLastMailboxListRefresTime = 0;
70        assertTrue(task.shouldRefreshMailboxList());
71
72        // IS refreshing, never refreshed == should NOT sync
73        mRefreshManager.mIsMailboxListRefreshing = true;
74        mRefreshManager.mLastMailboxListRefresTime = 0;
75        assertFalse(task.shouldRefreshMailboxList());
76
77        // Not refreshing, just refreshed == should NOT sync
78        mRefreshManager.mIsMailboxListRefreshing = false;
79        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
80        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime;
81        assertFalse(task.shouldRefreshMailboxList());
82
83        // Not refreshing, refreshed 1 ms ago == should NOT sync
84        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
85        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime + 1;
86        assertFalse(task.shouldRefreshMailboxList());
87
88        // Not refreshing, refreshed TIMEOUT-1 ago == should NOT sync
89        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
90        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime
91            + UIControllerTwoPane.MAILBOX_REFRESH_MIN_INTERVAL - 1;
92        assertFalse(task.shouldRefreshMailboxList());
93
94        // 1 ms laster... should sync.
95        mClock.advance();
96        assertTrue(task.shouldRefreshMailboxList());
97    }
98
99    public void testShouldAutoRefreshInbox() {
100        final long ACCOUNT_ID = 5;
101        final long MAILBOX_ID = 10;
102
103        UIControllerTwoPane.RefreshTask task = new UIControllerTwoPane.RefreshTask(null,
104                getContext(), ACCOUNT_ID, MAILBOX_ID, mClock, mRefreshManager);
105
106        mRefreshManager.mExpectedAccountId = ACCOUNT_ID;
107
108        mClock.mTime = 123456789;
109
110        // Current mailbox != inbox, not refreshing, never refreshed == should sync
111        mRefreshManager.mIsMessageListRefreshing = false;
112        mRefreshManager.mLastMessageListRefresTime = 0;
113        task.mInboxId = MAILBOX_ID + 1;
114        mRefreshManager.mExpectedMailboxId = MAILBOX_ID + 1;
115        assertTrue(task.shouldAutoRefreshInbox());
116
117        // Current mailbox == inbox should NOT sync.
118        task.mInboxId = MAILBOX_ID;
119        mRefreshManager.mExpectedMailboxId = MAILBOX_ID;
120        assertFalse(task.shouldAutoRefreshInbox());
121
122        // Fron here, Current mailbox != inbox
123        task.mInboxId = MAILBOX_ID + 1;
124        mRefreshManager.mExpectedMailboxId = MAILBOX_ID + 1;
125
126        // IS refreshing, never refreshed == should NOT sync
127        mRefreshManager.mIsMessageListRefreshing = true;
128        mRefreshManager.mLastMessageListRefresTime = 0;
129        assertFalse(task.shouldAutoRefreshInbox());
130
131        // Not refreshing, just refreshed == should NOT sync
132        mRefreshManager.mIsMessageListRefreshing = false;
133        mRefreshManager.mLastMessageListRefresTime = 1234567890;
134        mClock.mTime = mRefreshManager.mLastMessageListRefresTime;
135        assertFalse(task.shouldAutoRefreshInbox());
136
137        // Not refreshing, refreshed 1 ms ago == should NOT sync
138        mRefreshManager.mLastMessageListRefresTime = 1234567890;
139        mClock.mTime = mRefreshManager.mLastMessageListRefresTime + 1;
140        assertFalse(task.shouldAutoRefreshInbox());
141
142        // Not refreshing, refreshed TIMEOUT-1 ago == should NOT sync
143        mRefreshManager.mLastMessageListRefresTime = 1234567890;
144        mClock.mTime = mRefreshManager.mLastMessageListRefresTime
145            + UIControllerTwoPane.INBOX_AUTO_REFRESH_MIN_INTERVAL - 1;
146        assertFalse(task.shouldAutoRefreshInbox());
147
148        // 1 ms laster... should sync.
149        mClock.advance();
150        assertTrue(task.shouldAutoRefreshInbox());
151    }
152
153    private static class MockRefreshManager extends RefreshManager {
154        public long mExpectedAccountId;
155        public long mExpectedMailboxId;
156        public boolean mIsMailboxListRefreshing;
157        public long mLastMailboxListRefresTime;
158        public boolean mIsMessageListRefreshing;
159        public long mLastMessageListRefresTime;
160
161        protected MockRefreshManager(
162                Context context, Controller controller, Clock clock, Handler handler) {
163            super(context, controller, clock, handler);
164        }
165
166        @Override
167        public boolean isMailboxListRefreshing(long accountId) {
168            Assert.assertEquals(mExpectedAccountId, accountId);
169            return mIsMailboxListRefreshing;
170        }
171
172        @Override
173        public long getLastMailboxListRefreshTime(long accountId) {
174            Assert.assertEquals(mExpectedAccountId, accountId);
175            return mLastMailboxListRefresTime;
176        }
177
178        @Override
179        public boolean isMessageListRefreshing(long mailboxId) {
180            Assert.assertEquals(mExpectedMailboxId, mailboxId);
181            return mIsMessageListRefreshing;
182        }
183
184        @Override
185        public long getLastMessageListRefreshTime(long mailboxId) {
186            Assert.assertEquals(mExpectedMailboxId, mailboxId);
187            return mLastMessageListRefresTime;
188        }
189    }
190}
191