gmock-internal-utils_test.cc 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  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. // Google Mock - a framework for writing C++ mock classes.
  30. //
  31. // This file tests the internal utilities.
  32. #include "gmock/internal/gmock-internal-utils.h"
  33. #include <stdlib.h>
  34. #include <cstdint>
  35. #include <map>
  36. #include <memory>
  37. #include <sstream>
  38. #include <string>
  39. #include <tuple>
  40. #include <vector>
  41. #include "gmock/gmock.h"
  42. #include "gmock/internal/gmock-port.h"
  43. #include "gtest/gtest-spi.h"
  44. #include "gtest/gtest.h"
  45. // Indicates that this translation unit is part of Google Test's
  46. // implementation. It must come before gtest-internal-inl.h is
  47. // included, or there will be a compiler error. This trick is to
  48. // prevent a user from accidentally including gtest-internal-inl.h in
  49. // their code.
  50. #define GTEST_IMPLEMENTATION_ 1
  51. #include "src/gtest-internal-inl.h"
  52. #undef GTEST_IMPLEMENTATION_
  53. #ifdef GTEST_OS_CYGWIN
  54. #include <sys/types.h> // For ssize_t. NOLINT
  55. #endif
  56. namespace proto2 {
  57. class Message;
  58. } // namespace proto2
  59. namespace testing {
  60. namespace internal {
  61. namespace {
  62. TEST(JoinAsKeyValueTupleTest, JoinsEmptyTuple) {
  63. EXPECT_EQ("", JoinAsKeyValueTuple({}, Strings()));
  64. }
  65. TEST(JoinAsKeyValueTupleTest, JoinsOneTuple) {
  66. EXPECT_EQ("(a: 1)", JoinAsKeyValueTuple({"a"}, {"1"}));
  67. }
  68. TEST(JoinAsKeyValueTupleTest, JoinsTwoTuple) {
  69. EXPECT_EQ("(a: 1, b: 2)", JoinAsKeyValueTuple({"a", "b"}, {"1", "2"}));
  70. }
  71. TEST(JoinAsKeyValueTupleTest, JoinsTenTuple) {
  72. EXPECT_EQ(
  73. "(a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10)",
  74. JoinAsKeyValueTuple({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},
  75. {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}));
  76. }
  77. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
  78. EXPECT_EQ("", ConvertIdentifierNameToWords(""));
  79. EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
  80. EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
  81. }
  82. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
  83. EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
  84. EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
  85. EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
  86. EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
  87. }
  88. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
  89. EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
  90. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
  91. EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
  92. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
  93. EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
  94. }
  95. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
  96. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
  97. EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
  98. EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
  99. EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
  100. }
  101. TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
  102. EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
  103. EXPECT_EQ("chapter 11 section 1",
  104. ConvertIdentifierNameToWords("_Chapter11Section_1_"));
  105. }
  106. TEST(GetRawPointerTest, WorksForSmartPointers) {
  107. const char* const raw_p1 = new const char('a'); // NOLINT
  108. const std::unique_ptr<const char> p1(raw_p1);
  109. EXPECT_EQ(raw_p1, GetRawPointer(p1));
  110. double* const raw_p2 = new double(2.5); // NOLINT
  111. const std::shared_ptr<double> p2(raw_p2);
  112. EXPECT_EQ(raw_p2, GetRawPointer(p2));
  113. }
  114. TEST(GetRawPointerTest, WorksForRawPointers) {
  115. int* p = nullptr;
  116. EXPECT_TRUE(nullptr == GetRawPointer(p));
  117. int n = 1;
  118. EXPECT_EQ(&n, GetRawPointer(&n));
  119. }
  120. TEST(GetRawPointerTest, WorksForStdReferenceWrapper) {
  121. int n = 1;
  122. EXPECT_EQ(&n, GetRawPointer(std::ref(n)));
  123. EXPECT_EQ(&n, GetRawPointer(std::cref(n)));
  124. }
  125. // Tests KindOf<T>.
  126. class Base {};
  127. class Derived : public Base {};
  128. TEST(KindOfTest, Bool) {
  129. EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT
  130. }
  131. TEST(KindOfTest, Integer) {
  132. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT
  133. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT
  134. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT
  135. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT
  136. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT
  137. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int)); // NOLINT
  138. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int)); // NOLINT
  139. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long)); // NOLINT
  140. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long)); // NOLINT
  141. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long long)); // NOLINT
  142. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long long)); // NOLINT
  143. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT
  144. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT
  145. #if defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || defined(GTEST_OS_CYGWIN)
  146. // ssize_t is not defined on Windows and possibly some other OSes.
  147. EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT
  148. #endif
  149. }
  150. TEST(KindOfTest, FloatingPoint) {
  151. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float)); // NOLINT
  152. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double)); // NOLINT
  153. EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double)); // NOLINT
  154. }
  155. TEST(KindOfTest, Other) {
  156. EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*)); // NOLINT
  157. EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**)); // NOLINT
  158. EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base)); // NOLINT
  159. }
  160. // Tests LosslessArithmeticConvertible<T, U>.
  161. TEST(LosslessArithmeticConvertibleTest, BoolToBool) {
  162. EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
  163. }
  164. TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
  165. EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
  166. EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
  167. EXPECT_TRUE(
  168. (LosslessArithmeticConvertible<bool, unsigned long>::value)); // NOLINT
  169. }
  170. TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
  171. EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
  172. EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
  173. }
  174. TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
  175. EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
  176. EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
  177. }
  178. TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
  179. // Unsigned => larger signed is fine.
  180. EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
  181. // Unsigned => larger unsigned is fine.
  182. EXPECT_TRUE((LosslessArithmeticConvertible<unsigned short,
  183. uint64_t>::value)); // NOLINT
  184. // Signed => unsigned is not fine.
  185. EXPECT_FALSE(
  186. (LosslessArithmeticConvertible<short, uint64_t>::value)); // NOLINT
  187. EXPECT_FALSE((LosslessArithmeticConvertible<signed char,
  188. unsigned int>::value)); // NOLINT
  189. // Same size and same signedness: fine too.
  190. EXPECT_TRUE(
  191. (LosslessArithmeticConvertible<unsigned char, unsigned char>::value));
  192. EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
  193. EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
  194. EXPECT_TRUE((LosslessArithmeticConvertible<unsigned long,
  195. unsigned long>::value)); // NOLINT
  196. // Same size, different signedness: not fine.
  197. EXPECT_FALSE(
  198. (LosslessArithmeticConvertible<unsigned char, signed char>::value));
  199. EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
  200. EXPECT_FALSE((LosslessArithmeticConvertible<uint64_t, int64_t>::value));
  201. // Larger size => smaller size is not fine.
  202. EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value)); // NOLINT
  203. EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
  204. EXPECT_FALSE((LosslessArithmeticConvertible<int64_t, unsigned int>::value));
  205. }
  206. TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
  207. // Integers cannot be losslessly converted to floating-points, as
  208. // the format of the latter is implementation-defined.
  209. EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
  210. EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
  211. EXPECT_FALSE(
  212. (LosslessArithmeticConvertible<short, long double>::value)); // NOLINT
  213. }
  214. TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
  215. EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
  216. EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
  217. }
  218. TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
  219. EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value)); // NOLINT
  220. EXPECT_FALSE((LosslessArithmeticConvertible<double, int64_t>::value));
  221. EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
  222. }
  223. TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
  224. // Smaller size => larger size is fine.
  225. EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
  226. EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
  227. EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
  228. // Same size: fine.
  229. EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
  230. EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
  231. // Larger size => smaller size is not fine.
  232. EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
  233. GTEST_INTENTIONAL_CONST_COND_PUSH_()
  234. if (sizeof(double) == sizeof(long double)) { // NOLINT
  235. GTEST_INTENTIONAL_CONST_COND_POP_()
  236. // In some implementations (e.g. MSVC), double and long double
  237. // have the same size.
  238. EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
  239. } else {
  240. EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
  241. }
  242. }
  243. // Tests the TupleMatches() template function.
  244. TEST(TupleMatchesTest, WorksForSize0) {
  245. std::tuple<> matchers;
  246. std::tuple<> values;
  247. EXPECT_TRUE(TupleMatches(matchers, values));
  248. }
  249. TEST(TupleMatchesTest, WorksForSize1) {
  250. std::tuple<Matcher<int>> matchers(Eq(1));
  251. std::tuple<int> values1(1), values2(2);
  252. EXPECT_TRUE(TupleMatches(matchers, values1));
  253. EXPECT_FALSE(TupleMatches(matchers, values2));
  254. }
  255. TEST(TupleMatchesTest, WorksForSize2) {
  256. std::tuple<Matcher<int>, Matcher<char>> matchers(Eq(1), Eq('a'));
  257. std::tuple<int, char> values1(1, 'a'), values2(1, 'b'), values3(2, 'a'),
  258. values4(2, 'b');
  259. EXPECT_TRUE(TupleMatches(matchers, values1));
  260. EXPECT_FALSE(TupleMatches(matchers, values2));
  261. EXPECT_FALSE(TupleMatches(matchers, values3));
  262. EXPECT_FALSE(TupleMatches(matchers, values4));
  263. }
  264. TEST(TupleMatchesTest, WorksForSize5) {
  265. std::tuple<Matcher<int>, Matcher<char>, Matcher<bool>,
  266. Matcher<long>, // NOLINT
  267. Matcher<std::string>>
  268. matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
  269. std::tuple<int, char, bool, long, std::string> // NOLINT
  270. values1(1, 'a', true, 2L, "hi"), values2(1, 'a', true, 2L, "hello"),
  271. values3(2, 'a', true, 2L, "hi");
  272. EXPECT_TRUE(TupleMatches(matchers, values1));
  273. EXPECT_FALSE(TupleMatches(matchers, values2));
  274. EXPECT_FALSE(TupleMatches(matchers, values3));
  275. }
  276. // Tests that Assert(true, ...) succeeds.
  277. TEST(AssertTest, SucceedsOnTrue) {
  278. Assert(true, __FILE__, __LINE__, "This should succeed.");
  279. Assert(true, __FILE__, __LINE__); // This should succeed too.
  280. }
  281. // Tests that Assert(false, ...) generates a fatal failure.
  282. TEST(AssertTest, FailsFatallyOnFalse) {
  283. EXPECT_DEATH_IF_SUPPORTED(
  284. { Assert(false, __FILE__, __LINE__, "This should fail."); }, "");
  285. EXPECT_DEATH_IF_SUPPORTED({ Assert(false, __FILE__, __LINE__); }, "");
  286. }
  287. // Tests that Expect(true, ...) succeeds.
  288. TEST(ExpectTest, SucceedsOnTrue) {
  289. Expect(true, __FILE__, __LINE__, "This should succeed.");
  290. Expect(true, __FILE__, __LINE__); // This should succeed too.
  291. }
  292. // Tests that Expect(false, ...) generates a non-fatal failure.
  293. TEST(ExpectTest, FailsNonfatallyOnFalse) {
  294. EXPECT_NONFATAL_FAILURE(
  295. { // NOLINT
  296. Expect(false, __FILE__, __LINE__, "This should fail.");
  297. },
  298. "This should fail");
  299. EXPECT_NONFATAL_FAILURE(
  300. { // NOLINT
  301. Expect(false, __FILE__, __LINE__);
  302. },
  303. "Expectation failed");
  304. }
  305. // Tests LogIsVisible().
  306. class LogIsVisibleTest : public ::testing::Test {
  307. protected:
  308. void SetUp() override { original_verbose_ = GMOCK_FLAG_GET(verbose); }
  309. void TearDown() override { GMOCK_FLAG_SET(verbose, original_verbose_); }
  310. std::string original_verbose_;
  311. };
  312. TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
  313. GMOCK_FLAG_SET(verbose, kInfoVerbosity);
  314. EXPECT_TRUE(LogIsVisible(kInfo));
  315. EXPECT_TRUE(LogIsVisible(kWarning));
  316. }
  317. TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
  318. GMOCK_FLAG_SET(verbose, kErrorVerbosity);
  319. EXPECT_FALSE(LogIsVisible(kInfo));
  320. EXPECT_FALSE(LogIsVisible(kWarning));
  321. }
  322. TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
  323. GMOCK_FLAG_SET(verbose, kWarningVerbosity);
  324. EXPECT_FALSE(LogIsVisible(kInfo));
  325. EXPECT_TRUE(LogIsVisible(kWarning));
  326. }
  327. #if GTEST_HAS_STREAM_REDIRECTION
  328. // Tests the Log() function.
  329. // Verifies that Log() behaves correctly for the given verbosity level
  330. // and log severity.
  331. void TestLogWithSeverity(const std::string& verbosity, LogSeverity severity,
  332. bool should_print) {
  333. const std::string old_flag = GMOCK_FLAG_GET(verbose);
  334. GMOCK_FLAG_SET(verbose, verbosity);
  335. CaptureStdout();
  336. Log(severity, "Test log.\n", 0);
  337. if (should_print) {
  338. EXPECT_THAT(
  339. GetCapturedStdout().c_str(),
  340. ContainsRegex(severity == kWarning
  341. ? "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n"
  342. : "^\nTest log\\.\nStack trace:\n"));
  343. } else {
  344. EXPECT_STREQ("", GetCapturedStdout().c_str());
  345. }
  346. GMOCK_FLAG_SET(verbose, old_flag);
  347. }
  348. // Tests that when the stack_frames_to_skip parameter is negative,
  349. // Log() doesn't include the stack trace in the output.
  350. TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
  351. const std::string saved_flag = GMOCK_FLAG_GET(verbose);
  352. GMOCK_FLAG_SET(verbose, kInfoVerbosity);
  353. CaptureStdout();
  354. Log(kInfo, "Test log.\n", -1);
  355. EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
  356. GMOCK_FLAG_SET(verbose, saved_flag);
  357. }
  358. struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {
  359. std::string CurrentStackTrace(int max_depth, int skip_count) override {
  360. return (testing::Message() << max_depth << "::" << skip_count << "\n")
  361. .GetString();
  362. }
  363. void UponLeavingGTest() override {}
  364. };
  365. // Tests that in opt mode, a positive stack_frames_to_skip argument is
  366. // treated as 0.
  367. TEST(LogTest, NoSkippingStackFrameInOptMode) {
  368. MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;
  369. GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);
  370. CaptureStdout();
  371. Log(kWarning, "Test log.\n", 100);
  372. const std::string log = GetCapturedStdout();
  373. std::string expected_trace =
  374. (testing::Message() << GTEST_FLAG_GET(stack_trace_depth) << "::")
  375. .GetString();
  376. std::string expected_message =
  377. "\nGMOCK WARNING:\n"
  378. "Test log.\n"
  379. "Stack trace:\n" +
  380. expected_trace;
  381. EXPECT_THAT(log, HasSubstr(expected_message));
  382. int skip_count = atoi(log.substr(expected_message.size()).c_str());
  383. #if defined(NDEBUG)
  384. // In opt mode, no stack frame should be skipped.
  385. const int expected_skip_count = 0;
  386. #else
  387. // In dbg mode, the stack frames should be skipped.
  388. const int expected_skip_count = 100;
  389. #endif
  390. // Note that each inner implementation layer will +1 the number to remove
  391. // itself from the trace. This means that the value is a little higher than
  392. // expected, but close enough.
  393. EXPECT_THAT(skip_count,
  394. AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));
  395. // Restores the default OS stack trace getter.
  396. GetUnitTestImpl()->set_os_stack_trace_getter(nullptr);
  397. }
  398. // Tests that all logs are printed when the value of the
  399. // --gmock_verbose flag is "info".
  400. TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
  401. TestLogWithSeverity(kInfoVerbosity, kInfo, true);
  402. TestLogWithSeverity(kInfoVerbosity, kWarning, true);
  403. }
  404. // Tests that only warnings are printed when the value of the
  405. // --gmock_verbose flag is "warning".
  406. TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
  407. TestLogWithSeverity(kWarningVerbosity, kInfo, false);
  408. TestLogWithSeverity(kWarningVerbosity, kWarning, true);
  409. }
  410. // Tests that no logs are printed when the value of the
  411. // --gmock_verbose flag is "error".
  412. TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
  413. TestLogWithSeverity(kErrorVerbosity, kInfo, false);
  414. TestLogWithSeverity(kErrorVerbosity, kWarning, false);
  415. }
  416. // Tests that only warnings are printed when the value of the
  417. // --gmock_verbose flag is invalid.
  418. TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
  419. TestLogWithSeverity("invalid", kInfo, false);
  420. TestLogWithSeverity("invalid", kWarning, true);
  421. }
  422. // Verifies that Log() behaves correctly for the given verbosity level
  423. // and log severity.
  424. std::string GrabOutput(void (*logger)(), const char* verbosity) {
  425. const std::string saved_flag = GMOCK_FLAG_GET(verbose);
  426. GMOCK_FLAG_SET(verbose, verbosity);
  427. CaptureStdout();
  428. logger();
  429. GMOCK_FLAG_SET(verbose, saved_flag);
  430. return GetCapturedStdout();
  431. }
  432. class DummyMock {
  433. public:
  434. MOCK_METHOD0(TestMethod, void());
  435. MOCK_METHOD1(TestMethodArg, void(int dummy));
  436. };
  437. void ExpectCallLogger() {
  438. DummyMock mock;
  439. EXPECT_CALL(mock, TestMethod());
  440. mock.TestMethod();
  441. }
  442. // Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".
  443. TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
  444. EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),
  445. HasSubstr("EXPECT_CALL(mock, TestMethod())"));
  446. }
  447. // Verifies that EXPECT_CALL doesn't log
  448. // if the --gmock_verbose flag is set to "warning".
  449. TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
  450. EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
  451. }
  452. // Verifies that EXPECT_CALL doesn't log
  453. // if the --gmock_verbose flag is set to "error".
  454. TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) {
  455. EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
  456. }
  457. void OnCallLogger() {
  458. DummyMock mock;
  459. ON_CALL(mock, TestMethod());
  460. }
  461. // Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".
  462. TEST(OnCallTest, LogsWhenVerbosityIsInfo) {
  463. EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),
  464. HasSubstr("ON_CALL(mock, TestMethod())"));
  465. }
  466. // Verifies that ON_CALL doesn't log
  467. // if the --gmock_verbose flag is set to "warning".
  468. TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
  469. EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
  470. }
  471. // Verifies that ON_CALL doesn't log if
  472. // the --gmock_verbose flag is set to "error".
  473. TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
  474. EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
  475. }
  476. void OnCallAnyArgumentLogger() {
  477. DummyMock mock;
  478. ON_CALL(mock, TestMethodArg(_));
  479. }
  480. // Verifies that ON_CALL prints provided _ argument.
  481. TEST(OnCallTest, LogsAnythingArgument) {
  482. EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),
  483. HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
  484. }
  485. #endif // GTEST_HAS_STREAM_REDIRECTION
  486. // Tests StlContainerView.
  487. TEST(StlContainerViewTest, WorksForStlContainer) {
  488. StaticAssertTypeEq<std::vector<int>,
  489. StlContainerView<std::vector<int>>::type>();
  490. StaticAssertTypeEq<const std::vector<double>&,
  491. StlContainerView<std::vector<double>>::const_reference>();
  492. typedef std::vector<char> Chars;
  493. Chars v1;
  494. const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
  495. EXPECT_EQ(&v1, &v2);
  496. v1.push_back('a');
  497. Chars v3 = StlContainerView<Chars>::Copy(v1);
  498. EXPECT_THAT(v3, Eq(v3));
  499. }
  500. TEST(StlContainerViewTest, WorksForStaticNativeArray) {
  501. StaticAssertTypeEq<NativeArray<int>, StlContainerView<int[3]>::type>();
  502. StaticAssertTypeEq<NativeArray<double>,
  503. StlContainerView<const double[4]>::type>();
  504. StaticAssertTypeEq<NativeArray<char[3]>,
  505. StlContainerView<const char[2][3]>::type>();
  506. StaticAssertTypeEq<const NativeArray<int>,
  507. StlContainerView<int[2]>::const_reference>();
  508. int a1[3] = {0, 1, 2};
  509. NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
  510. EXPECT_EQ(3U, a2.size());
  511. EXPECT_EQ(a1, a2.begin());
  512. const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
  513. ASSERT_EQ(3U, a3.size());
  514. EXPECT_EQ(0, a3.begin()[0]);
  515. EXPECT_EQ(1, a3.begin()[1]);
  516. EXPECT_EQ(2, a3.begin()[2]);
  517. // Makes sure a1 and a3 aren't aliases.
  518. a1[0] = 3;
  519. EXPECT_EQ(0, a3.begin()[0]);
  520. }
  521. TEST(StlContainerViewTest, WorksForDynamicNativeArray) {
  522. StaticAssertTypeEq<NativeArray<int>,
  523. StlContainerView<std::tuple<const int*, size_t>>::type>();
  524. StaticAssertTypeEq<
  525. NativeArray<double>,
  526. StlContainerView<std::tuple<std::shared_ptr<double>, int>>::type>();
  527. StaticAssertTypeEq<
  528. const NativeArray<int>,
  529. StlContainerView<std::tuple<const int*, int>>::const_reference>();
  530. int a1[3] = {0, 1, 2};
  531. const int* const p1 = a1;
  532. NativeArray<int> a2 =
  533. StlContainerView<std::tuple<const int*, int>>::ConstReference(
  534. std::make_tuple(p1, 3));
  535. EXPECT_EQ(3U, a2.size());
  536. EXPECT_EQ(a1, a2.begin());
  537. const NativeArray<int> a3 = StlContainerView<std::tuple<int*, size_t>>::Copy(
  538. std::make_tuple(static_cast<int*>(a1), 3));
  539. ASSERT_EQ(3U, a3.size());
  540. EXPECT_EQ(0, a3.begin()[0]);
  541. EXPECT_EQ(1, a3.begin()[1]);
  542. EXPECT_EQ(2, a3.begin()[2]);
  543. // Makes sure a1 and a3 aren't aliases.
  544. a1[0] = 3;
  545. EXPECT_EQ(0, a3.begin()[0]);
  546. }
  547. // Tests the Function template struct.
  548. TEST(FunctionTest, Nullary) {
  549. typedef Function<int()> F; // NOLINT
  550. EXPECT_EQ(0u, F::ArgumentCount);
  551. EXPECT_TRUE((std::is_same<int, F::Result>::value));
  552. EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentTuple>::value));
  553. EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentMatcherTuple>::value));
  554. EXPECT_TRUE((std::is_same<void(), F::MakeResultVoid>::value));
  555. EXPECT_TRUE((std::is_same<IgnoredValue(), F::MakeResultIgnoredValue>::value));
  556. }
  557. TEST(FunctionTest, Unary) {
  558. typedef Function<int(bool)> F; // NOLINT
  559. EXPECT_EQ(1u, F::ArgumentCount);
  560. EXPECT_TRUE((std::is_same<int, F::Result>::value));
  561. EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
  562. EXPECT_TRUE((std::is_same<std::tuple<bool>, F::ArgumentTuple>::value));
  563. EXPECT_TRUE((
  564. std::is_same<std::tuple<Matcher<bool>>, F::ArgumentMatcherTuple>::value));
  565. EXPECT_TRUE((std::is_same<void(bool), F::MakeResultVoid>::value)); // NOLINT
  566. EXPECT_TRUE((std::is_same<IgnoredValue(bool), // NOLINT
  567. F::MakeResultIgnoredValue>::value));
  568. }
  569. TEST(FunctionTest, Binary) {
  570. typedef Function<int(bool, const long&)> F; // NOLINT
  571. EXPECT_EQ(2u, F::ArgumentCount);
  572. EXPECT_TRUE((std::is_same<int, F::Result>::value));
  573. EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
  574. EXPECT_TRUE((std::is_same<const long&, F::Arg<1>::type>::value)); // NOLINT
  575. EXPECT_TRUE((std::is_same<std::tuple<bool, const long&>, // NOLINT
  576. F::ArgumentTuple>::value));
  577. EXPECT_TRUE(
  578. (std::is_same<std::tuple<Matcher<bool>, Matcher<const long&>>, // NOLINT
  579. F::ArgumentMatcherTuple>::value));
  580. EXPECT_TRUE((std::is_same<void(bool, const long&), // NOLINT
  581. F::MakeResultVoid>::value));
  582. EXPECT_TRUE((std::is_same<IgnoredValue(bool, const long&), // NOLINT
  583. F::MakeResultIgnoredValue>::value));
  584. }
  585. TEST(FunctionTest, LongArgumentList) {
  586. typedef Function<char(bool, int, char*, int&, const long&)> F; // NOLINT
  587. EXPECT_EQ(5u, F::ArgumentCount);
  588. EXPECT_TRUE((std::is_same<char, F::Result>::value));
  589. EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
  590. EXPECT_TRUE((std::is_same<int, F::Arg<1>::type>::value));
  591. EXPECT_TRUE((std::is_same<char*, F::Arg<2>::type>::value));
  592. EXPECT_TRUE((std::is_same<int&, F::Arg<3>::type>::value));
  593. EXPECT_TRUE((std::is_same<const long&, F::Arg<4>::type>::value)); // NOLINT
  594. EXPECT_TRUE(
  595. (std::is_same<std::tuple<bool, int, char*, int&, const long&>, // NOLINT
  596. F::ArgumentTuple>::value));
  597. EXPECT_TRUE(
  598. (std::is_same<
  599. std::tuple<Matcher<bool>, Matcher<int>, Matcher<char*>, Matcher<int&>,
  600. Matcher<const long&>>, // NOLINT
  601. F::ArgumentMatcherTuple>::value));
  602. EXPECT_TRUE(
  603. (std::is_same<void(bool, int, char*, int&, const long&), // NOLINT
  604. F::MakeResultVoid>::value));
  605. EXPECT_TRUE((
  606. std::is_same<IgnoredValue(bool, int, char*, int&, const long&), // NOLINT
  607. F::MakeResultIgnoredValue>::value));
  608. }
  609. TEST(Base64Unescape, InvalidString) {
  610. std::string unescaped;
  611. EXPECT_FALSE(Base64Unescape("(invalid)", &unescaped));
  612. }
  613. TEST(Base64Unescape, ShortString) {
  614. std::string unescaped;
  615. EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQh", &unescaped));
  616. EXPECT_EQ("Hello world!", unescaped);
  617. }
  618. TEST(Base64Unescape, ShortStringWithPadding) {
  619. std::string unescaped;
  620. EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ=", &unescaped));
  621. EXPECT_EQ("Hello world", unescaped);
  622. }
  623. TEST(Base64Unescape, ShortStringWithoutPadding) {
  624. std::string unescaped;
  625. EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ", &unescaped));
  626. EXPECT_EQ("Hello world", unescaped);
  627. }
  628. TEST(Base64Unescape, LongStringWithWhiteSpaces) {
  629. std::string escaped =
  630. R"(TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
  631. IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
  632. dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
  633. dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
  634. ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=)";
  635. std::string expected =
  636. "Man is distinguished, not only by his reason, but by this singular "
  637. "passion from other animals, which is a lust of the mind, that by a "
  638. "perseverance of delight in the continued and indefatigable generation "
  639. "of knowledge, exceeds the short vehemence of any carnal pleasure.";
  640. std::string unescaped;
  641. EXPECT_TRUE(Base64Unescape(escaped, &unescaped));
  642. EXPECT_EQ(expected, unescaped);
  643. }
  644. } // namespace
  645. } // namespace internal
  646. } // namespace testing