github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/test/gmock-nice-strict_test.cc (about) 1 // Copyright 2008, 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 #include "gmock/gmock-generated-nice-strict.h" 33 34 #include <string> 35 #include "gmock/gmock.h" 36 #include "gtest/gtest.h" 37 #include "gtest/gtest-spi.h" 38 39 // This must not be defined inside the ::testing namespace, or it will 40 // clash with ::testing::Mock. 41 class Mock { 42 public: 43 Mock() {} 44 45 MOCK_METHOD0(DoThis, void()); 46 47 private: 48 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock); 49 }; 50 51 namespace testing { 52 namespace gmock_nice_strict_test { 53 54 using testing::internal::string; 55 using testing::GMOCK_FLAG(verbose); 56 using testing::HasSubstr; 57 using testing::NaggyMock; 58 using testing::NiceMock; 59 using testing::StrictMock; 60 61 #if GTEST_HAS_STREAM_REDIRECTION 62 using testing::internal::CaptureStdout; 63 using testing::internal::GetCapturedStdout; 64 #endif 65 66 // Defines some mock classes needed by the tests. 67 68 class Foo { 69 public: 70 virtual ~Foo() {} 71 72 virtual void DoThis() = 0; 73 virtual int DoThat(bool flag) = 0; 74 }; 75 76 class MockFoo : public Foo { 77 public: 78 MockFoo() {} 79 void Delete() { delete this; } 80 81 MOCK_METHOD0(DoThis, void()); 82 MOCK_METHOD1(DoThat, int(bool flag)); 83 84 private: 85 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo); 86 }; 87 88 class MockBar { 89 public: 90 explicit MockBar(const string& s) : str_(s) {} 91 92 MockBar(char a1, char a2, string a3, string a4, int a5, int a6, 93 const string& a7, const string& a8, bool a9, bool a10) { 94 str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) + 95 static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F'); 96 } 97 98 virtual ~MockBar() {} 99 100 const string& str() const { return str_; } 101 102 MOCK_METHOD0(This, int()); 103 MOCK_METHOD2(That, string(int, bool)); 104 105 private: 106 string str_; 107 108 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar); 109 }; 110 111 #if GTEST_HAS_STREAM_REDIRECTION 112 113 // Tests that a raw mock generates warnings for uninteresting calls. 114 TEST(RawMockTest, WarningForUninterestingCall) { 115 const string saved_flag = GMOCK_FLAG(verbose); 116 GMOCK_FLAG(verbose) = "warning"; 117 118 MockFoo raw_foo; 119 120 CaptureStdout(); 121 raw_foo.DoThis(); 122 raw_foo.DoThat(true); 123 EXPECT_THAT(GetCapturedStdout(), 124 HasSubstr("Uninteresting mock function call")); 125 126 GMOCK_FLAG(verbose) = saved_flag; 127 } 128 129 // Tests that a raw mock generates warnings for uninteresting calls 130 // that delete the mock object. 131 TEST(RawMockTest, WarningForUninterestingCallAfterDeath) { 132 const string saved_flag = GMOCK_FLAG(verbose); 133 GMOCK_FLAG(verbose) = "warning"; 134 135 MockFoo* const raw_foo = new MockFoo; 136 137 ON_CALL(*raw_foo, DoThis()) 138 .WillByDefault(Invoke(raw_foo, &MockFoo::Delete)); 139 140 CaptureStdout(); 141 raw_foo->DoThis(); 142 EXPECT_THAT(GetCapturedStdout(), 143 HasSubstr("Uninteresting mock function call")); 144 145 GMOCK_FLAG(verbose) = saved_flag; 146 } 147 148 // Tests that a raw mock generates informational logs for 149 // uninteresting calls. 150 TEST(RawMockTest, InfoForUninterestingCall) { 151 MockFoo raw_foo; 152 153 const string saved_flag = GMOCK_FLAG(verbose); 154 GMOCK_FLAG(verbose) = "info"; 155 CaptureStdout(); 156 raw_foo.DoThis(); 157 EXPECT_THAT(GetCapturedStdout(), 158 HasSubstr("Uninteresting mock function call")); 159 160 GMOCK_FLAG(verbose) = saved_flag; 161 } 162 163 // Tests that a nice mock generates no warning for uninteresting calls. 164 TEST(NiceMockTest, NoWarningForUninterestingCall) { 165 NiceMock<MockFoo> nice_foo; 166 167 CaptureStdout(); 168 nice_foo.DoThis(); 169 nice_foo.DoThat(true); 170 EXPECT_EQ("", GetCapturedStdout()); 171 } 172 173 // Tests that a nice mock generates no warning for uninteresting calls 174 // that delete the mock object. 175 TEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) { 176 NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>; 177 178 ON_CALL(*nice_foo, DoThis()) 179 .WillByDefault(Invoke(nice_foo, &MockFoo::Delete)); 180 181 CaptureStdout(); 182 nice_foo->DoThis(); 183 EXPECT_EQ("", GetCapturedStdout()); 184 } 185 186 // Tests that a nice mock generates informational logs for 187 // uninteresting calls. 188 TEST(NiceMockTest, InfoForUninterestingCall) { 189 NiceMock<MockFoo> nice_foo; 190 191 const string saved_flag = GMOCK_FLAG(verbose); 192 GMOCK_FLAG(verbose) = "info"; 193 CaptureStdout(); 194 nice_foo.DoThis(); 195 EXPECT_THAT(GetCapturedStdout(), 196 HasSubstr("Uninteresting mock function call")); 197 198 GMOCK_FLAG(verbose) = saved_flag; 199 } 200 201 #endif // GTEST_HAS_STREAM_REDIRECTION 202 203 // Tests that a nice mock allows expected calls. 204 TEST(NiceMockTest, AllowsExpectedCall) { 205 NiceMock<MockFoo> nice_foo; 206 207 EXPECT_CALL(nice_foo, DoThis()); 208 nice_foo.DoThis(); 209 } 210 211 // Tests that an unexpected call on a nice mock fails. 212 TEST(NiceMockTest, UnexpectedCallFails) { 213 NiceMock<MockFoo> nice_foo; 214 215 EXPECT_CALL(nice_foo, DoThis()).Times(0); 216 EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected"); 217 } 218 219 // Tests that NiceMock works with a mock class that has a non-default 220 // constructor. 221 TEST(NiceMockTest, NonDefaultConstructor) { 222 NiceMock<MockBar> nice_bar("hi"); 223 EXPECT_EQ("hi", nice_bar.str()); 224 225 nice_bar.This(); 226 nice_bar.That(5, true); 227 } 228 229 // Tests that NiceMock works with a mock class that has a 10-ary 230 // non-default constructor. 231 TEST(NiceMockTest, NonDefaultConstructor10) { 232 NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f', 233 "g", "h", true, false); 234 EXPECT_EQ("abcdefghTF", nice_bar.str()); 235 236 nice_bar.This(); 237 nice_bar.That(5, true); 238 } 239 240 #if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 241 // Tests that NiceMock<Mock> compiles where Mock is a user-defined 242 // class (as opposed to ::testing::Mock). We had to work around an 243 // MSVC 8.0 bug that caused the symbol Mock used in the definition of 244 // NiceMock to be looked up in the wrong context, and this test 245 // ensures that our fix works. 246 // 247 // We have to skip this test on Symbian and Windows Mobile, as it 248 // causes the program to crash there, for reasons unclear to us yet. 249 TEST(NiceMockTest, AcceptsClassNamedMock) { 250 NiceMock< ::Mock> nice; 251 EXPECT_CALL(nice, DoThis()); 252 nice.DoThis(); 253 } 254 #endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 255 256 #if GTEST_HAS_STREAM_REDIRECTION 257 258 // Tests that a naggy mock generates warnings for uninteresting calls. 259 TEST(NaggyMockTest, WarningForUninterestingCall) { 260 const string saved_flag = GMOCK_FLAG(verbose); 261 GMOCK_FLAG(verbose) = "warning"; 262 263 NaggyMock<MockFoo> naggy_foo; 264 265 CaptureStdout(); 266 naggy_foo.DoThis(); 267 naggy_foo.DoThat(true); 268 EXPECT_THAT(GetCapturedStdout(), 269 HasSubstr("Uninteresting mock function call")); 270 271 GMOCK_FLAG(verbose) = saved_flag; 272 } 273 274 // Tests that a naggy mock generates a warning for an uninteresting call 275 // that deletes the mock object. 276 TEST(NaggyMockTest, WarningForUninterestingCallAfterDeath) { 277 const string saved_flag = GMOCK_FLAG(verbose); 278 GMOCK_FLAG(verbose) = "warning"; 279 280 NaggyMock<MockFoo>* const naggy_foo = new NaggyMock<MockFoo>; 281 282 ON_CALL(*naggy_foo, DoThis()) 283 .WillByDefault(Invoke(naggy_foo, &MockFoo::Delete)); 284 285 CaptureStdout(); 286 naggy_foo->DoThis(); 287 EXPECT_THAT(GetCapturedStdout(), 288 HasSubstr("Uninteresting mock function call")); 289 290 GMOCK_FLAG(verbose) = saved_flag; 291 } 292 293 #endif // GTEST_HAS_STREAM_REDIRECTION 294 295 // Tests that a naggy mock allows expected calls. 296 TEST(NaggyMockTest, AllowsExpectedCall) { 297 NaggyMock<MockFoo> naggy_foo; 298 299 EXPECT_CALL(naggy_foo, DoThis()); 300 naggy_foo.DoThis(); 301 } 302 303 // Tests that an unexpected call on a naggy mock fails. 304 TEST(NaggyMockTest, UnexpectedCallFails) { 305 NaggyMock<MockFoo> naggy_foo; 306 307 EXPECT_CALL(naggy_foo, DoThis()).Times(0); 308 EXPECT_NONFATAL_FAILURE(naggy_foo.DoThis(), 309 "called more times than expected"); 310 } 311 312 // Tests that NaggyMock works with a mock class that has a non-default 313 // constructor. 314 TEST(NaggyMockTest, NonDefaultConstructor) { 315 NaggyMock<MockBar> naggy_bar("hi"); 316 EXPECT_EQ("hi", naggy_bar.str()); 317 318 naggy_bar.This(); 319 naggy_bar.That(5, true); 320 } 321 322 // Tests that NaggyMock works with a mock class that has a 10-ary 323 // non-default constructor. 324 TEST(NaggyMockTest, NonDefaultConstructor10) { 325 NaggyMock<MockBar> naggy_bar('0', '1', "2", "3", '4', '5', 326 "6", "7", true, false); 327 EXPECT_EQ("01234567TF", naggy_bar.str()); 328 329 naggy_bar.This(); 330 naggy_bar.That(5, true); 331 } 332 333 #if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 334 // Tests that NaggyMock<Mock> compiles where Mock is a user-defined 335 // class (as opposed to ::testing::Mock). We had to work around an 336 // MSVC 8.0 bug that caused the symbol Mock used in the definition of 337 // NaggyMock to be looked up in the wrong context, and this test 338 // ensures that our fix works. 339 // 340 // We have to skip this test on Symbian and Windows Mobile, as it 341 // causes the program to crash there, for reasons unclear to us yet. 342 TEST(NaggyMockTest, AcceptsClassNamedMock) { 343 NaggyMock< ::Mock> naggy; 344 EXPECT_CALL(naggy, DoThis()); 345 naggy.DoThis(); 346 } 347 #endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 348 349 // Tests that a strict mock allows expected calls. 350 TEST(StrictMockTest, AllowsExpectedCall) { 351 StrictMock<MockFoo> strict_foo; 352 353 EXPECT_CALL(strict_foo, DoThis()); 354 strict_foo.DoThis(); 355 } 356 357 // Tests that an unexpected call on a strict mock fails. 358 TEST(StrictMockTest, UnexpectedCallFails) { 359 StrictMock<MockFoo> strict_foo; 360 361 EXPECT_CALL(strict_foo, DoThis()).Times(0); 362 EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), 363 "called more times than expected"); 364 } 365 366 // Tests that an uninteresting call on a strict mock fails. 367 TEST(StrictMockTest, UninterestingCallFails) { 368 StrictMock<MockFoo> strict_foo; 369 370 EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), 371 "Uninteresting mock function call"); 372 } 373 374 // Tests that an uninteresting call on a strict mock fails, even if 375 // the call deletes the mock object. 376 TEST(StrictMockTest, UninterestingCallFailsAfterDeath) { 377 StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>; 378 379 ON_CALL(*strict_foo, DoThis()) 380 .WillByDefault(Invoke(strict_foo, &MockFoo::Delete)); 381 382 EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(), 383 "Uninteresting mock function call"); 384 } 385 386 // Tests that StrictMock works with a mock class that has a 387 // non-default constructor. 388 TEST(StrictMockTest, NonDefaultConstructor) { 389 StrictMock<MockBar> strict_bar("hi"); 390 EXPECT_EQ("hi", strict_bar.str()); 391 392 EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), 393 "Uninteresting mock function call"); 394 } 395 396 // Tests that StrictMock works with a mock class that has a 10-ary 397 // non-default constructor. 398 TEST(StrictMockTest, NonDefaultConstructor10) { 399 StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f', 400 "g", "h", true, false); 401 EXPECT_EQ("abcdefghTF", strict_bar.str()); 402 403 EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), 404 "Uninteresting mock function call"); 405 } 406 407 #if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 408 // Tests that StrictMock<Mock> compiles where Mock is a user-defined 409 // class (as opposed to ::testing::Mock). We had to work around an 410 // MSVC 8.0 bug that caused the symbol Mock used in the definition of 411 // StrictMock to be looked up in the wrong context, and this test 412 // ensures that our fix works. 413 // 414 // We have to skip this test on Symbian and Windows Mobile, as it 415 // causes the program to crash there, for reasons unclear to us yet. 416 TEST(StrictMockTest, AcceptsClassNamedMock) { 417 StrictMock< ::Mock> strict; 418 EXPECT_CALL(strict, DoThis()); 419 strict.DoThis(); 420 } 421 #endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE 422 423 } // namespace gmock_nice_strict_test 424 } // namespace testing