blob: 6d5395464ad4e82b3225ee19b77a1c34878089c7 [file] [log] [blame]
// Copyright 2015 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.test;
import static org.junit.Assert.fail;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowApplication;
import org.chromium.base.task.AsyncTask;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Executes async tasks on a background thread and waits on the result on the main thread.
* This is useful for users of AsyncTask on Roboelectric who check if the code is actually being
* run on a background thread (i.e. through the use of {@link ThreadUtils#runningOnUiThread()}).
* @param <Result> type for reporting result
*/
@Implements(AsyncTask.class)
public class BackgroundShadowAsyncTask<Result> extends ShadowAsyncTask<Result> {
private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
@Override
@Implementation
public final AsyncTask<Result> executeOnExecutor(Executor e) {
try {
return sExecutorService
.submit(new Callable<AsyncTask<Result>>() {
@Override
public AsyncTask<Result> call() throws Exception {
return BackgroundShadowAsyncTask.super.executeInRobolectric();
}
})
.get();
} catch (Exception ex) {
fail(ex.getMessage());
return null;
}
}
@Override
@Implementation
public final Result get() {
try {
runBackgroundTasks();
return BackgroundShadowAsyncTask.super.get();
} catch (Exception e) {
return null;
}
}
public static void runBackgroundTasks() throws Exception {
sExecutorService
.submit(new Runnable() {
@Override
public void run() {
ShadowApplication.runBackgroundTasks();
}
})
.get();
}
}