171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamspackage com.xtremelabs.robolectric.shadows; 271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 38d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traftimport java.util.concurrent.TimeUnit; 48d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft 58d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traftimport org.junit.Before; 68d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traftimport org.junit.Test; 78d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traftimport org.junit.runner.RunWith; 88d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft 971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamsimport android.os.AsyncTask; 108d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft 1171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamsimport com.xtremelabs.robolectric.Robolectric; 1271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamsimport com.xtremelabs.robolectric.WithTestDefaultsRunner; 1371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamsimport com.xtremelabs.robolectric.util.Join; 1471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamsimport com.xtremelabs.robolectric.util.Transcript; 1571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 168cb1d30709655f11542120d321f1293954a70d96Jan Berkelimport static org.hamcrest.CoreMatchers.equalTo; 17f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkelimport static org.hamcrest.CoreMatchers.is; 188cb1d30709655f11542120d321f1293954a70d96Jan Berkelimport static org.junit.Assert.*; 198cb1d30709655f11542120d321f1293954a70d96Jan Berkel 2071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams@RunWith(WithTestDefaultsRunner.class) 2171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williamspublic class AsyncTaskTest { 2271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams private Transcript transcript; 2371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 2471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Before public void setUp() throws Exception { 2571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript = new Transcript(); 260fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin Robolectric.getBackgroundScheduler().pause(); 27a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz Robolectric.getUiThreadScheduler().pause(); 2871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 2971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 3071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Test 3171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams public void testNormalFlow() throws Exception { 3271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams AsyncTask<String, String, String> asyncTask = new MyAsyncTask(); 3371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 3471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams asyncTask.execute("a", "b"); 3571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("onPreExecute"); 3671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 3771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runBackgroundTasks(); 3871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("doInBackground a, b"); 398d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS)); 4071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 4171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runUiThreadTasks(); 4271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("onPostExecute c"); 4371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 4471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 4571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Test 4671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams public void testCancelBeforeBackground() throws Exception { 4771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams AsyncTask<String, String, String> asyncTask = new MyAsyncTask(); 4871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 4971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams asyncTask.execute("a", "b"); 5071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("onPreExecute"); 5171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 528d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertTrue(asyncTask.cancel(true)); 538d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertTrue(asyncTask.isCancelled()); 5471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 5571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runBackgroundTasks(); 5671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertNoEventsSoFar(); 5771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 5871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runUiThreadTasks(); 598d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft transcript.assertEventsSoFar("onCancelled"); 6071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 6171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 6271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Test 6371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams public void testCancelBeforePostExecute() throws Exception { 6471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams AsyncTask<String, String, String> asyncTask = new MyAsyncTask(); 6571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 6671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams asyncTask.execute("a", "b"); 6771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("onPreExecute"); 6871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 6971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runBackgroundTasks(); 7071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("doInBackground a, b"); 718d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS)); 7271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 738d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertFalse(asyncTask.cancel(true)); 748d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertFalse(asyncTask.isCancelled()); 7571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 7671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams Robolectric.runUiThreadTasks(); 7771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.assertEventsSoFar("onPostExecute c"); 7871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 7971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 806b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams @Test 816b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams public void progressUpdatesAreQueuedUntilBackgroundThreadFinishes() throws Exception { 826b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams AsyncTask<String, String, String> asyncTask = new MyAsyncTask() { 836b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams @Override protected String doInBackground(String... strings) { 846b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams publishProgress("33%"); 856b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams publishProgress("66%"); 866b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams publishProgress("99%"); 876b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams return "done"; 886b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams } 896b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams }; 906b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams 916b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams asyncTask.execute("a", "b"); 926b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams transcript.assertEventsSoFar("onPreExecute"); 936b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams 946b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams Robolectric.runBackgroundTasks(); 956b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams transcript.assertNoEventsSoFar(); 968d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft assertEquals("Result should get stored in the AsyncTask", "done", asyncTask.get(100, TimeUnit.MILLISECONDS)); 976b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams 986b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams Robolectric.runUiThreadTasks(); 996b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams transcript.assertEventsSoFar( 1006b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams "onProgressUpdate 33%", 1016b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams "onProgressUpdate 66%", 1026b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams "onProgressUpdate 99%", 1036b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams "onPostExecute done"); 1046b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams } 1056b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams 1068cb1d30709655f11542120d321f1293954a70d96Jan Berkel @Test 1078cb1d30709655f11542120d321f1293954a70d96Jan Berkel public void executeReturnsAsyncTask() throws Exception { 1088cb1d30709655f11542120d321f1293954a70d96Jan Berkel Robolectric.getBackgroundScheduler().unPause(); 1098cb1d30709655f11542120d321f1293954a70d96Jan Berkel AsyncTask<String, String, String> asyncTask = new MyAsyncTask(); 1108cb1d30709655f11542120d321f1293954a70d96Jan Berkel assertThat(asyncTask.execute("a", "b").get(), equalTo("c")); 1118cb1d30709655f11542120d321f1293954a70d96Jan Berkel } 1128cb1d30709655f11542120d321f1293954a70d96Jan Berkel 113f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel @Test 114f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel public void shouldGetStatusForAsyncTask() throws Exception { 115f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel AsyncTask<String, String, String> asyncTask = new MyAsyncTask(); 116f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel assertThat(asyncTask.getStatus(), is(AsyncTask.Status.PENDING)); 117f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel asyncTask.execute("a"); 118f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel assertThat(asyncTask.getStatus(), is(AsyncTask.Status.RUNNING)); 119f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel Robolectric.getBackgroundScheduler().unPause(); 120f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel assertThat(asyncTask.getStatus(), is(AsyncTask.Status.FINISHED)); 121f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel } 122f98fe60b10305335ff39a2dd6ab04948e9fc83f7Jan Berkel 12371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams private class MyAsyncTask extends AsyncTask<String, String, String> { 12471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Override protected void onPreExecute() { 12571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.add("onPreExecute"); 12671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 12771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 12871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Override protected String doInBackground(String... strings) { 129c8eb8dfe132e60694d76d1a5a15af94cd508e308Phil Goodwin & Tyler Schultz transcript.add("doInBackground " + Join.join(", ", (Object[]) strings)); 13071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams return "c"; 13171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 13271d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 13371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Override protected void onProgressUpdate(String... values) { 1346b3f26530e07e46c5c79d37a3cdeb3856f9339cdChristian Williams transcript.add("onProgressUpdate " + Join.join(", ", (Object[]) values)); 13571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 13671d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 13771d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Override protected void onPostExecute(String s) { 13871d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams transcript.add("onPostExecute " + s); 13971d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 14071d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams 14171d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams @Override protected void onCancelled() { 1428d84df659ff5bf89d11256618a5e4c5f08cc15eaNeil Traft transcript.add("onCancelled"); 14371d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 14471d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams } 14571d7c3bcf0400e4b81109dd785187e1a93da3cabChristian Williams} 146