1// Copyright (c) 2009 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// Tests of CancellationFlag class. 6 7#include "base/cancellation_flag.h" 8 9#include "base/logging.h" 10#include "base/spin_wait.h" 11#include "base/time.h" 12#include "base/thread.h" 13#include "testing/gtest/include/gtest/gtest.h" 14#include "testing/platform_test.h" 15 16using base::CancellationFlag; 17using base::TimeDelta; 18using base::Thread; 19 20namespace { 21 22//------------------------------------------------------------------------------ 23// Define our test class. 24//------------------------------------------------------------------------------ 25 26class CancelTask : public Task { 27 public: 28 explicit CancelTask(CancellationFlag* flag) : flag_(flag) {} 29 virtual void Run() { 30 ASSERT_DEBUG_DEATH(flag_->Set(), ""); 31 } 32 private: 33 CancellationFlag* flag_; 34}; 35 36TEST(CancellationFlagTest, SimpleSingleThreadedTest) { 37 CancellationFlag flag; 38 ASSERT_FALSE(flag.IsSet()); 39 flag.Set(); 40 ASSERT_TRUE(flag.IsSet()); 41} 42 43TEST(CancellationFlagTest, DoubleSetTest) { 44 CancellationFlag flag; 45 ASSERT_FALSE(flag.IsSet()); 46 flag.Set(); 47 ASSERT_TRUE(flag.IsSet()); 48 flag.Set(); 49 ASSERT_TRUE(flag.IsSet()); 50} 51 52TEST(CancellationFlagTest, SetOnDifferentThreadDeathTest) { 53 // Checks that Set() can't be called from any other thread. 54 // CancellationFlag should die on a DCHECK if Set() is called from 55 // other thread. 56 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 57 Thread t("CancellationFlagTest.SetOnDifferentThreadDeathTest"); 58 ASSERT_TRUE(t.Start()); 59 ASSERT_TRUE(t.message_loop()); 60 ASSERT_TRUE(t.IsRunning()); 61 62 CancellationFlag flag; 63 t.message_loop()->PostTask(FROM_HERE, new CancelTask(&flag)); 64} 65 66} // namespace 67