• 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 import static org.junit.Assert.assertNotNull;
10 
11 import androidx.test.filters.SmallTest;
12 
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 
16 import org.chromium.base.test.BaseJUnit4ClassRunner;
17 import org.chromium.base.test.task.SchedulerTestHelpers;
18 
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.concurrent.atomic.AtomicBoolean;
22 
23 /**
24  * Test class for {@link PostTask}.
25  *
26  * Note due to layering concerns we can't test post native functionality in a
27  * base javatest. Instead see:
28  * content/public/android/javatests/src/org/chromium/content/browser/scheduler/
29  * NativePostTaskTest.java
30  */
31 @RunWith(BaseJUnit4ClassRunner.class)
32 public class PostTaskTest {
33     @Test
34     @SmallTest
testPreNativePostTask()35     public void testPreNativePostTask() {
36         // This test should not timeout.
37         final Object lock = new Object();
38         final AtomicBoolean taskExecuted = new AtomicBoolean();
39         PostTask.postTask(
40                 TaskTraits.USER_BLOCKING,
41                 new Runnable() {
42                     @Override
43                     public void run() {
44                         synchronized (lock) {
45                             taskExecuted.set(true);
46                             lock.notify();
47                         }
48                     }
49                 });
50         synchronized (lock) {
51             try {
52                 while (!taskExecuted.get()) {
53                     lock.wait();
54                 }
55             } catch (InterruptedException ie) {
56                 ie.printStackTrace();
57             }
58         }
59     }
60 
61     @Test
62     @SmallTest
testCreateSingleThreadTaskRunner()63     public void testCreateSingleThreadTaskRunner() {
64         TaskRunner taskQueue = PostTask.createSingleThreadTaskRunner(TaskTraits.USER_BLOCKING);
65         // A SingleThreadTaskRunner with default traits will run in the native thread pool
66         // and tasks posted won't run until after the native library has loaded.
67         assertNotNull(taskQueue);
68     }
69 
70     @Test
71     @SmallTest
testCreateSequencedTaskRunner()72     public void testCreateSequencedTaskRunner() {
73         TaskRunner taskQueue = PostTask.createSequencedTaskRunner(TaskTraits.USER_BLOCKING);
74         List<Integer> orderList = new ArrayList<>();
75         SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 1);
76         SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 2);
77         SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 3);
78         SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
79 
80         assertThat(orderList, contains(1, 2, 3));
81     }
82 
83     @Test
84     @SmallTest
testCreateTaskRunner()85     public void testCreateTaskRunner() {
86         TaskRunner taskQueue = PostTask.createTaskRunner(TaskTraits.USER_BLOCKING);
87 
88         // This should not timeout.
89         SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
90     }
91 }
92