gmock-spec-builders.cc revision 53e08c44dd34857ba57581d7c5774d6c96a8d0e1
1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc. 2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved. 3e35fdd936d133bf8a48de140a3c666897588a05shiqian// 4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without 5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are 6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met: 7e35fdd936d133bf8a48de140a3c666897588a05shiqian// 8e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions of source code must retain the above copyright 9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer. 10e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions in binary form must reproduce the above 11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer 12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the 13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution. 14e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Neither the name of Google Inc. nor the names of its 15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from 16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission. 17e35fdd936d133bf8a48de140a3c666897588a05shiqian// 18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e35fdd936d133bf8a48de140a3c666897588a05shiqian// 30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan) 31e35fdd936d133bf8a48de140a3c666897588a05shiqian 32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes. 33e35fdd936d133bf8a48de140a3c666897588a05shiqian// 34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file implements the spec builder syntax (ON_CALL and 35e35fdd936d133bf8a48de140a3c666897588a05shiqian// EXPECT_CALL). 36e35fdd936d133bf8a48de140a3c666897588a05shiqian 3753e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-spec-builders.h" 38e35fdd936d133bf8a48de140a3c666897588a05shiqian 39df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <stdlib.h> 40df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <iostream> // NOLINT 41df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <map> 42e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <set> 436c54a5e1f91e033fa937be5d647ce43dee597ad8vladlosev#include <string> 4453e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h" 4553e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h" 46e35fdd936d133bf8a48de140a3c666897588a05shiqian 47df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC 48df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <unistd.h> // NOLINT 49df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#endif 50df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 51e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing { 52e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal { 53e35fdd936d133bf8a48de140a3c666897588a05shiqian 54e35fdd936d133bf8a48de140a3c666897588a05shiqian// Protects the mock object registry (in class Mock), all function 55e35fdd936d133bf8a48de140a3c666897588a05shiqian// mockers, and all expectations. 565905ba00fe78e522f7253e837ded3ddb5b946934zhanyong.wanGTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex); 57e35fdd936d133bf8a48de140a3c666897588a05shiqian 58e35fdd936d133bf8a48de140a3c666897588a05shiqian// Constructs an ExpectationBase object. 5932de5f53763125925e078498250f7e73a88de9edzhanyong.wanExpectationBase::ExpectationBase(const char* a_file, 6032de5f53763125925e078498250f7e73a88de9edzhanyong.wan int a_line, 6132de5f53763125925e078498250f7e73a88de9edzhanyong.wan const string& a_source_text) 6232de5f53763125925e078498250f7e73a88de9edzhanyong.wan : file_(a_file), 6332de5f53763125925e078498250f7e73a88de9edzhanyong.wan line_(a_line), 6432de5f53763125925e078498250f7e73a88de9edzhanyong.wan source_text_(a_source_text), 65e35fdd936d133bf8a48de140a3c666897588a05shiqian cardinality_specified_(false), 66e35fdd936d133bf8a48de140a3c666897588a05shiqian cardinality_(Exactly(1)), 67e35fdd936d133bf8a48de140a3c666897588a05shiqian call_count_(0), 68e35fdd936d133bf8a48de140a3c666897588a05shiqian retired_(false) { 69e35fdd936d133bf8a48de140a3c666897588a05shiqian} 70e35fdd936d133bf8a48de140a3c666897588a05shiqian 71e35fdd936d133bf8a48de140a3c666897588a05shiqian// Destructs an ExpectationBase object. 72e35fdd936d133bf8a48de140a3c666897588a05shiqianExpectationBase::~ExpectationBase() {} 73e35fdd936d133bf8a48de140a3c666897588a05shiqian 74e35fdd936d133bf8a48de140a3c666897588a05shiqian// Explicitly specifies the cardinality of this expectation. Used by 75e35fdd936d133bf8a48de140a3c666897588a05shiqian// the subclasses to implement the .Times() clause. 7632de5f53763125925e078498250f7e73a88de9edzhanyong.wanvoid ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) { 77e35fdd936d133bf8a48de140a3c666897588a05shiqian cardinality_specified_ = true; 7832de5f53763125925e078498250f7e73a88de9edzhanyong.wan cardinality_ = a_cardinality; 79e35fdd936d133bf8a48de140a3c666897588a05shiqian} 80e35fdd936d133bf8a48de140a3c666897588a05shiqian 81e35fdd936d133bf8a48de140a3c666897588a05shiqian// Retires all pre-requisites of this expectation. 82e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ExpectationBase::RetireAllPreRequisites() { 83e35fdd936d133bf8a48de140a3c666897588a05shiqian if (is_retired()) { 84e35fdd936d133bf8a48de140a3c666897588a05shiqian // We can take this short-cut as we never retire an expectation 85e35fdd936d133bf8a48de140a3c666897588a05shiqian // until we have retired all its pre-requisites. 86e35fdd936d133bf8a48de140a3c666897588a05shiqian return; 87e35fdd936d133bf8a48de140a3c666897588a05shiqian } 88e35fdd936d133bf8a48de140a3c666897588a05shiqian 8941b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 9041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan it != immediate_prerequisites_.end(); ++it) { 9141b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan ExpectationBase* const prerequisite = it->expectation_base().get(); 92e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!prerequisite->is_retired()) { 93e35fdd936d133bf8a48de140a3c666897588a05shiqian prerequisite->RetireAllPreRequisites(); 94e35fdd936d133bf8a48de140a3c666897588a05shiqian prerequisite->Retire(); 95e35fdd936d133bf8a48de140a3c666897588a05shiqian } 96e35fdd936d133bf8a48de140a3c666897588a05shiqian } 97e35fdd936d133bf8a48de140a3c666897588a05shiqian} 98e35fdd936d133bf8a48de140a3c666897588a05shiqian 99e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff all pre-requisites of this expectation have been 100e35fdd936d133bf8a48de140a3c666897588a05shiqian// satisfied. 101e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex 102e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ExpectationBase::AllPrerequisitesAreSatisfied() const { 103e35fdd936d133bf8a48de140a3c666897588a05shiqian g_gmock_mutex.AssertHeld(); 10441b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 105e35fdd936d133bf8a48de140a3c666897588a05shiqian it != immediate_prerequisites_.end(); ++it) { 10641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan if (!(it->expectation_base()->IsSatisfied()) || 10741b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan !(it->expectation_base()->AllPrerequisitesAreSatisfied())) 108e35fdd936d133bf8a48de140a3c666897588a05shiqian return false; 109e35fdd936d133bf8a48de140a3c666897588a05shiqian } 110e35fdd936d133bf8a48de140a3c666897588a05shiqian return true; 111e35fdd936d133bf8a48de140a3c666897588a05shiqian} 112e35fdd936d133bf8a48de140a3c666897588a05shiqian 113e35fdd936d133bf8a48de140a3c666897588a05shiqian// Adds unsatisfied pre-requisites of this expectation to 'result'. 114e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex 115e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ExpectationBase::FindUnsatisfiedPrerequisites( 11641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan ExpectationSet* result) const { 117e35fdd936d133bf8a48de140a3c666897588a05shiqian g_gmock_mutex.AssertHeld(); 11841b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 119e35fdd936d133bf8a48de140a3c666897588a05shiqian it != immediate_prerequisites_.end(); ++it) { 12041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan if (it->expectation_base()->IsSatisfied()) { 121e35fdd936d133bf8a48de140a3c666897588a05shiqian // If *it is satisfied and has a call count of 0, some of its 122e35fdd936d133bf8a48de140a3c666897588a05shiqian // pre-requisites may not be satisfied yet. 12341b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan if (it->expectation_base()->call_count_ == 0) { 12441b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan it->expectation_base()->FindUnsatisfiedPrerequisites(result); 125e35fdd936d133bf8a48de140a3c666897588a05shiqian } 126e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 127e35fdd936d133bf8a48de140a3c666897588a05shiqian // Now that we know *it is unsatisfied, we are not so interested 128e35fdd936d133bf8a48de140a3c666897588a05shiqian // in whether its pre-requisites are satisfied. Therefore we 129e35fdd936d133bf8a48de140a3c666897588a05shiqian // don't recursively call FindUnsatisfiedPrerequisites() here. 13041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan *result += *it; 131e35fdd936d133bf8a48de140a3c666897588a05shiqian } 132e35fdd936d133bf8a48de140a3c666897588a05shiqian } 133e35fdd936d133bf8a48de140a3c666897588a05shiqian} 134e35fdd936d133bf8a48de140a3c666897588a05shiqian 135e35fdd936d133bf8a48de140a3c666897588a05shiqian// Points to the implicit sequence introduced by a living InSequence 136e35fdd936d133bf8a48de140a3c666897588a05shiqian// object (if any) in the current thread or NULL. 137e35fdd936d133bf8a48de140a3c666897588a05shiqianThreadLocal<Sequence*> g_gmock_implicit_sequence; 138e35fdd936d133bf8a48de140a3c666897588a05shiqian 139e35fdd936d133bf8a48de140a3c666897588a05shiqian// Reports an uninteresting call (whose description is in msg) in the 140e35fdd936d133bf8a48de140a3c666897588a05shiqian// manner specified by 'reaction'. 141e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ReportUninterestingCall(CallReaction reaction, const string& msg) { 142e35fdd936d133bf8a48de140a3c666897588a05shiqian switch (reaction) { 143e35fdd936d133bf8a48de140a3c666897588a05shiqian case ALLOW: 1449413f2ff615ae1b933580576183d316c4cb6376czhanyong.wan Log(INFO, msg, 3); 145e35fdd936d133bf8a48de140a3c666897588a05shiqian break; 146e35fdd936d133bf8a48de140a3c666897588a05shiqian case WARN: 1479413f2ff615ae1b933580576183d316c4cb6376czhanyong.wan Log(WARNING, msg, 3); 148e35fdd936d133bf8a48de140a3c666897588a05shiqian break; 149e35fdd936d133bf8a48de140a3c666897588a05shiqian default: // FAIL 150e35fdd936d133bf8a48de140a3c666897588a05shiqian Expect(false, NULL, -1, msg); 151e35fdd936d133bf8a48de140a3c666897588a05shiqian } 152e35fdd936d133bf8a48de140a3c666897588a05shiqian} 153e35fdd936d133bf8a48de140a3c666897588a05shiqian 154e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace internal 155e35fdd936d133bf8a48de140a3c666897588a05shiqian 156e35fdd936d133bf8a48de140a3c666897588a05shiqian// Class Mock. 157e35fdd936d133bf8a48de140a3c666897588a05shiqian 158e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace { 159e35fdd936d133bf8a48de140a3c666897588a05shiqian 160e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers; 161e35fdd936d133bf8a48de140a3c666897588a05shiqian 162df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// The current state of a mock object. Such information is needed for 163df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// detecting leaked mock objects and explicitly verifying a mock's 164df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// expectations. 165df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanstruct MockObjectState { 166df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan MockObjectState() 167df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan : first_used_file(NULL), first_used_line(-1), leakable(false) {} 168df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 169df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // Where in the source file an ON_CALL or EXPECT_CALL is first 170df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // invoked on this mock object. 171df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan const char* first_used_file; 172df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan int first_used_line; 173e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan ::std::string first_used_test_case; 174e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan ::std::string first_used_test; 175df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan bool leakable; // true iff it's OK to leak the object. 176df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan FunctionMockers function_mockers; // All registered methods of the object. 177df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan}; 178df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 179df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// A global registry holding the state of all mock objects that are 180df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// alive. A mock object is added to this registry the first time 181df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it. It 182df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// is removed from the registry in the mock object's destructor. 183df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanclass MockObjectRegistry { 184df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan public: 185df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // Maps a mock object (identified by its address) to its state. 186df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan typedef std::map<const void*, MockObjectState> StateMap; 187df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 188df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // This destructor will be called when a program exits, after all 189df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // tests in it have been run. By then, there should be no mock 190df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // object alive. Therefore we report any living object as test 191df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // failure, unless the user explicitly asked us to ignore it. 192df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan ~MockObjectRegistry() { 1939571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan 1949571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is 1959571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan // a macro. 196df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 197df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (!GMOCK_FLAG(catch_leaked_mocks)) 198df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan return; 199df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 200df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan int leaked_count = 0; 201df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan for (StateMap::const_iterator it = states_.begin(); it != states_.end(); 202df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan ++it) { 203df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (it->second.leakable) // The user said it's fine to leak this object. 204df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan continue; 205df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 206df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // TODO(wan@google.com): Print the type of the leaked object. 207df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // This can help the user identify the leaked object. 2089571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout << "\n"; 209df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan const MockObjectState& state = it->second; 210f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan std::cout << internal::FormatFileLocation(state.first_used_file, 211f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan state.first_used_line); 2129571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout << " ERROR: this mock object"; 213e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan if (state.first_used_test != "") { 2149571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout << " (used in test " << state.first_used_test_case << "." 215e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan << state.first_used_test << ")"; 216e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan } 2179571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout << " should be deleted but never is. Its address is @" 218e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan << it->first << "."; 219df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan leaked_count++; 220df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan } 221df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (leaked_count > 0) { 2229571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout << "\nERROR: " << leaked_count 223df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan << " leaked mock " << (leaked_count == 1 ? "object" : "objects") 224df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan << " found at program exit.\n"; 2259571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan std::cout.flush(); 226df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan ::std::cerr.flush(); 227df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // RUN_ALL_TESTS() has already returned when this destructor is 228df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // called. Therefore we cannot use the normal Google Test 229df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // failure reporting mechanism. 230df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan _exit(1); // We cannot call exit() as it is not reentrant and 231df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan // may already have been called. 232df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan } 233df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan } 234df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 235df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan StateMap& states() { return states_; } 236df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan private: 237df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan StateMap states_; 238df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan}; 239df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 240df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Protected by g_gmock_mutex. 241e35fdd936d133bf8a48de140a3c666897588a05shiqianMockObjectRegistry g_mock_object_registry; 242e35fdd936d133bf8a48de140a3c666897588a05shiqian 243e35fdd936d133bf8a48de140a3c666897588a05shiqian// Maps a mock object to the reaction Google Mock should have when an 244e35fdd936d133bf8a48de140a3c666897588a05shiqian// uninteresting method is called. Protected by g_gmock_mutex. 245e35fdd936d133bf8a48de140a3c666897588a05shiqianstd::map<const void*, internal::CallReaction> g_uninteresting_call_reaction; 246e35fdd936d133bf8a48de140a3c666897588a05shiqian 247e35fdd936d133bf8a48de140a3c666897588a05shiqian// Sets the reaction Google Mock should have when an uninteresting 248e35fdd936d133bf8a48de140a3c666897588a05shiqian// method of the given mock object is called. 249e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 250e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid SetReactionOnUninterestingCalls(const void* mock_obj, 251e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::CallReaction reaction) { 252e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 253e35fdd936d133bf8a48de140a3c666897588a05shiqian g_uninteresting_call_reaction[mock_obj] = reaction; 254e35fdd936d133bf8a48de140a3c666897588a05shiqian} 255e35fdd936d133bf8a48de140a3c666897588a05shiqian 256e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace 257e35fdd936d133bf8a48de140a3c666897588a05shiqian 258e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to allow uninteresting calls on the given mock 259e35fdd936d133bf8a48de140a3c666897588a05shiqian// object. 260e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 261e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::AllowUninterestingCalls(const void* mock_obj) { 262e35fdd936d133bf8a48de140a3c666897588a05shiqian SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW); 263e35fdd936d133bf8a48de140a3c666897588a05shiqian} 264e35fdd936d133bf8a48de140a3c666897588a05shiqian 265e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to warn the user about uninteresting calls on the 266e35fdd936d133bf8a48de140a3c666897588a05shiqian// given mock object. 267e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 268e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::WarnUninterestingCalls(const void* mock_obj) { 269e35fdd936d133bf8a48de140a3c666897588a05shiqian SetReactionOnUninterestingCalls(mock_obj, internal::WARN); 270e35fdd936d133bf8a48de140a3c666897588a05shiqian} 271e35fdd936d133bf8a48de140a3c666897588a05shiqian 272e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to fail uninteresting calls on the given mock 273e35fdd936d133bf8a48de140a3c666897588a05shiqian// object. 274e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 275e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::FailUninterestingCalls(const void* mock_obj) { 276e35fdd936d133bf8a48de140a3c666897588a05shiqian SetReactionOnUninterestingCalls(mock_obj, internal::FAIL); 277e35fdd936d133bf8a48de140a3c666897588a05shiqian} 278e35fdd936d133bf8a48de140a3c666897588a05shiqian 279e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock the given mock object is being destroyed and its 280e35fdd936d133bf8a48de140a3c666897588a05shiqian// entry in the call-reaction table should be removed. 281e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 282e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::UnregisterCallReaction(const void* mock_obj) { 283e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 284e35fdd936d133bf8a48de140a3c666897588a05shiqian g_uninteresting_call_reaction.erase(mock_obj); 285e35fdd936d133bf8a48de140a3c666897588a05shiqian} 286e35fdd936d133bf8a48de140a3c666897588a05shiqian 287e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reaction Google Mock will have on uninteresting calls 288e35fdd936d133bf8a48de140a3c666897588a05shiqian// made on the given mock object. 289e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 290e35fdd936d133bf8a48de140a3c666897588a05shiqianinternal::CallReaction Mock::GetReactionOnUninterestingCalls( 291e35fdd936d133bf8a48de140a3c666897588a05shiqian const void* mock_obj) { 292e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 293e35fdd936d133bf8a48de140a3c666897588a05shiqian return (g_uninteresting_call_reaction.count(mock_obj) == 0) ? 294e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::WARN : g_uninteresting_call_reaction[mock_obj]; 295e35fdd936d133bf8a48de140a3c666897588a05shiqian} 296e35fdd936d133bf8a48de140a3c666897588a05shiqian 297df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Tells Google Mock to ignore mock_obj when checking for leaked mock 298df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// objects. 299df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// L < g_gmock_mutex 300df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanvoid Mock::AllowLeak(const void* mock_obj) { 301df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan internal::MutexLock l(&internal::g_gmock_mutex); 302df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states()[mock_obj].leakable = true; 303df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan} 304df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 305e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies and clears all expectations on the given mock object. If 306e35fdd936d133bf8a48de140a3c666897588a05shiqian// the expectations aren't satisfied, generates one or more Google 307e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test non-fatal failures and returns false. 308e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 309e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClearExpectations(void* mock_obj) { 310e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 311e35fdd936d133bf8a48de140a3c666897588a05shiqian return VerifyAndClearExpectationsLocked(mock_obj); 312e35fdd936d133bf8a48de140a3c666897588a05shiqian} 313e35fdd936d133bf8a48de140a3c666897588a05shiqian 314e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies all expectations on the given mock object and clears its 315e35fdd936d133bf8a48de140a3c666897588a05shiqian// default actions and expectations. Returns true iff the 316e35fdd936d133bf8a48de140a3c666897588a05shiqian// verification was successful. 317e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 318e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClear(void* mock_obj) { 319e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 320e35fdd936d133bf8a48de140a3c666897588a05shiqian ClearDefaultActionsLocked(mock_obj); 321e35fdd936d133bf8a48de140a3c666897588a05shiqian return VerifyAndClearExpectationsLocked(mock_obj); 322e35fdd936d133bf8a48de140a3c666897588a05shiqian} 323e35fdd936d133bf8a48de140a3c666897588a05shiqian 324e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies and clears all expectations on the given mock object. If 325e35fdd936d133bf8a48de140a3c666897588a05shiqian// the expectations aren't satisfied, generates one or more Google 326e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test non-fatal failures and returns false. 327e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex 328e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) { 329e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::g_gmock_mutex.AssertHeld(); 330df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (g_mock_object_registry.states().count(mock_obj) == 0) { 331e35fdd936d133bf8a48de140a3c666897588a05shiqian // No EXPECT_CALL() was set on the given mock object. 332e35fdd936d133bf8a48de140a3c666897588a05shiqian return true; 333e35fdd936d133bf8a48de140a3c666897588a05shiqian } 334e35fdd936d133bf8a48de140a3c666897588a05shiqian 335e35fdd936d133bf8a48de140a3c666897588a05shiqian // Verifies and clears the expectations on each mock method in the 336e35fdd936d133bf8a48de140a3c666897588a05shiqian // given mock object. 337e35fdd936d133bf8a48de140a3c666897588a05shiqian bool expectations_met = true; 338df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan FunctionMockers& mockers = 339df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states()[mock_obj].function_mockers; 340e35fdd936d133bf8a48de140a3c666897588a05shiqian for (FunctionMockers::const_iterator it = mockers.begin(); 341e35fdd936d133bf8a48de140a3c666897588a05shiqian it != mockers.end(); ++it) { 342e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!(*it)->VerifyAndClearExpectationsLocked()) { 343e35fdd936d133bf8a48de140a3c666897588a05shiqian expectations_met = false; 344e35fdd936d133bf8a48de140a3c666897588a05shiqian } 345e35fdd936d133bf8a48de140a3c666897588a05shiqian } 346e35fdd936d133bf8a48de140a3c666897588a05shiqian 347e35fdd936d133bf8a48de140a3c666897588a05shiqian // We don't clear the content of mockers, as they may still be 348e35fdd936d133bf8a48de140a3c666897588a05shiqian // needed by ClearDefaultActionsLocked(). 349e35fdd936d133bf8a48de140a3c666897588a05shiqian return expectations_met; 350e35fdd936d133bf8a48de140a3c666897588a05shiqian} 351e35fdd936d133bf8a48de140a3c666897588a05shiqian 352e35fdd936d133bf8a48de140a3c666897588a05shiqian// Registers a mock object and a mock method it owns. 353e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex 354e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::Register(const void* mock_obj, 355e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::UntypedFunctionMockerBase* mocker) { 356e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::MutexLock l(&internal::g_gmock_mutex); 357df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker); 358df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan} 359df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan 360df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Tells Google Mock where in the source code mock_obj is used in an 361df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this 362df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// information helps the user identify which object it is. 363df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// L < g_gmock_mutex 364df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanvoid Mock::RegisterUseByOnCallOrExpectCall( 365df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan const void* mock_obj, const char* file, int line) { 366df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan internal::MutexLock l(&internal::g_gmock_mutex); 367df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan MockObjectState& state = g_mock_object_registry.states()[mock_obj]; 368df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (state.first_used_file == NULL) { 369df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan state.first_used_file = file; 370df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan state.first_used_line = line; 371e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan const TestInfo* const test_info = 372e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan UnitTest::GetInstance()->current_test_info(); 373e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan if (test_info != NULL) { 374e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan // TODO(wan@google.com): record the test case name when the 375e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or 376e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan // TearDownTestCase(). 377e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan state.first_used_test_case = test_info->test_case_name(); 378e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan state.first_used_test = test_info->name(); 379e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan } 380df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan } 381e35fdd936d133bf8a48de140a3c666897588a05shiqian} 382e35fdd936d133bf8a48de140a3c666897588a05shiqian 383e35fdd936d133bf8a48de140a3c666897588a05shiqian// Unregisters a mock method; removes the owning mock object from the 384e35fdd936d133bf8a48de140a3c666897588a05shiqian// registry when the last mock method associated with it has been 385e35fdd936d133bf8a48de140a3c666897588a05shiqian// unregistered. This is called only in the destructor of 386e35fdd936d133bf8a48de140a3c666897588a05shiqian// FunctionMockerBase. 387e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex 388e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) { 389e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::g_gmock_mutex.AssertHeld(); 390df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan for (MockObjectRegistry::StateMap::iterator it = 391df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states().begin(); 392df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan it != g_mock_object_registry.states().end(); ++it) { 393df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan FunctionMockers& mockers = it->second.function_mockers; 394e35fdd936d133bf8a48de140a3c666897588a05shiqian if (mockers.erase(mocker) > 0) { 395e35fdd936d133bf8a48de140a3c666897588a05shiqian // mocker was in mockers and has been just removed. 396e35fdd936d133bf8a48de140a3c666897588a05shiqian if (mockers.empty()) { 397df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states().erase(it); 398e35fdd936d133bf8a48de140a3c666897588a05shiqian } 399e35fdd936d133bf8a48de140a3c666897588a05shiqian return; 400e35fdd936d133bf8a48de140a3c666897588a05shiqian } 401e35fdd936d133bf8a48de140a3c666897588a05shiqian } 402e35fdd936d133bf8a48de140a3c666897588a05shiqian} 403e35fdd936d133bf8a48de140a3c666897588a05shiqian 404e35fdd936d133bf8a48de140a3c666897588a05shiqian// Clears all ON_CALL()s set on the given mock object. 405e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex 406e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::ClearDefaultActionsLocked(void* mock_obj) { 407e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::g_gmock_mutex.AssertHeld(); 408e35fdd936d133bf8a48de140a3c666897588a05shiqian 409df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan if (g_mock_object_registry.states().count(mock_obj) == 0) { 410e35fdd936d133bf8a48de140a3c666897588a05shiqian // No ON_CALL() was set on the given mock object. 411e35fdd936d133bf8a48de140a3c666897588a05shiqian return; 412e35fdd936d133bf8a48de140a3c666897588a05shiqian } 413e35fdd936d133bf8a48de140a3c666897588a05shiqian 414e35fdd936d133bf8a48de140a3c666897588a05shiqian // Clears the default actions for each mock method in the given mock 415e35fdd936d133bf8a48de140a3c666897588a05shiqian // object. 416df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan FunctionMockers& mockers = 417df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan g_mock_object_registry.states()[mock_obj].function_mockers; 418e35fdd936d133bf8a48de140a3c666897588a05shiqian for (FunctionMockers::const_iterator it = mockers.begin(); 419e35fdd936d133bf8a48de140a3c666897588a05shiqian it != mockers.end(); ++it) { 420e35fdd936d133bf8a48de140a3c666897588a05shiqian (*it)->ClearDefaultActionsLocked(); 421e35fdd936d133bf8a48de140a3c666897588a05shiqian } 422e35fdd936d133bf8a48de140a3c666897588a05shiqian 423e35fdd936d133bf8a48de140a3c666897588a05shiqian // We don't clear the content of mockers, as they may still be 424e35fdd936d133bf8a48de140a3c666897588a05shiqian // needed by VerifyAndClearExpectationsLocked(). 425e35fdd936d133bf8a48de140a3c666897588a05shiqian} 426e35fdd936d133bf8a48de140a3c666897588a05shiqian 4277c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::Expectation() {} 4287c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan 4297c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::Expectation( 43032de5f53763125925e078498250f7e73a88de9edzhanyong.wan const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base) 43132de5f53763125925e078498250f7e73a88de9edzhanyong.wan : expectation_base_(an_expectation_base) {} 4327c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan 4337c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::~Expectation() {} 4347c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan 435e35fdd936d133bf8a48de140a3c666897588a05shiqian// Adds an expectation to a sequence. 43641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wanvoid Sequence::AddExpectation(const Expectation& expectation) const { 437e35fdd936d133bf8a48de140a3c666897588a05shiqian if (*last_expectation_ != expectation) { 43841b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan if (last_expectation_->expectation_base() != NULL) { 43941b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan expectation.expectation_base()->immediate_prerequisites_ 44041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan += *last_expectation_; 441e35fdd936d133bf8a48de140a3c666897588a05shiqian } 442e35fdd936d133bf8a48de140a3c666897588a05shiqian *last_expectation_ = expectation; 443e35fdd936d133bf8a48de140a3c666897588a05shiqian } 444e35fdd936d133bf8a48de140a3c666897588a05shiqian} 445e35fdd936d133bf8a48de140a3c666897588a05shiqian 446e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates the implicit sequence if there isn't one. 447e35fdd936d133bf8a48de140a3c666897588a05shiqianInSequence::InSequence() { 448e35fdd936d133bf8a48de140a3c666897588a05shiqian if (internal::g_gmock_implicit_sequence.get() == NULL) { 449e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::g_gmock_implicit_sequence.set(new Sequence); 450e35fdd936d133bf8a48de140a3c666897588a05shiqian sequence_created_ = true; 451e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 452e35fdd936d133bf8a48de140a3c666897588a05shiqian sequence_created_ = false; 453e35fdd936d133bf8a48de140a3c666897588a05shiqian } 454e35fdd936d133bf8a48de140a3c666897588a05shiqian} 455e35fdd936d133bf8a48de140a3c666897588a05shiqian 456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Deletes the implicit sequence if it was created by the constructor 457e35fdd936d133bf8a48de140a3c666897588a05shiqian// of this object. 458e35fdd936d133bf8a48de140a3c666897588a05shiqianInSequence::~InSequence() { 459e35fdd936d133bf8a48de140a3c666897588a05shiqian if (sequence_created_) { 460e35fdd936d133bf8a48de140a3c666897588a05shiqian delete internal::g_gmock_implicit_sequence.get(); 461e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::g_gmock_implicit_sequence.set(NULL); 462e35fdd936d133bf8a48de140a3c666897588a05shiqian } 463e35fdd936d133bf8a48de140a3c666897588a05shiqian} 464e35fdd936d133bf8a48de140a3c666897588a05shiqian 465e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 466