Chromium Code Reviews| Index: base/bind_unittest.cc |
| diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc |
| index 7850ea6b740d263c175df9adf8cc0701391c4983..38c08b76f558ca6b4b444d77fc239cbacb036b6f 100644 |
| --- a/base/bind_unittest.cc |
| +++ b/base/bind_unittest.cc |
| @@ -712,80 +712,59 @@ TEST_F(BindTest, Owned) { |
| EXPECT_EQ(1, deletes); |
| } |
| -// Passed() wrapper support. |
| +// Tests for Passed() wrapper support: |
| // - Passed() can be constructed from a pointer to scoper. |
| // - Passed() can be constructed from a scoper rvalue. |
| // - Using Passed() gives Callback Ownership. |
| // - Ownership is transferred from Callback to callee on the first Run(). |
| // - Callback supports unbound arguments. |
| -TEST_F(BindTest, ScopedPtr) { |
| - int deletes = 0; |
| +template <typename T> |
| +class BindMoveOnlyTypeTest : public ::testing::Test { |
| + public: |
| + using DeleteCounterPtr = T; |
|
Nico
2016/01/21 17:29:14
is this used for anything?
dcheng
2016/01/21 19:15:33
Done.
|
| +}; |
| - // Tests the Passed() function's support for pointers. |
| - scoped_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes)); |
| - Callback<scoped_ptr<DeleteCounter>()> unused_callback = |
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >, Passed(&ptr)); |
| - EXPECT_FALSE(ptr.get()); |
| - EXPECT_EQ(0, deletes); |
| +struct CustomDeleter { |
| + void operator()(DeleteCounter* c) { delete c; } |
| +}; |
| - // If we never invoke the Callback, it retains ownership and deletes. |
| - unused_callback.Reset(); |
| - EXPECT_EQ(1, deletes); |
| +using MoveOnlyTypesToTest = |
| + ::testing::Types<scoped_ptr<DeleteCounter>, |
| + std::unique_ptr<DeleteCounter>, |
| + std::unique_ptr<DeleteCounter, CustomDeleter>>; |
| +TYPED_TEST_CASE(BindMoveOnlyTypeTest, MoveOnlyTypesToTest); |
| - // Tests the Passed() function's support for rvalues. |
| - deletes = 0; |
| - DeleteCounter* counter = new DeleteCounter(&deletes); |
| - Callback<scoped_ptr<DeleteCounter>()> callback = |
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >, |
| - Passed(scoped_ptr<DeleteCounter>(counter))); |
| - EXPECT_FALSE(ptr.get()); |
| - EXPECT_EQ(0, deletes); |
| +TYPED_TEST(BindMoveOnlyTypeTest, PassedToBoundCallback) { |
| + int deletes = 0; |
| - // Check that ownership can be transferred back out. |
| - scoped_ptr<DeleteCounter> result = callback.Run(); |
| - ASSERT_EQ(counter, result.get()); |
| + TypeParam ptr(new DeleteCounter(&deletes)); |
| + Callback<TypeParam()> callback = Bind(&PassThru<TypeParam>, Passed(&ptr)); |
| + EXPECT_FALSE(ptr.get()); |
| EXPECT_EQ(0, deletes); |
| - // Resetting does not delete since ownership was transferred. |
| + // If we never invoke the Callback, it retains ownership and deletes. |
| callback.Reset(); |
| - EXPECT_EQ(0, deletes); |
| - |
| - // Ensure that we actually did get ownership. |
| - result.reset(); |
| EXPECT_EQ(1, deletes); |
| - |
| - // Test unbound argument forwarding. |
| - Callback<scoped_ptr<DeleteCounter>(scoped_ptr<DeleteCounter>)> cb_unbound = |
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >); |
| - ptr.reset(new DeleteCounter(&deletes)); |
| - cb_unbound.Run(std::move(ptr)); |
| } |
| -TEST_F(BindTest, UniquePtr) { |
| +TYPED_TEST(BindMoveOnlyTypeTest, PassedWithRvalue) { |
| int deletes = 0; |
| - |
| - // Tests the Passed() function's support for pointers. |
| - std::unique_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes)); |
| - Callback<std::unique_ptr<DeleteCounter>()> unused_callback = |
| - Bind(&PassThru<std::unique_ptr<DeleteCounter>>, Passed(&ptr)); |
| - EXPECT_FALSE(ptr.get()); |
| + Callback<TypeParam()> callback = Bind( |
| + &PassThru<TypeParam>, Passed(TypeParam(new DeleteCounter(&deletes)))); |
| EXPECT_EQ(0, deletes); |
| // If we never invoke the Callback, it retains ownership and deletes. |
| - unused_callback.Reset(); |
| + callback.Reset(); |
| EXPECT_EQ(1, deletes); |
| +} |
| - // Tests the Passed() function's support for rvalues. |
| - deletes = 0; |
| +// Check that ownership can be transferred back out. |
| +TYPED_TEST(BindMoveOnlyTypeTest, ReturnMoveOnlyType) { |
| + int deletes = 0; |
| DeleteCounter* counter = new DeleteCounter(&deletes); |
| - Callback<std::unique_ptr<DeleteCounter>()> callback = |
| - Bind(&PassThru<std::unique_ptr<DeleteCounter>>, |
| - Passed(std::unique_ptr<DeleteCounter>(counter))); |
| - EXPECT_FALSE(ptr.get()); |
| - EXPECT_EQ(0, deletes); |
| - |
| - // Check that ownership can be transferred back out. |
| - std::unique_ptr<DeleteCounter> result = callback.Run(); |
| + Callback<TypeParam()> callback = |
| + Bind(&PassThru<TypeParam>, Passed(TypeParam(counter))); |
| + TypeParam result = callback.Run(); |
| ASSERT_EQ(counter, result.get()); |
| EXPECT_EQ(0, deletes); |
| @@ -796,12 +775,15 @@ TEST_F(BindTest, UniquePtr) { |
| // Ensure that we actually did get ownership. |
| result.reset(); |
| EXPECT_EQ(1, deletes); |
| +} |
| +TYPED_TEST(BindMoveOnlyTypeTest, UnboundForwarding) { |
| + int deletes = 0; |
| + TypeParam ptr(new DeleteCounter(&deletes)); |
| // Test unbound argument forwarding. |
| - Callback<std::unique_ptr<DeleteCounter>(std::unique_ptr<DeleteCounter>)> |
| - cb_unbound = Bind(&PassThru<std::unique_ptr<DeleteCounter>>); |
| - ptr.reset(new DeleteCounter(&deletes)); |
| + Callback<TypeParam(TypeParam)> cb_unbound = Bind(&PassThru<TypeParam>); |
| cb_unbound.Run(std::move(ptr)); |
| + EXPECT_EQ(1, deletes); |
| } |
| // Argument Copy-constructor usage for non-reference parameters. |