| Index: sync/internal_api/public/base/cancelation_signal_unittest.cc
|
| diff --git a/sync/internal_api/public/base/cancelation_signal_unittest.cc b/sync/internal_api/public/base/cancelation_signal_unittest.cc
|
| deleted file mode 100644
|
| index dbd19eb8c6299be2eaec733a0d9a12767f87fc15..0000000000000000000000000000000000000000
|
| --- a/sync/internal_api/public/base/cancelation_signal_unittest.cc
|
| +++ /dev/null
|
| @@ -1,188 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/internal_api/public/base/cancelation_signal.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "base/threading/thread.h"
|
| -#include "base/time/time.h"
|
| -#include "sync/internal_api/public/base/cancelation_observer.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -class BlockingTask : public CancelationObserver {
|
| - public:
|
| - explicit BlockingTask(CancelationSignal* cancel_signal);
|
| - ~BlockingTask() override;
|
| -
|
| - // Starts the |exec_thread_| and uses it to execute DoRun().
|
| - void RunAsync(base::WaitableEvent* task_start_signal,
|
| - base::WaitableEvent* task_done_signal);
|
| -
|
| - // Blocks until canceled. Signals |task_done_signal| when finished (either
|
| - // via early cancel or cancel after start). Signals |task_start_signal| if
|
| - // and when the task starts successfully (which will not happen if the task
|
| - // was cancelled early).
|
| - void Run(base::WaitableEvent* task_start_signal,
|
| - base::WaitableEvent* task_done_signal);
|
| -
|
| - // Implementation of CancelationObserver.
|
| - // Wakes up the thread blocked in Run().
|
| - void OnSignalReceived() override;
|
| -
|
| - // Checks if we ever did successfully start waiting for |event_|. Be careful
|
| - // with this. The flag itself is thread-unsafe, and the event that flips it
|
| - // is racy.
|
| - bool WasStarted();
|
| -
|
| - private:
|
| - base::WaitableEvent event_;
|
| - base::Thread exec_thread_;
|
| - CancelationSignal* cancel_signal_;
|
| - bool was_started_;
|
| -};
|
| -
|
| -BlockingTask::BlockingTask(CancelationSignal* cancel_signal)
|
| - : event_(base::WaitableEvent::ResetPolicy::MANUAL,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| - exec_thread_("BlockingTaskBackgroundThread"),
|
| - cancel_signal_(cancel_signal),
|
| - was_started_(false) {}
|
| -
|
| -BlockingTask::~BlockingTask() {
|
| - if (was_started_) {
|
| - cancel_signal_->UnregisterHandler(this);
|
| - }
|
| -}
|
| -
|
| -void BlockingTask::RunAsync(base::WaitableEvent* task_start_signal,
|
| - base::WaitableEvent* task_done_signal) {
|
| - exec_thread_.Start();
|
| - exec_thread_.task_runner()->PostTask(
|
| - FROM_HERE, base::Bind(&BlockingTask::Run, base::Unretained(this),
|
| - base::Unretained(task_start_signal),
|
| - base::Unretained(task_done_signal)));
|
| -}
|
| -
|
| -void BlockingTask::Run(
|
| - base::WaitableEvent* task_start_signal,
|
| - base::WaitableEvent* task_done_signal) {
|
| - if (cancel_signal_->TryRegisterHandler(this)) {
|
| - DCHECK(!event_.IsSignaled());
|
| - was_started_ = true;
|
| - task_start_signal->Signal();
|
| - event_.Wait();
|
| - }
|
| - task_done_signal->Signal();
|
| -}
|
| -
|
| -void BlockingTask::OnSignalReceived() {
|
| - event_.Signal();
|
| -}
|
| -
|
| -bool BlockingTask::WasStarted() {
|
| - return was_started_;
|
| -}
|
| -
|
| -class CancelationSignalTest : public ::testing::Test {
|
| - public:
|
| - CancelationSignalTest();
|
| - ~CancelationSignalTest() override;
|
| -
|
| - // Starts the blocking task on a background thread. Does not wait for the
|
| - // task to start.
|
| - void StartBlockingTaskAsync();
|
| -
|
| - // Starts the blocking task on a background thread. Does not return until
|
| - // the task has been started.
|
| - void StartBlockingTaskAndWaitForItToStart();
|
| -
|
| - // Cancels the blocking task.
|
| - void CancelBlocking();
|
| -
|
| - // Verifies that the background task was canceled early.
|
| - //
|
| - // This method may block for a brief period of time while waiting for the
|
| - // background thread to make progress.
|
| - bool VerifyTaskNotStarted();
|
| -
|
| - private:
|
| - base::MessageLoop main_loop_;
|
| -
|
| - CancelationSignal signal_;
|
| - base::WaitableEvent task_start_event_;
|
| - base::WaitableEvent task_done_event_;
|
| - BlockingTask blocking_task_;
|
| -};
|
| -
|
| -CancelationSignalTest::CancelationSignalTest()
|
| - : task_start_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| - task_done_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| - blocking_task_(&signal_) {}
|
| -
|
| -CancelationSignalTest::~CancelationSignalTest() {}
|
| -
|
| -void CancelationSignalTest::StartBlockingTaskAsync() {
|
| - blocking_task_.RunAsync(&task_start_event_, &task_done_event_);
|
| -}
|
| -
|
| -void CancelationSignalTest::StartBlockingTaskAndWaitForItToStart() {
|
| - blocking_task_.RunAsync(&task_start_event_, &task_done_event_);
|
| - task_start_event_.Wait();
|
| -}
|
| -
|
| -void CancelationSignalTest::CancelBlocking() {
|
| - signal_.Signal();
|
| -}
|
| -
|
| -bool CancelationSignalTest::VerifyTaskNotStarted() {
|
| - // Wait until BlockingTask::Run() has finished.
|
| - task_done_event_.Wait();
|
| -
|
| - // Verify the background thread never started blocking.
|
| - return !blocking_task_.WasStarted();
|
| -}
|
| -
|
| -class FakeCancelationObserver : public CancelationObserver {
|
| - void OnSignalReceived() override {}
|
| -};
|
| -
|
| -TEST(CancelationSignalTest_SingleThread, CheckFlags) {
|
| - FakeCancelationObserver observer;
|
| - CancelationSignal signal;
|
| -
|
| - EXPECT_FALSE(signal.IsSignalled());
|
| - signal.Signal();
|
| - EXPECT_TRUE(signal.IsSignalled());
|
| - EXPECT_FALSE(signal.TryRegisterHandler(&observer));
|
| -}
|
| -
|
| -// Send the cancelation signal before the task is started. This will ensure
|
| -// that the task will never be "started" (ie. TryRegisterHandler() will fail,
|
| -// so it will never start blocking on its main WaitableEvent).
|
| -TEST_F(CancelationSignalTest, CancelEarly) {
|
| - CancelBlocking();
|
| - StartBlockingTaskAsync();
|
| - EXPECT_TRUE(VerifyTaskNotStarted());
|
| -}
|
| -
|
| -// Send the cancelation signal after the task has started running. This tests
|
| -// the non-early exit code path, where the task is stopped while it is in
|
| -// progress.
|
| -TEST_F(CancelationSignalTest, Cancel) {
|
| - StartBlockingTaskAndWaitForItToStart();
|
| -
|
| - // Wait for the task to finish and let verify it has been started.
|
| - CancelBlocking();
|
| - EXPECT_FALSE(VerifyTaskNotStarted());
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|