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

Side by Side Diff: base/worker_pool_job_unittest.cc

Issue 5710002: Create base::WorkerPoolJob. Use it for HostResolverImpl and DirectoryLister. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minimize the header dependency. Created 10 years 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) 2010 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/worker_pool_job.h"
6
7 #include "base/callback.h"
8 #include "base/message_loop.h"
9 #include "base/waitable_event.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace base {
13
14 namespace {
15
16 class TestCallback : public CallbackRunner<Tuple0> {
17 public:
18 TestCallback()
19 : have_run_(false),
20 waiting_for_run_(false) {
21 }
22
23 void Wait() {
24 DCHECK(!waiting_for_run_);
Paweł Hajdan Jr. 2010/12/11 10:40:19 This is a test, and DCHECK can make it crashy. How
willchan no longer on Chromium 2010/12/11 22:44:26 Normally I'd agree. In this case, this means we'v
25 while (!have_run_) {
26 waiting_for_run_ = true;
27 MessageLoop::current()->Run();
28 waiting_for_run_ = false;
29 }
30 have_run_ = false; // auto-reset for next callback
31 }
32
33 virtual void RunWithParams(const Tuple0& params) {
34 if (waiting_for_run_)
35 MessageLoop::current()->Quit();
36 have_run_ = true;
37 }
38
39 private:
40 bool have_run_;
41 bool waiting_for_run_;
42 };
43
44 class TestJob : public WorkerPoolJob {
45 public:
46 explicit TestJob(Callback0::Type* callback)
47 : WorkerPoolJob(false),
48 callback_(callback),
49 run_on_worker_pool_event_(true /* manual reset */,
50 false /* not initially signalled */) {}
51
52 void SignalOnWorkerPool() {
53 run_on_worker_pool_event_.Signal();
54 }
55
56 using WorkerPoolJob::StartJob;
57 using WorkerPoolJob::CancelJob;
58 using WorkerPoolJob::canceled;
59 using WorkerPoolJob::is_running;
60
61 protected:
62 ~TestJob() {}
63
64 private:
65 virtual void RunJob() {
66 run_on_worker_pool_event_.Wait();
67 }
68
69 virtual void CompleteJob() {
70 callback_->Run();
71 }
72
73 virtual void OnCanceled() {
74 scoped_refptr<MessageLoopProxy> loop = origin_loop();
75 if (loop->BelongsToCurrentThread()) {
76 callback_->Run();
77 } else {
78 loop->PostTask(
79 FROM_HERE,
80 NewRunnableMethod(this, &TestJob::OnCanceledOnOriginLoop));
81 }
82 }
83
84 void OnCanceledOnOriginLoop() {
85 callback_->Run();
86 }
87
88 Callback0::Type* const callback_;
89 WaitableEvent run_on_worker_pool_event_;
90 };
91
92 TEST(WorkerPoolJobTest, Simple) {
93 MessageLoop loop;
94 TestCallback callback;
95 scoped_refptr<TestJob> job(new TestJob(&callback));
96 job->StartJob();
97 EXPECT_TRUE(job->is_running());
98 job->SignalOnWorkerPool();
99 callback.Wait();
100 EXPECT_FALSE(job->canceled());
101 EXPECT_FALSE(job->is_running());
102 }
103
104 TEST(WorkerPoolJobTest, CancelOnWorker) {
105 MessageLoop loop;
106 TestCallback callback;
107 scoped_refptr<TestJob> job(new TestJob(&callback));
108 job->StartJob();
109 job->CancelJob();
110 EXPECT_TRUE(job->is_running());
111 job->SignalOnWorkerPool();
112 callback.Wait();
113 EXPECT_TRUE(job->canceled());
114 EXPECT_FALSE(job->is_running());
115 }
116
117 TEST(WorkerPoolJobTest, CancelOnOrigin) {
118 MessageLoop loop;
119 TestCallback callback;
120 scoped_refptr<TestJob> job(new TestJob(&callback));
121 job->StartJob();
122 EXPECT_TRUE(job->is_running());
123 job->SignalOnWorkerPool();
124 job->CancelJob();
125 callback.Wait();
126 EXPECT_TRUE(job->canceled());
127 EXPECT_FALSE(job->is_running());
128 }
129
130 } // namespace
131
132 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698