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