Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Side by Side Diff: extensions/common/async_event_unittest.cc

Issue 14757022: Add a non-blocking "OneShotEvent" class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: dcronin's comments; ExtensionSystem::ready; and WeakPtr support Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 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.
4
5 #include "base/bind.h"
6 #include "base/run_loop.h"
7 #include "base/test/test_simple_task_runner.h"
8 #include "extensions/common/async_event.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace extensions {
12
13 namespace {
14
15 void Increment(int* i) {
16 ++*i;
17 }
18
19 TEST(AsyncEventTest, RecordsHappened) {
20 AsyncEvent event;
21 EXPECT_FALSE(event.has_happened());
22 event.MarkHappened();
23 EXPECT_TRUE(event.has_happened());
24 }
25
26 TEST(AsyncEventTest, CallsQueue) {
27 AsyncEvent event;
28 scoped_refptr<base::TestSimpleTaskRunner> runner(
29 new base::TestSimpleTaskRunner);
30 int i = 0;
31 event.RunAfter(FROM_HERE, base::Bind(&Increment, &i), runner);
32 event.RunAfter(FROM_HERE, base::Bind(&Increment, &i), runner);
33 EXPECT_EQ(0U, runner->GetPendingTasks().size());
34 event.MarkHappened();
35 ASSERT_EQ(2U, runner->GetPendingTasks().size());
36 EXPECT_NE(runner->GetPendingTasks()[0].location.line_number(),
37 runner->GetPendingTasks()[1].location.line_number())
38 << "Make sure FROM_HERE is propagated.";
39 EXPECT_EQ(0, i);
40 runner->RunPendingTasks();
41 EXPECT_EQ(2, i);
42 }
43
44 TEST(AsyncEventTest, CallsAfterHappenedDontRunInline) {
45 AsyncEvent event;
46 scoped_refptr<base::TestSimpleTaskRunner> runner(
47 new base::TestSimpleTaskRunner);
48 int i = 0;
49
50 event.MarkHappened();
51 event.RunAfter(FROM_HERE, base::Bind(&Increment, &i), runner);
52 EXPECT_EQ(1U, runner->GetPendingTasks().size());
53 EXPECT_EQ(0, i);
54 runner->RunPendingTasks();
55 EXPECT_EQ(1, i);
56 }
57
58 TEST(AsyncEventTest, RunAfterDefaultsToCurrentMessageLoop) {
59 AsyncEvent event;
60 scoped_refptr<base::TestSimpleTaskRunner> runner(
61 new base::TestSimpleTaskRunner);
62 MessageLoop loop;
63 int runner_i = 0;
64 int loop_i = 0;
65
66 event.RunAfter(FROM_HERE, base::Bind(&Increment, &runner_i), runner);
67 event.RunAfter(FROM_HERE, base::Bind(&Increment, &loop_i));
68 event.MarkHappened();
69 EXPECT_EQ(1U, runner->GetPendingTasks().size());
70 EXPECT_EQ(0, runner_i);
71 runner->RunPendingTasks();
72 EXPECT_EQ(1, runner_i);
73 EXPECT_EQ(0, loop_i);
74 base::RunLoop().RunUntilIdle();
75 EXPECT_EQ(1, loop_i);
76 }
77
78 TEST(AsyncEventTest, SupportsMessageLoopOutlivingEvent) {
79 scoped_refptr<base::TestSimpleTaskRunner> runner(
80 new base::TestSimpleTaskRunner);
81 {
82 // Use scoped_ptr to help detect use-after-free.
83 scoped_ptr<AsyncEvent> event1(new AsyncEvent), event2(new AsyncEvent);
84 event1->RunAfter(FROM_HERE,
85 base::Bind(&AsyncEvent::MarkHappened, event2->AsWeakPtr()),
86 runner);
87 // The event happens, and then both ends are destroyed.
88 event1->MarkHappened();
89 }
90 // The pending closure shouldn't call any methods on the
91 // now-destroyed |event2|.
92 runner->RunPendingTasks();
93 }
94
95 } // namespace
96 } // namespace extensions
OLDNEW
« extensions/common/async_event.cc ('K') | « extensions/common/async_event.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698