blob: e2b43a76ba3f2d56ee7742ccbadc83691056ff21 [file] [log] [blame]
Vladimir Glavnyy55b30822018-10-23 05:44:18 +07001#include "test_assert.h"
2
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +07003#include <assert.h>
4
Vladimir Glavnyy7a437752018-10-04 02:04:14 +07005#ifdef _MSC_VER
Vladimir Glavnyy7a437752018-10-04 02:04:14 +07006# include <crtdbg.h>
Vladimir Glavnyydd85c3b2019-04-09 00:01:41 +07007# include <windows.h>
Vladimir Glavnyy7a437752018-10-04 02:04:14 +07008#endif
9
Sumant Tambe49fed8c2018-09-24 12:03:31 -070010int testing_fails = 0;
Vladimir Glavnyy55b30822018-10-23 05:44:18 +070011static TestFailEventListener fail_listener_ = nullptr;
Sumant Tambe49fed8c2018-09-24 12:03:31 -070012
13void TestFail(const char *expval, const char *val, const char *exp,
14 const char *file, int line, const char *func) {
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070015 TEST_OUTPUT_LINE("EXPECTED: \"%s\"", expval);
16 TEST_OUTPUT_LINE("VALUE: \"%s\"", val);
Vladimir Glavnyy7a437752018-10-04 02:04:14 +070017 TEST_OUTPUT_LINE("TEST FAILED: %s:%d, %s in %s", file, line, exp,
18 func ? func : "");
Sumant Tambe49fed8c2018-09-24 12:03:31 -070019 testing_fails++;
Vladimir Glavnyy55b30822018-10-23 05:44:18 +070020
21 // Notify, emulate 'gtest::OnTestPartResult' event handler.
Vladimir Glavnyy5f32f942018-11-17 00:24:06 +070022 if (fail_listener_) (*fail_listener_)(expval, val, exp, file, line, func);
Vladimir Glavnyy55b30822018-10-23 05:44:18 +070023
Vladimir Glavnyy5f32f942018-11-17 00:24:06 +070024 assert(0); // ignored in Release if NDEBUG defined
Sumant Tambe49fed8c2018-09-24 12:03:31 -070025}
26
27void TestEqStr(const char *expval, const char *val, const char *exp,
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070028 const char *file, int line, const char *func) {
29 if (strcmp(expval, val) != 0) {
30 TestFail(expval, val, exp, file, line, func);
31 }
Sumant Tambe49fed8c2018-09-24 12:03:31 -070032}
33
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +070034#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \
35 defined(_DEBUG)
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070036# define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC
Vladimir Glavnyy7a437752018-10-04 02:04:14 +070037#endif
38
Vladimir Glavnyy55b30822018-10-23 05:44:18 +070039void InitTestEngine(TestFailEventListener listener) {
Vladimir Glavnyy7a437752018-10-04 02:04:14 +070040 testing_fails = 0;
41 // Disable stdout buffering to prevent information lost on assertion or core
42 // dump.
43 setvbuf(stdout, NULL, _IONBF, 0);
44 setvbuf(stderr, NULL, _IONBF, 0);
45
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070046 flatbuffers::SetupDefaultCRTReportMode();
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +070047
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070048 // clang-format off
Aurimas Liutikas420a0a22020-03-16 21:08:19 +000049
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +070050 #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
51 // For more thorough checking:
52 // _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF
53 auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
54 _CrtSetDbgFlag(flags | _CRTDBG_ALLOC_MEM_DF);
Vladimir Glavnyy7a437752018-10-04 02:04:14 +070055 #endif
56 // clang-format on
Vladimir Glavnyy55b30822018-10-23 05:44:18 +070057
58 fail_listener_ = listener;
Vladimir Glavnyy7a437752018-10-04 02:04:14 +070059}
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +070060
61int CloseTestEngine(bool force_report) {
62 if (!testing_fails || force_report) {
Haibo Huangb9f6b1a2020-03-16 15:41:29 -070063#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
64 auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
65 flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;
66 flags |= _CRTDBG_LEAK_CHECK_DF;
67 _CrtSetDbgFlag(flags);
68#endif
Vladimir Glavnyy3f388ec2019-01-25 04:30:11 +070069 }
70 return (0 != testing_fails);
71}