blob: 61dea5ccb1dba4a349dea7c563f0c07c6703f08c [file] [log] [blame]
// 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);
}
}