1 // Copyright 2013 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.
5 #include "base/basictypes.h"
7 #include "base/location.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/run_loop.h"
11 #include "base/time/time.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "webkit/browser/fileapi/timed_task_helper.h"
22 : timer_(base::MessageLoopProxy::current().get()), timer_fired_(false) {}
28 TimedTaskHelper* timer() { return &timer_; }
29 bool timer_fired() const { return timer_fired_; }
32 TimedTaskHelper timer_;
38 TEST(TimedTaskHelper, FireTimerWhenAlive) {
39 base::MessageLoop message_loop;
42 ASSERT_FALSE(embedder.timer_fired());
43 ASSERT_FALSE(embedder.timer()->IsRunning());
45 embedder.timer()->Start(
47 base::TimeDelta::FromSeconds(0),
48 base::Bind(&Embedder::OnTimerFired, base::Unretained(&embedder)));
50 ASSERT_TRUE(embedder.timer()->IsRunning());
51 embedder.timer()->Reset();
52 ASSERT_TRUE(embedder.timer()->IsRunning());
54 base::RunLoop().RunUntilIdle();
56 ASSERT_TRUE(embedder.timer_fired());
59 TEST(TimedTaskHelper, FireTimerWhenAlreadyDeleted) {
60 base::MessageLoop message_loop;
62 // Run message loop after embedder is already deleted to make sure callback
63 // doesn't cause a crash for use after free.
67 ASSERT_FALSE(embedder.timer_fired());
68 ASSERT_FALSE(embedder.timer()->IsRunning());
70 embedder.timer()->Start(
72 base::TimeDelta::FromSeconds(0),
73 base::Bind(&Embedder::OnTimerFired, base::Unretained(&embedder)));
75 ASSERT_TRUE(embedder.timer()->IsRunning());
78 // At this point the callback is still in the message queue but
80 base::RunLoop().RunUntilIdle();
83 } // namespace fileapi