47 #if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
62 ::std::ostringstream
s;
63 s << file <<
":" << line <<
": " << message << ::std::endl;
64 Log(severity, s.str(), 0);
70 const string& a_source_text)
73 source_text_(a_source_text),
74 cardinality_specified_(
false),
78 extra_matcher_specified_(
false),
79 repeated_action_specified_(
false),
80 retires_on_saturation_(
false),
82 action_count_checked_(
false) {}
117 g_gmock_mutex.AssertHeld();
120 if (!(
it->expectation_base()->IsSatisfied()) ||
121 !(
it->expectation_base()->AllPrerequisitesAreSatisfied()))
130 g_gmock_mutex.AssertHeld();
132 it != immediate_prerequisites_.end(); ++
it) {
133 if (
it->expectation_base()->IsSatisfied()) {
136 if (
it->expectation_base()->call_count_ == 0) {
137 it->expectation_base()->FindUnsatisfiedPrerequisites(result);
152 g_gmock_mutex.AssertHeld();
155 *
os <<
" Expected: to be ";
156 cardinality().DescribeTo(
os);
157 *
os <<
"\n Actual: ";
162 *
os <<
" - " << (IsOverSaturated() ?
"over-saturated" :
163 IsSaturated() ?
"saturated" :
164 IsSatisfied() ?
"satisfied" :
"unsatisfied")
166 << (is_retired() ?
"retired" :
"active");
175 bool should_check =
false;
197 if (action_count > upper_bound ||
200 }
else if (0 < action_count && action_count < lower_bound &&
207 ::std::stringstream ss;
209 ss <<
"Too " << (too_many ?
"many" :
"few")
210 <<
" actions specified in " <<
source_text() <<
"...\n"
211 <<
"Expected to be ";
213 ss <<
", but has " << (too_many ?
"" :
"only ")
214 << action_count <<
" WillOnce()"
215 << (action_count == 1 ?
"" :
"s");
217 ss <<
" and a WillRepeatedly()";
228 ".Times() cannot appear "
229 "more than once in an EXPECT_CALL().");
232 ".Times() cannot appear after "
233 ".InSequence(), .WillOnce(), .WillRepeatedly(), "
234 "or .RetiresOnSaturation().");
249 const int stack_frames_to_skip =
253 Log(
kInfo, msg, stack_frames_to_skip);
258 "\nNOTE: You can safely ignore the above warning unless this "
259 "call should not happen. Do not suppress it by blindly adding "
260 "an EXPECT_CALL() if you don't mean to enforce the call. "
261 "See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#"
262 "knowing-when-to-expect for details.\n",
263 stack_frames_to_skip);
266 Expect(
false, NULL, -1, msg);
271 : mock_obj_(NULL),
name_(
"") {}
283 mock_obj_ = mock_obj;
285 Mock::Register(mock_obj,
this);
297 mock_obj_ = mock_obj;
305 const void* mock_obj;
311 "MockObject() must not be called before RegisterOwner() or "
312 "SetOwnerAndName() has been called.");
328 "Name() must not be called before SetOwnerAndName() has "
341 if (untyped_expectations_.size() == 0) {
350 Mock::GetReactionOnUninterestingCalls(MockObject());
355 const bool need_to_report_uninteresting_call =
366 if (!need_to_report_uninteresting_call) {
368 return this->UntypedPerformDefaultAction(untyped_args,
"");
372 ::std::stringstream ss;
373 this->UntypedDescribeUninterestingCall(untyped_args, &ss);
377 this->UntypedPerformDefaultAction(untyped_args, ss.str());
387 bool is_excessive =
false;
388 ::std::stringstream ss;
389 ::std::stringstream why;
390 ::std::stringstream
loc;
391 const void* untyped_action = NULL;
396 this->UntypedFindMatchingExpectation(
397 untyped_args, &untyped_action, &is_excessive,
399 const bool found = untyped_expectation != NULL;
404 const bool need_to_report_call =
406 if (!need_to_report_call) {
409 untyped_action == NULL ?
410 this->UntypedPerformDefaultAction(untyped_args,
"") :
411 this->UntypedPerformAction(untyped_action, untyped_args);
414 ss <<
" Function call: " << Name();
415 this->UntypedPrintArgs(untyped_args, &ss);
419 if (found && !is_excessive) {
424 untyped_action == NULL ?
425 this->UntypedPerformDefaultAction(untyped_args, ss.str()) :
426 this->UntypedPerformAction(untyped_action, untyped_args);
429 ss <<
"\n" << why.str();
433 Expect(
false, NULL, -1, ss.str());
434 }
else if (is_excessive) {
437 untyped_expectation->
line(), ss.str());
441 Log(
kInfo, loc.str() + ss.str(), 2);
450 for (UntypedExpectations::const_iterator
it =
453 if (
it->get() == exp) {
458 Assert(
false, __FILE__, __LINE__,
"Cannot find expectation.");
469 g_gmock_mutex.AssertHeld();
470 bool expectations_met =
true;
471 for (UntypedExpectations::const_iterator
it =
479 expectations_met =
false;
481 expectations_met =
false;
482 ::std::stringstream ss;
483 ss <<
"Actual function call count doesn't match "
491 untyped_expectation->
line(), ss.str());
505 g_gmock_mutex.Unlock();
506 expectations_to_delete.clear();
507 g_gmock_mutex.Lock();
509 return expectations_met;
518 typedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;
523 struct MockObjectState {
541 class MockObjectRegistry {
544 typedef std::map<const void*, MockObjectState> StateMap;
550 ~MockObjectRegistry() {
557 int leaked_count = 0;
560 if (
it->second.leakable)
566 const MockObjectState&
state =
it->second;
568 state.first_used_line);
569 std::cout <<
" ERROR: this mock object";
570 if (state.first_used_test !=
"") {
571 std::cout <<
" (used in test " << state.first_used_test_case <<
"."
572 << state.first_used_test <<
")";
574 std::cout <<
" should be deleted but never is. Its address is @"
578 if (leaked_count > 0) {
579 std::cout <<
"\nERROR: " << leaked_count
580 <<
" leaked mock " << (leaked_count == 1 ?
"object" :
"objects")
581 <<
" found at program exit.\n";
592 StateMap& states() {
return states_; }
599 MockObjectRegistry g_mock_object_registry;
603 std::map<const void*, internal::CallReaction> g_uninteresting_call_reaction;
607 void SetReactionOnUninterestingCalls(
const void* mock_obj,
611 g_uninteresting_call_reaction[mock_obj] = reaction;
618 void Mock::AllowUninterestingCalls(
const void* mock_obj)
625 void Mock::WarnUninterestingCalls(
const void* mock_obj)
632 void Mock::FailUninterestingCalls(
const void* mock_obj)
639 void Mock::UnregisterCallReaction(
const void* mock_obj)
642 g_uninteresting_call_reaction.erase(mock_obj);
648 const void* mock_obj)
651 return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?
657 void Mock::AllowLeak(
const void* mock_obj)
660 g_mock_object_registry.states()[mock_obj].leakable =
true;
666 bool Mock::VerifyAndClearExpectations(
void* mock_obj)
669 return VerifyAndClearExpectationsLocked(mock_obj);
675 bool Mock::VerifyAndClear(
void* mock_obj)
678 ClearDefaultActionsLocked(mock_obj);
679 return VerifyAndClearExpectationsLocked(mock_obj);
685 bool Mock::VerifyAndClearExpectationsLocked(
void* mock_obj)
687 internal::g_gmock_mutex.AssertHeld();
688 if (g_mock_object_registry.states().count(mock_obj) == 0) {
695 bool expectations_met =
true;
696 FunctionMockers& mockers =
697 g_mock_object_registry.states()[mock_obj].function_mockers;
698 for (FunctionMockers::const_iterator
it = mockers.begin();
699 it != mockers.end(); ++
it) {
700 if (!(*it)->VerifyAndClearExpectationsLocked()) {
701 expectations_met =
false;
707 return expectations_met;
711 void Mock::Register(
const void* mock_obj,
712 internal::UntypedFunctionMockerBase* mocker)
715 g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);
721 void Mock::RegisterUseByOnCallOrExpectCall(
const void* mock_obj,
725 MockObjectState&
state = g_mock_object_registry.states()[mock_obj];
726 if (state.first_used_file == NULL) {
727 state.first_used_file =
file;
728 state.first_used_line =
line;
729 const TestInfo*
const test_info =
731 if (test_info != NULL) {
735 state.first_used_test_case = test_info->test_case_name();
736 state.first_used_test = test_info->name();
745 void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
747 internal::g_gmock_mutex.AssertHeld();
748 for (MockObjectRegistry::StateMap::iterator
it =
749 g_mock_object_registry.states().begin();
750 it != g_mock_object_registry.states().end(); ++
it) {
751 FunctionMockers& mockers =
it->second.function_mockers;
752 if (mockers.erase(mocker) > 0) {
754 if (mockers.empty()) {
755 g_mock_object_registry.states().erase(
it);
763 void Mock::ClearDefaultActionsLocked(
void* mock_obj)
765 internal::g_gmock_mutex.AssertHeld();
767 if (g_mock_object_registry.states().count(mock_obj) == 0) {
774 FunctionMockers& mockers =
775 g_mock_object_registry.states()[mock_obj].function_mockers;
776 for (FunctionMockers::const_iterator
it = mockers.begin();
777 it != mockers.end(); ++
it) {
778 (*it)->ClearDefaultActionsLocked();
789 : expectation_base_(an_expectation_base) {}