16b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki/* 26b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * Copyright (C) 2011 The Android Open Source Project 36b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * 46b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 56b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * you may not use this file except in compliance with the License. 66b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * You may obtain a copy of the License at 76b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * 86b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 96b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * 106b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * Unless required by applicable law or agreed to in writing, software 116b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 126b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * See the License for the specific language governing permissions and 146b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki * limitations under the License. 156b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki */ 166b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 176b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onukipackage com.android.emailcommon.utility; 186b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 196b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onukiimport android.test.AndroidTestCase; 207037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xieimport android.test.suitebuilder.annotation.Suppress; 216b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 226b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onukiimport java.util.ArrayList; 236b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onukiimport java.util.concurrent.atomic.AtomicInteger; 246b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 257037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie@Suppress 266b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onukipublic class DelayedOperationsTests extends AndroidTestCase { 276b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki private DelayedOperationsForTest mDelayedOperations; 286b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 296b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override 306b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki protected void setUp() throws Exception { 316b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki super.setUp(); 326b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 336b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations = new DelayedOperationsForTest(); 346b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 356b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 367037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie public void brokentestEnueue() { 376b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Can pass only final vars, so AtomicInteger. 386b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki final AtomicInteger i = new AtomicInteger(1); 396b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 406b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(new Runnable() { 416b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 426b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(2); 436b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 446b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 456b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 466b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(new Runnable() { 476b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 486b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(4); 496b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 506b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 516b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 526b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // 2 ops queued. 536b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(2, mDelayedOperations.mPendingOperations.size()); 546b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 556b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Value still not changed. 566b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(1, i.get()); 576b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 586b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Execute all pending tasks! 596b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.runQueuedOperations(); 606b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 616b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // 1 + 2 + 4 = 7 626b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(7, i.get()); 636b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 646b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // No pending tasks. 656b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(0, mDelayedOperations.mPendingOperations.size()); 666b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 676b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 687037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie public void brokentestCancel() { 696b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Can pass only final vars, so AtomicInteger. 706b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki final AtomicInteger i = new AtomicInteger(1); 716b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 726b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Post & cancel it immediately 736b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki Runnable r; 746b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(r = new Runnable() { 756b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 766b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(2); 776b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 786b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 796b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.removeCallbacks(r); 806b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 816b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(new Runnable() { 826b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 836b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(4); 846b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 856b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 866b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 876b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // 1 op queued. 886b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(1, mDelayedOperations.mPendingOperations.size()); 896b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 906b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Value still not changed. 916b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(1, i.get()); 926b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 936b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Execute all pending tasks! 946b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.runQueuedOperations(); 956b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 966b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // 1 + 4 = 5 976b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(5, i.get()); 986b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 996b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // No pending tasks. 1006b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(0, mDelayedOperations.mPendingOperations.size()); 1016b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1026b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1037037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie public void brokentestCancelAll() { 1046b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Can pass only final vars, so AtomicInteger. 1056b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki final AtomicInteger i = new AtomicInteger(1); 1066b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1076b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(new Runnable() { 1086b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 1096b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(2); 1106b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1116b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 1126b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1136b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.post(new Runnable() { 1146b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override public void run() { 1156b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki i.addAndGet(4); 1166b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1176b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki }); 1186b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1196b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // 2 op queued. 1206b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(2, mDelayedOperations.mPendingOperations.size()); 1216b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1226b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Value still not changed. 1236b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(1, i.get()); 1246b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1256b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Cancel all!! 1266b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mDelayedOperations.removeCallbacks(); 1276b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1286b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // There should be no pending tasks in handler. 1296b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(0, mDelayedOperations.mPostedToHandler.size()); 1306b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1316b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Nothing should have changed. 1326b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(1, i.get()); 1336b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1346b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // No pending tasks. 1356b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki assertEquals(0, mDelayedOperations.mPendingOperations.size()); 1366b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1376b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1386b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki private static class DelayedOperationsForTest extends DelayedOperations { 1396b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Represents all runnables pending in the handler. 1406b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki public final ArrayList<Runnable> mPostedToHandler = new ArrayList<Runnable>(); 1416b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1426b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki public DelayedOperationsForTest() { 1436b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki super(null); 1446b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1456b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1466b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Emulate Handler.post 1476b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override 1486b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki void postRunnable(Runnable r) { 1496b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mPostedToHandler.add(r); 1506b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1516b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1526b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki // Emulate Handler.removeCallbacks 1536b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki @Override 1546b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki void cancelRunnable(Runnable r) { 1556b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mPostedToHandler.remove(r); 1566b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1576b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki 1586b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki public void runQueuedOperations() { 1596b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki for (Runnable r : mPostedToHandler) { 1606b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki r.run(); 1616b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1626b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki mPostedToHandler.clear(); 1636b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1646b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki } 1656b968c1dce3ba78680d968e04fc6f59bbbb22073Makoto Onuki} 166