blob: 54d832d25f229cb5a004f1c7a07c9d393f45cf8d [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import android.os.AsyncTask;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.WithTestDefaultsRunner;
import com.xtremelabs.robolectric.util.Join;
import com.xtremelabs.robolectric.util.Transcript;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
@RunWith(WithTestDefaultsRunner.class)
public class AsyncTaskTest {
private Transcript transcript;
@Before public void setUp() throws Exception {
transcript = new Transcript();
Robolectric.getBackgroundScheduler().pause();
Robolectric.getUiThreadScheduler().pause();
}
@Test
public void testNormalFlow() throws Exception {
AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
asyncTask.execute("a", "b");
transcript.assertEventsSoFar("onPreExecute");
Robolectric.runBackgroundTasks();
transcript.assertEventsSoFar("doInBackground a, b");
assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS));
Robolectric.runUiThreadTasks();
transcript.assertEventsSoFar("onPostExecute c");
}
@Test
public void testCancelBeforeBackground() throws Exception {
AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
asyncTask.execute("a", "b");
transcript.assertEventsSoFar("onPreExecute");
assertTrue(asyncTask.cancel(true));
assertTrue(asyncTask.isCancelled());
Robolectric.runBackgroundTasks();
transcript.assertNoEventsSoFar();
Robolectric.runUiThreadTasks();
transcript.assertEventsSoFar("onCancelled");
}
@Test
public void testCancelBeforePostExecute() throws Exception {
AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
asyncTask.execute("a", "b");
transcript.assertEventsSoFar("onPreExecute");
Robolectric.runBackgroundTasks();
transcript.assertEventsSoFar("doInBackground a, b");
assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS));
assertFalse(asyncTask.cancel(true));
assertFalse(asyncTask.isCancelled());
Robolectric.runUiThreadTasks();
transcript.assertEventsSoFar("onPostExecute c");
}
@Test
public void progressUpdatesAreQueuedUntilBackgroundThreadFinishes() throws Exception {
AsyncTask<String, String, String> asyncTask = new MyAsyncTask() {
@Override protected String doInBackground(String... strings) {
publishProgress("33%");
publishProgress("66%");
publishProgress("99%");
return "done";
}
};
asyncTask.execute("a", "b");
transcript.assertEventsSoFar("onPreExecute");
Robolectric.runBackgroundTasks();
transcript.assertNoEventsSoFar();
assertEquals("Result should get stored in the AsyncTask", "done", asyncTask.get(100, TimeUnit.MILLISECONDS));
Robolectric.runUiThreadTasks();
transcript.assertEventsSoFar(
"onProgressUpdate 33%",
"onProgressUpdate 66%",
"onProgressUpdate 99%",
"onPostExecute done");
}
@Test
public void executeReturnsAsyncTask() throws Exception {
Robolectric.getBackgroundScheduler().unPause();
AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
assertThat(asyncTask.execute("a", "b").get(), equalTo("c"));
}
@Test
public void shouldGetStatusForAsyncTask() throws Exception {
AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
assertThat(asyncTask.getStatus(), is(AsyncTask.Status.PENDING));
asyncTask.execute("a");
assertThat(asyncTask.getStatus(), is(AsyncTask.Status.RUNNING));
Robolectric.getBackgroundScheduler().unPause();
assertThat(asyncTask.getStatus(), is(AsyncTask.Status.FINISHED));
}
private class MyAsyncTask extends AsyncTask<String, String, String> {
@Override protected void onPreExecute() {
transcript.add("onPreExecute");
}
@Override protected String doInBackground(String... strings) {
transcript.add("doInBackground " + Join.join(", ", (Object[]) strings));
return "c";
}
@Override protected void onProgressUpdate(String... values) {
transcript.add("onProgressUpdate " + Join.join(", ", (Object[]) values));
}
@Override protected void onPostExecute(String s) {
transcript.add("onPostExecute " + s);
}
@Override protected void onCancelled() {
transcript.add("onCancelled");
}
}
}