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