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