1ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki/*
2ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * Copyright (C) 2010 The Android Open Source Project
3ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki *
4ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * you may not use this file except in compliance with the License.
6ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * You may obtain a copy of the License at
7ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki *
8ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki *
10ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * Unless required by applicable law or agreed to in writing, software
11ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * See the License for the specific language governing permissions and
14ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * limitations under the License.
15ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki */
16ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
17ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onukipackage com.android.email.activity;
18ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
196e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.content.Context;
206e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.InstrumentationTestCase;
216e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.ProviderTestCase2;
226e418aa41a17136be0dddb816d843428a0a1e722Marc Blankimport android.test.suitebuilder.annotation.LargeTest;
236e418aa41a17136be0dddb816d843428a0a1e722Marc Blank
24ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onukiimport com.android.email.Controller;
25b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport com.android.email.DBTestHelper;
26ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onukiimport com.android.email.Email;
27ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onukiimport com.android.email.TestUtils;
28c184f36c2df16431693d7709e28ded593efc3da7Marc Blankimport com.android.email.provider.ProviderTestUtils;
292193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.MessagingException;
30f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
3153ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
32ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
33ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki/**
34ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * Test case for {@link MailboxFinder}.
35ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki *
36ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * We need to use {@link InstrumentationTestCase} so that we can create AsyncTasks on the UI thread
37ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * using {@link InstrumentationTestCase#runTestOnUiThread}.  This class also needs an isolated
38ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * context, which is provided by {@link ProviderTestCase2}.  We can't derive from two classes,
39ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki * so we just copy the code for an isolate context to here.
40ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki */
41ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki@LargeTest
42ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onukipublic class MailboxFinderTest extends InstrumentationTestCase {
43ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private static final int TIMEOUT = 10; // in seconds
44ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
45ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    // Test target
46ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private MailboxFinder mMailboxFinder;
47ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
48b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki    // Isolted Context for providers.
49b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki    private Context mProviderContext;
50b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki
51ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    // Mock to track callback invocations.
52ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private MockController mMockController;
53ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private MockCallback mCallback;
54ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
55ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private Context getContext() {
56ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        return getInstrumentation().getTargetContext();
57ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
58ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
59ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    @Override
60ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    protected void setUp() throws Exception {
61ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        super.setUp();
62ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
63b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki        mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
64d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki                getInstrumentation().getTargetContext());
65ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        mCallback = new MockCallback();
66ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        mMockController = new MockController(getContext());
67ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        Controller.injectMockControllerForTest(mMockController);
68086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertEquals(0, mMockController.getResultCallbacksForTest().size());
69ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
70ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
71ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    @Override
72ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    protected void tearDown() throws Exception {
73ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        super.tearDown();
74086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        if (mMailboxFinder != null) {
75086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            mMailboxFinder.cancel();
76086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
77086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            // MailboxFinder should unregister its listener when closed.
78086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            checkControllerResultRemoved(mMockController);
79086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        }
8003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        mMockController.cleanupForTest();
81ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        Controller.injectMockControllerForTest(null);
82ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
83ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
84ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
85086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * Make sure no {@link MailboxFinder.Callback} is left registered to the controller.
86086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     */
87086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    private static void checkControllerResultRemoved(Controller controller) {
88086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        for (Controller.Result callback : controller.getResultCallbacksForTest()) {
89086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            assertFalse(callback instanceof MailboxFinder.Callback);
90086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        }
91086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    }
92086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
93086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    /**
94ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Create an account and returns the ID.
95ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
96ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private long createAccount(boolean securityHold) {
97ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        Account acct = ProviderTestUtils.setupAccount("acct1", false, mProviderContext);
98ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        if (securityHold) {
99ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            acct.mFlags |= Account.FLAGS_SECURITY_HOLD;
100ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
101ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        acct.save(mProviderContext);
102ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        return acct.mId;
103ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
104ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
105ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
106ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Create a mailbox and return the ID.
107ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
108ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private long createMailbox(long accountId, int mailboxType) {
10953ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komalo        Mailbox box = new Mailbox();
11022208771b7b39c5d131372ba6bc45ab23cc22232Todd Kennedy        box.mServerId = box.mDisplayName = "mailbox";
111ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        box.mAccountKey = accountId;
112ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        box.mType = mailboxType;
113ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        box.mFlagVisible = true;
114ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        box.mVisibleLimit = Email.VISIBLE_LIMIT_DEFAULT;
115ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        box.save(mProviderContext);
116ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        return box.mId;
117ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
118ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
119ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
120ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Create a {@link MailboxFinder} and kick it.
121ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
122ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private void createAndStartFinder(final long accountId, final int mailboxType)
123ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            throws Throwable {
124ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        runTestOnUiThread(new Runnable() {
125ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            @Override
126ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            public void run() {
127ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                mMailboxFinder = new MailboxFinder(mProviderContext, accountId, mailboxType,
128ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                        mCallback);
129ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                mMailboxFinder.startLookup();
130086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                assertTrue(mMailboxFinder.isStartedForTest());
131ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            }
132ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        });
133ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
134ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
135ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
136ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Wait until any of the {@link MailboxFinder.Callback} method or
137ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * {@link Controller#updateMailboxList} is called.
138ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
139ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private void waitUntilCallbackCalled() {
140ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        TestUtils.waitUntil("", new TestUtils.Condition() {
141ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            @Override
142ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            public boolean isMet() {
143ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                return mCallback.isAnyMethodCalled() || mMockController.mCalledUpdateMailboxList;
144ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            }
145ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }, TIMEOUT);
146ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
147ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
148ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
149ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Account is on security hold.
150ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
151ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testSecurityHold() throws Throwable {
152ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long accountId = createAccount(true);
153ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
154ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
155ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
156ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
157ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
158ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mCallback.mCalledAccountSecurityHold);
159ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
160ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
161ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
162086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
163086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
164ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
165ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
166ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
167ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Account does not exist.
168ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
169ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testAccountNotFound() throws Throwable {
170ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        createAndStartFinder(123456, Mailbox.TYPE_INBOX); // No such account.
171ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
172ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
173ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mCallback.mCalledAccountNotFound);
174ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
175ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
176ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
177ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
178086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
179086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
180ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
181ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
182ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
183ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Mailbox found
184ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
185ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testMailboxFound() throws Throwable {
186ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long accountId = createAccount(false);
187ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long mailboxId = createMailbox(accountId, Mailbox.TYPE_INBOX);
188ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
189ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
190ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
191ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
192ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
193ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
194ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mCallback.mCalledMailboxFound);
195ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
196ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
197ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
198ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertEquals(accountId, mCallback.mAccountId);
199ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertEquals(mailboxId, mCallback.mMailboxId);
200086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
201086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
202ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
203ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
204ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
205086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * Common initialization for tests that involves network-lookup.
206ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
207086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    private void prepareForNetworkLookupTest(final long accountId) throws Throwable {
208086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        // Look for non-existing mailbox.
209ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
210ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
211ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
212086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        // Mailbox not found, so the finder should try network-looking up.
213ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
214ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
215ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
216ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
217ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
218ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Controller.updateMailboxList() should have been called, with the account id.
219ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mMockController.mCalledUpdateMailboxList);
220ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertEquals(accountId, mMockController.mPassedAccountId);
221ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
222ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        mMockController.reset();
223ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
224086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertFalse(mMailboxFinder.isReallyClosedForTest()); // Not closed yet
225086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    }
226086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
227086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    /**
228086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * Test: Account exists, but mailbox doesn't -> Get {@link Controller} to update the mailbox
229086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * list -> mailbox still doesn't exist.
230086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     */
231086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    public void testMailboxNotFound() throws Throwable {
232086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        final long accountId = createAccount(false);
233086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
234086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        prepareForNetworkLookupTest(accountId);
235086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
236ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Imitate the mCallback...
237ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        runTestOnUiThread(new Runnable() {
238ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            @Override
239ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            public void run() {
240ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                mMailboxFinder.getControllerResultsForTest().updateMailboxListCallback(
241ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                        null, accountId, 100);
242ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            }
243ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        });
244ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
245ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Task should have started, so wait for the response...
246ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
247ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
248ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
249ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
250ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
251ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mCallback.mCalledMailboxNotFound);
252ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
253086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
254086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
255ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
256ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
257ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
258ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Account exists, but mailbox doesn't -> Get {@link Controller} to update the mailbox
259ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * list -> found mailbox this time.
260ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
261ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testMailboxFoundOnNetwork() throws Throwable {
262ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long accountId = createAccount(false);
263ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
264086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        prepareForNetworkLookupTest(accountId);
265ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
266ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Create mailbox at this point.
267ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long mailboxId = createMailbox(accountId, Mailbox.TYPE_INBOX);
268ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
269ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Imitate the mCallback...
270ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        runTestOnUiThread(new Runnable() {
271ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            @Override
272ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            public void run() {
273ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                mMailboxFinder.getControllerResultsForTest().updateMailboxListCallback(
274ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                        null, accountId, 100);
275ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            }
276ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        });
277ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
278ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        // Task should have started, so wait for the response...
279ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
280ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
281ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
282ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
283ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mCallback.mCalledMailboxFound);
284ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
285ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
286ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
287ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertEquals(accountId, mCallback.mAccountId);
288ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertEquals(mailboxId, mCallback.mMailboxId);
289086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
290086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
291ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
292ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
293ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
294ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Account exists, but mailbox doesn't -> Get {@link Controller} to update the mailbox
295ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * list -> network error.
296ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
297ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testMailboxNotFoundNetworkError() throws Throwable {
298ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long accountId = createAccount(false);
299ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
300086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        prepareForNetworkLookupTest(accountId);
301086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
302086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        // Imitate the mCallback...
303086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        runTestOnUiThread(new Runnable() {
304086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            @Override
305086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            public void run() {
306086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                // network error.
307086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                mMailboxFinder.getControllerResultsForTest().updateMailboxListCallback(
308086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                        new MessagingException("Network error"), accountId, 0);
309086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            }
310086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        });
311ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
312ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
313ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
314ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
315086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mCallback.mCalledMailboxNotFound);
316086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
317ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
318086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
319086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    }
320ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
321086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    /**
322086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * Test: updateMailboxListCallback won't respond to update of a non-target account.
323086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     */
324086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    public void testUpdateMailboxListCallbackNonTarget() throws Throwable {
325086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        final long accountId = createAccount(false);
326ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
327086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        prepareForNetworkLookupTest(accountId);
328086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
329086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        // Callback from Controller, but for a different account.
330ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        runTestOnUiThread(new Runnable() {
331ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            @Override
332ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            public void run() {
333086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                long nonTargetAccountId = accountId + 1;
334ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                mMailboxFinder.getControllerResultsForTest().updateMailboxListCallback(
335086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki                        new MessagingException("Network error"), nonTargetAccountId, 0);
336ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            }
337ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        });
338ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
339086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        // Nothing happened.
340ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
341ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
342ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
343086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
344ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mMockController.mCalledUpdateMailboxList);
345086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
346086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertFalse(mMailboxFinder.isReallyClosedForTest()); // Not closed yet
347ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
348ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
349ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
350ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Test: Mailbox not found (mailbox of different type exists)
351ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
352ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    public void testMailboxNotFound2() throws Throwable {
353ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long accountId = createAccount(false);
354ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        final long mailboxId = createMailbox(accountId, Mailbox.TYPE_DRAFTS);
355ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
356ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
357ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        waitUntilCallbackCalled();
358ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
359ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountNotFound);
360ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledAccountSecurityHold);
361ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxFound);
362ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertFalse(mCallback.mCalledMailboxNotFound);
363ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        assertTrue(mMockController.mCalledUpdateMailboxList);
364086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
365086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertFalse(mMailboxFinder.isReallyClosedForTest()); // Not closed yet -- network lookup.
366086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    }
367086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
368086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    /**
369086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     * Test: Call {@link MailboxFinder#startLookup()} twice, which should throw an ISE.
370086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki     */
371086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    public void testRunTwice() throws Throwable {
372086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        final long accountId = createAccount(true);
373086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
374086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
375086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        try {
376086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            mMailboxFinder.startLookup();
377086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki            fail("Expected exception not thrown");
378086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        } catch (IllegalStateException ok) {
379086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        }
380086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    }
381086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
382086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki    public void testCancel() throws Throwable {
383086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        final long accountId = createAccount(true);
384086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki
385086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        createAndStartFinder(accountId, Mailbox.TYPE_INBOX);
386086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        mMailboxFinder.cancel();
387086aac2386a575a0e2c78b1fa8dd8ea13825ae2bMakoto Onuki        assertTrue(mMailboxFinder.isReallyClosedForTest());
388ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
389ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
390ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
391ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * A {@link Controller} that remembers if updateMailboxList has been called.
392ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
393ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private static class MockController extends Controller {
394d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile long mPassedAccountId;
395d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile boolean mCalledUpdateMailboxList;
396ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
397ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void reset() {
398ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mPassedAccountId = -1;
399ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledUpdateMailboxList = false;
400ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
401ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
402ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        protected MockController(Context context) {
403c184f36c2df16431693d7709e28ded593efc3da7Marc Blank            super(context);
404ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
405ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
406ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        @Override
407ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void updateMailboxList(long accountId) {
408ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledUpdateMailboxList = true;
409ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mPassedAccountId = accountId;
410ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
411ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
412ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
413ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    /**
414ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     * Callback that logs what method is called with what arguments.
415ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki     */
416ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    private static class MockCallback implements MailboxFinder.Callback {
417d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile boolean mCalledAccountNotFound;
418d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile boolean mCalledAccountSecurityHold;
419d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile boolean mCalledMailboxFound;
420d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile boolean mCalledMailboxNotFound;
421ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
422d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile long mAccountId = -1;
423d1a05e1cc32e31494af7a62e0395631bef3e1107Makoto Onuki        public volatile long mMailboxId = -1;
424ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
425ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public boolean isAnyMethodCalled() {
426ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            return mCalledAccountNotFound || mCalledAccountSecurityHold || mCalledMailboxFound
427ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki                    || mCalledMailboxNotFound;
428ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
429ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
430ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        @Override
431ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void onAccountNotFound() {
432ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledAccountNotFound = true;
433ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
434ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
435ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        @Override
436ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void onAccountSecurityHold(long accountId) {
437ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledAccountSecurityHold = true;
438ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mAccountId = accountId;
439ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
440ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
441ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        @Override
442ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void onMailboxFound(long accountId, long mailboxId) {
443ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledMailboxFound = true;
444ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mAccountId = accountId;
445ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mMailboxId = mailboxId;
446ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
447ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki
448ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        @Override
449ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        public void onMailboxNotFound(long accountId) {
450ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mCalledMailboxNotFound = true;
451ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki            mAccountId = accountId;
452ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki        }
453ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki    }
454ec15f2356e47d621584cc3fc84c9c02557e0a0dfMakoto Onuki}
455