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