1 // Copyright 2018 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.task; 6 7 import static org.hamcrest.MatcherAssert.assertThat; 8 import static org.hamcrest.collection.IsIterableContainingInOrder.contains; 9 10 import android.os.Handler; 11 import android.os.HandlerThread; 12 import android.os.Looper; 13 14 import androidx.test.filters.SmallTest; 15 16 import org.junit.After; 17 import org.junit.Assert; 18 import org.junit.Before; 19 import org.junit.Test; 20 import org.junit.runner.RunWith; 21 22 import org.chromium.base.test.BaseJUnit4ClassRunner; 23 import org.chromium.base.test.task.SchedulerTestHelpers; 24 25 import java.util.ArrayList; 26 import java.util.List; 27 28 /** 29 * Test class for {@link SingleThreadTaskRunnerImpl}. 30 * 31 * Note due to layering concerns we can't test post native functionality in a 32 * base javatest. Instead see: 33 * content/public/android/javatests/src/org/chromium/content/browser/scheduler/ 34 * NativePostTaskTest.java 35 */ 36 @RunWith(BaseJUnit4ClassRunner.class) 37 public class SingleThreadTaskRunnerImplTest { 38 @Before setUp()39 public void setUp() { 40 mHandlerThread = new HandlerThread("SingleThreadTaskRunnerImplTest thread"); 41 mHandlerThread.start(); 42 mHandler = new Handler(mHandlerThread.getLooper()); 43 } 44 45 @After tearDown()46 public void tearDown() throws InterruptedException { 47 Looper looper = mHandlerThread.getLooper(); 48 if (looper != null) { 49 looper.quitSafely(); 50 } 51 mHandlerThread.join(); 52 } 53 54 private HandlerThread mHandlerThread; 55 private Handler mHandler; 56 57 @Test 58 @SmallTest testPreNativePostTask()59 public void testPreNativePostTask() { 60 TaskRunner taskQueue = new SingleThreadTaskRunnerImpl(mHandler, TaskTraits.USER_BLOCKING); 61 List<Integer> orderList = new ArrayList<>(); 62 SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 1); 63 SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 2); 64 SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 3); 65 66 SchedulerTestHelpers.preNativeRunUntilIdle(mHandlerThread); 67 assertThat(orderList, contains(1, 2, 3)); 68 } 69 70 @Test 71 @SmallTest testBelongsToCurrentThread()72 public void testBelongsToCurrentThread() { 73 // The handler created during test setup belongs to a different thread. 74 SingleThreadTaskRunner taskQueue = 75 new SingleThreadTaskRunnerImpl(mHandler, TaskTraits.USER_BLOCKING); 76 Assert.assertFalse(taskQueue.belongsToCurrentThread()); 77 78 // We create a handler belonging to current thread. 79 Looper.prepare(); 80 SingleThreadTaskRunner taskQueueCurrentThread = 81 new SingleThreadTaskRunnerImpl(new Handler(), TaskTraits.USER_BLOCKING); 82 Assert.assertTrue(taskQueueCurrentThread.belongsToCurrentThread()); 83 } 84 } 85