ModernAsyncTaskTest.java revision db7cc953f35069e445cf1dd1d59058b9b1665e5c
1db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler/*
2db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * Copyright (C) 2016 The Android Open Source Project
3db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler *
4db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
5db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * you may not use this file except in compliance with the License.
6db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * You may obtain a copy of the License at
7db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler *
8db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
9db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler *
10db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * Unless required by applicable law or agreed to in writing, software
11db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
12db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * See the License for the specific language governing permissions and
14db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler * limitations under the License
15db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler */
16db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
17db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerpackage android.support.v4.content;
18db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
19db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport android.support.test.InstrumentationRegistry;
20db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport android.support.test.runner.AndroidJUnit4;
21db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
22db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport org.junit.Test;
23db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport org.junit.runner.RunWith;
24db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
25db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport java.util.concurrent.CountDownLatch;
26db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport java.util.concurrent.TimeUnit;
27db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
28db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerimport static org.junit.Assert.*;
29db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
30db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler@RunWith(AndroidJUnit4.class)
31db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantlerpublic class ModernAsyncTaskTest {
32db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
33db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler    ModernAsyncTask mModernAsyncTask;
34db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
35db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler    /**
36db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler     * Test to ensure that onCancelled is always called, even if doInBackground throws an exception.
37db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler     *
38db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler     * @throws Throwable
39db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler     */
40db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler    @Test
41db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler    public void testCancellationWithException() throws Throwable {
42db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        final CountDownLatch readyToCancel = new CountDownLatch(1);
43db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        final CountDownLatch readyToThrow = new CountDownLatch(1);
44db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        final CountDownLatch calledOnCancelled = new CountDownLatch(1);
45db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
46db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler            @Override
47db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler            public void run() {
48db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                mModernAsyncTask = new ModernAsyncTask() {
49db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    @Override
50db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    protected Object doInBackground(Object[] params) {
51db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        readyToCancel.countDown();
52db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        try {
53db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                            readyToThrow.await();
54db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        } catch (InterruptedException e) {}
55db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        // This exception is expected to be caught and ignored
56db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        throw new RuntimeException();
57db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    }
58db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
59db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    @Override
60db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    protected void onCancelled(Object o) {
61db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                        calledOnCancelled.countDown();
62db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                    }
63db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler                };
64db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler            }
65db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        });
66db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler
67db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        mModernAsyncTask.execute();
68db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        if (!readyToCancel.await(5, TimeUnit.SECONDS)) {
69db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler            fail("Test failure: doInBackground did not run in time.");
70db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        }
71db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        mModernAsyncTask.cancel(false);
72db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        readyToThrow.countDown();
73db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        if (!calledOnCancelled.await(5, TimeUnit.SECONDS)) {
74db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler            fail("onCancelled not called!");
75db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler        }
76db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler    }
77db7cc953f35069e445cf1dd1d59058b9b1665e5cTony Mantler}
78