| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.base.task; |
| |
| import android.support.annotation.NonNull; |
| import android.support.test.filters.SmallTest; |
| |
| import org.hamcrest.CoreMatchers; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.rules.ExpectedException; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.test.BaseJUnit4ClassRunner; |
| |
| import java.util.concurrent.ArrayBlockingQueue; |
| import java.util.concurrent.Executor; |
| import java.util.concurrent.RejectedExecutionException; |
| import java.util.concurrent.ThreadFactory; |
| import java.util.concurrent.TimeUnit; |
| |
| /** |
| * Tests for our AsyncTask modifications |
| * |
| * Not a robolectric test because the reflection doesn't work with ShadowAsyncTask. |
| */ |
| @RunWith(BaseJUnit4ClassRunner.class) |
| public class AsyncTaskTest { |
| private static class SpecialChromeAsyncTask extends AsyncTask<Void> { |
| @Override |
| protected Void doInBackground() { |
| return null; |
| } |
| } |
| |
| @SuppressWarnings("NoAndroidAsyncTaskCheck") |
| private static class SpecialOsAsyncTask extends android.os.AsyncTask<Void, Void, Void> { |
| @Override |
| protected Void doInBackground(Void... params) { |
| return null; |
| } |
| } |
| |
| private static class SpecialRunnable implements Runnable { |
| @Override |
| public void run() {} |
| } |
| |
| private static final int QUEUE_SIZE = 40; |
| |
| @Rule |
| public ExpectedException thrown = ExpectedException.none(); |
| |
| /** |
| * Test filling the queue with basic Runnables, then add a final AsyncTask to overfill it, and |
| * ensure the Runnable is the one blamed in the exception message. |
| */ |
| @Test |
| @SmallTest |
| public void testChromeThreadPoolExecutorRunnables() { |
| Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, |
| new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() { |
| @Override |
| public Thread newThread(@NonNull Runnable r) { |
| return null; |
| } |
| }); |
| for (int i = 0; i < QUEUE_SIZE; i++) { |
| executor.execute(new SpecialRunnable()); |
| } |
| thrown.expect(RejectedExecutionException.class); |
| thrown.expectMessage(CoreMatchers.containsString( |
| "org.chromium.base.task.AsyncTaskTest$SpecialRunnable")); |
| thrown.expectMessage( |
| CoreMatchers.not(CoreMatchers.containsString("SpecialChromeAsyncTask"))); |
| new SpecialChromeAsyncTask().executeOnExecutor(executor); |
| } |
| |
| /** |
| * Test filling the queue with Chrome AsyncTasks, then add a final OS AsyncTask to |
| * overfill it and ensure the Chrome AsyncTask is the one blamed in the exception message. |
| */ |
| @Test |
| @SmallTest |
| public void testChromeThreadPoolExecutorChromeAsyncTask() { |
| Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, |
| new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() { |
| @Override |
| public Thread newThread(@NonNull Runnable r) { |
| return null; |
| } |
| }); |
| for (int i = 0; i < QUEUE_SIZE; i++) { |
| new SpecialChromeAsyncTask().executeOnExecutor(executor); |
| } |
| thrown.expect(RejectedExecutionException.class); |
| thrown.expectMessage(CoreMatchers.containsString( |
| "org.chromium.base.task.AsyncTaskTest$SpecialChromeAsyncTask")); |
| thrown.expectMessage(CoreMatchers.not(CoreMatchers.containsString("SpecialOsAsyncTask"))); |
| new SpecialOsAsyncTask().executeOnExecutor(executor); |
| } |
| |
| /** |
| * Test filling the queue with android.os.AsyncTasks, then add a final ChromeAsyncTask to |
| * overfill it and ensure the OsAsyncTask is the one blamed in the exception message. |
| */ |
| @Test |
| @SmallTest |
| public void testChromeThreadPoolExecutorOsAsyncTask() { |
| Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, |
| new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() { |
| @Override |
| public Thread newThread(@NonNull Runnable r) { |
| return null; |
| } |
| }); |
| for (int i = 0; i < QUEUE_SIZE; i++) { |
| new SpecialOsAsyncTask().executeOnExecutor(executor); |
| } |
| thrown.expect(RejectedExecutionException.class); |
| thrown.expectMessage(CoreMatchers.containsString( |
| "org.chromium.base.task.AsyncTaskTest$SpecialOsAsyncTask")); |
| thrown.expectMessage( |
| CoreMatchers.not(CoreMatchers.containsString("SpecialChromeAsyncTask"))); |
| new SpecialChromeAsyncTask().executeOnExecutor(executor); |
| } |
| } |