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/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IncompleteType; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoRef { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoRef() {} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(VoidMethod0, void(void)); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(VoidConstMethod0, void(void)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(IntMethod0, int(void)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(IntConstMethod0, int(void)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Particularly important in this test to ensure no copies are made. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NoRef); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HasRef : public NoRef { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasRef() {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(AddRef, void(void)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(Release, bool(void)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Particularly important in this test to ensure no copies are made. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HasRef); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HasRefPrivateDtor : public HasRef { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~HasRefPrivateDtor() {} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kParentValue = 1; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kChildValue = 2; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Parent { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddRef(void) const {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Release(void) const {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void VirtualSet() { value = kParentValue; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NonVirtualSet() { value = kParentValue; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Child : public Parent { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void VirtualSet() OVERRIDE { value = kChildValue; } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NonVirtualSet() { value = kChildValue; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoRefParent { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void VirtualSet() { value = kParentValue; } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NonVirtualSet() { value = kParentValue; } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoRefChild : public NoRefParent { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void VirtualSet() OVERRIDE { value = kChildValue; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NonVirtualSet() { value = kChildValue; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for probing the number of copies that occur if a type must be coerced 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// during argument forwarding in the Run() methods. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DerivedCopyCounter { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DerivedCopyCounter(int* copies, int* assigns) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : copies_(copies), assigns_(assigns) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* copies_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* assigns_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for probing the number of copies in an argument. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CopyCounter { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyCounter(int* copies, int* assigns) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : copies_(copies), assigns_(assigns) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyCounter(const CopyCounter& other) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : copies_(other.copies_), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assigns_(other.assigns_) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*copies_)++; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probing for copies from coercion. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit CopyCounter(const DerivedCopyCounter& other) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : copies_(other.copies_), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assigns_(other.assigns_) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*copies_)++; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CopyCounter& operator=(const CopyCounter& rhs) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copies_ = rhs.copies_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assigns_ = rhs.assigns_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (assigns_) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*assigns_)++; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copies() const { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *copies_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* copies_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* assigns_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeleteCounter { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DeleteCounter(int* deletes) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : deletes_(deletes) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~DeleteCounter() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*deletes_)++; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VoidMethod0() {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* deletes_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)T PassThru(T scoper) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoper.Pass(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some test functions that we can Bind to. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)T PolymorphicIdentity(T t) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return t; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VoidPolymorphic1(T t) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Identity(int n) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ArrayGet(const int array[], int n) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return array[n]; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Sum(int a, int b, int c, int d, int e, int f) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a + b + c + d + e + f; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* CStringIdentity(const char* s) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCopies(const CopyCounter& counter) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return counter.copies(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UnwrapNoRefParent(NoRefParent p) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p.value; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UnwrapNoRefParentPtr(NoRefParent* p) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->value; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UnwrapNoRefParentConstRef(const NoRefParent& p) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p.value; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RefArgSet(int &n) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = 2; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PtrArgSet(int *n) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n = 2; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FunctionWithWeakFirstParam(WeakPtr<NoRef> o, int n) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint FunctionWithScopedRefptrFirstParam(const scoped_refptr<HasRef>& o, int n) { 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return n; 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TakesACallback(const Closure& callback) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BindTest : public ::testing::Test { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindTest() { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_has_ref_ptr_ = &has_ref_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_no_ref_ptr_ = &no_ref_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_func_mock_ptr = &static_func_mock_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindTest() { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void VoidFunc0(void) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_func_mock_ptr->VoidMethod0(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int IntFunc0(void) { return static_func_mock_ptr->IntMethod0(); } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<NoRef> no_ref_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<HasRef> has_ref_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HasRef* const_has_ref_ptr_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NoRef* const_no_ref_ptr_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<NoRef> static_func_mock_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by the static functions to perform expectations. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static StrictMock<NoRef>* static_func_mock_ptr; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BindTest); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StrictMock<NoRef>* BindTest::static_func_mock_ptr; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanity check that we can instantiate a callback for each arity. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ArityTest) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> c0 = Bind(&Sum, 32, 16, 8, 4, 2, 1); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(63, c0.Run()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int)> c1 = Bind(&Sum, 32, 16, 8, 4, 2); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(75, c1.Run(13)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int)> c2 = Bind(&Sum, 32, 16, 8, 4); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(85, c2.Run(13, 12)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int)> c3 = Bind(&Sum, 32, 16, 8); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(92, c3.Run(13, 12, 11)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int)> c4 = Bind(&Sum, 32, 16); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(94, c4.Run(13, 12, 11, 10)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int,int)> c5 = Bind(&Sum, 32); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(87, c5.Run(13, 12, 11, 10, 9)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int,int,int)> c6 = Bind(&Sum); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(69, c6.Run(13, 12, 11, 10, 9, 14)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the Currying ability of the Callback system. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, CurryingTest) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int,int,int)> c6 = Bind(&Sum); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(69, c6.Run(13, 12, 11, 10, 9, 14)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int,int)> c5 = Bind(c6, 32); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(87, c5.Run(13, 12, 11, 10, 9)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int,int)> c4 = Bind(c5, 16); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(94, c4.Run(13, 12, 11, 10)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int,int)> c3 = Bind(c4, 8); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(92, c3.Run(13, 12, 11)); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int,int)> c2 = Bind(c3, 4); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(85, c2.Run(13, 12)); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int)> c1 = Bind(c2, 2); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(75, c1.Run(13)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> c0 = Bind(c1, 1); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(63, c0.Run()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that currying the rvalue result of another Bind() works correctly. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - rvalue should be usable as argument to Bind(). 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - multiple runs of resulting Callback remain valid. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, CurryingRvalueResultOfBind) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 0; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure cb = base::Bind(&TakesACallback, base::Bind(&PtrArgSet, &n)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we implement Bind() such that the return value has auto_ptr-like 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // semantics, the second call here will fail because ownership of 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the internal BindState<> would have been transfered to a *temporary* 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructon of a Callback object on the first call. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.Run(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, n); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = 0; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.Run(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, n); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function type support. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Normal function. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Normal function bound with non-refcounted first argument. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method bound to non-const object. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method bound to scoped_refptr. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to non-const object. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to const object. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Derived classes can be used with pointers to non-virtual base functions. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Derived classes can be used with pointers to virtual base functions (and 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preserve virtual dispatch). 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, FunctionTypeSupport) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(static_func_mock_, VoidMethod0()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, AddRef()).Times(5); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, Release()).Times(5); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, VoidMethod0()).Times(2); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, VoidConstMethod0()).Times(2); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure normal_cb = Bind(&VoidFunc0); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<NoRef*(void)> normal_non_refcounted_cb = 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PolymorphicIdentity<NoRef*>, &no_ref_); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_cb.Run(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&no_ref_, normal_non_refcounted_cb.Run()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure method_cb = Bind(&HasRef::VoidMethod0, &has_ref_); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure method_refptr_cb = Bind(&HasRef::VoidMethod0, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_scoped_refptr(&has_ref_)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure const_method_nonconst_obj_cb = Bind(&HasRef::VoidConstMethod0, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &has_ref_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure const_method_const_obj_cb = Bind(&HasRef::VoidConstMethod0, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_has_ref_ptr_); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_cb.Run(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_refptr_cb.Run(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_nonconst_obj_cb.Run(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_const_obj_cb.Run(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Child child; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.value = 0; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure virtual_set_cb = Bind(&Parent::VirtualSet, &child); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual_set_cb.Run(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kChildValue, child.value); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.value = 0; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure non_virtual_set_cb = Bind(&Parent::NonVirtualSet, &child); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_virtual_set_cb.Run(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kParentValue, child.value); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return value support. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Function with return value. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method with return value. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method with return value. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ReturnValues) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, AddRef()).Times(3); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, Release()).Times(3); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(31337)); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, IntConstMethod0()) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(41337)) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(51337)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> normal_cb = Bind(&IntFunc0); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> method_cb = Bind(&HasRef::IntMethod0, &has_ref_); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> const_method_nonconst_obj_cb = 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&HasRef::IntConstMethod0, &has_ref_); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> const_method_const_obj_cb = 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&HasRef::IntConstMethod0, const_has_ref_ptr_); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1337, normal_cb.Run()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(31337, method_cb.Run()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(41337, const_method_nonconst_obj_cb.Run()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(51337, const_method_const_obj_cb.Run()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IgnoreResult adapter test. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Function with return value. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method with return value. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const Method with return. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method with return value bound to WeakPtr<>. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const Method with return bound to WeakPtr<>. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, IgnoreResult) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, AddRef()).Times(2); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, Release()).Times(2); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, IntMethod0()).WillOnce(Return(12)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, IntConstMethod0()).WillOnce(Return(13)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure normal_func_cb = Bind(IgnoreResult(&IntFunc0)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_func_cb.Run(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure non_void_method_cb = 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(IgnoreResult(&HasRef::IntMethod0), &has_ref_); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_method_cb.Run(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure non_void_const_method_cb = 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_const_method_cb.Run(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WeakPtrFactory<NoRef> weak_factory(&no_ref_); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure non_void_weak_method_cb = 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(IgnoreResult(&NoRef::IntMethod0), weak_factory.GetWeakPtr()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_weak_method_cb.Run(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure non_void_weak_const_method_cb = 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(IgnoreResult(&NoRef::IntConstMethod0), weak_factory.GetWeakPtr()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_weak_const_method_cb.Run(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory.InvalidateWeakPtrs(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_weak_const_method_cb.Run(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_void_weak_method_cb.Run(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Argument binding tests. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to primitive. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to primitive pointer. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to a literal integer. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to a literal string. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding with template function. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to an object. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument binding to pointer to incomplete type. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Argument gets type converted. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Pointer argument gets converted. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const Reference forces conversion. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ArgumentBinding) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 2; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_primitive_cb = Bind(&Identity, n); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, bind_primitive_cb.Run()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int*(void)> bind_primitive_pointer_cb = 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PolymorphicIdentity<int*>, &n); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&n, bind_primitive_pointer_cb.Run()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_int_literal_cb = Bind(&Identity, 3); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, bind_int_literal_cb.Run()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<const char*(void)> bind_string_literal_cb = 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CStringIdentity, "hi"); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("hi", bind_string_literal_cb.Run()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_template_function_cb = 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PolymorphicIdentity<int>, 4); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, bind_template_function_cb.Run()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoRefParent p; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.value = 5; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_object_cb = Bind(&UnwrapNoRefParent, p); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, bind_object_cb.Run()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncompleteType* incomplete_ptr = reinterpret_cast<IncompleteType*>(123); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<IncompleteType*(void)> bind_incomplete_ptr_cb = 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PolymorphicIdentity<IncompleteType*>, incomplete_ptr); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(incomplete_ptr, bind_incomplete_ptr_cb.Run()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoRefChild c; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.value = 6; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_promotes_cb = Bind(&UnwrapNoRefParent, c); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(6, bind_promotes_cb.Run()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.value = 7; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_pointer_promotes_cb = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&UnwrapNoRefParentPtr, &c); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, bind_pointer_promotes_cb.Run()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.value = 8; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> bind_const_reference_promotes_cb = 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&UnwrapNoRefParentConstRef, c); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, bind_const_reference_promotes_cb.Run()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unbound argument type support tests. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound value. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound pointer. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound reference. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound const reference. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound unsized array. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound sized array. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unbound array-of-arrays. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, UnboundArgumentTypeSupport) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int)> unbound_value_cb = Bind(&VoidPolymorphic1<int>); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int*)> unbound_pointer_cb = Bind(&VoidPolymorphic1<int*>); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int&)> unbound_ref_cb = Bind(&VoidPolymorphic1<int&>); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(const int&)> unbound_const_ref_cb = 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<const int&>); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int[])> unbound_unsized_array_cb = 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<int[]>); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int[2])> unbound_sized_array_cb = 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<int[2]>); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int[][2])> unbound_array_of_arrays_cb = 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<int[][2]>); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function with unbound reference parameter. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Original parameter is modified by callback. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, UnboundReferenceSupport) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 0; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(int&)> unbound_ref_cb = Bind(&RefArgSet); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unbound_ref_cb.Run(n); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, n); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Functions that take reference parameters. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Forced reference parameter type still stores a copy. 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Forced const reference parameter type still stores a copy. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ReferenceArgumentBinding) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 1; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int& ref_n = n; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int& const_ref_n = n; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> ref_copies_cb = Bind(&Identity, ref_n); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, ref_copies_cb.Run()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n++; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n - 1, ref_copies_cb.Run()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> const_ref_copies_cb = Bind(&Identity, const_ref_n); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, const_ref_copies_cb.Run()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n++; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n - 1, const_ref_copies_cb.Run()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that we can pass in arrays and have them be stored as a pointer. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Array of values stores a pointer. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Array of const values stores a pointer. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ArrayArgumentBinding) { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int array[4] = {1, 1, 1, 1}; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int (*const_array_ptr)[4] = &array; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> array_cb = Bind(&ArrayGet, array, 1); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, array_cb.Run()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> const_array_cb = Bind(&ArrayGet, *const_array_ptr, 1); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, const_array_cb.Run()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array[1] = 3; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, array_cb.Run()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, const_array_cb.Run()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify SupportsAddRefAndRelease correctly introspects the class type for 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddRef() and Release(). 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Class with AddRef() and Release() 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Class without AddRef() and Release() 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Derived Class with AddRef() and Release() 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Derived Class without AddRef() and Release() 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Derived Class with AddRef() and Release() and a private destructor. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, SupportsAddRefAndRelease) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(internal::SupportsAddRefAndRelease<HasRef>::value); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(internal::SupportsAddRefAndRelease<NoRef>::value); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StrictMock<T> is a derived class of T. So, we use StrictMock<HasRef> and 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StrictMock<NoRef> to test that SupportsAddRefAndRelease works over 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inheritance. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(internal::SupportsAddRefAndRelease<StrictMock<HasRef> >::value); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(internal::SupportsAddRefAndRelease<StrictMock<NoRef> >::value); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This matters because the implementation creates a dummy class that 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inherits from the template type. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(internal::SupportsAddRefAndRelease<HasRefPrivateDtor>::value); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unretained() wrapper support. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method bound to Unretained() non-const object. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to Unretained() non-const object. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to Unretained() const object. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, Unretained) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, VoidMethod0()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, VoidConstMethod0()).Times(2); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(void)> method_cb = 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidMethod0, Unretained(&no_ref_)); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_cb.Run(); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(void)> const_method_cb = 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidConstMethod0, Unretained(&no_ref_)); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_cb.Run(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(void)> const_method_const_ptr_cb = 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidConstMethod0, Unretained(const_no_ref_ptr_)); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_const_ptr_cb.Run(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WeakPtr() support. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Method bound to WeakPtr<> to non-const object. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to WeakPtr<> to non-const object. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Const method bound to WeakPtr<> to const object. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Normal Function with WeakPtr<> as P1 can have return type and is 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not canceled. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, WeakPtr) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, VoidMethod0()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(no_ref_, VoidConstMethod0()).Times(2); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WeakPtrFactory<NoRef> weak_factory(&no_ref_); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure method_cb = 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidMethod0, weak_factory.GetWeakPtr()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_cb.Run(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure const_method_cb = 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_cb.Run(); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure const_method_const_ptr_cb = 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_const_ptr_cb.Run(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(int)> normal_func_cb = 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, normal_func_cb.Run(1)); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory.InvalidateWeakPtrs(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_weak_factory.InvalidateWeakPtrs(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_cb.Run(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_cb.Run(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_method_const_ptr_cb.Run(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Still runs even after the pointers are invalidated. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, normal_func_cb.Run(2)); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ConstRef() wrapper support. 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Binding w/o ConstRef takes a copy. 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Binding a ConstRef takes a reference. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Binding ConstRef to a function ConstRef does not copy on invoke. 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ConstRef) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 1; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> copy_cb = Bind(&Identity, n); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> const_ref_cb = Bind(&Identity, ConstRef(n)); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, copy_cb.Run()); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, const_ref_cb.Run()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n++; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n - 1, copy_cb.Run()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(n, const_ref_cb.Run()); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copies = 0; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int assigns = 0; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyCounter counter(&copies, &assigns); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> all_const_ref_cb = 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&GetCopies, ConstRef(counter)); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, all_const_ref_cb.Run()); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, copies); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, assigns); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(BindTest, ScopedRefptr) { 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // BUG: The scoped_refptr should cause the only AddRef()/Release() pair. But 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // due to a bug in base::Bind(), there's an extra call when invoking the 669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // callback. 670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // https://code.google.com/p/chromium/issues/detail?id=251937 671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(has_ref_, AddRef()).Times(2); 672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(has_ref_, Release()).Times(2); 673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<StrictMock<HasRef> > refptr(&has_ref_); 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Callback<int(void)> scoped_refptr_const_ref_cb = 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Bind(&FunctionWithScopedRefptrFirstParam, base::ConstRef(refptr), 1); 678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, scoped_refptr_const_ref_cb.Run()); 679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Owned() support. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, Owned) { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int deletes = 0; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteCounter* counter = new DeleteCounter(&deletes); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we don't capture, delete happens on Callback destruction/reset. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the same value. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<DeleteCounter*(void)> no_capture_cb = 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PolymorphicIdentity<DeleteCounter*>, Owned(counter)); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(counter, no_capture_cb.Run()); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(counter, no_capture_cb.Run()); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_capture_cb.Reset(); // This should trigger a delete. 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, deletes); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deletes = 0; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter = new DeleteCounter(&deletes); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure own_object_cb = 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&DeleteCounter::VoidMethod0, Owned(counter)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) own_object_cb.Run(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) own_object_cb.Reset(); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, deletes); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Passed() wrapper support. 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Passed() can be constructed from a pointer to scoper. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Passed() can be constructed from a scoper rvalue. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Using Passed() gives Callback Ownership. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Ownership is transferred from Callback to callee on the first Run(). 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Callback supports unbound arguments. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ScopedPtr) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int deletes = 0; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests the Passed() function's support for pointers. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes)); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<scoped_ptr<DeleteCounter>(void)> unused_callback = 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PassThru<scoped_ptr<DeleteCounter> >, Passed(&ptr)); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ptr.get()); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we never invoke the Callback, it retains ownership and deletes. 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unused_callback.Reset(); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, deletes); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests the Passed() function's support for rvalues. 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deletes = 0; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteCounter* counter = new DeleteCounter(&deletes); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<scoped_ptr<DeleteCounter>(void)> callback = 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PassThru<scoped_ptr<DeleteCounter> >, 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Passed(scoped_ptr<DeleteCounter>(counter))); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ptr.get()); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that ownership can be transferred back out. 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeleteCounter> result = callback.Run(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(counter, result.get()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resetting does not delete since ownership was transferred. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Reset(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, deletes); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we actually did get ownership. 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.reset(); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, deletes); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test unbound argument forwarding. 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<scoped_ptr<DeleteCounter>(scoped_ptr<DeleteCounter>)> cb_unbound = 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&PassThru<scoped_ptr<DeleteCounter> >); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr.reset(new DeleteCounter(&deletes)); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb_unbound.Run(ptr.Pass()); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Argument Copy-constructor usage for non-reference parameters. 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Bound arguments are only copied once. 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Forwarded arguments are only copied once. 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Forwarded arguments with coercions are only copied twice (once for the 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// coercion, and one for the final dispatch). 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, ArgumentCopies) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copies = 0; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int assigns = 0; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyCounter counter(&copies, &assigns); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(void)> copy_cb = 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<CopyCounter>, counter); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(1, copies); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, assigns); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copies = 0; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assigns = 0; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(CopyCounter)> forward_cb = 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<CopyCounter>); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_cb.Run(counter); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(1, copies); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, assigns); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copies = 0; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assigns = 0; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DerivedCopyCounter dervied(&copies, &assigns); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<void(CopyCounter)> coerce_cb = 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&VoidPolymorphic1<CopyCounter>); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) coerce_cb.Run(CopyCounter(dervied)); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(2, copies); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, assigns); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback construction and assignment tests. 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Construction from an InvokerStorageHolder should not cause ref/deref. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Assignment from other callback should only cause one ref 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ajwong): Is there actually a way to test this? 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __fastcall FastCallFunc(int n) { 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __stdcall StdCallFunc(int n) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows specific calling convention support. 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Can bind a __fastcall function. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Can bind a __stdcall function. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindTest, WindowsCallingConventions) { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> fastcall_cb = Bind(&FastCallFunc, 1); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, fastcall_cb.Run()); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback<int(void)> stdcall_cb = Bind(&StdCallFunc, 2); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, stdcall_cb.Run()); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && GTEST_HAS_DEATH_TEST 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test null callbacks cause a DCHECK. 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(BindDeathTest, NullCallback) { 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(int)> null_cb; 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(null_cb.is_null()); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_DEATH(base::Bind(null_cb, 42), ""); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GTEST_HAS_DEATH_TEST 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 830