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