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