|
1 // Copyright 2007, Google Inc. |
|
2 // All rights reserved. |
|
3 // |
|
4 // Redistribution and use in source and binary forms, with or without |
|
5 // modification, are permitted provided that the following conditions are |
|
6 // met: |
|
7 // |
|
8 // * Redistributions of source code must retain the above copyright |
|
9 // notice, this list of conditions and the following disclaimer. |
|
10 // * Redistributions in binary form must reproduce the above |
|
11 // copyright notice, this list of conditions and the following disclaimer |
|
12 // in the documentation and/or other materials provided with the |
|
13 // distribution. |
|
14 // * Neither the name of Google Inc. nor the names of its |
|
15 // contributors may be used to endorse or promote products derived from |
|
16 // this software without specific prior written permission. |
|
17 // |
|
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
29 // |
|
30 // Author: wan@google.com (Zhanyong Wan) |
|
31 |
|
32 // Google Mock - a framework for writing C++ mock classes. |
|
33 // |
|
34 // This file implements the spec builder syntax (ON_CALL and |
|
35 // EXPECT_CALL). |
|
36 |
|
37 #include "gmock/gmock-spec-builders.h" |
|
38 |
|
39 #include <stdlib.h> |
|
40 #include <iostream> // NOLINT |
|
41 #include <map> |
|
42 #include <set> |
|
43 #include <string> |
|
44 #include "gmock/gmock.h" |
|
45 #include "gtest/gtest.h" |
|
46 |
|
47 #if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC |
|
48 # include <unistd.h> // NOLINT |
|
49 #endif |
|
50 |
|
51 namespace testing { |
|
52 namespace internal { |
|
53 |
|
54 // Protects the mock object registry (in class Mock), all function |
|
55 // mockers, and all expectations. |
|
56 GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex); |
|
57 |
|
58 // Logs a message including file and line number information. |
|
59 void LogWithLocation(testing::internal::LogSeverity severity, |
|
60 const char* file, int line, |
|
61 const string& message) { |
|
62 ::std::ostringstream s; |
|
63 s << file << ":" << line << ": " << message << ::std::endl; |
|
64 Log(severity, s.str(), 0); |
|
65 } |
|
66 |
|
67 // Constructs an ExpectationBase object. |
|
68 ExpectationBase::ExpectationBase(const char* a_file, |
|
69 int a_line, |
|
70 const string& a_source_text) |
|
71 : file_(a_file), |
|
72 line_(a_line), |
|
73 source_text_(a_source_text), |
|
74 cardinality_specified_(false), |
|
75 cardinality_(Exactly(1)), |
|
76 call_count_(0), |
|
77 retired_(false), |
|
78 extra_matcher_specified_(false), |
|
79 repeated_action_specified_(false), |
|
80 retires_on_saturation_(false), |
|
81 last_clause_(kNone), |
|
82 action_count_checked_(false) {} |
|
83 |
|
84 // Destructs an ExpectationBase object. |
|
85 ExpectationBase::~ExpectationBase() {} |
|
86 |
|
87 // Explicitly specifies the cardinality of this expectation. Used by |
|
88 // the subclasses to implement the .Times() clause. |
|
89 void ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) { |
|
90 cardinality_specified_ = true; |
|
91 cardinality_ = a_cardinality; |
|
92 } |
|
93 |
|
94 // Retires all pre-requisites of this expectation. |
|
95 void ExpectationBase::RetireAllPreRequisites() { |
|
96 if (is_retired()) { |
|
97 // We can take this short-cut as we never retire an expectation |
|
98 // until we have retired all its pre-requisites. |
|
99 return; |
|
100 } |
|
101 |
|
102 for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); |
|
103 it != immediate_prerequisites_.end(); ++it) { |
|
104 ExpectationBase* const prerequisite = it->expectation_base().get(); |
|
105 if (!prerequisite->is_retired()) { |
|
106 prerequisite->RetireAllPreRequisites(); |
|
107 prerequisite->Retire(); |
|
108 } |
|
109 } |
|
110 } |
|
111 |
|
112 // Returns true iff all pre-requisites of this expectation have been |
|
113 // satisfied. |
|
114 // L >= g_gmock_mutex |
|
115 bool ExpectationBase::AllPrerequisitesAreSatisfied() const { |
|
116 g_gmock_mutex.AssertHeld(); |
|
117 for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); |
|
118 it != immediate_prerequisites_.end(); ++it) { |
|
119 if (!(it->expectation_base()->IsSatisfied()) || |
|
120 !(it->expectation_base()->AllPrerequisitesAreSatisfied())) |
|
121 return false; |
|
122 } |
|
123 return true; |
|
124 } |
|
125 |
|
126 // Adds unsatisfied pre-requisites of this expectation to 'result'. |
|
127 // L >= g_gmock_mutex |
|
128 void ExpectationBase::FindUnsatisfiedPrerequisites( |
|
129 ExpectationSet* result) const { |
|
130 g_gmock_mutex.AssertHeld(); |
|
131 for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); |
|
132 it != immediate_prerequisites_.end(); ++it) { |
|
133 if (it->expectation_base()->IsSatisfied()) { |
|
134 // If *it is satisfied and has a call count of 0, some of its |
|
135 // pre-requisites may not be satisfied yet. |
|
136 if (it->expectation_base()->call_count_ == 0) { |
|
137 it->expectation_base()->FindUnsatisfiedPrerequisites(result); |
|
138 } |
|
139 } else { |
|
140 // Now that we know *it is unsatisfied, we are not so interested |
|
141 // in whether its pre-requisites are satisfied. Therefore we |
|
142 // don't recursively call FindUnsatisfiedPrerequisites() here. |
|
143 *result += *it; |
|
144 } |
|
145 } |
|
146 } |
|
147 |
|
148 // Describes how many times a function call matching this |
|
149 // expectation has occurred. |
|
150 // L >= g_gmock_mutex |
|
151 void ExpectationBase::DescribeCallCountTo(::std::ostream* os) const { |
|
152 g_gmock_mutex.AssertHeld(); |
|
153 |
|
154 // Describes how many times the function is expected to be called. |
|
155 *os << " Expected: to be "; |
|
156 cardinality().DescribeTo(os); |
|
157 *os << "\n Actual: "; |
|
158 Cardinality::DescribeActualCallCountTo(call_count(), os); |
|
159 |
|
160 // Describes the state of the expectation (e.g. is it satisfied? |
|
161 // is it active?). |
|
162 *os << " - " << (IsOverSaturated() ? "over-saturated" : |
|
163 IsSaturated() ? "saturated" : |
|
164 IsSatisfied() ? "satisfied" : "unsatisfied") |
|
165 << " and " |
|
166 << (is_retired() ? "retired" : "active"); |
|
167 } |
|
168 |
|
169 // Checks the action count (i.e. the number of WillOnce() and |
|
170 // WillRepeatedly() clauses) against the cardinality if this hasn't |
|
171 // been done before. Prints a warning if there are too many or too |
|
172 // few actions. |
|
173 // L < mutex_ |
|
174 void ExpectationBase::CheckActionCountIfNotDone() const { |
|
175 bool should_check = false; |
|
176 { |
|
177 MutexLock l(&mutex_); |
|
178 if (!action_count_checked_) { |
|
179 action_count_checked_ = true; |
|
180 should_check = true; |
|
181 } |
|
182 } |
|
183 |
|
184 if (should_check) { |
|
185 if (!cardinality_specified_) { |
|
186 // The cardinality was inferred - no need to check the action |
|
187 // count against it. |
|
188 return; |
|
189 } |
|
190 |
|
191 // The cardinality was explicitly specified. |
|
192 const int action_count = static_cast<int>(untyped_actions_.size()); |
|
193 const int upper_bound = cardinality().ConservativeUpperBound(); |
|
194 const int lower_bound = cardinality().ConservativeLowerBound(); |
|
195 bool too_many; // True if there are too many actions, or false |
|
196 // if there are too few. |
|
197 if (action_count > upper_bound || |
|
198 (action_count == upper_bound && repeated_action_specified_)) { |
|
199 too_many = true; |
|
200 } else if (0 < action_count && action_count < lower_bound && |
|
201 !repeated_action_specified_) { |
|
202 too_many = false; |
|
203 } else { |
|
204 return; |
|
205 } |
|
206 |
|
207 ::std::stringstream ss; |
|
208 DescribeLocationTo(&ss); |
|
209 ss << "Too " << (too_many ? "many" : "few") |
|
210 << " actions specified in " << source_text() << "...\n" |
|
211 << "Expected to be "; |
|
212 cardinality().DescribeTo(&ss); |
|
213 ss << ", but has " << (too_many ? "" : "only ") |
|
214 << action_count << " WillOnce()" |
|
215 << (action_count == 1 ? "" : "s"); |
|
216 if (repeated_action_specified_) { |
|
217 ss << " and a WillRepeatedly()"; |
|
218 } |
|
219 ss << "."; |
|
220 Log(WARNING, ss.str(), -1); // -1 means "don't print stack trace". |
|
221 } |
|
222 } |
|
223 |
|
224 // Implements the .Times() clause. |
|
225 void ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) { |
|
226 if (last_clause_ == kTimes) { |
|
227 ExpectSpecProperty(false, |
|
228 ".Times() cannot appear " |
|
229 "more than once in an EXPECT_CALL()."); |
|
230 } else { |
|
231 ExpectSpecProperty(last_clause_ < kTimes, |
|
232 ".Times() cannot appear after " |
|
233 ".InSequence(), .WillOnce(), .WillRepeatedly(), " |
|
234 "or .RetiresOnSaturation()."); |
|
235 } |
|
236 last_clause_ = kTimes; |
|
237 |
|
238 SpecifyCardinality(a_cardinality); |
|
239 } |
|
240 |
|
241 // Points to the implicit sequence introduced by a living InSequence |
|
242 // object (if any) in the current thread or NULL. |
|
243 ThreadLocal<Sequence*> g_gmock_implicit_sequence; |
|
244 |
|
245 // Reports an uninteresting call (whose description is in msg) in the |
|
246 // manner specified by 'reaction'. |
|
247 void ReportUninterestingCall(CallReaction reaction, const string& msg) { |
|
248 switch (reaction) { |
|
249 case ALLOW: |
|
250 Log(INFO, msg, 3); |
|
251 break; |
|
252 case WARN: |
|
253 Log(WARNING, msg, 3); |
|
254 break; |
|
255 default: // FAIL |
|
256 Expect(false, NULL, -1, msg); |
|
257 } |
|
258 } |
|
259 |
|
260 UntypedFunctionMockerBase::UntypedFunctionMockerBase() |
|
261 : mock_obj_(NULL), name_("") {} |
|
262 |
|
263 UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {} |
|
264 |
|
265 // Sets the mock object this mock method belongs to, and registers |
|
266 // this information in the global mock registry. Will be called |
|
267 // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock |
|
268 // method. |
|
269 // L < g_gmock_mutex |
|
270 void UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj) { |
|
271 { |
|
272 MutexLock l(&g_gmock_mutex); |
|
273 mock_obj_ = mock_obj; |
|
274 } |
|
275 Mock::Register(mock_obj, this); |
|
276 } |
|
277 |
|
278 // Sets the mock object this mock method belongs to, and sets the name |
|
279 // of the mock function. Will be called upon each invocation of this |
|
280 // mock function. |
|
281 // L < g_gmock_mutex |
|
282 void UntypedFunctionMockerBase::SetOwnerAndName( |
|
283 const void* mock_obj, const char* name) { |
|
284 // We protect name_ under g_gmock_mutex in case this mock function |
|
285 // is called from two threads concurrently. |
|
286 MutexLock l(&g_gmock_mutex); |
|
287 mock_obj_ = mock_obj; |
|
288 name_ = name; |
|
289 } |
|
290 |
|
291 // Returns the name of the function being mocked. Must be called |
|
292 // after RegisterOwner() or SetOwnerAndName() has been called. |
|
293 // L < g_gmock_mutex |
|
294 const void* UntypedFunctionMockerBase::MockObject() const { |
|
295 const void* mock_obj; |
|
296 { |
|
297 // We protect mock_obj_ under g_gmock_mutex in case this mock |
|
298 // function is called from two threads concurrently. |
|
299 MutexLock l(&g_gmock_mutex); |
|
300 Assert(mock_obj_ != NULL, __FILE__, __LINE__, |
|
301 "MockObject() must not be called before RegisterOwner() or " |
|
302 "SetOwnerAndName() has been called."); |
|
303 mock_obj = mock_obj_; |
|
304 } |
|
305 return mock_obj; |
|
306 } |
|
307 |
|
308 // Returns the name of this mock method. Must be called after |
|
309 // SetOwnerAndName() has been called. |
|
310 // L < g_gmock_mutex |
|
311 const char* UntypedFunctionMockerBase::Name() const { |
|
312 const char* name; |
|
313 { |
|
314 // We protect name_ under g_gmock_mutex in case this mock |
|
315 // function is called from two threads concurrently. |
|
316 MutexLock l(&g_gmock_mutex); |
|
317 Assert(name_ != NULL, __FILE__, __LINE__, |
|
318 "Name() must not be called before SetOwnerAndName() has " |
|
319 "been called."); |
|
320 name = name_; |
|
321 } |
|
322 return name; |
|
323 } |
|
324 |
|
325 // Calculates the result of invoking this mock function with the given |
|
326 // arguments, prints it, and returns it. The caller is responsible |
|
327 // for deleting the result. |
|
328 // L < g_gmock_mutex |
|
329 const UntypedActionResultHolderBase* |
|
330 UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args) { |
|
331 if (untyped_expectations_.size() == 0) { |
|
332 // No expectation is set on this mock method - we have an |
|
333 // uninteresting call. |
|
334 |
|
335 // We must get Google Mock's reaction on uninteresting calls |
|
336 // made on this mock object BEFORE performing the action, |
|
337 // because the action may DELETE the mock object and make the |
|
338 // following expression meaningless. |
|
339 const CallReaction reaction = |
|
340 Mock::GetReactionOnUninterestingCalls(MockObject()); |
|
341 |
|
342 // True iff we need to print this call's arguments and return |
|
343 // value. This definition must be kept in sync with |
|
344 // the behavior of ReportUninterestingCall(). |
|
345 const bool need_to_report_uninteresting_call = |
|
346 // If the user allows this uninteresting call, we print it |
|
347 // only when he wants informational messages. |
|
348 reaction == ALLOW ? LogIsVisible(INFO) : |
|
349 // If the user wants this to be a warning, we print it only |
|
350 // when he wants to see warnings. |
|
351 reaction == WARN ? LogIsVisible(WARNING) : |
|
352 // Otherwise, the user wants this to be an error, and we |
|
353 // should always print detailed information in the error. |
|
354 true; |
|
355 |
|
356 if (!need_to_report_uninteresting_call) { |
|
357 // Perform the action without printing the call information. |
|
358 return this->UntypedPerformDefaultAction(untyped_args, ""); |
|
359 } |
|
360 |
|
361 // Warns about the uninteresting call. |
|
362 ::std::stringstream ss; |
|
363 this->UntypedDescribeUninterestingCall(untyped_args, &ss); |
|
364 |
|
365 // Calculates the function result. |
|
366 const UntypedActionResultHolderBase* const result = |
|
367 this->UntypedPerformDefaultAction(untyped_args, ss.str()); |
|
368 |
|
369 // Prints the function result. |
|
370 if (result != NULL) |
|
371 result->PrintAsActionResult(&ss); |
|
372 |
|
373 ReportUninterestingCall(reaction, ss.str()); |
|
374 return result; |
|
375 } |
|
376 |
|
377 bool is_excessive = false; |
|
378 ::std::stringstream ss; |
|
379 ::std::stringstream why; |
|
380 ::std::stringstream loc; |
|
381 const void* untyped_action = NULL; |
|
382 |
|
383 // The UntypedFindMatchingExpectation() function acquires and |
|
384 // releases g_gmock_mutex. |
|
385 const ExpectationBase* const untyped_expectation = |
|
386 this->UntypedFindMatchingExpectation( |
|
387 untyped_args, &untyped_action, &is_excessive, |
|
388 &ss, &why); |
|
389 const bool found = untyped_expectation != NULL; |
|
390 |
|
391 // True iff we need to print the call's arguments and return value. |
|
392 // This definition must be kept in sync with the uses of Expect() |
|
393 // and Log() in this function. |
|
394 const bool need_to_report_call = !found || is_excessive || LogIsVisible(INFO); |
|
395 if (!need_to_report_call) { |
|
396 // Perform the action without printing the call information. |
|
397 return |
|
398 untyped_action == NULL ? |
|
399 this->UntypedPerformDefaultAction(untyped_args, "") : |
|
400 this->UntypedPerformAction(untyped_action, untyped_args); |
|
401 } |
|
402 |
|
403 ss << " Function call: " << Name(); |
|
404 this->UntypedPrintArgs(untyped_args, &ss); |
|
405 |
|
406 // In case the action deletes a piece of the expectation, we |
|
407 // generate the message beforehand. |
|
408 if (found && !is_excessive) { |
|
409 untyped_expectation->DescribeLocationTo(&loc); |
|
410 } |
|
411 |
|
412 const UntypedActionResultHolderBase* const result = |
|
413 untyped_action == NULL ? |
|
414 this->UntypedPerformDefaultAction(untyped_args, ss.str()) : |
|
415 this->UntypedPerformAction(untyped_action, untyped_args); |
|
416 if (result != NULL) |
|
417 result->PrintAsActionResult(&ss); |
|
418 ss << "\n" << why.str(); |
|
419 |
|
420 if (!found) { |
|
421 // No expectation matches this call - reports a failure. |
|
422 Expect(false, NULL, -1, ss.str()); |
|
423 } else if (is_excessive) { |
|
424 // We had an upper-bound violation and the failure message is in ss. |
|
425 Expect(false, untyped_expectation->file(), |
|
426 untyped_expectation->line(), ss.str()); |
|
427 } else { |
|
428 // We had an expected call and the matching expectation is |
|
429 // described in ss. |
|
430 Log(INFO, loc.str() + ss.str(), 2); |
|
431 } |
|
432 |
|
433 return result; |
|
434 } |
|
435 |
|
436 // Returns an Expectation object that references and co-owns exp, |
|
437 // which must be an expectation on this mock function. |
|
438 Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) { |
|
439 for (UntypedExpectations::const_iterator it = |
|
440 untyped_expectations_.begin(); |
|
441 it != untyped_expectations_.end(); ++it) { |
|
442 if (it->get() == exp) { |
|
443 return Expectation(*it); |
|
444 } |
|
445 } |
|
446 |
|
447 Assert(false, __FILE__, __LINE__, "Cannot find expectation."); |
|
448 return Expectation(); |
|
449 // The above statement is just to make the code compile, and will |
|
450 // never be executed. |
|
451 } |
|
452 |
|
453 // Verifies that all expectations on this mock function have been |
|
454 // satisfied. Reports one or more Google Test non-fatal failures |
|
455 // and returns false if not. |
|
456 // L >= g_gmock_mutex |
|
457 bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked() { |
|
458 g_gmock_mutex.AssertHeld(); |
|
459 bool expectations_met = true; |
|
460 for (UntypedExpectations::const_iterator it = |
|
461 untyped_expectations_.begin(); |
|
462 it != untyped_expectations_.end(); ++it) { |
|
463 ExpectationBase* const untyped_expectation = it->get(); |
|
464 if (untyped_expectation->IsOverSaturated()) { |
|
465 // There was an upper-bound violation. Since the error was |
|
466 // already reported when it occurred, there is no need to do |
|
467 // anything here. |
|
468 expectations_met = false; |
|
469 } else if (!untyped_expectation->IsSatisfied()) { |
|
470 expectations_met = false; |
|
471 ::std::stringstream ss; |
|
472 ss << "Actual function call count doesn't match " |
|
473 << untyped_expectation->source_text() << "...\n"; |
|
474 // No need to show the source file location of the expectation |
|
475 // in the description, as the Expect() call that follows already |
|
476 // takes care of it. |
|
477 untyped_expectation->MaybeDescribeExtraMatcherTo(&ss); |
|
478 untyped_expectation->DescribeCallCountTo(&ss); |
|
479 Expect(false, untyped_expectation->file(), |
|
480 untyped_expectation->line(), ss.str()); |
|
481 } |
|
482 } |
|
483 untyped_expectations_.clear(); |
|
484 return expectations_met; |
|
485 } |
|
486 |
|
487 } // namespace internal |
|
488 |
|
489 // Class Mock. |
|
490 |
|
491 namespace { |
|
492 |
|
493 typedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers; |
|
494 |
|
495 // The current state of a mock object. Such information is needed for |
|
496 // detecting leaked mock objects and explicitly verifying a mock's |
|
497 // expectations. |
|
498 struct MockObjectState { |
|
499 MockObjectState() |
|
500 : first_used_file(NULL), first_used_line(-1), leakable(false) {} |
|
501 |
|
502 // Where in the source file an ON_CALL or EXPECT_CALL is first |
|
503 // invoked on this mock object. |
|
504 const char* first_used_file; |
|
505 int first_used_line; |
|
506 ::std::string first_used_test_case; |
|
507 ::std::string first_used_test; |
|
508 bool leakable; // true iff it's OK to leak the object. |
|
509 FunctionMockers function_mockers; // All registered methods of the object. |
|
510 }; |
|
511 |
|
512 // A global registry holding the state of all mock objects that are |
|
513 // alive. A mock object is added to this registry the first time |
|
514 // Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it. It |
|
515 // is removed from the registry in the mock object's destructor. |
|
516 class MockObjectRegistry { |
|
517 public: |
|
518 // Maps a mock object (identified by its address) to its state. |
|
519 typedef std::map<const void*, MockObjectState> StateMap; |
|
520 |
|
521 // This destructor will be called when a program exits, after all |
|
522 // tests in it have been run. By then, there should be no mock |
|
523 // object alive. Therefore we report any living object as test |
|
524 // failure, unless the user explicitly asked us to ignore it. |
|
525 ~MockObjectRegistry() { |
|
526 // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is |
|
527 // a macro. |
|
528 |
|
529 if (!GMOCK_FLAG(catch_leaked_mocks)) |
|
530 return; |
|
531 |
|
532 int leaked_count = 0; |
|
533 for (StateMap::const_iterator it = states_.begin(); it != states_.end(); |
|
534 ++it) { |
|
535 if (it->second.leakable) // The user said it's fine to leak this object. |
|
536 continue; |
|
537 |
|
538 // TODO(wan@google.com): Print the type of the leaked object. |
|
539 // This can help the user identify the leaked object. |
|
540 std::cout << "\n"; |
|
541 const MockObjectState& state = it->second; |
|
542 std::cout << internal::FormatFileLocation(state.first_used_file, |
|
543 state.first_used_line); |
|
544 std::cout << " ERROR: this mock object"; |
|
545 if (state.first_used_test != "") { |
|
546 std::cout << " (used in test " << state.first_used_test_case << "." |
|
547 << state.first_used_test << ")"; |
|
548 } |
|
549 std::cout << " should be deleted but never is. Its address is @" |
|
550 << it->first << "."; |
|
551 leaked_count++; |
|
552 } |
|
553 if (leaked_count > 0) { |
|
554 std::cout << "\nERROR: " << leaked_count |
|
555 << " leaked mock " << (leaked_count == 1 ? "object" : "objects") |
|
556 << " found at program exit.\n"; |
|
557 std::cout.flush(); |
|
558 ::std::cerr.flush(); |
|
559 // RUN_ALL_TESTS() has already returned when this destructor is |
|
560 // called. Therefore we cannot use the normal Google Test |
|
561 // failure reporting mechanism. |
|
562 _exit(1); // We cannot call exit() as it is not reentrant and |
|
563 // may already have been called. |
|
564 } |
|
565 } |
|
566 |
|
567 StateMap& states() { return states_; } |
|
568 private: |
|
569 StateMap states_; |
|
570 }; |
|
571 |
|
572 // Protected by g_gmock_mutex. |
|
573 MockObjectRegistry g_mock_object_registry; |
|
574 |
|
575 // Maps a mock object to the reaction Google Mock should have when an |
|
576 // uninteresting method is called. Protected by g_gmock_mutex. |
|
577 std::map<const void*, internal::CallReaction> g_uninteresting_call_reaction; |
|
578 |
|
579 // Sets the reaction Google Mock should have when an uninteresting |
|
580 // method of the given mock object is called. |
|
581 // L < g_gmock_mutex |
|
582 void SetReactionOnUninterestingCalls(const void* mock_obj, |
|
583 internal::CallReaction reaction) { |
|
584 internal::MutexLock l(&internal::g_gmock_mutex); |
|
585 g_uninteresting_call_reaction[mock_obj] = reaction; |
|
586 } |
|
587 |
|
588 } // namespace |
|
589 |
|
590 // Tells Google Mock to allow uninteresting calls on the given mock |
|
591 // object. |
|
592 // L < g_gmock_mutex |
|
593 void Mock::AllowUninterestingCalls(const void* mock_obj) { |
|
594 SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW); |
|
595 } |
|
596 |
|
597 // Tells Google Mock to warn the user about uninteresting calls on the |
|
598 // given mock object. |
|
599 // L < g_gmock_mutex |
|
600 void Mock::WarnUninterestingCalls(const void* mock_obj) { |
|
601 SetReactionOnUninterestingCalls(mock_obj, internal::WARN); |
|
602 } |
|
603 |
|
604 // Tells Google Mock to fail uninteresting calls on the given mock |
|
605 // object. |
|
606 // L < g_gmock_mutex |
|
607 void Mock::FailUninterestingCalls(const void* mock_obj) { |
|
608 SetReactionOnUninterestingCalls(mock_obj, internal::FAIL); |
|
609 } |
|
610 |
|
611 // Tells Google Mock the given mock object is being destroyed and its |
|
612 // entry in the call-reaction table should be removed. |
|
613 // L < g_gmock_mutex |
|
614 void Mock::UnregisterCallReaction(const void* mock_obj) { |
|
615 internal::MutexLock l(&internal::g_gmock_mutex); |
|
616 g_uninteresting_call_reaction.erase(mock_obj); |
|
617 } |
|
618 |
|
619 // Returns the reaction Google Mock will have on uninteresting calls |
|
620 // made on the given mock object. |
|
621 // L < g_gmock_mutex |
|
622 internal::CallReaction Mock::GetReactionOnUninterestingCalls( |
|
623 const void* mock_obj) { |
|
624 internal::MutexLock l(&internal::g_gmock_mutex); |
|
625 return (g_uninteresting_call_reaction.count(mock_obj) == 0) ? |
|
626 internal::WARN : g_uninteresting_call_reaction[mock_obj]; |
|
627 } |
|
628 |
|
629 // Tells Google Mock to ignore mock_obj when checking for leaked mock |
|
630 // objects. |
|
631 // L < g_gmock_mutex |
|
632 void Mock::AllowLeak(const void* mock_obj) { |
|
633 internal::MutexLock l(&internal::g_gmock_mutex); |
|
634 g_mock_object_registry.states()[mock_obj].leakable = true; |
|
635 } |
|
636 |
|
637 // Verifies and clears all expectations on the given mock object. If |
|
638 // the expectations aren't satisfied, generates one or more Google |
|
639 // Test non-fatal failures and returns false. |
|
640 // L < g_gmock_mutex |
|
641 bool Mock::VerifyAndClearExpectations(void* mock_obj) { |
|
642 internal::MutexLock l(&internal::g_gmock_mutex); |
|
643 return VerifyAndClearExpectationsLocked(mock_obj); |
|
644 } |
|
645 |
|
646 // Verifies all expectations on the given mock object and clears its |
|
647 // default actions and expectations. Returns true iff the |
|
648 // verification was successful. |
|
649 // L < g_gmock_mutex |
|
650 bool Mock::VerifyAndClear(void* mock_obj) { |
|
651 internal::MutexLock l(&internal::g_gmock_mutex); |
|
652 ClearDefaultActionsLocked(mock_obj); |
|
653 return VerifyAndClearExpectationsLocked(mock_obj); |
|
654 } |
|
655 |
|
656 // Verifies and clears all expectations on the given mock object. If |
|
657 // the expectations aren't satisfied, generates one or more Google |
|
658 // Test non-fatal failures and returns false. |
|
659 // L >= g_gmock_mutex |
|
660 bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) { |
|
661 internal::g_gmock_mutex.AssertHeld(); |
|
662 if (g_mock_object_registry.states().count(mock_obj) == 0) { |
|
663 // No EXPECT_CALL() was set on the given mock object. |
|
664 return true; |
|
665 } |
|
666 |
|
667 // Verifies and clears the expectations on each mock method in the |
|
668 // given mock object. |
|
669 bool expectations_met = true; |
|
670 FunctionMockers& mockers = |
|
671 g_mock_object_registry.states()[mock_obj].function_mockers; |
|
672 for (FunctionMockers::const_iterator it = mockers.begin(); |
|
673 it != mockers.end(); ++it) { |
|
674 if (!(*it)->VerifyAndClearExpectationsLocked()) { |
|
675 expectations_met = false; |
|
676 } |
|
677 } |
|
678 |
|
679 // We don't clear the content of mockers, as they may still be |
|
680 // needed by ClearDefaultActionsLocked(). |
|
681 return expectations_met; |
|
682 } |
|
683 |
|
684 // Registers a mock object and a mock method it owns. |
|
685 // L < g_gmock_mutex |
|
686 void Mock::Register(const void* mock_obj, |
|
687 internal::UntypedFunctionMockerBase* mocker) { |
|
688 internal::MutexLock l(&internal::g_gmock_mutex); |
|
689 g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker); |
|
690 } |
|
691 |
|
692 // Tells Google Mock where in the source code mock_obj is used in an |
|
693 // ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this |
|
694 // information helps the user identify which object it is. |
|
695 // L < g_gmock_mutex |
|
696 void Mock::RegisterUseByOnCallOrExpectCall( |
|
697 const void* mock_obj, const char* file, int line) { |
|
698 internal::MutexLock l(&internal::g_gmock_mutex); |
|
699 MockObjectState& state = g_mock_object_registry.states()[mock_obj]; |
|
700 if (state.first_used_file == NULL) { |
|
701 state.first_used_file = file; |
|
702 state.first_used_line = line; |
|
703 const TestInfo* const test_info = |
|
704 UnitTest::GetInstance()->current_test_info(); |
|
705 if (test_info != NULL) { |
|
706 // TODO(wan@google.com): record the test case name when the |
|
707 // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or |
|
708 // TearDownTestCase(). |
|
709 state.first_used_test_case = test_info->test_case_name(); |
|
710 state.first_used_test = test_info->name(); |
|
711 } |
|
712 } |
|
713 } |
|
714 |
|
715 // Unregisters a mock method; removes the owning mock object from the |
|
716 // registry when the last mock method associated with it has been |
|
717 // unregistered. This is called only in the destructor of |
|
718 // FunctionMockerBase. |
|
719 // L >= g_gmock_mutex |
|
720 void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) { |
|
721 internal::g_gmock_mutex.AssertHeld(); |
|
722 for (MockObjectRegistry::StateMap::iterator it = |
|
723 g_mock_object_registry.states().begin(); |
|
724 it != g_mock_object_registry.states().end(); ++it) { |
|
725 FunctionMockers& mockers = it->second.function_mockers; |
|
726 if (mockers.erase(mocker) > 0) { |
|
727 // mocker was in mockers and has been just removed. |
|
728 if (mockers.empty()) { |
|
729 g_mock_object_registry.states().erase(it); |
|
730 } |
|
731 return; |
|
732 } |
|
733 } |
|
734 } |
|
735 |
|
736 // Clears all ON_CALL()s set on the given mock object. |
|
737 // L >= g_gmock_mutex |
|
738 void Mock::ClearDefaultActionsLocked(void* mock_obj) { |
|
739 internal::g_gmock_mutex.AssertHeld(); |
|
740 |
|
741 if (g_mock_object_registry.states().count(mock_obj) == 0) { |
|
742 // No ON_CALL() was set on the given mock object. |
|
743 return; |
|
744 } |
|
745 |
|
746 // Clears the default actions for each mock method in the given mock |
|
747 // object. |
|
748 FunctionMockers& mockers = |
|
749 g_mock_object_registry.states()[mock_obj].function_mockers; |
|
750 for (FunctionMockers::const_iterator it = mockers.begin(); |
|
751 it != mockers.end(); ++it) { |
|
752 (*it)->ClearDefaultActionsLocked(); |
|
753 } |
|
754 |
|
755 // We don't clear the content of mockers, as they may still be |
|
756 // needed by VerifyAndClearExpectationsLocked(). |
|
757 } |
|
758 |
|
759 Expectation::Expectation() {} |
|
760 |
|
761 Expectation::Expectation( |
|
762 const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base) |
|
763 : expectation_base_(an_expectation_base) {} |
|
764 |
|
765 Expectation::~Expectation() {} |
|
766 |
|
767 // Adds an expectation to a sequence. |
|
768 void Sequence::AddExpectation(const Expectation& expectation) const { |
|
769 if (*last_expectation_ != expectation) { |
|
770 if (last_expectation_->expectation_base() != NULL) { |
|
771 expectation.expectation_base()->immediate_prerequisites_ |
|
772 += *last_expectation_; |
|
773 } |
|
774 *last_expectation_ = expectation; |
|
775 } |
|
776 } |
|
777 |
|
778 // Creates the implicit sequence if there isn't one. |
|
779 InSequence::InSequence() { |
|
780 if (internal::g_gmock_implicit_sequence.get() == NULL) { |
|
781 internal::g_gmock_implicit_sequence.set(new Sequence); |
|
782 sequence_created_ = true; |
|
783 } else { |
|
784 sequence_created_ = false; |
|
785 } |
|
786 } |
|
787 |
|
788 // Deletes the implicit sequence if it was created by the constructor |
|
789 // of this object. |
|
790 InSequence::~InSequence() { |
|
791 if (sequence_created_) { |
|
792 delete internal::g_gmock_implicit_sequence.get(); |
|
793 internal::g_gmock_implicit_sequence.set(NULL); |
|
794 } |
|
795 } |
|
796 |
|
797 } // namespace testing |