Home | History | Annotate | Download | only in task_scheduler
      1 // Copyright 2017 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/task_scheduler/task_traits.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace base {
     10 
     11 TEST(TaskSchedulerTaskTraitsTest, Default) {
     12   constexpr TaskTraits traits = {};
     13   EXPECT_FALSE(traits.priority_set_explicitly());
     14   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
     15   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
     16   EXPECT_FALSE(traits.may_block());
     17   EXPECT_FALSE(traits.with_base_sync_primitives());
     18 }
     19 
     20 TEST(TaskSchedulerTaskTraitsTest, TaskPriority) {
     21   constexpr TaskTraits traits = {TaskPriority::BACKGROUND};
     22   EXPECT_TRUE(traits.priority_set_explicitly());
     23   EXPECT_EQ(TaskPriority::BACKGROUND, traits.priority());
     24   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
     25   EXPECT_FALSE(traits.may_block());
     26   EXPECT_FALSE(traits.with_base_sync_primitives());
     27 }
     28 
     29 TEST(TaskSchedulerTaskTraitsTest, TaskShutdownBehavior) {
     30   constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
     31   EXPECT_FALSE(traits.priority_set_explicitly());
     32   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
     33   EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN, traits.shutdown_behavior());
     34   EXPECT_FALSE(traits.may_block());
     35   EXPECT_FALSE(traits.with_base_sync_primitives());
     36 }
     37 
     38 TEST(TaskSchedulerTaskTraitsTest, MayBlock) {
     39   constexpr TaskTraits traits = {MayBlock()};
     40   EXPECT_FALSE(traits.priority_set_explicitly());
     41   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
     42   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
     43   EXPECT_TRUE(traits.may_block());
     44   EXPECT_FALSE(traits.with_base_sync_primitives());
     45 }
     46 
     47 TEST(TaskSchedulerTaskTraitsTest, WithBaseSyncPrimitives) {
     48   constexpr TaskTraits traits = {WithBaseSyncPrimitives()};
     49   EXPECT_FALSE(traits.priority_set_explicitly());
     50   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
     51   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
     52   EXPECT_FALSE(traits.may_block());
     53   EXPECT_TRUE(traits.with_base_sync_primitives());
     54 }
     55 
     56 TEST(TaskSchedulerTaskTraitsTest, MultipleTraits) {
     57   constexpr TaskTraits traits = {TaskPriority::BACKGROUND,
     58                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
     59                                  MayBlock(), WithBaseSyncPrimitives()};
     60   EXPECT_TRUE(traits.priority_set_explicitly());
     61   EXPECT_EQ(TaskPriority::BACKGROUND, traits.priority());
     62   EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN, traits.shutdown_behavior());
     63   EXPECT_TRUE(traits.may_block());
     64   EXPECT_TRUE(traits.with_base_sync_primitives());
     65 }
     66 
     67 TEST(TaskSchedulerTaskTraitsTest, Copy) {
     68   constexpr TaskTraits traits = {TaskPriority::BACKGROUND,
     69                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
     70                                  MayBlock(), WithBaseSyncPrimitives()};
     71   constexpr TaskTraits traits_copy(traits);
     72   EXPECT_EQ(traits.priority_set_explicitly(),
     73             traits_copy.priority_set_explicitly());
     74   EXPECT_EQ(traits.priority(), traits_copy.priority());
     75   EXPECT_EQ(traits.shutdown_behavior(), traits_copy.shutdown_behavior());
     76   EXPECT_EQ(traits.may_block(), traits_copy.may_block());
     77   EXPECT_EQ(traits.with_base_sync_primitives(),
     78             traits_copy.with_base_sync_primitives());
     79 }
     80 
     81 TEST(TaskSchedulerTaskTraitsTest, OverridePriority) {
     82   constexpr TaskTraits left = {TaskPriority::BACKGROUND};
     83   constexpr TaskTraits right = {TaskPriority::USER_BLOCKING};
     84   constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     85   EXPECT_TRUE(overridden.priority_set_explicitly());
     86   EXPECT_EQ(TaskPriority::USER_BLOCKING, overridden.priority());
     87   EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
     88   EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
     89             overridden.shutdown_behavior());
     90   EXPECT_FALSE(overridden.may_block());
     91   EXPECT_FALSE(overridden.with_base_sync_primitives());
     92 }
     93 
     94 TEST(TaskSchedulerTaskTraitsTest, OverrideShutdownBehavior) {
     95   constexpr TaskTraits left = {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
     96   constexpr TaskTraits right = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
     97   constexpr TaskTraits overridden = TaskTraits::Override(left, right);
     98   EXPECT_FALSE(overridden.priority_set_explicitly());
     99   EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
    100   EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
    101   EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN,
    102             overridden.shutdown_behavior());
    103   EXPECT_FALSE(overridden.may_block());
    104   EXPECT_FALSE(overridden.with_base_sync_primitives());
    105 }
    106 
    107 TEST(TaskSchedulerTaskTraitsTest, OverrideMayBlock) {
    108   {
    109     constexpr TaskTraits left = {MayBlock()};
    110     constexpr TaskTraits right = {};
    111     constexpr TaskTraits overridden = TaskTraits::Override(left, right);
    112     EXPECT_FALSE(overridden.priority_set_explicitly());
    113     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
    114     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
    115     EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
    116               overridden.shutdown_behavior());
    117     EXPECT_TRUE(overridden.may_block());
    118     EXPECT_FALSE(overridden.with_base_sync_primitives());
    119   }
    120   {
    121     constexpr TaskTraits left = {};
    122     constexpr TaskTraits right = {MayBlock()};
    123     constexpr TaskTraits overridden = TaskTraits::Override(left, right);
    124     EXPECT_FALSE(overridden.priority_set_explicitly());
    125     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
    126     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
    127     EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
    128               overridden.shutdown_behavior());
    129     EXPECT_TRUE(overridden.may_block());
    130     EXPECT_FALSE(overridden.with_base_sync_primitives());
    131   }
    132 }
    133 
    134 TEST(TaskSchedulerTaskTraitsTest, OverrideWithBaseSyncPrimitives) {
    135   {
    136     constexpr TaskTraits left = {WithBaseSyncPrimitives()};
    137     constexpr TaskTraits right = {};
    138     constexpr TaskTraits overridden = TaskTraits::Override(left, right);
    139     EXPECT_FALSE(overridden.priority_set_explicitly());
    140     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
    141     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
    142     EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
    143               overridden.shutdown_behavior());
    144     EXPECT_FALSE(overridden.may_block());
    145     EXPECT_TRUE(overridden.with_base_sync_primitives());
    146   }
    147   {
    148     constexpr TaskTraits left = {};
    149     constexpr TaskTraits right = {WithBaseSyncPrimitives()};
    150     constexpr TaskTraits overridden = TaskTraits::Override(left, right);
    151     EXPECT_FALSE(overridden.priority_set_explicitly());
    152     EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
    153     EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
    154     EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
    155               overridden.shutdown_behavior());
    156     EXPECT_FALSE(overridden.may_block());
    157     EXPECT_TRUE(overridden.with_base_sync_primitives());
    158   }
    159 }
    160 
    161 TEST(TaskSchedulerTaskTraitsTest, OverrideMultipleTraits) {
    162   constexpr TaskTraits left = {MayBlock(), TaskPriority::BACKGROUND,
    163                                TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
    164   constexpr TaskTraits right = {WithBaseSyncPrimitives(),
    165                                 TaskPriority::USER_BLOCKING};
    166   constexpr TaskTraits overridden = TaskTraits::Override(left, right);
    167   EXPECT_TRUE(overridden.priority_set_explicitly());
    168   EXPECT_EQ(right.priority(), overridden.priority());
    169   EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
    170   EXPECT_EQ(left.shutdown_behavior(), overridden.shutdown_behavior());
    171   EXPECT_TRUE(overridden.may_block());
    172   EXPECT_TRUE(overridden.with_base_sync_primitives());
    173 }
    174 
    175 }  // namespace base
    176