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