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