1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/callback_internal.h" 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace base { 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HelperObject { 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HelperObject() : next_number_(0) { } 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int GetNextNumber() { return ++next_number_; } 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetNextNumberArg(int* number) { *number = GetNextNumber(); } 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_number_; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct FakeInvoker { 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static void DoInvoke(internal::InvokerStorageBase*) { 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// White-box testpoints to inject into a Callback<> object for checking 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// comparators and emptiness APIs. 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FakeInvokerStorage1 : public internal::InvokerStorageBase { 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef FakeInvoker Invoker; 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FakeInvokerStorage2 : public internal::InvokerStorageBase { 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef FakeInvoker Invoker; 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CallbackOld, OneArg) { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HelperObject obj; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<Callback1<int*>::Type> callback( 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallback(&obj, &HelperObject::GetNextNumberArg)); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int number = 0; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch callback->Run(&number); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(number, 1); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CallbackOld, ReturnValue) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HelperObject obj; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<CallbackWithReturnValue<int>::Type> callback( 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallbackWithReturnValue(&obj, &HelperObject::GetNextNumber)); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(callback->Run(), 1); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CallbackTest : public ::testing::Test { 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CallbackTest() 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : callback_a_(MakeInvokerStorageHolder(new FakeInvokerStorage1())), 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen callback_b_(MakeInvokerStorageHolder(new FakeInvokerStorage2())) { 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~CallbackTest() { 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected: 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> callback_a_; 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const Callback<void(void)> callback_b_; // Ensure APIs work with const. 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> null_callback_; 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Ensure we can create unbound callbacks. We need this to be able to store 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// them in class members that can be initialized later. 77dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, DefaultConstruction) { 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> c0; 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int)> c1; 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int,int)> c2; 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int,int,int)> c3; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int,int,int,int)> c4; 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int,int,int,int,int)> c5; 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(int,int,int,int,int,int)> c6; 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c0.is_null()); 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c1.is_null()); 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c2.is_null()); 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c3.is_null()); 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c4.is_null()); 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c5.is_null()); 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(c6.is_null()); 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 95dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, IsNull) { 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(null_callback_.is_null()); 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(callback_a_.is_null()); 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(callback_b_.is_null()); 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 101dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, Equals) { 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(callback_a_.Equals(callback_a_)); 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(callback_a_.Equals(callback_b_)); 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(callback_b_.Equals(callback_a_)); 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // We should compare based on instance, not type. 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> callback_c( 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen MakeInvokerStorageHolder(new FakeInvokerStorage1())); 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> callback_a2 = callback_a_; 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(callback_a_.Equals(callback_a2)); 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE(callback_a_.Equals(callback_c)); 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Empty, however, is always equal to empty. 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Callback<void(void)> empty2; 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(null_callback_.Equals(empty2)); 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 118dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, Reset) { 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Resetting should bring us back to empty. 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_FALSE(callback_a_.is_null()); 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ASSERT_FALSE(callback_a_.Equals(null_callback_)); 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen callback_a_.Reset(); 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(callback_a_.is_null()); 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(callback_a_.Equals(null_callback_)); 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace base 131