// Copyright (c) 2011 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 "base/logging.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "webkit/glue/worker_task_runner.h" namespace webkit_glue { class WorkerTaskRunnerTest : public testing::Test { public: void FakeStart() { task_runner_.OnWorkerRunLoopStarted(WebKit::WebWorkerRunLoop()); } void FakeStop() { task_runner_.OnWorkerRunLoopStopped(WebKit::WebWorkerRunLoop()); } WorkerTaskRunner task_runner_; }; class MockObserver : public WorkerTaskRunner::Observer { public: MOCK_METHOD0(OnWorkerRunLoopStopped, void()); void RemoveSelfOnNotify() { ON_CALL(*this, OnWorkerRunLoopStopped()).WillByDefault( testing::Invoke(this, &MockObserver::RemoveSelf)); } void RemoveSelf() { runner_->RemoveStopObserver(this); } WorkerTaskRunner* runner_; }; TEST_F(WorkerTaskRunnerTest, BasicObservingAndWorkerId) { ASSERT_EQ(0, task_runner_.CurrentWorkerId()); MockObserver o; EXPECT_CALL(o, OnWorkerRunLoopStopped()).Times(1); FakeStart(); task_runner_.AddStopObserver(&o); ASSERT_LT(0, task_runner_.CurrentWorkerId()); FakeStop(); } TEST_F(WorkerTaskRunnerTest, CanRemoveSelfDuringNotification) { MockObserver o; o.RemoveSelfOnNotify(); o.runner_ = &task_runner_; EXPECT_CALL(o, OnWorkerRunLoopStopped()).Times(1); FakeStart(); task_runner_.AddStopObserver(&o); FakeStop(); } }