1 // Copyright (c) 2012 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 7 #include <memory> 8 #include <utility> 9 #include <vector> 10 11 #include "base/callback.h" 12 #include "base/macros.h" 13 #include "base/memory/ptr_util.h" 14 #include "base/memory/ref_counted.h" 15 #include "base/memory/weak_ptr.h" 16 #include "base/test/bind_test_util.h" 17 #include "base/test/gtest_util.h" 18 #include "build/build_config.h" 19 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gtest/include/gtest/gtest.h" 21 22 using ::testing::_; 23 using ::testing::Mock; 24 using ::testing::ByMove; 25 using ::testing::Return; 26 using ::testing::StrictMock; 27 28 namespace base { 29 namespace { 30 31 class IncompleteType; 32 33 class NoRef { 34 public: 35 NoRef() = default; 36 37 MOCK_METHOD0(VoidMethod0, void()); 38 MOCK_CONST_METHOD0(VoidConstMethod0, void()); 39 40 MOCK_METHOD0(IntMethod0, int()); 41 MOCK_CONST_METHOD0(IntConstMethod0, int()); 42 43 MOCK_METHOD1(VoidMethodWithIntArg, void(int)); 44 MOCK_METHOD0(UniquePtrMethod0, std::unique_ptr<int>()); 45 46 private: 47 // Particularly important in this test to ensure no copies are made. 48 DISALLOW_COPY_AND_ASSIGN(NoRef); 49 }; 50 51 class HasRef : public NoRef { 52 public: 53 HasRef() = default; 54 55 MOCK_CONST_METHOD0(AddRef, void()); 56 MOCK_CONST_METHOD0(Release, bool()); 57 58 private: 59 // Particularly important in this test to ensure no copies are made. 60 DISALLOW_COPY_AND_ASSIGN(HasRef); 61 }; 62 63 class HasRefPrivateDtor : public HasRef { 64 private: 65 ~HasRefPrivateDtor() = default; 66 }; 67 68 static const int kParentValue = 1; 69 static const int kChildValue = 2; 70 71 class Parent { 72 public: 73 virtual ~Parent() {} 74 void AddRef() const {} 75 void Release() const {} 76 virtual void VirtualSet() { value = kParentValue; } 77 void NonVirtualSet() { value = kParentValue; } 78 int value; 79 }; 80 81 class Child : public Parent { 82 public: 83 ~Child() override {} 84 void VirtualSet() override { value = kChildValue; } 85 void NonVirtualSet() { value = kChildValue; } 86 }; 87 88 class NoRefParent { 89 public: 90 virtual ~NoRefParent() {} 91 virtual void VirtualSet() { value = kParentValue; } 92 void NonVirtualSet() { value = kParentValue; } 93 int value; 94 }; 95 96 class NoRefChild : public NoRefParent { 97 public: 98 ~NoRefChild() override {} 99 private: 100 void VirtualSet() override { value = kChildValue; } 101 void NonVirtualSet() { value = kChildValue; } 102 }; 103 104 // Used for probing the number of copies and moves that occur if a type must be 105 // coerced during argument forwarding in the Run() methods. 106 struct DerivedCopyMoveCounter { 107 DerivedCopyMoveCounter(int* copies, 108 int* assigns, 109 int* move_constructs, 110 int* move_assigns) 111 : copies_(copies), 112 assigns_(assigns), 113 move_constructs_(move_constructs), 114 move_assigns_(move_assigns) {} 115 int* copies_; 116 int* assigns_; 117 int* move_constructs_; 118 int* move_assigns_; 119 }; 120 121 // Used for probing the number of copies and moves in an argument. 122 class CopyMoveCounter { 123 public: 124 CopyMoveCounter(int* copies, 125 int* assigns, 126 int* move_constructs, 127 int* move_assigns) 128 : copies_(copies), 129 assigns_(assigns), 130 move_constructs_(move_constructs), 131 move_assigns_(move_assigns) {} 132 133 CopyMoveCounter(const CopyMoveCounter& other) 134 : copies_(other.copies_), 135 assigns_(other.assigns_), 136 move_constructs_(other.move_constructs_), 137 move_assigns_(other.move_assigns_) { 138 (*copies_)++; 139 } 140 141 CopyMoveCounter(CopyMoveCounter&& other) 142 : copies_(other.copies_), 143 assigns_(other.assigns_), 144 move_constructs_(other.move_constructs_), 145 move_assigns_(other.move_assigns_) { 146 (*move_constructs_)++; 147 } 148 149 // Probing for copies from coercion. 150 explicit CopyMoveCounter(const DerivedCopyMoveCounter& other) 151 : copies_(other.copies_), 152 assigns_(other.assigns_), 153 move_constructs_(other.move_constructs_), 154 move_assigns_(other.move_assigns_) { 155 (*copies_)++; 156 } 157 158 // Probing for moves from coercion. 159 explicit CopyMoveCounter(DerivedCopyMoveCounter&& other) 160 : copies_(other.copies_), 161 assigns_(other.assigns_), 162 move_constructs_(other.move_constructs_), 163 move_assigns_(other.move_assigns_) { 164 (*move_constructs_)++; 165 } 166 167 const CopyMoveCounter& operator=(const CopyMoveCounter& rhs) { 168 copies_ = rhs.copies_; 169 assigns_ = rhs.assigns_; 170 move_constructs_ = rhs.move_constructs_; 171 move_assigns_ = rhs.move_assigns_; 172 173 (*assigns_)++; 174 175 return *this; 176 } 177 178 const CopyMoveCounter& operator=(CopyMoveCounter&& rhs) { 179 copies_ = rhs.copies_; 180 assigns_ = rhs.assigns_; 181 move_constructs_ = rhs.move_constructs_; 182 move_assigns_ = rhs.move_assigns_; 183 184 (*move_assigns_)++; 185 186 return *this; 187 } 188 189 int copies() const { 190 return *copies_; 191 } 192 193 private: 194 int* copies_; 195 int* assigns_; 196 int* move_constructs_; 197 int* move_assigns_; 198 }; 199 200 // Used for probing the number of copies in an argument. The instance is a 201 // copyable and non-movable type. 202 class CopyCounter { 203 public: 204 CopyCounter(int* copies, int* assigns) 205 : counter_(copies, assigns, nullptr, nullptr) {} 206 CopyCounter(const CopyCounter& other) = default; 207 CopyCounter& operator=(const CopyCounter& other) = default; 208 209 explicit CopyCounter(const DerivedCopyMoveCounter& other) : counter_(other) {} 210 211 int copies() const { return counter_.copies(); } 212 213 private: 214 CopyMoveCounter counter_; 215 }; 216 217 // Used for probing the number of moves in an argument. The instance is a 218 // non-copyable and movable type. 219 class MoveCounter { 220 public: 221 MoveCounter(int* move_constructs, int* move_assigns) 222 : counter_(nullptr, nullptr, move_constructs, move_assigns) {} 223 MoveCounter(MoveCounter&& other) : counter_(std::move(other.counter_)) {} 224 MoveCounter& operator=(MoveCounter&& other) { 225 counter_ = std::move(other.counter_); 226 return *this; 227 } 228 229 explicit MoveCounter(DerivedCopyMoveCounter&& other) 230 : counter_(std::move(other)) {} 231 232 private: 233 CopyMoveCounter counter_; 234 }; 235 236 class DeleteCounter { 237 public: 238 explicit DeleteCounter(int* deletes) 239 : deletes_(deletes) { 240 } 241 242 ~DeleteCounter() { 243 (*deletes_)++; 244 } 245 246 void VoidMethod0() {} 247 248 private: 249 int* deletes_; 250 }; 251 252 template <typename T> 253 T PassThru(T scoper) { 254 return scoper; 255 } 256 257 // Some test functions that we can Bind to. 258 template <typename T> 259 T PolymorphicIdentity(T t) { 260 return t; 261 } 262 263 template <typename... Ts> 264 struct VoidPolymorphic { 265 static void Run(Ts... t) {} 266 }; 267 268 int Identity(int n) { 269 return n; 270 } 271 272 int ArrayGet(const int array[], int n) { 273 return array[n]; 274 } 275 276 int Sum(int a, int b, int c, int d, int e, int f) { 277 return a + b + c + d + e + f; 278 } 279 280 const char* CStringIdentity(const char* s) { 281 return s; 282 } 283 284 int GetCopies(const CopyMoveCounter& counter) { 285 return counter.copies(); 286 } 287 288 int UnwrapNoRefParent(NoRefParent p) { 289 return p.value; 290 } 291 292 int UnwrapNoRefParentPtr(NoRefParent* p) { 293 return p->value; 294 } 295 296 int UnwrapNoRefParentConstRef(const NoRefParent& p) { 297 return p.value; 298 } 299 300 void RefArgSet(int &n) { 301 n = 2; 302 } 303 304 void PtrArgSet(int *n) { 305 *n = 2; 306 } 307 308 int FunctionWithWeakFirstParam(WeakPtr<NoRef> o, int n) { 309 return n; 310 } 311 312 int FunctionWithScopedRefptrFirstParam(const scoped_refptr<HasRef>& o, int n) { 313 return n; 314 } 315 316 void TakesACallback(const Closure& callback) { 317 callback.Run(); 318 } 319 320 int Noexcept() noexcept { 321 return 42; 322 } 323 324 class BindTest : public ::testing::Test { 325 public: 326 BindTest() { 327 const_has_ref_ptr_ = &has_ref_; 328 const_no_ref_ptr_ = &no_ref_; 329 static_func_mock_ptr = &static_func_mock_; 330 } 331 332 ~BindTest() override = default; 333 334 static void VoidFunc0() { 335 static_func_mock_ptr->VoidMethod0(); 336 } 337 338 static int IntFunc0() { return static_func_mock_ptr->IntMethod0(); } 339 int NoexceptMethod() noexcept { return 42; } 340 int ConstNoexceptMethod() const noexcept { return 42; } 341 342 protected: 343 StrictMock<NoRef> no_ref_; 344 StrictMock<HasRef> has_ref_; 345 const HasRef* const_has_ref_ptr_; 346 const NoRef* const_no_ref_ptr_; 347 StrictMock<NoRef> static_func_mock_; 348 349 // Used by the static functions to perform expectations. 350 static StrictMock<NoRef>* static_func_mock_ptr; 351 352 private: 353 DISALLOW_COPY_AND_ASSIGN(BindTest); 354 }; 355 356 StrictMock<NoRef>* BindTest::static_func_mock_ptr; 357 StrictMock<NoRef>* g_func_mock_ptr; 358 359 void VoidFunc0() { 360 g_func_mock_ptr->VoidMethod0(); 361 } 362 363 int IntFunc0() { 364 return g_func_mock_ptr->IntMethod0(); 365 } 366 367 TEST_F(BindTest, BasicTest) { 368 Callback<int(int, int, int)> cb = Bind(&Sum, 32, 16, 8); 369 EXPECT_EQ(92, cb.Run(13, 12, 11)); 370 371 Callback<int(int, int, int, int, int, int)> c1 = Bind(&Sum); 372 EXPECT_EQ(69, c1.Run(14, 13, 12, 11, 10, 9)); 373 374 Callback<int(int, int, int)> c2 = Bind(c1, 32, 16, 8); 375 EXPECT_EQ(86, c2.Run(11, 10, 9)); 376 377 Callback<int()> c3 = Bind(c2, 4, 2, 1); 378 EXPECT_EQ(63, c3.Run()); 379 } 380 381 // Test that currying the rvalue result of another Bind() works correctly. 382 // - rvalue should be usable as argument to Bind(). 383 // - multiple runs of resulting Callback remain valid. 384 TEST_F(BindTest, CurryingRvalueResultOfBind) { 385 int n = 0; 386 RepeatingClosure cb = BindRepeating(&TakesACallback, 387 BindRepeating(&PtrArgSet, &n)); 388 389 // If we implement Bind() such that the return value has auto_ptr-like 390 // semantics, the second call here will fail because ownership of 391 // the internal BindState<> would have been transfered to a *temporary* 392 // constructon of a Callback object on the first call. 393 cb.Run(); 394 EXPECT_EQ(2, n); 395 396 n = 0; 397 cb.Run(); 398 EXPECT_EQ(2, n); 399 } 400 401 TEST_F(BindTest, RepeatingCallbackBasicTest) { 402 RepeatingCallback<int(int)> c0 = BindRepeating(&Sum, 1, 2, 4, 8, 16); 403 404 // RepeatingCallback can run via a lvalue-reference. 405 EXPECT_EQ(63, c0.Run(32)); 406 407 // It is valid to call a RepeatingCallback more than once. 408 EXPECT_EQ(54, c0.Run(23)); 409 410 // BindRepeating can handle a RepeatingCallback as the target functor. 411 RepeatingCallback<int()> c1 = BindRepeating(c0, 11); 412 413 // RepeatingCallback can run via a rvalue-reference. 414 EXPECT_EQ(42, std::move(c1).Run()); 415 416 // BindRepeating can handle a rvalue-reference of RepeatingCallback. 417 EXPECT_EQ(32, BindRepeating(std::move(c0), 1).Run()); 418 } 419 420 TEST_F(BindTest, OnceCallbackBasicTest) { 421 OnceCallback<int(int)> c0 = BindOnce(&Sum, 1, 2, 4, 8, 16); 422 423 // OnceCallback can run via a rvalue-reference. 424 EXPECT_EQ(63, std::move(c0).Run(32)); 425 426 // After running via the rvalue-reference, the value of the OnceCallback 427 // is undefined. The implementation simply clears the instance after the 428 // invocation. 429 EXPECT_TRUE(c0.is_null()); 430 431 c0 = BindOnce(&Sum, 2, 3, 5, 7, 11); 432 433 // BindOnce can handle a rvalue-reference of OnceCallback as the target 434 // functor. 435 OnceCallback<int()> c1 = BindOnce(std::move(c0), 13); 436 EXPECT_EQ(41, std::move(c1).Run()); 437 438 RepeatingCallback<int(int)> c2 = BindRepeating(&Sum, 2, 3, 5, 7, 11); 439 EXPECT_EQ(41, BindOnce(c2, 13).Run()); 440 } 441 442 // IgnoreResult adapter test. 443 // - Function with return value. 444 // - Method with return value. 445 // - Const Method with return. 446 // - Method with return value bound to WeakPtr<>. 447 // - Const Method with return bound to WeakPtr<>. 448 TEST_F(BindTest, IgnoreResultForRepeating) { 449 EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337)); 450 EXPECT_CALL(has_ref_, AddRef()).Times(2); 451 EXPECT_CALL(has_ref_, Release()).Times(2); 452 EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10)); 453 EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11)); 454 EXPECT_CALL(no_ref_, IntMethod0()).WillOnce(Return(12)); 455 EXPECT_CALL(no_ref_, IntConstMethod0()).WillOnce(Return(13)); 456 457 RepeatingClosure normal_func_cb = BindRepeating(IgnoreResult(&IntFunc0)); 458 normal_func_cb.Run(); 459 460 RepeatingClosure non_void_method_cb = 461 BindRepeating(IgnoreResult(&HasRef::IntMethod0), &has_ref_); 462 non_void_method_cb.Run(); 463 464 RepeatingClosure non_void_const_method_cb = 465 BindRepeating(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_); 466 non_void_const_method_cb.Run(); 467 468 WeakPtrFactory<NoRef> weak_factory(&no_ref_); 469 WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 470 471 RepeatingClosure non_void_weak_method_cb = 472 BindRepeating(IgnoreResult(&NoRef::IntMethod0), 473 weak_factory.GetWeakPtr()); 474 non_void_weak_method_cb.Run(); 475 476 RepeatingClosure non_void_weak_const_method_cb = 477 BindRepeating(IgnoreResult(&NoRef::IntConstMethod0), 478 weak_factory.GetWeakPtr()); 479 non_void_weak_const_method_cb.Run(); 480 481 weak_factory.InvalidateWeakPtrs(); 482 non_void_weak_const_method_cb.Run(); 483 non_void_weak_method_cb.Run(); 484 } 485 486 TEST_F(BindTest, IgnoreResultForOnce) { 487 EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337)); 488 EXPECT_CALL(has_ref_, AddRef()).Times(2); 489 EXPECT_CALL(has_ref_, Release()).Times(2); 490 EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10)); 491 EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11)); 492 493 OnceClosure normal_func_cb = BindOnce(IgnoreResult(&IntFunc0)); 494 std::move(normal_func_cb).Run(); 495 496 OnceClosure non_void_method_cb = 497 BindOnce(IgnoreResult(&HasRef::IntMethod0), &has_ref_); 498 std::move(non_void_method_cb).Run(); 499 500 OnceClosure non_void_const_method_cb = 501 BindOnce(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_); 502 std::move(non_void_const_method_cb).Run(); 503 504 WeakPtrFactory<NoRef> weak_factory(&no_ref_); 505 WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 506 507 OnceClosure non_void_weak_method_cb = 508 BindOnce(IgnoreResult(&NoRef::IntMethod0), 509 weak_factory.GetWeakPtr()); 510 OnceClosure non_void_weak_const_method_cb = 511 BindOnce(IgnoreResult(&NoRef::IntConstMethod0), 512 weak_factory.GetWeakPtr()); 513 514 weak_factory.InvalidateWeakPtrs(); 515 std::move(non_void_weak_const_method_cb).Run(); 516 std::move(non_void_weak_method_cb).Run(); 517 } 518 519 // Functions that take reference parameters. 520 // - Forced reference parameter type still stores a copy. 521 // - Forced const reference parameter type still stores a copy. 522 TEST_F(BindTest, ReferenceArgumentBindingForRepeating) { 523 int n = 1; 524 int& ref_n = n; 525 const int& const_ref_n = n; 526 527 RepeatingCallback<int()> ref_copies_cb = BindRepeating(&Identity, ref_n); 528 EXPECT_EQ(n, ref_copies_cb.Run()); 529 n++; 530 EXPECT_EQ(n - 1, ref_copies_cb.Run()); 531 532 RepeatingCallback<int()> const_ref_copies_cb = 533 BindRepeating(&Identity, const_ref_n); 534 EXPECT_EQ(n, const_ref_copies_cb.Run()); 535 n++; 536 EXPECT_EQ(n - 1, const_ref_copies_cb.Run()); 537 } 538 539 TEST_F(BindTest, ReferenceArgumentBindingForOnce) { 540 int n = 1; 541 int& ref_n = n; 542 const int& const_ref_n = n; 543 544 OnceCallback<int()> ref_copies_cb = BindOnce(&Identity, ref_n); 545 n++; 546 EXPECT_EQ(n - 1, std::move(ref_copies_cb).Run()); 547 548 OnceCallback<int()> const_ref_copies_cb = 549 BindOnce(&Identity, const_ref_n); 550 n++; 551 EXPECT_EQ(n - 1, std::move(const_ref_copies_cb).Run()); 552 } 553 554 // Check that we can pass in arrays and have them be stored as a pointer. 555 // - Array of values stores a pointer. 556 // - Array of const values stores a pointer. 557 TEST_F(BindTest, ArrayArgumentBindingForRepeating) { 558 int array[4] = {1, 1, 1, 1}; 559 const int (*const_array_ptr)[4] = &array; 560 561 RepeatingCallback<int()> array_cb = BindRepeating(&ArrayGet, array, 1); 562 EXPECT_EQ(1, array_cb.Run()); 563 564 RepeatingCallback<int()> const_array_cb = 565 BindRepeating(&ArrayGet, *const_array_ptr, 1); 566 EXPECT_EQ(1, const_array_cb.Run()); 567 568 array[1] = 3; 569 EXPECT_EQ(3, array_cb.Run()); 570 EXPECT_EQ(3, const_array_cb.Run()); 571 } 572 573 TEST_F(BindTest, ArrayArgumentBindingForOnce) { 574 int array[4] = {1, 1, 1, 1}; 575 const int (*const_array_ptr)[4] = &array; 576 577 OnceCallback<int()> array_cb = BindOnce(&ArrayGet, array, 1); 578 OnceCallback<int()> const_array_cb = 579 BindOnce(&ArrayGet, *const_array_ptr, 1); 580 581 array[1] = 3; 582 EXPECT_EQ(3, std::move(array_cb).Run()); 583 EXPECT_EQ(3, std::move(const_array_cb).Run()); 584 } 585 586 // WeakPtr() support. 587 // - Method bound to WeakPtr<> to non-const object. 588 // - Const method bound to WeakPtr<> to non-const object. 589 // - Const method bound to WeakPtr<> to const object. 590 // - Normal Function with WeakPtr<> as P1 can have return type and is 591 // not canceled. 592 TEST_F(BindTest, WeakPtrForRepeating) { 593 EXPECT_CALL(no_ref_, VoidMethod0()); 594 EXPECT_CALL(no_ref_, VoidConstMethod0()).Times(2); 595 596 WeakPtrFactory<NoRef> weak_factory(&no_ref_); 597 WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 598 599 RepeatingClosure method_cb = 600 BindRepeating(&NoRef::VoidMethod0, weak_factory.GetWeakPtr()); 601 method_cb.Run(); 602 603 RepeatingClosure const_method_cb = 604 BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 605 const_method_cb.Run(); 606 607 RepeatingClosure const_method_const_ptr_cb = 608 BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 609 const_method_const_ptr_cb.Run(); 610 611 RepeatingCallback<int(int)> normal_func_cb = 612 BindRepeating(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr()); 613 EXPECT_EQ(1, normal_func_cb.Run(1)); 614 615 weak_factory.InvalidateWeakPtrs(); 616 const_weak_factory.InvalidateWeakPtrs(); 617 618 method_cb.Run(); 619 const_method_cb.Run(); 620 const_method_const_ptr_cb.Run(); 621 622 // Still runs even after the pointers are invalidated. 623 EXPECT_EQ(2, normal_func_cb.Run(2)); 624 } 625 626 TEST_F(BindTest, WeakPtrForOnce) { 627 WeakPtrFactory<NoRef> weak_factory(&no_ref_); 628 WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 629 630 OnceClosure method_cb = 631 BindOnce(&NoRef::VoidMethod0, weak_factory.GetWeakPtr()); 632 OnceClosure const_method_cb = 633 BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 634 OnceClosure const_method_const_ptr_cb = 635 BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 636 Callback<int(int)> normal_func_cb = 637 Bind(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr()); 638 639 weak_factory.InvalidateWeakPtrs(); 640 const_weak_factory.InvalidateWeakPtrs(); 641 642 std::move(method_cb).Run(); 643 std::move(const_method_cb).Run(); 644 std::move(const_method_const_ptr_cb).Run(); 645 646 // Still runs even after the pointers are invalidated. 647 EXPECT_EQ(2, std::move(normal_func_cb).Run(2)); 648 } 649 650 // ConstRef() wrapper support. 651 // - Binding w/o ConstRef takes a copy. 652 // - Binding a ConstRef takes a reference. 653 // - Binding ConstRef to a function ConstRef does not copy on invoke. 654 TEST_F(BindTest, ConstRefForRepeating) { 655 int n = 1; 656 657 RepeatingCallback<int()> copy_cb = BindRepeating(&Identity, n); 658 RepeatingCallback<int()> const_ref_cb = BindRepeating(&Identity, ConstRef(n)); 659 EXPECT_EQ(n, copy_cb.Run()); 660 EXPECT_EQ(n, const_ref_cb.Run()); 661 n++; 662 EXPECT_EQ(n - 1, copy_cb.Run()); 663 EXPECT_EQ(n, const_ref_cb.Run()); 664 665 int copies = 0; 666 int assigns = 0; 667 int move_constructs = 0; 668 int move_assigns = 0; 669 CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns); 670 RepeatingCallback<int()> all_const_ref_cb = 671 BindRepeating(&GetCopies, ConstRef(counter)); 672 EXPECT_EQ(0, all_const_ref_cb.Run()); 673 EXPECT_EQ(0, copies); 674 EXPECT_EQ(0, assigns); 675 EXPECT_EQ(0, move_constructs); 676 EXPECT_EQ(0, move_assigns); 677 } 678 679 TEST_F(BindTest, ConstRefForOnce) { 680 int n = 1; 681 682 OnceCallback<int()> copy_cb = BindOnce(&Identity, n); 683 OnceCallback<int()> const_ref_cb = BindOnce(&Identity, ConstRef(n)); 684 n++; 685 EXPECT_EQ(n - 1, std::move(copy_cb).Run()); 686 EXPECT_EQ(n, std::move(const_ref_cb).Run()); 687 688 int copies = 0; 689 int assigns = 0; 690 int move_constructs = 0; 691 int move_assigns = 0; 692 CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns); 693 OnceCallback<int()> all_const_ref_cb = 694 BindOnce(&GetCopies, ConstRef(counter)); 695 EXPECT_EQ(0, std::move(all_const_ref_cb).Run()); 696 EXPECT_EQ(0, copies); 697 EXPECT_EQ(0, assigns); 698 EXPECT_EQ(0, move_constructs); 699 EXPECT_EQ(0, move_assigns); 700 } 701 702 // Test Owned() support. 703 TEST_F(BindTest, OwnedForRepeating) { 704 int deletes = 0; 705 DeleteCounter* counter = new DeleteCounter(&deletes); 706 707 // If we don't capture, delete happens on Callback destruction/reset. 708 // return the same value. 709 RepeatingCallback<DeleteCounter*()> no_capture_cb = 710 BindRepeating(&PolymorphicIdentity<DeleteCounter*>, Owned(counter)); 711 ASSERT_EQ(counter, no_capture_cb.Run()); 712 ASSERT_EQ(counter, no_capture_cb.Run()); 713 EXPECT_EQ(0, deletes); 714 no_capture_cb.Reset(); // This should trigger a delete. 715 EXPECT_EQ(1, deletes); 716 717 deletes = 0; 718 counter = new DeleteCounter(&deletes); 719 RepeatingClosure own_object_cb = 720 BindRepeating(&DeleteCounter::VoidMethod0, Owned(counter)); 721 own_object_cb.Run(); 722 EXPECT_EQ(0, deletes); 723 own_object_cb.Reset(); 724 EXPECT_EQ(1, deletes); 725 } 726 727 TEST_F(BindTest, OwnedForOnce) { 728 int deletes = 0; 729 DeleteCounter* counter = new DeleteCounter(&deletes); 730 731 // If we don't capture, delete happens on Callback destruction/reset. 732 // return the same value. 733 OnceCallback<DeleteCounter*()> no_capture_cb = 734 BindOnce(&PolymorphicIdentity<DeleteCounter*>, Owned(counter)); 735 EXPECT_EQ(0, deletes); 736 no_capture_cb.Reset(); // This should trigger a delete. 737 EXPECT_EQ(1, deletes); 738 739 deletes = 0; 740 counter = new DeleteCounter(&deletes); 741 OnceClosure own_object_cb = 742 BindOnce(&DeleteCounter::VoidMethod0, Owned(counter)); 743 EXPECT_EQ(0, deletes); 744 own_object_cb.Reset(); 745 EXPECT_EQ(1, deletes); 746 } 747 748 template <typename T> 749 class BindVariantsTest : public ::testing::Test { 750 }; 751 752 struct RepeatingTestConfig { 753 template <typename Signature> 754 using CallbackType = RepeatingCallback<Signature>; 755 using ClosureType = RepeatingClosure; 756 757 template <typename F, typename... Args> 758 static CallbackType<MakeUnboundRunType<F, Args...>> 759 Bind(F&& f, Args&&... args) { 760 return BindRepeating(std::forward<F>(f), std::forward<Args>(args)...); 761 } 762 }; 763 764 struct OnceTestConfig { 765 template <typename Signature> 766 using CallbackType = OnceCallback<Signature>; 767 using ClosureType = OnceClosure; 768 769 template <typename F, typename... Args> 770 static CallbackType<MakeUnboundRunType<F, Args...>> 771 Bind(F&& f, Args&&... args) { 772 return BindOnce(std::forward<F>(f), std::forward<Args>(args)...); 773 } 774 }; 775 776 using BindVariantsTestConfig = ::testing::Types< 777 RepeatingTestConfig, OnceTestConfig>; 778 TYPED_TEST_CASE(BindVariantsTest, BindVariantsTestConfig); 779 780 template <typename TypeParam, typename Signature> 781 using CallbackType = typename TypeParam::template CallbackType<Signature>; 782 783 // Function type support. 784 // - Normal function. 785 // - Normal function bound with non-refcounted first argument. 786 // - Method bound to non-const object. 787 // - Method bound to scoped_refptr. 788 // - Const method bound to non-const object. 789 // - Const method bound to const object. 790 // - Derived classes can be used with pointers to non-virtual base functions. 791 // - Derived classes can be used with pointers to virtual base functions (and 792 // preserve virtual dispatch). 793 TYPED_TEST(BindVariantsTest, FunctionTypeSupport) { 794 using ClosureType = typename TypeParam::ClosureType; 795 796 StrictMock<HasRef> has_ref; 797 StrictMock<NoRef> no_ref; 798 StrictMock<NoRef> static_func_mock; 799 const HasRef* const_has_ref_ptr = &has_ref; 800 g_func_mock_ptr = &static_func_mock; 801 802 EXPECT_CALL(static_func_mock, VoidMethod0()); 803 EXPECT_CALL(has_ref, AddRef()).Times(4); 804 EXPECT_CALL(has_ref, Release()).Times(4); 805 EXPECT_CALL(has_ref, VoidMethod0()).Times(2); 806 EXPECT_CALL(has_ref, VoidConstMethod0()).Times(2); 807 808 ClosureType normal_cb = TypeParam::Bind(&VoidFunc0); 809 CallbackType<TypeParam, NoRef*()> normal_non_refcounted_cb = 810 TypeParam::Bind(&PolymorphicIdentity<NoRef*>, &no_ref); 811 std::move(normal_cb).Run(); 812 EXPECT_EQ(&no_ref, std::move(normal_non_refcounted_cb).Run()); 813 814 ClosureType method_cb = TypeParam::Bind(&HasRef::VoidMethod0, &has_ref); 815 ClosureType method_refptr_cb = 816 TypeParam::Bind(&HasRef::VoidMethod0, WrapRefCounted(&has_ref)); 817 ClosureType const_method_nonconst_obj_cb = 818 TypeParam::Bind(&HasRef::VoidConstMethod0, &has_ref); 819 ClosureType const_method_const_obj_cb = 820 TypeParam::Bind(&HasRef::VoidConstMethod0, const_has_ref_ptr); 821 std::move(method_cb).Run(); 822 std::move(method_refptr_cb).Run(); 823 std::move(const_method_nonconst_obj_cb).Run(); 824 std::move(const_method_const_obj_cb).Run(); 825 826 Child child; 827 child.value = 0; 828 ClosureType virtual_set_cb = TypeParam::Bind(&Parent::VirtualSet, &child); 829 std::move(virtual_set_cb).Run(); 830 EXPECT_EQ(kChildValue, child.value); 831 832 child.value = 0; 833 ClosureType non_virtual_set_cb = 834 TypeParam::Bind(&Parent::NonVirtualSet, &child); 835 std::move(non_virtual_set_cb).Run(); 836 EXPECT_EQ(kParentValue, child.value); 837 } 838 839 // Return value support. 840 // - Function with return value. 841 // - Method with return value. 842 // - Const method with return value. 843 // - Move-only return value. 844 TYPED_TEST(BindVariantsTest, ReturnValues) { 845 StrictMock<NoRef> static_func_mock; 846 StrictMock<HasRef> has_ref; 847 g_func_mock_ptr = &static_func_mock; 848 const HasRef* const_has_ref_ptr = &has_ref; 849 850 EXPECT_CALL(static_func_mock, IntMethod0()).WillOnce(Return(1337)); 851 EXPECT_CALL(has_ref, AddRef()).Times(4); 852 EXPECT_CALL(has_ref, Release()).Times(4); 853 EXPECT_CALL(has_ref, IntMethod0()).WillOnce(Return(31337)); 854 EXPECT_CALL(has_ref, IntConstMethod0()) 855 .WillOnce(Return(41337)) 856 .WillOnce(Return(51337)); 857 EXPECT_CALL(has_ref, UniquePtrMethod0()) 858 .WillOnce(Return(ByMove(std::make_unique<int>(42)))); 859 860 CallbackType<TypeParam, int()> normal_cb = TypeParam::Bind(&IntFunc0); 861 CallbackType<TypeParam, int()> method_cb = 862 TypeParam::Bind(&HasRef::IntMethod0, &has_ref); 863 CallbackType<TypeParam, int()> const_method_nonconst_obj_cb = 864 TypeParam::Bind(&HasRef::IntConstMethod0, &has_ref); 865 CallbackType<TypeParam, int()> const_method_const_obj_cb = 866 TypeParam::Bind(&HasRef::IntConstMethod0, const_has_ref_ptr); 867 CallbackType<TypeParam, std::unique_ptr<int>()> move_only_rv_cb = 868 TypeParam::Bind(&HasRef::UniquePtrMethod0, &has_ref); 869 EXPECT_EQ(1337, std::move(normal_cb).Run()); 870 EXPECT_EQ(31337, std::move(method_cb).Run()); 871 EXPECT_EQ(41337, std::move(const_method_nonconst_obj_cb).Run()); 872 EXPECT_EQ(51337, std::move(const_method_const_obj_cb).Run()); 873 EXPECT_EQ(42, *std::move(move_only_rv_cb).Run()); 874 } 875 876 // Argument binding tests. 877 // - Argument binding to primitive. 878 // - Argument binding to primitive pointer. 879 // - Argument binding to a literal integer. 880 // - Argument binding to a literal string. 881 // - Argument binding with template function. 882 // - Argument binding to an object. 883 // - Argument binding to pointer to incomplete type. 884 // - Argument gets type converted. 885 // - Pointer argument gets converted. 886 // - Const Reference forces conversion. 887 TYPED_TEST(BindVariantsTest, ArgumentBinding) { 888 int n = 2; 889 890 EXPECT_EQ(n, TypeParam::Bind(&Identity, n).Run()); 891 EXPECT_EQ(&n, TypeParam::Bind(&PolymorphicIdentity<int*>, &n).Run()); 892 EXPECT_EQ(3, TypeParam::Bind(&Identity, 3).Run()); 893 EXPECT_STREQ("hi", TypeParam::Bind(&CStringIdentity, "hi").Run()); 894 EXPECT_EQ(4, TypeParam::Bind(&PolymorphicIdentity<int>, 4).Run()); 895 896 NoRefParent p; 897 p.value = 5; 898 EXPECT_EQ(5, TypeParam::Bind(&UnwrapNoRefParent, p).Run()); 899 900 IncompleteType* incomplete_ptr = reinterpret_cast<IncompleteType*>(123); 901 EXPECT_EQ(incomplete_ptr, 902 TypeParam::Bind(&PolymorphicIdentity<IncompleteType*>, 903 incomplete_ptr).Run()); 904 905 NoRefChild c; 906 c.value = 6; 907 EXPECT_EQ(6, TypeParam::Bind(&UnwrapNoRefParent, c).Run()); 908 909 c.value = 7; 910 EXPECT_EQ(7, TypeParam::Bind(&UnwrapNoRefParentPtr, &c).Run()); 911 912 c.value = 8; 913 EXPECT_EQ(8, TypeParam::Bind(&UnwrapNoRefParentConstRef, c).Run()); 914 } 915 916 // Unbound argument type support tests. 917 // - Unbound value. 918 // - Unbound pointer. 919 // - Unbound reference. 920 // - Unbound const reference. 921 // - Unbound unsized array. 922 // - Unbound sized array. 923 // - Unbound array-of-arrays. 924 TYPED_TEST(BindVariantsTest, UnboundArgumentTypeSupport) { 925 CallbackType<TypeParam, void(int)> unbound_value_cb = 926 TypeParam::Bind(&VoidPolymorphic<int>::Run); 927 CallbackType<TypeParam, void(int*)> unbound_pointer_cb = 928 TypeParam::Bind(&VoidPolymorphic<int*>::Run); 929 CallbackType<TypeParam, void(int&)> unbound_ref_cb = 930 TypeParam::Bind(&VoidPolymorphic<int&>::Run); 931 CallbackType<TypeParam, void(const int&)> unbound_const_ref_cb = 932 TypeParam::Bind(&VoidPolymorphic<const int&>::Run); 933 CallbackType<TypeParam, void(int[])> unbound_unsized_array_cb = 934 TypeParam::Bind(&VoidPolymorphic<int[]>::Run); 935 CallbackType<TypeParam, void(int[2])> unbound_sized_array_cb = 936 TypeParam::Bind(&VoidPolymorphic<int[2]>::Run); 937 CallbackType<TypeParam, void(int[][2])> unbound_array_of_arrays_cb = 938 TypeParam::Bind(&VoidPolymorphic<int[][2]>::Run); 939 CallbackType<TypeParam, void(int&)> unbound_ref_with_bound_arg = 940 TypeParam::Bind(&VoidPolymorphic<int, int&>::Run, 1); 941 } 942 943 // Function with unbound reference parameter. 944 // - Original parameter is modified by callback. 945 TYPED_TEST(BindVariantsTest, UnboundReferenceSupport) { 946 int n = 0; 947 CallbackType<TypeParam, void(int&)> unbound_ref_cb = 948 TypeParam::Bind(&RefArgSet); 949 std::move(unbound_ref_cb).Run(n); 950 EXPECT_EQ(2, n); 951 } 952 953 // Unretained() wrapper support. 954 // - Method bound to Unretained() non-const object. 955 // - Const method bound to Unretained() non-const object. 956 // - Const method bound to Unretained() const object. 957 TYPED_TEST(BindVariantsTest, Unretained) { 958 StrictMock<NoRef> no_ref; 959 const NoRef* const_no_ref_ptr = &no_ref; 960 961 EXPECT_CALL(no_ref, VoidMethod0()); 962 EXPECT_CALL(no_ref, VoidConstMethod0()).Times(2); 963 964 TypeParam::Bind(&NoRef::VoidMethod0, Unretained(&no_ref)).Run(); 965 TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(&no_ref)).Run(); 966 TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(const_no_ref_ptr)).Run(); 967 } 968 969 TYPED_TEST(BindVariantsTest, ScopedRefptr) { 970 StrictMock<HasRef> has_ref; 971 EXPECT_CALL(has_ref, AddRef()).Times(1); 972 EXPECT_CALL(has_ref, Release()).Times(1); 973 974 const scoped_refptr<HasRef> refptr(&has_ref); 975 CallbackType<TypeParam, int()> scoped_refptr_const_ref_cb = 976 TypeParam::Bind(&FunctionWithScopedRefptrFirstParam, 977 base::ConstRef(refptr), 1); 978 EXPECT_EQ(1, std::move(scoped_refptr_const_ref_cb).Run()); 979 } 980 981 TYPED_TEST(BindVariantsTest, UniquePtrReceiver) { 982 std::unique_ptr<StrictMock<NoRef>> no_ref(new StrictMock<NoRef>); 983 EXPECT_CALL(*no_ref, VoidMethod0()).Times(1); 984 TypeParam::Bind(&NoRef::VoidMethod0, std::move(no_ref)).Run(); 985 } 986 987 // Tests for Passed() wrapper support: 988 // - Passed() can be constructed from a pointer to scoper. 989 // - Passed() can be constructed from a scoper rvalue. 990 // - Using Passed() gives Callback Ownership. 991 // - Ownership is transferred from Callback to callee on the first Run(). 992 // - Callback supports unbound arguments. 993 template <typename T> 994 class BindMoveOnlyTypeTest : public ::testing::Test { 995 }; 996 997 struct CustomDeleter { 998 void operator()(DeleteCounter* c) { delete c; } 999 }; 1000 1001 using MoveOnlyTypesToTest = 1002 ::testing::Types<std::unique_ptr<DeleteCounter>, 1003 std::unique_ptr<DeleteCounter, CustomDeleter>>; 1004 TYPED_TEST_CASE(BindMoveOnlyTypeTest, MoveOnlyTypesToTest); 1005 1006 TYPED_TEST(BindMoveOnlyTypeTest, PassedToBoundCallback) { 1007 int deletes = 0; 1008 1009 TypeParam ptr(new DeleteCounter(&deletes)); 1010 Callback<TypeParam()> callback = Bind(&PassThru<TypeParam>, Passed(&ptr)); 1011 EXPECT_FALSE(ptr.get()); 1012 EXPECT_EQ(0, deletes); 1013 1014 // If we never invoke the Callback, it retains ownership and deletes. 1015 callback.Reset(); 1016 EXPECT_EQ(1, deletes); 1017 } 1018 1019 TYPED_TEST(BindMoveOnlyTypeTest, PassedWithRvalue) { 1020 int deletes = 0; 1021 Callback<TypeParam()> callback = Bind( 1022 &PassThru<TypeParam>, Passed(TypeParam(new DeleteCounter(&deletes)))); 1023 EXPECT_EQ(0, deletes); 1024 1025 // If we never invoke the Callback, it retains ownership and deletes. 1026 callback.Reset(); 1027 EXPECT_EQ(1, deletes); 1028 } 1029 1030 // Check that ownership can be transferred back out. 1031 TYPED_TEST(BindMoveOnlyTypeTest, ReturnMoveOnlyType) { 1032 int deletes = 0; 1033 DeleteCounter* counter = new DeleteCounter(&deletes); 1034 Callback<TypeParam()> callback = 1035 Bind(&PassThru<TypeParam>, Passed(TypeParam(counter))); 1036 TypeParam result = callback.Run(); 1037 ASSERT_EQ(counter, result.get()); 1038 EXPECT_EQ(0, deletes); 1039 1040 // Resetting does not delete since ownership was transferred. 1041 callback.Reset(); 1042 EXPECT_EQ(0, deletes); 1043 1044 // Ensure that we actually did get ownership. 1045 result.reset(); 1046 EXPECT_EQ(1, deletes); 1047 } 1048 1049 TYPED_TEST(BindMoveOnlyTypeTest, UnboundForwarding) { 1050 int deletes = 0; 1051 TypeParam ptr(new DeleteCounter(&deletes)); 1052 // Test unbound argument forwarding. 1053 Callback<TypeParam(TypeParam)> cb_unbound = Bind(&PassThru<TypeParam>); 1054 cb_unbound.Run(std::move(ptr)); 1055 EXPECT_EQ(1, deletes); 1056 } 1057 1058 void VerifyVector(const std::vector<std::unique_ptr<int>>& v) { 1059 ASSERT_EQ(1u, v.size()); 1060 EXPECT_EQ(12345, *v[0]); 1061 } 1062 1063 std::vector<std::unique_ptr<int>> AcceptAndReturnMoveOnlyVector( 1064 std::vector<std::unique_ptr<int>> v) { 1065 VerifyVector(v); 1066 return v; 1067 } 1068 1069 // Test that a vector containing move-only types can be used with Callback. 1070 TEST_F(BindTest, BindMoveOnlyVector) { 1071 using MoveOnlyVector = std::vector<std::unique_ptr<int>>; 1072 1073 MoveOnlyVector v; 1074 v.push_back(WrapUnique(new int(12345))); 1075 1076 // Early binding should work: 1077 base::Callback<MoveOnlyVector()> bound_cb = 1078 base::Bind(&AcceptAndReturnMoveOnlyVector, Passed(&v)); 1079 MoveOnlyVector intermediate_result = bound_cb.Run(); 1080 VerifyVector(intermediate_result); 1081 1082 // As should passing it as an argument to Run(): 1083 base::Callback<MoveOnlyVector(MoveOnlyVector)> unbound_cb = 1084 base::Bind(&AcceptAndReturnMoveOnlyVector); 1085 MoveOnlyVector final_result = unbound_cb.Run(std::move(intermediate_result)); 1086 VerifyVector(final_result); 1087 } 1088 1089 // Argument copy-constructor usage for non-reference copy-only parameters. 1090 // - Bound arguments are only copied once. 1091 // - Forwarded arguments are only copied once. 1092 // - Forwarded arguments with coercions are only copied twice (once for the 1093 // coercion, and one for the final dispatch). 1094 TEST_F(BindTest, ArgumentCopies) { 1095 int copies = 0; 1096 int assigns = 0; 1097 1098 CopyCounter counter(&copies, &assigns); 1099 Bind(&VoidPolymorphic<CopyCounter>::Run, counter); 1100 EXPECT_EQ(1, copies); 1101 EXPECT_EQ(0, assigns); 1102 1103 copies = 0; 1104 assigns = 0; 1105 Bind(&VoidPolymorphic<CopyCounter>::Run, CopyCounter(&copies, &assigns)); 1106 EXPECT_EQ(1, copies); 1107 EXPECT_EQ(0, assigns); 1108 1109 copies = 0; 1110 assigns = 0; 1111 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(counter); 1112 EXPECT_EQ(2, copies); 1113 EXPECT_EQ(0, assigns); 1114 1115 copies = 0; 1116 assigns = 0; 1117 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(&copies, &assigns)); 1118 EXPECT_EQ(1, copies); 1119 EXPECT_EQ(0, assigns); 1120 1121 copies = 0; 1122 assigns = 0; 1123 DerivedCopyMoveCounter derived(&copies, &assigns, nullptr, nullptr); 1124 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(derived)); 1125 EXPECT_EQ(2, copies); 1126 EXPECT_EQ(0, assigns); 1127 1128 copies = 0; 1129 assigns = 0; 1130 Bind(&VoidPolymorphic<CopyCounter>::Run) 1131 .Run(CopyCounter( 1132 DerivedCopyMoveCounter(&copies, &assigns, nullptr, nullptr))); 1133 EXPECT_EQ(2, copies); 1134 EXPECT_EQ(0, assigns); 1135 } 1136 1137 // Argument move-constructor usage for move-only parameters. 1138 // - Bound arguments passed by move are not copied. 1139 TEST_F(BindTest, ArgumentMoves) { 1140 int move_constructs = 0; 1141 int move_assigns = 0; 1142 1143 Bind(&VoidPolymorphic<const MoveCounter&>::Run, 1144 MoveCounter(&move_constructs, &move_assigns)); 1145 EXPECT_EQ(1, move_constructs); 1146 EXPECT_EQ(0, move_assigns); 1147 1148 // TODO(tzik): Support binding move-only type into a non-reference parameter 1149 // of a variant of Callback. 1150 1151 move_constructs = 0; 1152 move_assigns = 0; 1153 Bind(&VoidPolymorphic<MoveCounter>::Run) 1154 .Run(MoveCounter(&move_constructs, &move_assigns)); 1155 EXPECT_EQ(1, move_constructs); 1156 EXPECT_EQ(0, move_assigns); 1157 1158 move_constructs = 0; 1159 move_assigns = 0; 1160 Bind(&VoidPolymorphic<MoveCounter>::Run) 1161 .Run(MoveCounter(DerivedCopyMoveCounter( 1162 nullptr, nullptr, &move_constructs, &move_assigns))); 1163 EXPECT_EQ(2, move_constructs); 1164 EXPECT_EQ(0, move_assigns); 1165 } 1166 1167 // Argument constructor usage for non-reference movable-copyable 1168 // parameters. 1169 // - Bound arguments passed by move are not copied. 1170 // - Forwarded arguments are only copied once. 1171 // - Forwarded arguments with coercions are only copied once and moved once. 1172 TEST_F(BindTest, ArgumentCopiesAndMoves) { 1173 int copies = 0; 1174 int assigns = 0; 1175 int move_constructs = 0; 1176 int move_assigns = 0; 1177 1178 CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns); 1179 Bind(&VoidPolymorphic<CopyMoveCounter>::Run, counter); 1180 EXPECT_EQ(1, copies); 1181 EXPECT_EQ(0, assigns); 1182 EXPECT_EQ(0, move_constructs); 1183 EXPECT_EQ(0, move_assigns); 1184 1185 copies = 0; 1186 assigns = 0; 1187 move_constructs = 0; 1188 move_assigns = 0; 1189 Bind(&VoidPolymorphic<CopyMoveCounter>::Run, 1190 CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns)); 1191 EXPECT_EQ(0, copies); 1192 EXPECT_EQ(0, assigns); 1193 EXPECT_EQ(1, move_constructs); 1194 EXPECT_EQ(0, move_assigns); 1195 1196 copies = 0; 1197 assigns = 0; 1198 move_constructs = 0; 1199 move_assigns = 0; 1200 Bind(&VoidPolymorphic<CopyMoveCounter>::Run).Run(counter); 1201 EXPECT_EQ(1, copies); 1202 EXPECT_EQ(0, assigns); 1203 EXPECT_EQ(1, move_constructs); 1204 EXPECT_EQ(0, move_assigns); 1205 1206 copies = 0; 1207 assigns = 0; 1208 move_constructs = 0; 1209 move_assigns = 0; 1210 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1211 .Run(CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns)); 1212 EXPECT_EQ(0, copies); 1213 EXPECT_EQ(0, assigns); 1214 EXPECT_EQ(1, move_constructs); 1215 EXPECT_EQ(0, move_assigns); 1216 1217 DerivedCopyMoveCounter derived_counter(&copies, &assigns, &move_constructs, 1218 &move_assigns); 1219 copies = 0; 1220 assigns = 0; 1221 move_constructs = 0; 1222 move_assigns = 0; 1223 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1224 .Run(CopyMoveCounter(derived_counter)); 1225 EXPECT_EQ(1, copies); 1226 EXPECT_EQ(0, assigns); 1227 EXPECT_EQ(1, move_constructs); 1228 EXPECT_EQ(0, move_assigns); 1229 1230 copies = 0; 1231 assigns = 0; 1232 move_constructs = 0; 1233 move_assigns = 0; 1234 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1235 .Run(CopyMoveCounter(DerivedCopyMoveCounter( 1236 &copies, &assigns, &move_constructs, &move_assigns))); 1237 EXPECT_EQ(0, copies); 1238 EXPECT_EQ(0, assigns); 1239 EXPECT_EQ(2, move_constructs); 1240 EXPECT_EQ(0, move_assigns); 1241 } 1242 1243 TEST_F(BindTest, CapturelessLambda) { 1244 EXPECT_FALSE(internal::IsCallableObject<void>::value); 1245 EXPECT_FALSE(internal::IsCallableObject<int>::value); 1246 EXPECT_FALSE(internal::IsCallableObject<void (*)()>::value); 1247 EXPECT_FALSE(internal::IsCallableObject<void (NoRef::*)()>::value); 1248 1249 auto f = []() {}; 1250 EXPECT_TRUE(internal::IsCallableObject<decltype(f)>::value); 1251 1252 int i = 0; 1253 auto g = [i]() { (void)i; }; 1254 EXPECT_TRUE(internal::IsCallableObject<decltype(g)>::value); 1255 1256 auto h = [](int, double) { return 'k'; }; 1257 EXPECT_TRUE((std::is_same< 1258 char(int, double), 1259 internal::ExtractCallableRunType<decltype(h)>>::value)); 1260 1261 EXPECT_EQ(42, Bind([] { return 42; }).Run()); 1262 EXPECT_EQ(42, Bind([](int i) { return i * 7; }, 6).Run()); 1263 1264 int x = 1; 1265 base::Callback<void(int)> cb = 1266 Bind([](int* x, int i) { *x *= i; }, Unretained(&x)); 1267 cb.Run(6); 1268 EXPECT_EQ(6, x); 1269 cb.Run(7); 1270 EXPECT_EQ(42, x); 1271 } 1272 1273 TEST_F(BindTest, EmptyFunctor) { 1274 struct NonEmptyFunctor { 1275 int operator()() const { return x; } 1276 int x = 42; 1277 }; 1278 1279 struct EmptyFunctor { 1280 int operator()() { return 42; } 1281 }; 1282 1283 struct EmptyFunctorConst { 1284 int operator()() const { return 42; } 1285 }; 1286 1287 EXPECT_TRUE(internal::IsCallableObject<NonEmptyFunctor>::value); 1288 EXPECT_TRUE(internal::IsCallableObject<EmptyFunctor>::value); 1289 EXPECT_TRUE(internal::IsCallableObject<EmptyFunctorConst>::value); 1290 EXPECT_EQ(42, BindOnce(EmptyFunctor()).Run()); 1291 EXPECT_EQ(42, BindOnce(EmptyFunctorConst()).Run()); 1292 EXPECT_EQ(42, BindRepeating(EmptyFunctorConst()).Run()); 1293 } 1294 1295 TEST_F(BindTest, CapturingLambdaForTesting) { 1296 int x = 6; 1297 EXPECT_EQ(42, BindLambdaForTesting([=](int y) { return x * y; }).Run(7)); 1298 1299 auto f = [x](std::unique_ptr<int> y) { return x * *y; }; 1300 EXPECT_EQ(42, BindLambdaForTesting(f).Run(std::make_unique<int>(7))); 1301 } 1302 1303 TEST_F(BindTest, Cancellation) { 1304 EXPECT_CALL(no_ref_, VoidMethodWithIntArg(_)).Times(2); 1305 1306 WeakPtrFactory<NoRef> weak_factory(&no_ref_); 1307 RepeatingCallback<void(int)> cb = 1308 BindRepeating(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr()); 1309 RepeatingClosure cb2 = BindRepeating(cb, 8); 1310 OnceClosure cb3 = BindOnce(cb, 8); 1311 1312 OnceCallback<void(int)> cb4 = 1313 BindOnce(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr()); 1314 EXPECT_FALSE(cb4.IsCancelled()); 1315 1316 OnceClosure cb5 = BindOnce(std::move(cb4), 8); 1317 1318 EXPECT_FALSE(cb.IsCancelled()); 1319 EXPECT_FALSE(cb2.IsCancelled()); 1320 EXPECT_FALSE(cb3.IsCancelled()); 1321 EXPECT_FALSE(cb5.IsCancelled()); 1322 1323 cb.Run(6); 1324 cb2.Run(); 1325 1326 weak_factory.InvalidateWeakPtrs(); 1327 1328 EXPECT_TRUE(cb.IsCancelled()); 1329 EXPECT_TRUE(cb2.IsCancelled()); 1330 EXPECT_TRUE(cb3.IsCancelled()); 1331 EXPECT_TRUE(cb5.IsCancelled()); 1332 1333 cb.Run(6); 1334 cb2.Run(); 1335 std::move(cb3).Run(); 1336 std::move(cb5).Run(); 1337 } 1338 1339 TEST_F(BindTest, OnceCallback) { 1340 // Check if Callback variants have declarations of conversions as expected. 1341 // Copy constructor and assignment of RepeatingCallback. 1342 static_assert(std::is_constructible< 1343 RepeatingClosure, const RepeatingClosure&>::value, 1344 "RepeatingClosure should be copyable."); 1345 static_assert( 1346 std::is_assignable<RepeatingClosure, const RepeatingClosure&>::value, 1347 "RepeatingClosure should be copy-assignable."); 1348 1349 // Move constructor and assignment of RepeatingCallback. 1350 static_assert(std::is_constructible< 1351 RepeatingClosure, RepeatingClosure&&>::value, 1352 "RepeatingClosure should be movable."); 1353 static_assert(std::is_assignable<RepeatingClosure, RepeatingClosure&&>::value, 1354 "RepeatingClosure should be move-assignable"); 1355 1356 // Conversions from OnceCallback to RepeatingCallback. 1357 static_assert(!std::is_constructible< 1358 RepeatingClosure, const OnceClosure&>::value, 1359 "OnceClosure should not be convertible to RepeatingClosure."); 1360 static_assert( 1361 !std::is_assignable<RepeatingClosure, const OnceClosure&>::value, 1362 "OnceClosure should not be convertible to RepeatingClosure."); 1363 1364 // Destructive conversions from OnceCallback to RepeatingCallback. 1365 static_assert(!std::is_constructible< 1366 RepeatingClosure, OnceClosure&&>::value, 1367 "OnceClosure should not be convertible to RepeatingClosure."); 1368 static_assert(!std::is_assignable<RepeatingClosure, OnceClosure&&>::value, 1369 "OnceClosure should not be convertible to RepeatingClosure."); 1370 1371 // Copy constructor and assignment of OnceCallback. 1372 static_assert(!std::is_constructible< 1373 OnceClosure, const OnceClosure&>::value, 1374 "OnceClosure should not be copyable."); 1375 static_assert(!std::is_assignable<OnceClosure, const OnceClosure&>::value, 1376 "OnceClosure should not be copy-assignable"); 1377 1378 // Move constructor and assignment of OnceCallback. 1379 static_assert(std::is_constructible< 1380 OnceClosure, OnceClosure&&>::value, 1381 "OnceClosure should be movable."); 1382 static_assert(std::is_assignable<OnceClosure, OnceClosure&&>::value, 1383 "OnceClosure should be move-assignable."); 1384 1385 // Conversions from RepeatingCallback to OnceCallback. 1386 static_assert(std::is_constructible< 1387 OnceClosure, const RepeatingClosure&>::value, 1388 "RepeatingClosure should be convertible to OnceClosure."); 1389 static_assert(std::is_assignable<OnceClosure, const RepeatingClosure&>::value, 1390 "RepeatingClosure should be convertible to OnceClosure."); 1391 1392 // Destructive conversions from RepeatingCallback to OnceCallback. 1393 static_assert(std::is_constructible< 1394 OnceClosure, RepeatingClosure&&>::value, 1395 "RepeatingClosure should be convertible to OnceClosure."); 1396 static_assert(std::is_assignable<OnceClosure, RepeatingClosure&&>::value, 1397 "RepeatingClosure should be covretible to OnceClosure."); 1398 1399 OnceClosure cb = BindOnce(&VoidPolymorphic<>::Run); 1400 std::move(cb).Run(); 1401 1402 // RepeatingCallback should be convertible to OnceCallback. 1403 OnceClosure cb2 = BindRepeating(&VoidPolymorphic<>::Run); 1404 std::move(cb2).Run(); 1405 1406 RepeatingClosure cb3 = BindRepeating(&VoidPolymorphic<>::Run); 1407 cb = cb3; 1408 std::move(cb).Run(); 1409 1410 cb = std::move(cb2); 1411 1412 OnceCallback<void(int)> cb4 = 1413 BindOnce(&VoidPolymorphic<std::unique_ptr<int>, int>::Run, 1414 std::make_unique<int>(0)); 1415 BindOnce(std::move(cb4), 1).Run(); 1416 } 1417 1418 // Callback construction and assignment tests. 1419 // - Construction from an InvokerStorageHolder should not cause ref/deref. 1420 // - Assignment from other callback should only cause one ref 1421 // 1422 // TODO(ajwong): Is there actually a way to test this? 1423 1424 #if defined(OS_WIN) 1425 int __fastcall FastCallFunc(int n) { 1426 return n; 1427 } 1428 1429 int __stdcall StdCallFunc(int n) { 1430 return n; 1431 } 1432 1433 // Windows specific calling convention support. 1434 // - Can bind a __fastcall function. 1435 // - Can bind a __stdcall function. 1436 TEST_F(BindTest, WindowsCallingConventions) { 1437 Callback<int()> fastcall_cb = Bind(&FastCallFunc, 1); 1438 EXPECT_EQ(1, fastcall_cb.Run()); 1439 1440 Callback<int()> stdcall_cb = Bind(&StdCallFunc, 2); 1441 EXPECT_EQ(2, stdcall_cb.Run()); 1442 } 1443 #endif 1444 1445 // Test unwrapping the various wrapping functions. 1446 1447 TEST_F(BindTest, UnwrapUnretained) { 1448 int i = 0; 1449 auto unretained = Unretained(&i); 1450 EXPECT_EQ(&i, internal::Unwrap(unretained)); 1451 EXPECT_EQ(&i, internal::Unwrap(std::move(unretained))); 1452 } 1453 1454 TEST_F(BindTest, UnwrapConstRef) { 1455 int p = 0; 1456 auto const_ref = ConstRef(p); 1457 EXPECT_EQ(&p, &internal::Unwrap(const_ref)); 1458 EXPECT_EQ(&p, &internal::Unwrap(std::move(const_ref))); 1459 } 1460 1461 TEST_F(BindTest, UnwrapRetainedRef) { 1462 auto p = MakeRefCounted<RefCountedData<int>>(); 1463 auto retained_ref = RetainedRef(p); 1464 EXPECT_EQ(p.get(), internal::Unwrap(retained_ref)); 1465 EXPECT_EQ(p.get(), internal::Unwrap(std::move(retained_ref))); 1466 } 1467 1468 TEST_F(BindTest, UnwrapOwned) { 1469 int* p = new int; 1470 auto owned = Owned(p); 1471 EXPECT_EQ(p, internal::Unwrap(owned)); 1472 EXPECT_EQ(p, internal::Unwrap(std::move(owned))); 1473 } 1474 1475 TEST_F(BindTest, UnwrapPassed) { 1476 int* p = new int; 1477 auto passed = Passed(WrapUnique(p)); 1478 EXPECT_EQ(p, internal::Unwrap(passed).get()); 1479 1480 p = new int; 1481 EXPECT_EQ(p, internal::Unwrap(Passed(WrapUnique(p))).get()); 1482 } 1483 1484 TEST_F(BindTest, BindNoexcept) { 1485 EXPECT_EQ(42, base::BindOnce(&Noexcept).Run()); 1486 EXPECT_EQ( 1487 42, 1488 base::BindOnce(&BindTest::NoexceptMethod, base::Unretained(this)).Run()); 1489 EXPECT_EQ( 1490 42, base::BindOnce(&BindTest::ConstNoexceptMethod, base::Unretained(this)) 1491 .Run()); 1492 } 1493 1494 // Test null callbacks cause a DCHECK. 1495 TEST(BindDeathTest, NullCallback) { 1496 base::Callback<void(int)> null_cb; 1497 ASSERT_TRUE(null_cb.is_null()); 1498 EXPECT_DCHECK_DEATH(base::Bind(null_cb, 42)); 1499 } 1500 1501 } // namespace 1502 } // namespace base 1503