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

Side by Side Diff: components/scheduler/promises/thread_pool_promise_executor_unittest.cc

Issue 1401553002: NOT INTENDED FOR LANDING: A promises demo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Support for rejectatble promises! Created 4 years, 8 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
OLDNEW
(Empty)
1 // Copyright 2016 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 "components/scheduler/promises/thread_pool_promise_executor.h"
6
7 #include "base/bind.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 using testing::ElementsAre;
13 using testing::WhenSorted;
14
15 #if 0
16
17 namespace promise {
18
19 class ThreadPoolPromiseExecutorTest : public testing::Test {
20 public:
21 ThreadPoolPromiseExecutorTest() {}
22 ~ThreadPoolPromiseExecutorTest() override {}
23
24 void SetUp() override {
25 promise_executor_.reset(new internal::ThreadPoolPromiseExecutor());
26 }
27
28 scoped_ptr<internal::ThreadPoolPromiseExecutor> promise_executor_;
29 };
30
31 namespace {
32 bool ReturnTrue() {
33 return true;
34 }
35
36 int ReturnOne() {
37 return 1;
38 }
39
40 int ReturnTwo() {
41 return 2;
42 }
43
44 int ReturnTen() {
45 return 10;
46 }
47
48 int AddOne(int i) {
49 return i + 1;
50 }
51
52 int CondTimesThree(int i, bool do_smth) {
53 if (do_smth)
54 return i * 3;
55 return i;
56 }
57
58 int ReturnZero() {
59 return 0;
60 }
61
62 scoped_refptr<Promise<int>> Choose(scoped_refptr<Promise<int>> p1,
63 scoped_refptr<Promise<int>> p2,
64 int i) {
65 return i ? p1 : p2;
66 }
67
68 void RecordOrder(int value, std::vector<int>* out_result) {
69 out_result->push_back(value);
70 }
71
72 void SignalWaitableEvent(base::WaitableEvent* waitable_event, int) {
73 waitable_event->Signal();
74 }
75
76 void SignalWaitableEventVoid(base::WaitableEvent* waitable_event) {
77 waitable_event->Signal();
78 }
79
80 } // namespace
81
82 TEST_F(ThreadPoolPromiseExecutorTest, NonVoidPromise) {
83 base::WaitableEvent event(true, false);
84 scoped_refptr<Promise<int>> promise(promise::Create(base::Bind(&ReturnOne)));
85
86 scoped_refptr<Promise<void>> wait_promise(
87 promise.Then(base::Bind(&SignalWaitableEvent, &event)));
88
89 promise_executor_->StartResolve(wait_promise.get());
90 event.Wait();
91 EXPECT_EQ(1, promise->GetResolved());
92 }
93
94 TEST_F(ThreadPoolPromiseExecutorTest, RunAfter_OnePromise_AndThen) {
95 scoped_refptr<Promise<int>> promise(
96 promise::Create(base::Bind(&ReturnOne)).Then(base::Bind(&AddOne)));
97
98 base::WaitableEvent event(true, false);
99 scoped_refptr<Promise<void>> wait_promise(
100 promise.Then(base::Bind(&SignalWaitableEvent, &event)));
101
102 promise_executor_->StartResolve(wait_promise.get());
103 event.Wait();
104 EXPECT_EQ(2, promise->GetResolved());
105 }
106
107 TEST_F(ThreadPoolPromiseExecutorTest, RunAfter_TwoPromises_AndThen) {
108 base::WaitableEvent event(true, false);
109 scoped_refptr<Promise<int>> promise(
110 promise::All(promise::Create(base::Bind(&ReturnOne)),
111 promise::Create(base::Bind(&ReturnTrue)))
112 .Then(base::Bind(&CondTimesThree)));
113
114 scoped_refptr<Promise<void>> wait_promise(
115 promise.Then(base::Bind(&SignalWaitableEvent, &event)));
116
117 promise_executor_->StartResolve(wait_promise.get());
118 event.Wait();
119 EXPECT_EQ(3, promise->GetResolved());
120 }
121
122 TEST_F(ThreadPoolPromiseExecutorTest, ChainOfPromises) {
123 scoped_refptr<Promise<int>> promise(promise::Create(base::Bind(&ReturnOne))
124 .Then(base::Bind(&AddOne))
125 .Then(base::Bind(&AddOne))
126 .Then(base::Bind(&AddOne))
127 .Then(base::Bind(&AddOne)));
128
129 base::WaitableEvent event(true, false);
130 scoped_refptr<Promise<void>> wait_promise(
131 promise.Then(base::Bind(&SignalWaitableEvent, &event)));
132
133 promise_executor_->StartResolve(wait_promise.get());
134 event.Wait();
135 EXPECT_EQ(5, promise->GetResolved());
136 }
137
138 TEST_F(ThreadPoolPromiseExecutorTest, EagerTasksExecutedFirst) {
139 std::vector<int> run_order;
140
141 scoped_refptr<Promise<void>> promiseA(
142 promise::Create(base::Bind(&RecordOrder, 0, &run_order))
143 .Then(base::Bind(&RecordOrder, 1, &run_order))
144 .Then(base::Bind(&RecordOrder, 2, &run_order))
145 .Then(base::Bind(&RecordOrder, 3, &run_order))
146 .Then(base::Bind(&RecordOrder, 4, &run_order)));
147
148 scoped_refptr<Promise<void>> promiseB(
149 promise::Create(base::Bind(&RecordOrder, 10, &run_order))
150 .Then(base::Bind(&RecordOrder, 11, &run_order))
151 .Then(base::Bind(&RecordOrder, 12, &run_order))
152 .Then(base::Bind(&RecordOrder, 13, &run_order))
153 .Then(base::Bind(&RecordOrder, 14, &run_order)));
154
155 promiseB->SetEager(true);
156
157 base::WaitableEvent event(true, false);
158 scoped_refptr<Promise<void>> wait_promise(
159 promise::All(promiseA, promiseB)
160 .Then(base::Bind(&SignalWaitableEventVoid, &event)));
161
162 promise_executor_->StartResolve(wait_promise.get());
163 event.Wait();
164
165 EXPECT_THAT(run_order, ElementsAre(10, 11, 12, 13, 14, 0, 1, 2, 3, 4));
166 }
167
168 TEST_F(ThreadPoolPromiseExecutorTest, Cancel) {
169 /*std::vector<int> run_order;
170
171 scoped_refptr<Promise<void>> promise(promise::Create(
172 base::Bind(&RecordOrder, 1, &run_order)));
173
174 base::WaitableEvent event(true, false);
175 scoped_refptr<Promise<void>> wait_promise(
176 promise.Then(base::Bind(&SignalWaitableEventVoid, &event)));
177
178 promise_executor_->StartResolve(wait_promise.get());
179 wait_promise->Cancel();
180 event.Wait();
181
182 EXPECT_TRUE(run_order.empty());*/
183 }
184
185 TEST_F(ThreadPoolPromiseExecutorTest, CancelChainOfTasks) {
186 std::vector<int> run_order;
187
188 scoped_refptr<Promise<void>> promiseA(
189 promise::Create(base::Bind(&RecordOrder, 0, &run_order))
190 .Then(base::Bind(&RecordOrder, 1, &run_order))
191 .Then(base::Bind(&RecordOrder, 2, &run_order))
192 .Then(base::Bind(&RecordOrder, 3, &run_order))
193 .Then(base::Bind(&RecordOrder, 4, &run_order)));
194
195 scoped_refptr<Promise<void>> promiseB(
196 promise::Create(base::Bind(&RecordOrder, 10, &run_order))
197 .Then(base::Bind(&RecordOrder, 11, &run_order))
198 .Then(base::Bind(&RecordOrder, 12, &run_order))
199 .Then(base::Bind(&RecordOrder, 13, &run_order))
200 .Then(base::Bind(&RecordOrder, 14, &run_order)));
201
202 base::WaitableEvent event(true, false);
203 scoped_refptr<Promise<void>> wait_promise(
204 promiseA.Then(base::Bind(&SignalWaitableEventVoid, &event)));
205
206 promise_executor_->StartResolve(promiseB.get());
207 promiseB->Cancel();
208 promise_executor_->StartResolve(wait_promise.get());
209 event.Wait();
210
211 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4));
212 }
213
214 TEST_F(ThreadPoolPromiseExecutorTest, CancelOneBranch) {
215 std::vector<int> run_order;
216
217 scoped_refptr<Promise<void>> promiseA(
218 promise::Create(base::Bind(&RecordOrder, 0, &run_order))
219 .Then(base::Bind(&RecordOrder, 1, &run_order)));
220
221 scoped_refptr<Promise<void>> promiseB(
222 promiseA.Then(base::Bind(&RecordOrder, 2, &run_order))
223 .Then(base::Bind(&RecordOrder, 3, &run_order)));
224
225 scoped_refptr<Promise<void>> promiseC(
226 promiseA.Then(base::Bind(&RecordOrder, 4, &run_order))
227 .Then(base::Bind(&RecordOrder, 5, &run_order)));
228
229 base::WaitableEvent event(true, false);
230 scoped_refptr<Promise<void>> wait_promise(
231 promiseC.Then(base::Bind(&SignalWaitableEventVoid, &event)));
232
233 promise_executor_->StartResolve(promiseB.get());
234 promise_executor_->StartResolve(wait_promise.get());
235
236 promiseB->Cancel();
237
238 event.Wait();
239
240 EXPECT_THAT(run_order, ElementsAre(0, 1, 4, 5));
241 }
242
243 TEST_F(ThreadPoolPromiseExecutorTest, Choose) {
244 scoped_refptr<Promise<int>> promise_two(
245 promise::Create(base::Bind(&ReturnTwo)));
246 scoped_refptr<Promise<int>> promise_ten(
247 promise::Create(base::Bind(&ReturnTen)));
248 scoped_refptr<Promise<int>> promiseA(
249 promise::Create(base::Bind(&ReturnZero))
250 .Then(base::Bind(&Choose, promise_two, promise_ten)));
251
252 scoped_refptr<Promise<int>> promiseB(
253 promise::Create(base::Bind(&ReturnOne))
254 .Then(base::Bind(&Choose, promise_two, promise_ten)));
255
256 base::WaitableEvent event(true, false);
257 scoped_refptr<Promise<void>> wait_promise(
258 promise::All(promiseA, promiseB)
259 .Then(base::Bind(&SignalWaitableEventVoid, &event)));
260
261 promise_executor_->StartResolve(wait_promise.get());
262 event.Wait();
263
264 EXPECT_EQ(10, promiseA->GetResolved());
265 EXPECT_EQ(2, promiseB->GetResolved());
266 }
267 /*
268 TEST_F(ThreadPoolPromiseExecutorTest, ChooseAndAddOne) {
269 scoped_refptr<Promise<int>> promise_a(
270 promise::Create(base::Bind(&ReturnZero)));
271 scoped_refptr<Promise<int>> promise_b(
272 promise::Create(base::Bind(&ReturnOne)));
273 scoped_refptr<Promise<int>> promise_c(
274 promise::Create(base::Bind(&ReturnTen)));
275
276 scoped_refptr<Promise<int>> promise_d_zero(promise_executor_->RunAfter(
277 base::Bind(&Choose, promise_b, promise_c), promise_a));
278
279 scoped_refptr<Promise<int>> promise_d_one(promise_executor_->RunAfter(
280 base::Bind(&Choose, promise_b, promise_c), promise_b));
281
282 scoped_refptr<Promise<int>> promise_e(
283 promise_executor_->RunAfter(base::Bind(&AddOne), promise_d_zero));
284
285 scoped_refptr<Promise<int>> promise_f(
286 promise_executor_->RunAfter(base::Bind(&AddOne), promise_d_one));
287
288 base::WaitableEvent event(true, false);
289 scoped_refptr<Promise<void>> wait_promise(promise_executor_->RunAfter(
290 base::Bind(&SignalWaitableEventVoid, &event), promise_e, promise_f));
291
292 promise_executor_->StartResolve(wait_promise.get());
293 event.Wait();
294
295 EXPECT_EQ(11, promise_e->GetResolved());
296 EXPECT_EQ(2, promise_f->GetResolved());
297 }
298
299 TEST_F(ThreadPoolPromiseExecutorTest, ChooseAndAddOne_ResolvedPromise) {
300 scoped_refptr<Promise<int>> promise_one(
301 promise::Create(base::Bind(&ReturnOne)));
302
303 scoped_refptr<Promise<int>> promise_zero(
304 promise::Create(base::Bind(&ReturnZero)));
305
306 scoped_refptr<Promise<int>> promise_a(promise_executor_->RunAfter(
307 base::Bind(&Choose,
308 make_scoped_refptr(promise::Create<int>(1)),
309 make_scoped_refptr(promise::Create<int>(10))),
310 promise_zero));
311
312 scoped_refptr<Promise<int>> promise_b(promise_executor_->RunAfter(
313 base::Bind(&Choose,
314 make_scoped_refptr(promise::Create<int>(1)),
315 make_scoped_refptr(promise::Create<int>(10))),
316 promise_one));
317
318 scoped_refptr<Promise<int>> promise_c(
319 promise_executor_->RunAfter(base::Bind(&AddOne), promise_a));
320
321 scoped_refptr<Promise<int>> promise_d(
322 promise_executor_->RunAfter(base::Bind(&AddOne), promise_b));
323
324 base::WaitableEvent event(true, false);
325 scoped_refptr<Promise<void>> wait_promise(promise_executor_->RunAfter(
326 base::Bind(&SignalWaitableEventVoid, &event), promise_c, promise_d));
327
328 promise_executor_->StartResolve(wait_promise.get());
329 event.Wait();
330
331 EXPECT_EQ(11, promise_c->GetResolved());
332 EXPECT_EQ(2, promise_d->GetResolved());
333 }
334 */
335
336 namespace {
337 class BlockingResolveFixture {
338 public:
339 void Root() { run_order_.push_back("Root"); }
340
341 void L() { run_order_.push_back("L"); }
342
343 void LL() { run_order_.push_back("LL"); }
344
345 void LR() { run_order_.push_back("LR"); }
346
347 void R() { run_order_.push_back("R"); }
348
349 void RL() { run_order_.push_back("RL"); }
350
351 void RR() { run_order_.push_back("RL"); }
352
353 std::vector<std::string> run_order_;
354 };
355 } // namespace
356
357 /*
358 TEST_F(ThreadPoolPromiseExecutorTest, BlockingResolve) {
359 BlockingResolveFixture fixture;
360
361 scoped_refptr<Promise<void>> promise_ll(promise::Create(
362 base::Bind(&BlockingResolveFixture::LL, base::Unretained(&fixture))));
363
364 scoped_refptr<Promise<void>> promise_lr(promise::Create(
365 base::Bind(&BlockingResolveFixture::LR, base::Unretained(&fixture))));
366
367 scoped_refptr<Promise<void>> promise_l(promise_executor_->RunAfter(
368 base::Bind(&BlockingResolveFixture::L, base::Unretained(&fixture)),
369 promise_ll, promise_lr));
370
371 scoped_refptr<Promise<void>> promise_rl(promise::Create(
372 base::Bind(&BlockingResolveFixture::RL, base::Unretained(&fixture))));
373
374 scoped_refptr<Promise<void>> promise_rr(promise::Create(
375 base::Bind(&BlockingResolveFixture::RR, base::Unretained(&fixture))));
376
377 scoped_refptr<Promise<void>> blocking_promise(
378 promise::Create<void>());
379
380 scoped_refptr<Promise<void>> promise_r(promise_executor_->RunAfter(
381 base::Bind(&BlockingResolveFixture::R, base::Unretained(&fixture)),
382 promise_rl, promise_rr, scoped_refptr<Promise<void>>(blocking_promise)));
383
384 scoped_refptr<Promise<void>> promise_root(promise_executor_->RunAfter(
385 base::Bind(&BlockingResolveFixture::Root, base::Unretained(&fixture)),
386 promise_l, promise_r));
387
388 promise_executor_->StartResolve(promise_root.get());
389 mock_task_runner_->RunUntilIdle();
390 EXPECT_THAT(fixture.run_order_,
391 WhenSorted(ElementsAre(std::string("L"), std::string("LL"),
392 std::string("LR"), std::string("RL"),
393 std::string("RL"))));
394
395 fixture.run_order_.clear();
396 blocking_promise.Resolve();
397 mock_task_runner_->RunUntilIdle();
398 EXPECT_THAT(fixture.run_order_,
399 ElementsAre(std::string("R"), std::string("Root")));
400 }
401
402 namespace {
403 scoped_refptr<Promise<void>> GenerateNewTask(PromiseExecutor* executor,
404 std::vector<int>* out_result) {
405 out_result->push_back(1);
406
407 scoped_refptr<Promise<void>> promise0(
408 executor->promise::Create(base::Bind(&RecordOrder, 2, out_result)));
409
410 return executor->RunAfter(base::Bind(&RecordOrder, 3, out_result), promise0);
411 }
412 } // namespace
413
414 TEST_F(ThreadPoolPromiseExecutorTest, NewPromiseFromWithinPromise) {
415 std::vector<int> run_order;
416
417 scoped_refptr<Promise<void>> promise0(promise::Create(
418 base::Bind(&RecordOrder, 0, &run_order)));
419
420 scoped_refptr<Promise<void>> promise1(promise_executor_->RunAfter(
421 base::Bind(&GenerateNewTask, base::Unretained(promise_executor_.get()),
422 &run_order),
423 promise0));
424
425 scoped_refptr<Promise<void>> promise4(promise_executor_->RunAfter(
426 base::Bind(&RecordOrder, 4, &run_order), promise1));
427
428 promise_executor_->StartResolve(promise4.get());
429
430 mock_task_runner_->RunUntilIdle();
431
432 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4));
433 }*/
434
435 } // namespace promise
436
437 #endif
OLDNEW
« no previous file with comments | « components/scheduler/promises/thread_pool_promise_executor.cc ('k') | components/scheduler/scheduler.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698