• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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