/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.unit_tests.os; import junit.framework.TestCase; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.os.Process; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; public class HandlerThreadTest extends TestCase { private static final int TEST_WHAT = 1; private boolean mGotMessage = false; private int mGotMessageWhat = -1; private volatile boolean mDidSetup = false; private volatile int mLooperTid = -1; @MediumTest public void testHandlerThread() throws Exception { HandlerThread th1 = new HandlerThread("HandlerThreadTest") { protected void onLooperPrepared() { mDidSetup = true; mLooperTid = Process.myTid(); } }; assertFalse(th1.isAlive()); assertNull(th1.getLooper()); th1.start(); assertTrue(th1.isAlive()); assertNotNull(th1.getLooper()); /* * Since getLooper() will block until the HandlerThread is setup, we are guaranteed * that mDidSetup and mLooperTid will have been initalized. If they have not, then * this test should fail */ // Make sure that the onLooperPrepared() was called on a different thread. assertNotSame(Process.myTid(), mLooperTid); assertTrue(mDidSetup); final Handler h1 = new Handler(th1.getLooper()) { public void handleMessage(Message msg) { assertEquals(TEST_WHAT, msg.what); // Ensure that we are running on the same thread in which the looper was setup on. assertEquals(mLooperTid, Process.myTid()); mGotMessageWhat = msg.what; mGotMessage = true; synchronized(this) { notifyAll(); } } }; Message msg = h1.obtainMessage(TEST_WHAT); synchronized (h1) { // wait until we have the lock before sending the message. h1.sendMessage(msg); try { // wait for the message to be handled h1.wait(); } catch (InterruptedException e) { } } assertTrue(mGotMessage); assertEquals(TEST_WHAT, mGotMessageWhat); } }