121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki/*
221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * Copyright (C) 2010 The Android Open Source Project
321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki *
421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * you may not use this file except in compliance with the License.
621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * You may obtain a copy of the License at
721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki *
821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki *
1021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * Unless required by applicable law or agreed to in writing, software
1121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
1221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * See the License for the specific language governing permissions and
1421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki * limitations under the License.
1521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki */
1621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
1721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onukipackage com.android.email;
1821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
1903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.email.provider.ProviderTestUtils;
2003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.emailcommon.Logging;
2103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.emailcommon.mail.MessagingException;
2203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.emailcommon.provider.Account;
2303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
2421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onukiimport android.content.Context;
25f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onukiimport android.test.InstrumentationTestCase;
26f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onukiimport android.test.suitebuilder.annotation.LargeTest;
2721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
2821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onukiimport junit.framework.Assert;
2921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
30f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki@LargeTest
31f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onukipublic class RefreshManagerTest extends InstrumentationTestCase {
32f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki    private static final int WAIT_UNTIL_TIMEOUT_SECONDS = 15;
3321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private MockClock mClock;
3421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private MockController mController;
3521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private RefreshManager mTarget;
3621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private RefreshListener mListener;
3721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
38f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki    private Context mContext;
39f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki
4021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    // Isolated Context for providers.
4121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private Context mProviderContext;
4221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
4321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static final MessagingException EXCEPTION = new MessagingException("test");
4421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
4521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    // Looks silly, but it'll make it more readable.
4621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static final long ACCOUNT_1 = 1;
4721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static final long ACCOUNT_2 = 2;
4821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static final long MAILBOX_1 = 3;
4921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static final long MAILBOX_2 = 4;
5021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
5121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    @Override
5221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    protected void setUp() throws Exception {
5321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        super.setUp();
5421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
5521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mClock = new MockClock();
56f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        mContext = getInstrumentation().getTargetContext();
57c184f36c2df16431693d7709e28ded593efc3da7Marc Blank        mController = new MockController(mContext);
5821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener = new RefreshListener();
59d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki        mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(mContext);
6021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mTarget = new RefreshManager(mProviderContext, mController, mClock, null);
6121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mTarget.registerListener(mListener);
6221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
6321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
6403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    @Override
6503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    protected void tearDown() throws Exception {
6603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        super.tearDown();
6703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.cleanupForTest();
6803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    }
6903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
7021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    public void testRegisterUnregisterListener() {
7121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // mListener is already registered
7221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(1, mTarget.getListenersForTest().size());
7321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
7421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mTarget.unregisterListener(mListener);
7521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, mTarget.getListenersForTest().size());
7621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
7721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
7821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    public void testRefreshStatus() {
7921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        RefreshManager.Status s = new RefreshManager.Status();
8021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.isRefreshing());
8121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.canRefresh());
8221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, s.getLastRefreshTime());
8321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
8421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Request refresh
8521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onRefreshRequested();
8621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.isRefreshing());
8721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.canRefresh());
8821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, s.getLastRefreshTime());
8921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
9021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refresh start
9121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onCallback(null, 0, mClock);
9221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.isRefreshing());
9321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.canRefresh());
9421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, s.getLastRefreshTime());
9521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
9621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refresh 50% done -- nothing changes
9721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onCallback(null, 50, mClock);
9821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.isRefreshing());
9921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.canRefresh());
10021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, s.getLastRefreshTime());
10121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
10221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refresh finish
10321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onCallback(null, 100, mClock);
10421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.isRefreshing());
10521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.canRefresh());
10621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, s.getLastRefreshTime());
10721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
10821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refresh start without request
10921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onCallback(null, 0, mClock);
11021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.isRefreshing());
11121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.canRefresh());
11221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, s.getLastRefreshTime());
11321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
11421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mClock.advance();
11521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
11621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refresh finish with error.
11721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        s.onCallback(EXCEPTION, 0, mClock);
11821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(s.isRefreshing());
11921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(s.canRefresh());
12021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, s.getLastRefreshTime());
12121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
12221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
12321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    public void testRefreshMailboxList() {
12421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // request refresh for account 1
12521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.refreshMailboxList(ACCOUNT_1));
12621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
12721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
12821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
12921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
13021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
13121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
13221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mController.mCalledUpdateMailboxList);
13321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mController.mAccountId);
13421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mController.mMailboxId);
13521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
13621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMailboxListRefreshing(ACCOUNT_1));
137c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMailboxListForTest());
13821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
13921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Request again -- shouldn't be accepted.
14021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mTarget.refreshMailboxList(ACCOUNT_1));
14121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
14221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnRefreshStatusChanged);
14321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
14421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
14521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mController.mCalledUpdateMailboxList);
14621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
14721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
14821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // request refresh for account 2
14921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.refreshMailboxList(ACCOUNT_2));
15021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
15121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
15221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
15321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
15421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
15521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
15621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mController.mCalledUpdateMailboxList);
15721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mController.mAccountId);
15821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mController.mMailboxId);
15921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
16021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMailboxListRefreshing(ACCOUNT_2));
161c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMailboxListForTest());
16221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
16321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refreshing for account 1...
16421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.mListener.updateMailboxListCallback(null, ACCOUNT_1, 0);
16521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
16621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
16721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
16821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
16921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
17021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
17121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMailboxListRefreshing(ACCOUNT_1));
17221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, mTarget.getMailboxListStatusForTest(ACCOUNT_1).getLastRefreshTime());
17321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
17421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Done.
175560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "" + mController.mListener.getClass());
17621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.mListener.updateMailboxListCallback(null, ACCOUNT_1, 100);
17721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
17821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
17921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
18021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
18121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
18221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
18321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mTarget.isMailboxListRefreshing(ACCOUNT_1));
18421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, mTarget.getMailboxListStatusForTest(ACCOUNT_1)
18521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki                .getLastRefreshTime());
18621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
18721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Check "any" method.
188c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMailboxListForTest()); // still refreshing account 2
18921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
19021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refreshing for account 2...
19121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mClock.advance();
19221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
19321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.mListener.updateMailboxListCallback(null, ACCOUNT_2, 0);
19421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
19521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
19621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
19721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
19821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
19921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
20021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMailboxListRefreshing(ACCOUNT_2));
20121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, mTarget.getMailboxListStatusForTest(ACCOUNT_2).getLastRefreshTime());
20221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
20321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Done with exception.
20421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.mListener.updateMailboxListCallback(EXCEPTION, ACCOUNT_2, 0);
20521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
20621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
20721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnConnectionError);
20821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
20921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(-1, mListener.mMailboxId);
21031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        assertEquals(MessagingExceptionStrings.getErrorString(mContext, EXCEPTION),
21131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank                mListener.mMessage);
21221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
21321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mTarget.isMailboxListRefreshing(ACCOUNT_2));
21421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, mTarget.getMailboxListStatusForTest(ACCOUNT_2)
21521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki                .getLastRefreshTime());
21621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
21721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Check "any" method.
218c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertFalse(mTarget.isRefreshingAnyMailboxListForTest());
21921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
22021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
22121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    public void testRefreshMessageList() {
22221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // request refresh mailbox 1
223cbdd9f78b2605e87e45e4f6761b0a8c444a8cd4cMarc Blank        assertTrue(mTarget.refreshMessageList(ACCOUNT_1, MAILBOX_1, false));
22421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
22521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
22621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
22721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
22821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_1, mListener.mMailboxId);
22921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
23021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mController.mCalledUpdateMailbox);
23121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mController.mAccountId);
23221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_1, mController.mMailboxId);
23321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
23421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMessageListRefreshing(MAILBOX_1));
235c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMessageListForTest());
23621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
23721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Request again -- shouldn't be accepted.
238cbdd9f78b2605e87e45e4f6761b0a8c444a8cd4cMarc Blank        assertFalse(mTarget.refreshMessageList(ACCOUNT_1, MAILBOX_1, false));
23921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
24021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnRefreshStatusChanged);
24121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
24221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
24321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mController.mCalledUpdateMailbox);
24421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
24521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
24621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // request refresh mailbox 2
247cbdd9f78b2605e87e45e4f6761b0a8c444a8cd4cMarc Blank        assertTrue(mTarget.refreshMessageList(ACCOUNT_2, MAILBOX_2, false));
24821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
24921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
25021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
25121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
25221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_2, mListener.mMailboxId);
25321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
25421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mController.mCalledUpdateMailbox);
25521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mController.mAccountId);
25621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_2, mController.mMailboxId);
25721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mController.reset();
25821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMessageListRefreshing(MAILBOX_2));
259c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMessageListForTest());
26021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
26121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refreshing mailbox 1...
262c4cdb11d24c19428dd39f986b00c1a29e75e1505Todd Kennedy        mController.mListener.updateMailboxCallback(null, ACCOUNT_1, MAILBOX_1, 0, 0, null);
26321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
26421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
26521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
26621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
26721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_1, mListener.mMailboxId);
26821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
26921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMessageListRefreshing(MAILBOX_1));
27021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, mTarget.getMessageListStatusForTest(MAILBOX_1).getLastRefreshTime());
27121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
27221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Done.
273560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "" + mController.mListener.getClass());
274c4cdb11d24c19428dd39f986b00c1a29e75e1505Todd Kennedy        mController.mListener.updateMailboxCallback(null, ACCOUNT_1, MAILBOX_1, 100, 0, null);
27521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
27621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
27721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
27821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_1, mListener.mAccountId);
27921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_1, mListener.mMailboxId);
28021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
28121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mTarget.isMessageListRefreshing(MAILBOX_1));
28221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, mTarget.getMessageListStatusForTest(MAILBOX_1)
28321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki                .getLastRefreshTime());
28421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
28521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Check "any" method.
286c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertTrue(mTarget.isRefreshingAnyMessageListForTest()); // still refreshing mailbox 2
28721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
28821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Refreshing mailbox 2...
28921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mClock.advance();
29021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
291c4cdb11d24c19428dd39f986b00c1a29e75e1505Todd Kennedy        mController.mListener.updateMailboxCallback(null, ACCOUNT_2, MAILBOX_2, 0, 0, null);
29221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
29321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
29421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mListener.mCalledOnConnectionError);
29521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
29621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_2, mListener.mMailboxId);
29721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
29821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mTarget.isMessageListRefreshing(MAILBOX_2));
29921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(0, mTarget.getMessageListStatusForTest(MAILBOX_2).getLastRefreshTime());
30021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
30121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Done with exception.
302c4cdb11d24c19428dd39f986b00c1a29e75e1505Todd Kennedy        mController.mListener.updateMailboxCallback(EXCEPTION, ACCOUNT_2, MAILBOX_2, 0, 0, null);
30321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
30421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnRefreshStatusChanged);
30521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertTrue(mListener.mCalledOnConnectionError);
30621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(ACCOUNT_2, mListener.mAccountId);
30721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(MAILBOX_2, mListener.mMailboxId);
30831d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        assertEquals(MessagingExceptionStrings.getErrorString(mContext, EXCEPTION),
30931d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank                mListener.mMessage);
31021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        mListener.reset();
31121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertFalse(mTarget.isMessageListRefreshing(MAILBOX_2));
31221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        assertEquals(mClock.mTime, mTarget.getMessageListStatusForTest(MAILBOX_2)
31321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki                .getLastRefreshTime());
31421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
31521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        // Check "any" method.
316c1e8c95d053464e0821d45347704bd6c27e7e546Andy Stadler        assertFalse(mTarget.isRefreshingAnyMessageListForTest());
31721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
31821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
31903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    public void testSendPendingMessages() {
32003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // request sending for account 1
32103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mTarget.sendPendingMessages(ACCOUNT_1));
32203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
32303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mListener.mCalledOnRefreshStatusChanged);
32403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
32503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(ACCOUNT_1, mListener.mAccountId);
32603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(-1, mListener.mMailboxId);
32703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
32803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mController.mCalledSendPendingMessages);
32903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(ACCOUNT_1, mController.mAccountId);
33003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(-1, mController.mMailboxId);
33103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.reset();
33203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
33303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // request sending for account 2
33403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mTarget.sendPendingMessages(ACCOUNT_2));
33503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
33603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
33703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(ACCOUNT_2, mListener.mAccountId);
33803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(-1, mListener.mMailboxId);
33903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
34003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mController.mCalledSendPendingMessages);
34103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(ACCOUNT_2, mController.mAccountId);
34203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(-1, mController.mMailboxId);
34303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.reset();
34403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
34503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Sending start for account 1...
34603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // batch send start.  (message id == -1, progress == 0)
34703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(null, ACCOUNT_1, -1, 0);
34803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
34903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
35003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
35103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
35203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Per message callback
35303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(null, ACCOUNT_1, 100, 0);
35403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(null, ACCOUNT_1, 101, 0);
35503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
35603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
35703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
35803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
35903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Exception -- first error will be reported.
36003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(EXCEPTION, ACCOUNT_1, 102, 0);
36103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
36203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertTrue(mListener.mCalledOnConnectionError);
36303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertEquals(MessagingExceptionStrings.getErrorString(mContext, EXCEPTION),
36403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank                mListener.mMessage);
36503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
36603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
36703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Exception again -- no more error callbacks
36803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(null, ACCOUNT_1, 103, 0);
36903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(EXCEPTION, ACCOUNT_1, 104, 0);
37003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
37103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
37203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
37303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
37403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Done.
375560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "" + mController.mListener.getClass());
37603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mController.mListener.sendMailCallback(null, ACCOUNT_1, -1, 100);
37703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
37803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        assertFalse(mListener.mCalledOnConnectionError);
37903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mListener.reset();
38003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    }
38103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
38203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    public void testSendPendingMessagesForAllAccounts() throws Throwable {
38303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, mProviderContext);
38403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        Account acct2 = ProviderTestUtils.setupAccount("acct2", true, mProviderContext);
38503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
38603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // AsyncTask needs to be created on the UI thread.
38703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        runTestOnUiThread(new Runnable() {
38803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            @Override
38903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            public void run() {
39003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank                mTarget.sendPendingMessagesForAllAccounts();
39103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            }
39203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        });
39303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
39403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // sendPendingMessagesForAllAccounts uses Utility.ForEachAccount, which has it's own test,
39503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // so we don't really have to check everything.
39603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // Here, we just check if sendPendingMessages() has been called at least for once,
39703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        // which is a enough check.
39803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        TestUtils.waitUntil(new TestUtils.Condition() {
39903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            @Override
40003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            public boolean isMet() {
40103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank                // The write to this is done on the UI thread, but we're checking it here
40203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank                // on the test thread, so mCalledSendPendingMessages needs to be volatile.
40303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank                return mController.mCalledSendPendingMessages;
40403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            }
40503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }, WAIT_UNTIL_TIMEOUT_SECONDS);
40603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank    }
40703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
408a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki    public void testLoadMoreMessages() {
409a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        final long ACCOUNT_ID = 123;
410a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        final long MAILBOX_ID = 456;
411a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki
412a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        mTarget.loadMoreMessages(ACCOUNT_ID, MAILBOX_ID);
413a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki
414a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        assertTrue(mController.mCalledLoadMoreMessages);
415a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        assertEquals(mController.mMailboxId, MAILBOX_ID);
416a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        assertFalse(mController.mCalledUpdateMailbox);
417a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki    }
418a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki
419f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki    // volatile is necessary for testSendPendingMessagesForAllAccounts().
420f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki    // (Not all of them are actually necessary, but added for consistency.)
42121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static class MockController extends Controller {
422f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        public volatile long mAccountId = -1;
423f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        public volatile long mMailboxId = -1;
42403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        public volatile boolean mCalledSendPendingMessages;
425f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        public volatile boolean mCalledUpdateMailbox;
426f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        public volatile boolean mCalledUpdateMailboxList;
427a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        public volatile boolean mCalledLoadMoreMessages;
428f52afae9424fe41071cc34a8d6cbcb82b992a411Makoto Onuki        public volatile Result mListener;
42921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
430c184f36c2df16431693d7709e28ded593efc3da7Marc Blank        protected MockController(Context context) {
431c184f36c2df16431693d7709e28ded593efc3da7Marc Blank            super(context);
43221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
43321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
43421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void reset() {
43521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = -1;
43621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMailboxId = -1;
43703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            mCalledSendPendingMessages = false;
43821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledUpdateMailbox = false;
43921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledUpdateMailboxList = false;
44021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
44121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
44221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
44321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void sendPendingMessages(long accountId) {
44403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            mCalledSendPendingMessages = true;
44521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = accountId;
44621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
44721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
44821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
449cbdd9f78b2605e87e45e4f6761b0a8c444a8cd4cMarc Blank        public void updateMailbox(long accountId, long mailboxId, boolean userRequest) {
45021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledUpdateMailbox = true;
45121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = accountId;
45221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMailboxId = mailboxId;
45321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
45421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
45521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
45621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void updateMailboxList(long accountId) {
45721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledUpdateMailboxList = true;
45821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = accountId;
45921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
46021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
46121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
462a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        public void loadMoreMessages(long mailboxId) {
463a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki            mCalledLoadMoreMessages = true;
464a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki            mAccountId = -1;
465a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki            mMailboxId = mailboxId;
466a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        }
467a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki
468a796fbab0237c094aa943de68f85d201dd22503bMakoto Onuki        @Override
46921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void addResultCallback(Result listener) {
47021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            Assert.assertTrue(mListener == null);
47121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mListener = listener;
47202a750dd6478689612d2c49a552c229919bd9553Makoto Onuki
47302a750dd6478689612d2c49a552c229919bd9553Makoto Onuki            // Let it call listener.setRegistered(). Otherwise callbacks won't fire.
47402a750dd6478689612d2c49a552c229919bd9553Makoto Onuki            super.addResultCallback(listener);
47521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
47621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
47721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
47821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    private static class RefreshListener implements RefreshManager.Listener {
47921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public long mAccountId = -1;
48021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public long mMailboxId = -1;
48121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public String mMessage;
48221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public boolean mCalledOnConnectionError;
48321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public boolean mCalledOnRefreshStatusChanged;
48421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
48521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void reset() {
48621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = -1;
48721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMailboxId = -1;
48821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMessage = null;
48921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledOnConnectionError = false;
49021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledOnRefreshStatusChanged = false;
49121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
49221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
49321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
49421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void onRefreshStatusChanged(long accountId, long mailboxId) {
49521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = accountId;
49621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMailboxId = mailboxId;
49721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledOnRefreshStatusChanged = true;
49821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
49921efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki
50021efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        @Override
50121efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        public void onMessagingError(long accountId, long mailboxId, String message) {
50221efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mAccountId = accountId;
50321efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMailboxId = mailboxId;
50421efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mMessage = message;
50521efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki            mCalledOnConnectionError = true;
50621efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki        }
50721efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki    }
50821efedb67fdfff208cef3a18804771fd1d1fff30Makoto Onuki}
509