1e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki/*
2e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * Copyright (C) 2010 The Android Open Source Project
3e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki *
4e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * you may not use this file except in compliance with the License.
6e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * You may obtain a copy of the License at
7e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki *
8e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki *
10e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * Unless required by applicable law or agreed to in writing, software
11e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * See the License for the specific language governing permissions and
14e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * limitations under the License.
15e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki */
16e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
17e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukipackage com.android.email.activity;
18e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
19e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport com.android.email.Clock;
20e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport com.android.email.Controller;
21e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport com.android.email.MockClock;
22e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport com.android.email.RefreshManager;
23e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
24e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport android.content.Context;
25e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport android.os.Handler;
26e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport android.test.AndroidTestCase;
27e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport android.test.suitebuilder.annotation.SmallTest;
28e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
29e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onukiimport junit.framework.Assert;
30e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
31e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki/**
328112732376d4cc033ee515a6531852ef42266929Makoto Onuki * Tests for {@link UIControllerTwoPane.RefreshTask}.
33e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki *
34e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * TOOD Add more tests.
35e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * Right now, it only has tests for the "shouldXxx" methods, because it's hard to notice when
36e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki * they're subtly broken.  (And the spec may change.)
37e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki */
38e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki@SmallTest
398112732376d4cc033ee515a6531852ef42266929Makoto Onukipublic class UIControllerTwoPaneRefreshTaskTest extends AndroidTestCase {
40e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    private MockClock mClock = new MockClock();
41e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    private MockRefreshManager mRefreshManager;
42e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
43e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    @Override
44e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    protected void setUp() throws Exception {
45e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        super.setUp();
46e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager = new MockRefreshManager(getContext(), Controller.getInstance(getContext()),
47e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki                mClock, null);
48e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
49e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
50e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    @Override
51e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    protected void tearDown() throws Exception {
52e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        super.tearDown();
53e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.cleanUpForTest();
54e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
55e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
56e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testShouldRefreshMailboxList() {
57e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final long ACCOUNT_ID = 5;
58e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final long MAILBOX_ID = 10;
59e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
608112732376d4cc033ee515a6531852ef42266929Makoto Onuki        UIControllerTwoPane.RefreshTask task = new UIControllerTwoPane.RefreshTask(null,
618112732376d4cc033ee515a6531852ef42266929Makoto Onuki                getContext(), ACCOUNT_ID, MAILBOX_ID, mClock, mRefreshManager);
62e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
63e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mExpectedAccountId = ACCOUNT_ID;
64e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
65e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = 123456789;
66e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
67e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, never refreshed == should sync
68e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMailboxListRefreshing = false;
69e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMailboxListRefresTime = 0;
70e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(task.shouldRefreshMailboxList());
71e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
72e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // IS refreshing, never refreshed == should NOT sync
73e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMailboxListRefreshing = true;
74e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMailboxListRefresTime = 0;
75e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldRefreshMailboxList());
76e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
77e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, just refreshed == should NOT sync
78e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMailboxListRefreshing = false;
79e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
80e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime;
81e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldRefreshMailboxList());
82e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
83e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, refreshed 1 ms ago == should NOT sync
84e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
85e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime + 1;
86e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldRefreshMailboxList());
87e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
88e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, refreshed TIMEOUT-1 ago == should NOT sync
89e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMailboxListRefresTime = 1234567890;
90e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMailboxListRefresTime
918112732376d4cc033ee515a6531852ef42266929Makoto Onuki            + UIControllerTwoPane.MAILBOX_REFRESH_MIN_INTERVAL - 1;
92e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldRefreshMailboxList());
93e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
94e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // 1 ms laster... should sync.
95e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.advance();
96e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(task.shouldRefreshMailboxList());
97e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
98e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
99e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    public void testShouldAutoRefreshInbox() {
100e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final long ACCOUNT_ID = 5;
101e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        final long MAILBOX_ID = 10;
102e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
1038112732376d4cc033ee515a6531852ef42266929Makoto Onuki        UIControllerTwoPane.RefreshTask task = new UIControllerTwoPane.RefreshTask(null,
1048112732376d4cc033ee515a6531852ef42266929Makoto Onuki                getContext(), ACCOUNT_ID, MAILBOX_ID, mClock, mRefreshManager);
105e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
106e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mExpectedAccountId = ACCOUNT_ID;
107e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
108e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = 123456789;
109e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
110e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Current mailbox != inbox, not refreshing, never refreshed == should sync
111e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMessageListRefreshing = false;
112e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMessageListRefresTime = 0;
113e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        task.mInboxId = MAILBOX_ID + 1;
114e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mExpectedMailboxId = MAILBOX_ID + 1;
115e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(task.shouldAutoRefreshInbox());
116e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
117e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Current mailbox == inbox should NOT sync.
118e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        task.mInboxId = MAILBOX_ID;
119e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mExpectedMailboxId = MAILBOX_ID;
120e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldAutoRefreshInbox());
121e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
122e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Fron here, Current mailbox != inbox
123e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        task.mInboxId = MAILBOX_ID + 1;
124e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mExpectedMailboxId = MAILBOX_ID + 1;
125e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
126e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // IS refreshing, never refreshed == should NOT sync
127e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMessageListRefreshing = true;
128e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMessageListRefresTime = 0;
129e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldAutoRefreshInbox());
130e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
131e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, just refreshed == should NOT sync
132e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mIsMessageListRefreshing = false;
133e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMessageListRefresTime = 1234567890;
134e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMessageListRefresTime;
135e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldAutoRefreshInbox());
136e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
137e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, refreshed 1 ms ago == should NOT sync
138e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMessageListRefresTime = 1234567890;
139e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMessageListRefresTime + 1;
140e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldAutoRefreshInbox());
141e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
142e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // Not refreshing, refreshed TIMEOUT-1 ago == should NOT sync
143e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mRefreshManager.mLastMessageListRefresTime = 1234567890;
144e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.mTime = mRefreshManager.mLastMessageListRefresTime
1458112732376d4cc033ee515a6531852ef42266929Makoto Onuki            + UIControllerTwoPane.INBOX_AUTO_REFRESH_MIN_INTERVAL - 1;
146e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertFalse(task.shouldAutoRefreshInbox());
147e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
148e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        // 1 ms laster... should sync.
149e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        mClock.advance();
150e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        assertTrue(task.shouldAutoRefreshInbox());
151e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
152e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
153e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    private static class MockRefreshManager extends RefreshManager {
154e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long mExpectedAccountId;
155e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long mExpectedMailboxId;
156e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public boolean mIsMailboxListRefreshing;
157e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long mLastMailboxListRefresTime;
158e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public boolean mIsMessageListRefreshing;
159e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long mLastMessageListRefresTime;
160e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
161e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        protected MockRefreshManager(
162e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki                Context context, Controller controller, Clock clock, Handler handler) {
163e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            super(context, controller, clock, handler);
164e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        }
165e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
166e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        @Override
167e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public boolean isMailboxListRefreshing(long accountId) {
168e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            Assert.assertEquals(mExpectedAccountId, accountId);
169e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            return mIsMailboxListRefreshing;
170e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        }
171e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
172e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        @Override
173e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long getLastMailboxListRefreshTime(long accountId) {
174e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            Assert.assertEquals(mExpectedAccountId, accountId);
175e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            return mLastMailboxListRefresTime;
176e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        }
177e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
178e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        @Override
179e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public boolean isMessageListRefreshing(long mailboxId) {
180e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            Assert.assertEquals(mExpectedMailboxId, mailboxId);
181e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            return mIsMessageListRefreshing;
182e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        }
183e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki
184e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        @Override
185e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        public long getLastMessageListRefreshTime(long mailboxId) {
186e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            Assert.assertEquals(mExpectedMailboxId, mailboxId);
187e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki            return mLastMessageListRefresTime;
188e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki        }
189e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki    }
190e357f5879187124c7af5c2ece5d7d3e4f60f07d2Makoto Onuki}
191