Home | History | Annotate | Download | only in test
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_TEST_GTEST_UTIL_H_
      6 #define BASE_TEST_GTEST_UTIL_H_
      7 
      8 #include <string>
      9 #include <utility>
     10 #include <vector>
     11 
     12 #include "base/compiler_specific.h"
     13 #include "base/logging.h"
     14 #include "build/build_config.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 // EXPECT/ASSERT_DCHECK_DEATH is intended to replace EXPECT/ASSERT_DEBUG_DEATH
     18 // when the death is expected to be caused by a DCHECK. Contrary to
     19 // EXPECT/ASSERT_DEBUG_DEATH however, it doesn't execute the statement in non-
     20 // dcheck builds as DCHECKs are intended to catch things that should never
     21 // happen and as such executing the statement results in undefined behavior
     22 // (|statement| is compiled in unsupported configurations nonetheless).
     23 // Death tests misbehave on Android.
     24 #if DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
     25 
     26 // EXPECT/ASSERT_DCHECK_DEATH tests verify that a DCHECK is hit ("Check failed"
     27 // is part of the error message), but intentionally do not expose the gtest
     28 // death test's full |regex| parameter to avoid users having to verify the exact
     29 // syntax of the error message produced by the DCHECK.
     30 #define EXPECT_DCHECK_DEATH(statement) EXPECT_DEATH(statement, "Check failed")
     31 #define ASSERT_DCHECK_DEATH(statement) ASSERT_DEATH(statement, "Check failed")
     32 
     33 #else
     34 // DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
     35 
     36 // Macro copied from gtest-death-test-internal.h as it's (1) internal for now
     37 // and (2) only defined if !GTEST_HAS_DEATH_TEST which is only a subset of the
     38 // conditions in which it's needed here.
     39 // TODO(gab): Expose macro in upstream gtest repo for consumers like us that
     40 // want more specific death tests and remove this hack.
     41 # define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \
     42     GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
     43     if (::testing::internal::AlwaysTrue()) { \
     44       GTEST_LOG_(WARNING) \
     45           << "Death tests are not supported on this platform.\n" \
     46           << "Statement '" #statement "' cannot be verified."; \
     47     } else if (::testing::internal::AlwaysFalse()) { \
     48       ::testing::internal::RE::PartialMatch(".*", (regex)); \
     49       GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
     50       terminator; \
     51     } else \
     52       ::testing::Message()
     53 
     54 #define EXPECT_DCHECK_DEATH(statement) \
     55     GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", )
     56 #define ASSERT_DCHECK_DEATH(statement) \
     57     GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", return)
     58 
     59 #endif
     60 // DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
     61 
     62 namespace base {
     63 
     64 class FilePath;
     65 
     66 struct TestIdentifier {
     67   TestIdentifier();
     68   TestIdentifier(const TestIdentifier& other);
     69 
     70   std::string test_case_name;
     71   std::string test_name;
     72   std::string file;
     73   int line;
     74 };
     75 
     76 // Constructs a full test name given a test case name and a test name,
     77 // e.g. for test case "A" and test name "B" returns "A.B".
     78 std::string FormatFullTestName(const std::string& test_case_name,
     79                                const std::string& test_name);
     80 
     81 // Returns the full test name with the "DISABLED_" prefix stripped out.
     82 // e.g. for the full test names "A.DISABLED_B", "DISABLED_A.B", and
     83 // "DISABLED_A.DISABLED_B", returns "A.B".
     84 std::string TestNameWithoutDisabledPrefix(const std::string& full_test_name);
     85 
     86 // Returns a vector of gtest-based tests compiled into
     87 // current executable.
     88 std::vector<TestIdentifier> GetCompiledInTests();
     89 
     90 // Writes the list of gtest-based tests compiled into
     91 // current executable as a JSON file. Returns true on success.
     92 bool WriteCompiledInTestsToFile(const FilePath& path) WARN_UNUSED_RESULT;
     93 
     94 // Reads the list of gtest-based tests from |path| into |output|.
     95 // Returns true on success.
     96 bool ReadTestNamesFromFile(
     97     const FilePath& path,
     98     std::vector<TestIdentifier>* output) WARN_UNUSED_RESULT;
     99 
    100 }  // namespace base
    101 
    102 #endif  // BASE_TEST_GTEST_UTIL_H_
    103