Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import java.util.concurrent.TimeUnit;
      4 
      5 import org.junit.Before;
      6 import org.junit.Test;
      7 import org.junit.runner.RunWith;
      8 
      9 import android.os.AsyncTask;
     10 
     11 import com.xtremelabs.robolectric.Robolectric;
     12 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
     13 import com.xtremelabs.robolectric.util.Join;
     14 import com.xtremelabs.robolectric.util.Transcript;
     15 
     16 import static org.hamcrest.CoreMatchers.equalTo;
     17 import static org.hamcrest.CoreMatchers.is;
     18 import static org.junit.Assert.*;
     19 
     20 @RunWith(WithTestDefaultsRunner.class)
     21 public class AsyncTaskTest {
     22     private Transcript transcript;
     23 
     24     @Before public void setUp() throws Exception {
     25         transcript = new Transcript();
     26         Robolectric.getBackgroundScheduler().pause();
     27         Robolectric.getUiThreadScheduler().pause();
     28     }
     29 
     30     @Test
     31     public void testNormalFlow() throws Exception {
     32         AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
     33 
     34         asyncTask.execute("a", "b");
     35         transcript.assertEventsSoFar("onPreExecute");
     36 
     37         Robolectric.runBackgroundTasks();
     38         transcript.assertEventsSoFar("doInBackground a, b");
     39         assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS));
     40 
     41         Robolectric.runUiThreadTasks();
     42         transcript.assertEventsSoFar("onPostExecute c");
     43     }
     44 
     45     @Test
     46     public void testCancelBeforeBackground() throws Exception {
     47         AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
     48 
     49         asyncTask.execute("a", "b");
     50         transcript.assertEventsSoFar("onPreExecute");
     51 
     52         assertTrue(asyncTask.cancel(true));
     53         assertTrue(asyncTask.isCancelled());
     54 
     55         Robolectric.runBackgroundTasks();
     56         transcript.assertNoEventsSoFar();
     57 
     58         Robolectric.runUiThreadTasks();
     59         transcript.assertEventsSoFar("onCancelled");
     60     }
     61 
     62     @Test
     63     public void testCancelBeforePostExecute() throws Exception {
     64         AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
     65 
     66         asyncTask.execute("a", "b");
     67         transcript.assertEventsSoFar("onPreExecute");
     68 
     69         Robolectric.runBackgroundTasks();
     70         transcript.assertEventsSoFar("doInBackground a, b");
     71         assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS));
     72 
     73         assertFalse(asyncTask.cancel(true));
     74         assertFalse(asyncTask.isCancelled());
     75 
     76         Robolectric.runUiThreadTasks();
     77         transcript.assertEventsSoFar("onPostExecute c");
     78     }
     79 
     80     @Test
     81     public void progressUpdatesAreQueuedUntilBackgroundThreadFinishes() throws Exception {
     82         AsyncTask<String, String, String> asyncTask = new MyAsyncTask() {
     83             @Override protected String doInBackground(String... strings) {
     84                 publishProgress("33%");
     85                 publishProgress("66%");
     86                 publishProgress("99%");
     87                 return "done";
     88             }
     89         };
     90 
     91         asyncTask.execute("a", "b");
     92         transcript.assertEventsSoFar("onPreExecute");
     93 
     94         Robolectric.runBackgroundTasks();
     95         transcript.assertNoEventsSoFar();
     96         assertEquals("Result should get stored in the AsyncTask", "done", asyncTask.get(100, TimeUnit.MILLISECONDS));
     97 
     98         Robolectric.runUiThreadTasks();
     99         transcript.assertEventsSoFar(
    100                 "onProgressUpdate 33%",
    101                 "onProgressUpdate 66%",
    102                 "onProgressUpdate 99%",
    103                 "onPostExecute done");
    104     }
    105 
    106     @Test
    107     public void executeReturnsAsyncTask() throws Exception {
    108         Robolectric.getBackgroundScheduler().unPause();
    109         AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
    110         assertThat(asyncTask.execute("a", "b").get(), equalTo("c"));
    111     }
    112 
    113     @Test
    114     public void shouldGetStatusForAsyncTask() throws Exception {
    115         AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
    116         assertThat(asyncTask.getStatus(), is(AsyncTask.Status.PENDING));
    117         asyncTask.execute("a");
    118         assertThat(asyncTask.getStatus(), is(AsyncTask.Status.RUNNING));
    119         Robolectric.getBackgroundScheduler().unPause();
    120         assertThat(asyncTask.getStatus(), is(AsyncTask.Status.FINISHED));
    121     }
    122 
    123     private class MyAsyncTask extends AsyncTask<String, String, String> {
    124         @Override protected void onPreExecute() {
    125             transcript.add("onPreExecute");
    126         }
    127 
    128         @Override protected String doInBackground(String... strings) {
    129             transcript.add("doInBackground " + Join.join(", ", (Object[]) strings));
    130             return "c";
    131         }
    132 
    133         @Override protected void onProgressUpdate(String... values) {
    134             transcript.add("onProgressUpdate " + Join.join(", ", (Object[]) values));
    135         }
    136 
    137         @Override protected void onPostExecute(String s) {
    138             transcript.add("onPostExecute " + s);
    139         }
    140 
    141         @Override protected void onCancelled() {
    142         	transcript.add("onCancelled");
    143         }
    144     }
    145 }
    146