1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os.cts; 18 19 import junit.framework.TestCase; 20 import android.os.Handler; 21 import android.os.Looper; 22 import android.os.Message; 23 import android.os.SystemClock; 24 import android.os.Handler.Callback; 25 import android.util.Printer; 26 27 public class HandlerTest extends TestCase { 28 29 public static final int MESSAGE_WHAT = 3; 30 31 // time when message should be handled. 32 static final int RUNTIME = 300; 33 34 // time when check whether the message is handled. 35 static final long DELAYED = RUNTIME + 50; 36 37 // Handler 38 Handler mHandler = new Handler(); 39 MockHandler mHandler1 = new MockHandler(); 40 41 @Override 42 protected void tearDown() throws Exception { 43 mHandler1.reset(); 44 super.tearDown(); 45 } 46 47 public void testConstructor() { 48 Callback cb = new Callback() { 49 public boolean handleMessage(Message msg) { 50 return false; 51 } 52 }; 53 54 // new the Handler instance 55 new Handler(); 56 new Handler(Looper.myLooper()); 57 new Handler(cb); 58 new Handler(Looper.myLooper(), cb); 59 } 60 61 public void testPostAtTime1() { 62 MockRunnable r = new MockRunnable(); 63 assertTrue(mHandler.postAtTime(r, SystemClock.uptimeMillis() + RUNTIME)); 64 assertFalse(r.isRun()); 65 sleep(DELAYED); 66 assertTrue(r.isRun()); 67 mHandler.removeCallbacks(r); 68 } 69 70 public void testPostAtTime2() { 71 MockRunnable r = new MockRunnable(); 72 Object token = new Object(); 73 assertTrue(mHandler.postAtTime(r, token, SystemClock.uptimeMillis() + RUNTIME)); 74 assertFalse(r.isRun()); 75 sleep(DELAYED); 76 assertTrue(r.isRun()); 77 mHandler.removeCallbacks(r); 78 } 79 80 public void testSendMessageAtTime() { 81 Message msg = mHandler1.obtainMessage(); 82 assertTrue(mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME)); 83 assertNull(mHandler1.message); 84 sleep(DELAYED); 85 assertSame(msg, mHandler1.message); 86 mHandler1.removeMessages(msg.what); 87 } 88 89 public void testDump() { 90 final String prefix = "AndroidTest"; 91 MockPrinter pw = new MockPrinter(); 92 mHandler.dump(pw, prefix); 93 } 94 95 public void testHasMessagesWithInt() { 96 Message msg = mHandler.obtainMessage(); 97 assertFalse(mHandler.hasMessages(msg.what)); 98 mHandler.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 99 assertTrue(mHandler.hasMessages(msg.what)); 100 mHandler.removeMessages(msg.what); 101 assertFalse(mHandler.hasMessages(msg.what)); 102 } 103 104 public void testHasMessagesWithObject() { 105 Message msg = mHandler.obtainMessage(); 106 msg.obj = new Object(); 107 assertFalse(mHandler.hasMessages(msg.what, msg.obj)); 108 mHandler.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 109 assertTrue(mHandler.hasMessages(msg.what, msg.obj)); 110 mHandler.removeMessages(msg.what); 111 assertFalse(mHandler.hasMessages(msg.what, msg.obj)); 112 } 113 114 public void testRemoveCallbacksAndMessages() { 115 Message msg = mHandler1.obtainMessage(); 116 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 117 sleep(RUNTIME / 2); 118 119 // Test the obj == null 120 mHandler1.removeCallbacksAndMessages(null); 121 sleep(RUNTIME / 2); 122 assertNull(mHandler1.message); 123 mHandler1.reset(); 124 125 msg = mHandler1.obtainMessage(); 126 msg.obj = new Object(); 127 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 128 sleep(RUNTIME / 2); 129 130 // Test the obj == p.obj for message 131 mHandler1.removeCallbacksAndMessages(msg.obj); 132 sleep(RUNTIME / 2); 133 assertNull(mHandler1.message); 134 mHandler1.reset(); 135 136 // Test remove a callback 137 final Object obj = new Object(); 138 MockRunnable mr1 = new MockRunnable(); 139 mHandler1.postAtTime(mr1, obj, SystemClock.uptimeMillis() + RUNTIME); 140 sleep(RUNTIME / 2); 141 mHandler1.removeCallbacksAndMessages(obj); 142 sleep(RUNTIME / 2); 143 assertFalse(mr1.isRun()); 144 145 // test remove a wrong callback 146 mr1 = new MockRunnable(); 147 mHandler1.postAtTime(mr1, obj, SystemClock.uptimeMillis() + RUNTIME); 148 sleep(DELAYED / 2); 149 mHandler1.removeCallbacksAndMessages(new Object()); 150 sleep(DELAYED / 2); 151 assertTrue(mr1.isRun()); 152 } 153 154 public void testSendEmptyMessageAtTime() { 155 long uptime = SystemClock.uptimeMillis() + RUNTIME; 156 assertTrue(mHandler1.sendEmptyMessageAtTime(MESSAGE_WHAT, uptime)); 157 assertEquals(0, mHandler1.what); 158 sleep(DELAYED); 159 assertEquals(MESSAGE_WHAT, mHandler1.what); 160 mHandler1.removeMessages(MESSAGE_WHAT); 161 } 162 163 public void testGetLooper() { 164 // new the Handler instance 165 Looper looper = Looper.myLooper(); 166 mHandler = new Handler(looper); 167 assertSame(looper, mHandler.getLooper()); 168 } 169 170 public void testRemoveCallbacks() { 171 // test remove right object. 172 MockRunnable r = new MockRunnable(); 173 mHandler.postAtTime(r, SystemClock.uptimeMillis() + RUNTIME); 174 sleep(DELAYED / 2); 175 mHandler.removeCallbacks(r); 176 sleep(DELAYED / 2); 177 assertFalse(r.isRun()); 178 179 // test remove wrong object. 180 r = new MockRunnable(); 181 MockRunnable mr = new MockRunnable(); 182 mHandler.postAtTime(r, SystemClock.uptimeMillis() + RUNTIME); 183 sleep(DELAYED / 2); 184 mHandler.removeCallbacks(mr); 185 sleep(DELAYED / 2); 186 assertTrue(r.isRun()); 187 } 188 189 public void testRemoveCallbacksWithObject() { 190 // test remove right object. 191 MockRunnable r1 = new MockRunnable(); 192 Object token = new Object(); 193 mHandler.postAtTime(r1, token, SystemClock.uptimeMillis() + RUNTIME); 194 sleep(DELAYED / 2); 195 mHandler.removeCallbacks(r1, token); 196 sleep(DELAYED / 2); 197 assertFalse(r1.isRun()); 198 199 // test remove wrong object. 200 r1 = new MockRunnable(); 201 MockRunnable r2 = new MockRunnable(); 202 203 mHandler.postAtTime(r1, token, SystemClock.uptimeMillis() + RUNTIME); 204 sleep(DELAYED / 2); 205 mHandler.removeCallbacks(r2, token); 206 sleep(DELAYED / 2); 207 assertTrue(r1.isRun()); 208 209 // test remove with right callback and wrong token 210 mHandler.postAtTime(r1, token, SystemClock.uptimeMillis() + RUNTIME); 211 Object wrongToken = new Object(); 212 sleep(DELAYED / 2); 213 mHandler.removeCallbacks(r1, wrongToken); 214 sleep(DELAYED / 2); 215 assertTrue(r1.isRun()); 216 } 217 218 public void testRemoveMessages() { 219 // test remove right message 220 Message msg = mHandler1.obtainMessage(); 221 msg.what = 100; 222 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 223 sleep(DELAYED / 2); 224 mHandler1.removeMessages(msg.what); 225 sleep(DELAYED / 2); 226 assertNull(mHandler1.message); 227 assertEquals(0, mHandler1.what); 228 mHandler1.reset(); 229 230 // test remove wrong message 231 msg = mHandler1.obtainMessage(); 232 msg.what = 100; 233 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 234 sleep(DELAYED / 2); 235 mHandler1.removeMessages(101); 236 sleep(DELAYED / 2); 237 assertEquals(100, mHandler1.what); 238 } 239 240 public void testRemoveMessagesWithObject() { 241 // test remove right message 242 Message msg = mHandler1.obtainMessage(); 243 msg.obj = new Object(); 244 msg.what = 100; 245 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 246 sleep(DELAYED / 2); 247 mHandler1.removeMessages(msg.what, msg.obj); 248 sleep(DELAYED / 2); 249 assertNull(mHandler1.message); 250 assertEquals(0, mHandler1.what); 251 mHandler1.reset(); 252 253 // test remove wrong message 254 msg = mHandler1.obtainMessage(); 255 msg.obj = new Object(); 256 msg.what = 100; 257 Message wrongMessage = mHandler1.obtainMessage(); 258 wrongMessage.obj = new Object(); 259 wrongMessage.what = 111; 260 mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME); 261 sleep(DELAYED / 2); 262 mHandler1.removeMessages(msg.what, wrongMessage.obj); 263 sleep(DELAYED / 2); 264 assertEquals(100, mHandler1.what); 265 } 266 267 public void testSendMessage() { 268 Message msg = mHandler1.obtainMessage(); 269 assertTrue(mHandler1.sendMessage(msg)); 270 sleep(DELAYED); 271 assertSame(msg, mHandler1.message); 272 mHandler1.removeMessages(msg.what); 273 } 274 275 public void testObtainMessage() { 276 Message msg = mHandler.obtainMessage(); 277 assertNotNull(msg); 278 assertEquals(mHandler, msg.getTarget()); 279 } 280 281 public void testObtainMessageWithInt() { 282 // new the Handler instance 283 Handler handler = new Handler(); 284 Message msg = handler.obtainMessage(); 285 msg.what = 100; 286 Message msg1 = mHandler.obtainMessage(msg.what); 287 assertNotNull(msg1); 288 assertEquals(mHandler, msg1.getTarget()); 289 assertEquals(msg.what, msg1.what); 290 } 291 292 public void testObtainMessageWithIntObject() { 293 // new the Handler instance 294 Handler handler = new Handler(); 295 Message msg = handler.obtainMessage(); 296 msg.what = 100; 297 msg.obj = new Object(); 298 Message msg1 = mHandler.obtainMessage(msg.what, msg.obj); 299 assertNotNull(msg1); 300 assertEquals(mHandler, msg1.getTarget()); 301 assertEquals(msg.what, msg1.what); 302 assertSame(msg.obj, msg1.obj); 303 } 304 305 public void testObtainMessageWithMutiInt() { 306 // new the Handler instance 307 Handler handler = new Handler(); 308 Message msg = handler.obtainMessage(); 309 msg.what = 100; 310 msg.arg1 = 101; 311 msg.arg2 = 102; 312 Message msg1 = mHandler.obtainMessage(msg.what, msg.arg1, msg.arg2); 313 assertNotNull(msg1); 314 assertEquals(mHandler, msg1.getTarget()); 315 assertEquals(msg.what, msg1.what); 316 assertEquals(msg.arg1, msg1.arg1); 317 assertEquals(msg.arg2, msg1.arg2); 318 } 319 320 public void testObtainMessageWithMutiIntObject() { 321 // new the Handler instance 322 Handler handler = new Handler(); 323 Message msg = handler.obtainMessage(); 324 msg.what = 100; 325 msg.arg1 = 1000; 326 msg.arg2 = 2000; 327 msg.obj = new Object(); 328 Message msg1 = mHandler.obtainMessage(msg.what, msg.arg1, msg.arg2, msg.obj); 329 assertNotNull(msg1); 330 assertEquals(mHandler, msg1.getTarget()); 331 assertEquals(msg.arg1, msg1.arg1); 332 assertEquals(msg.arg2, msg1.arg2); 333 assertSame(msg.obj, msg1.obj); 334 } 335 336 public void testSendMessageAtFrontOfQueue() { 337 Message lateMsg = mHandler1.obtainMessage(); 338 mHandler1.sendEmptyMessageAtTime(lateMsg.what, SystemClock.uptimeMillis() + RUNTIME * 5); 339 Message msg = mHandler1.obtainMessage(); 340 msg.what = 100; 341 assertTrue(mHandler1.sendMessageAtFrontOfQueue(msg)); 342 sleep(DELAYED); 343 assertSame(msg, mHandler1.message); 344 mHandler1.removeMessages(msg.what); 345 } 346 347 public void testPostDelayed() { 348 MockRunnable r = new MockRunnable(); 349 assertTrue(mHandler.postDelayed(r, DELAYED)); 350 assertFalse(r.isRun()); 351 sleep(DELAYED + 500); 352 assertTrue(r.isRun()); 353 mHandler.removeCallbacks(r); 354 } 355 356 public void testPostAtFrontOfQueue() { 357 MockRunnable r = new MockRunnable(); 358 MockRunnable mr = new MockRunnable(); 359 assertFalse(r.isRun()); 360 assertTrue(mHandler.postDelayed(mr, DELAYED)); 361 assertTrue(mHandler.postAtFrontOfQueue(r)); 362 sleep(DELAYED / 2); 363 assertTrue(r.isRun()); 364 mHandler.removeCallbacks(r); 365 } 366 367 public void testSendMessageDelayed() { 368 Message msg = mHandler1.obtainMessage(); 369 assertTrue(mHandler1.sendMessageDelayed(msg, DELAYED)); 370 assertNull(mHandler1.message); 371 sleep(DELAYED + 500); 372 assertSame(msg, mHandler1.message); 373 mHandler1.removeMessages(msg.what); 374 } 375 376 public void testPost() { 377 MockRunnable r = new MockRunnable(); 378 assertFalse(r.isRun()); 379 assertTrue(mHandler.post(r)); 380 sleep(DELAYED); 381 assertTrue(r.isRun()); 382 mHandler.removeCallbacks(r); 383 } 384 385 public void testSendEmptyMessageDelayed() { 386 Message msg = mHandler1.obtainMessage(); 387 msg.what = 100; 388 assertTrue(mHandler1.sendEmptyMessageDelayed(msg.what, DELAYED)); 389 sleep(DELAYED + 500); 390 assertEquals(msg.what, mHandler1.what); 391 mHandler1.removeMessages(msg.what); 392 } 393 394 public void testDispatchMessage1() { 395 // new the Handler instance 396 MockHandler handler = new MockHandler(); 397 MockRunnable callback = new MockRunnable(); 398 Message msg = Message.obtain(handler, callback); 399 handler.dispatchMessage(msg); 400 assertNotNull(msg.getCallback()); 401 402 // Test the if branch 403 assertTrue(callback.isRun()); 404 } 405 406 public void testDispatchMessage2() { 407 // new the Handler instance 408 MockHandler handler = new MockHandler(); 409 Message msg = handler.obtainMessage(); 410 handler.dispatchMessage(msg); 411 412 // Test the else branch 413 assertSame(msg, handler.message); 414 } 415 416 public void testSendEmptyMessage() { 417 Message msg = mHandler1.obtainMessage(); 418 msg.what = 100; 419 assertTrue(mHandler1.sendEmptyMessage(msg.what)); 420 sleep(DELAYED); 421 assertEquals(msg.what, mHandler1.what); 422 mHandler1.removeMessages(msg.what); 423 } 424 425 public void testToString() { 426 assertNotNull(mHandler1.toString()); 427 } 428 429 /** 430 * MockRunnable 431 */ 432 private class MockRunnable implements Runnable { 433 // MockRunnable run 434 private boolean mIsRun; 435 436 public void run() { 437 mIsRun = true; 438 } 439 440 public boolean isRun() { 441 return mIsRun; 442 } 443 } 444 445 /** 446 * MockPrinter 447 */ 448 private class MockPrinter implements Printer { 449 String mOutput; 450 451 public void println(String x) { 452 mOutput = x; 453 } 454 455 public String getPrint() { 456 return mOutput; 457 } 458 } 459 460 /** 461 * MockHandler 462 */ 463 private class MockHandler extends Handler { 464 public Message message; 465 public int what; 466 467 @Override 468 public void handleMessage(Message msg) { 469 message = msg; 470 what = message.what; 471 } 472 473 public void reset() { 474 message = null; 475 what = 0; 476 } 477 } 478 479 public void sleep(long time) { 480 try { 481 Thread.sleep(time); 482 } catch (InterruptedException e) { 483 fail(e.getMessage()); 484 } 485 } 486 } 487