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