1ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki/*
2ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * Copyright (C) 2011 The Android Open Source Project
3ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki *
4ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * you may not use this file except in compliance with the License.
6ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * You may obtain a copy of the License at
7ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki *
8ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki *
10ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * Unless required by applicable law or agreed to in writing, software
11ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * See the License for the specific language governing permissions and
14ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki * limitations under the License.
15ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki */
16ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
17ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onukipackage com.android.emailcommon.utility;
18ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
19ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onukiimport android.test.AndroidTestCase;
20ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onukiimport android.test.MoreAsserts;
213555dc03bf2243dc275c9c832702abbee3b64387Jerry Xieimport android.test.suitebuilder.annotation.SmallTest;
22ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
233555dc03bf2243dc275c9c832702abbee3b64387Jerry Xie@SmallTest
24ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onukipublic class EmailAsyncTaskTests extends AndroidTestCase {
25ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    public void testAll() throws Exception {
26ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Because AsyncTask relies on the UI thread and how we use threads in test, we can't
27ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // execute() these tasks.
28ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Instead, we directly call onPostExecute/onCancel.
29ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
30ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final EmailAsyncTask.Tracker tracker = new EmailAsyncTask.Tracker();
31ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
32ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Initially empty
33ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(0, tracker.getTaskCountForTest());
34ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
35ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Start 4 tasks
36ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final MyTask task1 = new MyTask(tracker);
37ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(1, tracker.getTaskCountForTest());
38ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
39ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final MyTask task2 = new MyTask(tracker);
40ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(2, tracker.getTaskCountForTest());
41ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
42ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final MyTask task3 = new MyTask(tracker);
43ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(3, tracker.getTaskCountForTest());
44ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
45ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final MyTask task4 = new MyTask(tracker);
46ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(4, tracker.getTaskCountForTest());
47ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
48ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Check the piping for doInBackground
49ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        task1.mDoInBackgroundResult = "R";
50ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals("R", task1.callDoInBackgroundForTest("1", "2"));
51ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        MoreAsserts.assertEquals(new String[] {"1", "2"}, task1.mDoInBackgroundArg);
52ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
53ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Finish task1
54ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        task1.callOnPostExecuteForTest("a");
55ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
56ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // onPostExecute should unregister the instance
57ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(3, tracker.getTaskCountForTest());
58ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // and call onPostExecuteInternal
59ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals("a", task1.mOnPostExecuteArg);
60ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertNull(task1.mOnCancelledArg);
61ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
62ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Cancel task 3
63ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        task3.callOnCancelledForTest("b");
64ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // onCancelled should unregister the instance too
65ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(2, tracker.getTaskCountForTest());
66ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // and call onCancelledInternal
67ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertNull(task3.mOnPostExecuteArg);
68ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals("b", task3.mOnCancelledArg);
69ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
70ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Task 2 and 4 are still registered.
71ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
72ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Cancel all left
73feeb1e3adac000f36e1e7a5d754ad6b4e3ab34c1Tony Mantler        tracker.cancelAllInterrupt();
74ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
75ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        // Check if they're canceled
76ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        assertEquals(0, tracker.getTaskCountForTest());
77ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    }
78ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
79ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    // Make sure null tracker will be accepted
80ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    public void testNullTracker() {
81ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        final MyTask task1 = new MyTask(null);
82ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        task1.unregisterSelf();
83ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    }
84ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
85d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki    /**
86d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki     * Test for {@link EmailAsyncTask.Tracker#cancelOthers}
87d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki     */
88d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki    public void testCancellOthers() {
89d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final EmailAsyncTask.Tracker tracker = new EmailAsyncTask.Tracker();
90d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
91d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask task1 = new MyTask(tracker);
92d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask task2 = new MyTask(tracker);
93d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask task3 = new MyTask(tracker);
94d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
95d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask sub1 = new MyTaskSubClass(tracker);
96d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask sub2 = new MyTaskSubClass(tracker);
97d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        final MyTask sub3 = new MyTaskSubClass(tracker);
98d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
99d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        // All should be in the tracker.
100d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertEquals(6, tracker.getTaskCountForTest());
101d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
102d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        // This should remove task1, task2, but not task3 itself.
103d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        tracker.cancelOthers(task3);
104d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
105d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertEquals(4, tracker.getTaskCountForTest());
106d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertTrue(tracker.containsTaskForTest(task3));
107d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
108d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        // Same for sub1.
109d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        tracker.cancelOthers(sub1);
110d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
111d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertEquals(2, tracker.getTaskCountForTest());
112d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertTrue(tracker.containsTaskForTest(task3));
113d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        assertTrue(tracker.containsTaskForTest(sub1));
114d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki    }
115d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
116ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    private static class MyTask extends EmailAsyncTask<String, String, String> {
117ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        public String[] mDoInBackgroundArg;
118ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        public String mDoInBackgroundResult;
119ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        public String mOnCancelledArg;
120ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        public String mOnPostExecuteArg;
121ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
122ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        public MyTask(Tracker tracker) {
123ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki            super(tracker);
124ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        }
125ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
126ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        @Override
127ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        protected String doInBackground(String... params) {
128ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki            mDoInBackgroundArg = params;
129ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki            return mDoInBackgroundResult;
130ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        }
131ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
132ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        @Override
133ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        protected void onCancelled(String result) {
134ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki            mOnCancelledArg = result;
135ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        }
136ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki
137ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        @Override
13850d934360d51392ac2aa6f11de4d6e1446cf78c9Makoto Onuki        protected void onSuccess(String result) {
139ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki            mOnPostExecuteArg = result;
140ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki        }
141ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki    }
142d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki
143d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki    private static class MyTaskSubClass extends MyTask {
144d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        public MyTaskSubClass(Tracker tracker) {
145d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki            super(tracker);
146d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki        }
147d72f7bdf114a21db6aac66a7e83d6b002c8e8ed5Makoto Onuki    }
148ba125ab5ac747bb382dc8fe986dd8f0ed72ca596Makoto Onuki}
149