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