19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.HandlerThread;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class HandlerThreadTest extends TestCase {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TEST_WHAT = 1;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mGotMessage = false;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mGotMessageWhat = -1;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private volatile boolean mDidSetup = false;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private volatile int mLooperTid = -1;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testHandlerThread() throws Exception {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HandlerThread th1 =  new HandlerThread("HandlerThreadTest") {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            protected void onLooperPrepared() {
39207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                synchronized (HandlerThreadTest.this) {
40207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                    mDidSetup = true;
41207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                    mLooperTid = Process.myTid();
42207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                    HandlerThreadTest.this.notify();
43207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse(th1.isAlive());
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNull(th1.getLooper());
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        th1.start();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(th1.isAlive());
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(th1.getLooper());
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        // The call to getLooper() internally blocks until the looper is
56207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        // available, but will call onLooperPrepared() after that.  So we
57207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        // need to block here to wait for our onLooperPrepared() to complete
58207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        // and fill in the values we expect.
59207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        synchronized (this) {
60207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn            while (!mDidSetup) {
61207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                try {
62207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                    wait();
63207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                } catch (InterruptedException e) {
64207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn                }
65207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn            }
66207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        }
67207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn
68207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        // Make sure that the process was set.
69207700d857cbaedca6ed19af74b29eae12988644Dianne Hackborn        assertNotSame(-1, mLooperTid);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure that the onLooperPrepared() was called on a different thread.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotSame(Process.myTid(), mLooperTid);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Handler h1 = new Handler(th1.getLooper()) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void handleMessage(Message msg) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assertEquals(TEST_WHAT, msg.what);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Ensure that we are running on the same thread in which the looper was setup on.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assertEquals(mLooperTid, Process.myTid());
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGotMessageWhat = msg.what;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGotMessage = true;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized(this) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = h1.obtainMessage(TEST_WHAT);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (h1) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // wait until we have the lock before sending the message.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            h1.sendMessage(msg);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // wait for the message to be handled
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                h1.wait();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (InterruptedException e) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(mGotMessage);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TEST_WHAT, mGotMessageWhat);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
103