diff options
Diffstat (limited to 'webkit/browser/fileapi/timed_task_helper_unittest.cc')
-rw-r--r-- | webkit/browser/fileapi/timed_task_helper_unittest.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/webkit/browser/fileapi/timed_task_helper_unittest.cc b/webkit/browser/fileapi/timed_task_helper_unittest.cc new file mode 100644 index 0000000..5f11c7e --- /dev/null +++ b/webkit/browser/fileapi/timed_task_helper_unittest.cc @@ -0,0 +1,84 @@ +// 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 "base/basictypes.h" +#include "base/bind.h" +#include "base/location.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop.h" +#include "base/message_loop/message_loop_proxy.h" +#include "base/time.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webkit/browser/fileapi/timed_task_helper.h" + +namespace fileapi { + +namespace { + +class Embedder { + public: + Embedder() + : timer_(base::MessageLoopProxy::current()), + timer_fired_(false) {} + + void OnTimerFired() { + timer_fired_ = true; + } + + TimedTaskHelper* timer() { return &timer_; } + bool timer_fired() const { return timer_fired_; } + + private: + TimedTaskHelper timer_; + bool timer_fired_; +}; + +} // namespace + +TEST(TimedTaskHelper, FireTimerWhenAlive) { + base::MessageLoop message_loop; + Embedder embedder; + + ASSERT_FALSE(embedder.timer_fired()); + ASSERT_FALSE(embedder.timer()->IsRunning()); + + embedder.timer()->Start( + FROM_HERE, + base::TimeDelta::FromSeconds(0), + base::Bind(&Embedder::OnTimerFired, base::Unretained(&embedder))); + + ASSERT_TRUE(embedder.timer()->IsRunning()); + embedder.timer()->Reset(); + ASSERT_TRUE(embedder.timer()->IsRunning()); + + base::MessageLoop::current()->RunUntilIdle(); + + ASSERT_TRUE(embedder.timer_fired()); +} + +TEST(TimedTaskHelper, FireTimerWhenAlreadyDeleted) { + base::MessageLoop message_loop; + + // Run message loop after embedder is already deleted to make sure callback + // doesn't cause a crash for use after free. + { + Embedder embedder; + + ASSERT_FALSE(embedder.timer_fired()); + ASSERT_FALSE(embedder.timer()->IsRunning()); + + embedder.timer()->Start( + FROM_HERE, + base::TimeDelta::FromSeconds(0), + base::Bind(&Embedder::OnTimerFired, base::Unretained(&embedder))); + + ASSERT_TRUE(embedder.timer()->IsRunning()); + } + + // At this point the callback is still in the message queue but + // embedder is gone. + base::MessageLoop::current()->RunUntilIdle(); +} + +} // namespace fileapi |