TestMain.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //===--- utils/unittest/SPIRV/TestMain.cpp - unittest driver --------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "gmock/gmock.h"
  10. #include "gtest/gtest.h"
  11. #include "llvm/Support/Signals.h"
  12. #include "SPIRVTestOptions.h"
  13. #if defined(_WIN32)
  14. #include <windows.h>
  15. #if defined(_MSC_VER)
  16. #include <crtdbg.h>
  17. #endif
  18. #endif
  19. namespace {
  20. using namespace ::testing;
  21. /// A GoogleTest event printer that only prints test failures.
  22. class FailurePrinter : public TestEventListener {
  23. public:
  24. explicit FailurePrinter(TestEventListener *listener)
  25. : defaultListener(listener) {}
  26. ~FailurePrinter() override { delete defaultListener; }
  27. void OnTestProgramStart(const UnitTest &ut) override {
  28. defaultListener->OnTestProgramStart(ut);
  29. }
  30. void OnTestIterationStart(const UnitTest &ut, int iteration) override {
  31. defaultListener->OnTestIterationStart(ut, iteration);
  32. }
  33. void OnEnvironmentsSetUpStart(const UnitTest &ut) override {
  34. defaultListener->OnEnvironmentsSetUpStart(ut);
  35. }
  36. void OnEnvironmentsSetUpEnd(const UnitTest &ut) override {
  37. defaultListener->OnEnvironmentsSetUpEnd(ut);
  38. }
  39. void OnTestCaseStart(const TestCase &tc) override {
  40. defaultListener->OnTestCaseStart(tc);
  41. }
  42. void OnTestStart(const TestInfo &ti) override {
  43. // Do not output on test start
  44. // defaultListener->OnTestStart(ti);
  45. }
  46. void OnTestPartResult(const TestPartResult &result) override {
  47. defaultListener->OnTestPartResult(result);
  48. }
  49. void OnTestEnd(const TestInfo &ti) override {
  50. // Only output if failure on test end
  51. if (ti.result()->Failed())
  52. defaultListener->OnTestEnd(ti);
  53. }
  54. void OnTestCaseEnd(const TestCase &tc) override {
  55. defaultListener->OnTestCaseEnd(tc);
  56. }
  57. void OnEnvironmentsTearDownStart(const UnitTest &ut) override {
  58. defaultListener->OnEnvironmentsTearDownStart(ut);
  59. }
  60. void OnEnvironmentsTearDownEnd(const UnitTest &ut) override {
  61. defaultListener->OnEnvironmentsTearDownEnd(ut);
  62. }
  63. void OnTestIterationEnd(const UnitTest &ut, int iteration) override {
  64. defaultListener->OnTestIterationEnd(ut, iteration);
  65. }
  66. void OnTestProgramEnd(const UnitTest &ut) override {
  67. defaultListener->OnTestProgramEnd(ut);
  68. }
  69. private:
  70. TestEventListener *defaultListener;
  71. };
  72. } // namespace
  73. const char *TestMainArgv0;
  74. int main(int argc, char **argv) {
  75. llvm::sys::PrintStackTraceOnErrorSignal(true /* Disable crash reporting */);
  76. for (int i = 1; i < argc; ++i) {
  77. if (std::string("--spirv-test-root") == argv[i]) {
  78. // Allow the user set the root directory for test input files.
  79. if (i + 1 < argc) {
  80. clang::spirv::testOptions::inputDataDir = argv[++i];
  81. } else {
  82. fprintf(stderr, "Error: --spirv-test-root requires an argument\n");
  83. return 1;
  84. }
  85. }
  86. }
  87. // Initialize both gmock and gtest.
  88. testing::InitGoogleMock(&argc, argv);
  89. // Switch event listener to one that only prints failures.
  90. testing::TestEventListeners &listeners =
  91. ::testing::UnitTest::GetInstance()->listeners();
  92. auto *defaultPrinter = listeners.Release(listeners.default_result_printer());
  93. // Google Test takes the ownership.
  94. listeners.Append(new FailurePrinter(defaultPrinter));
  95. // Make it easy for a test to re-execute itself by saving argv[0].
  96. TestMainArgv0 = argv[0];
  97. #if defined(_WIN32)
  98. // Disable all of the possible ways Windows conspires to make automated
  99. // testing impossible.
  100. ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
  101. #if defined(_MSC_VER)
  102. ::_set_error_mode(_OUT_TO_STDERR);
  103. _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
  104. _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
  105. _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
  106. _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
  107. _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
  108. _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
  109. #endif
  110. #endif
  111. return RUN_ALL_TESTS();
  112. }