15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReturnFourtyTwo() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 42;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StoreValue(int* destination, int value) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *destination = value;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StoreDoubleValue(double* destination, double value) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *destination = value;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_foo_destruct_count = 0;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_foo_free_count = 0;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Foo {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Foo() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++g_foo_destruct_count;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<Foo> CreateFoo() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<Foo>(new Foo);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFoo(scoped_ptr<Foo> foo) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(foo.get());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Foo> local_foo(foo.Pass());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(local_foo.get());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(foo.get());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FreeFooFunctor {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void operator()(Foo* foo) const {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++g_foo_free_count;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete foo;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr_malloc<Foo, FreeFooFunctor> CreateScopedFoo() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr_malloc<Foo, FreeFooFunctor>(new Foo);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectScopedFoo(scoped_ptr_malloc<Foo, FreeFooFunctor> foo) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(foo.get());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr_malloc<Foo, FreeFooFunctor> local_foo(foo.Pass());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(local_foo.get());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(foo.get());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop message_loop;
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             FROM_HERE,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&ReturnFourtyTwo),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&StoreValue, &result));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunLoop().RunUntilIdle();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(42, result);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultImplicitConvert) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double result = 0;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop message_loop;
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             FROM_HERE,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&ReturnFourtyTwo),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&StoreDoubleValue, &result));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunLoop().RunUntilIdle();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_DOUBLE_EQ(42.0, result);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassed) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_foo_destruct_count = 0;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_foo_free_count = 0;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             FROM_HERE,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&CreateFoo),
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&ExpectFoo));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunLoop().RunUntilIdle();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, g_foo_destruct_count);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, g_foo_free_count);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_foo_destruct_count = 0;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_foo_free_count = 0;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop;
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostTaskAndReplyWithResult(message_loop.message_loop_proxy().get(),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             FROM_HERE,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&CreateScopedFoo),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Bind(&ExpectScopedFoo));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunLoop().RunUntilIdle();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, g_foo_destruct_count);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, g_foo_free_count);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
129