xref: /aosp_15_r20/external/flatbuffers/tests/test_assert.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker #include "test_assert.h"
2*890232f2SAndroid Build Coastguard Worker 
3*890232f2SAndroid Build Coastguard Worker #include <assert.h>
4*890232f2SAndroid Build Coastguard Worker 
5*890232f2SAndroid Build Coastguard Worker #ifdef _MSC_VER
6*890232f2SAndroid Build Coastguard Worker #  include <crtdbg.h>
7*890232f2SAndroid Build Coastguard Worker #  include <windows.h>
8*890232f2SAndroid Build Coastguard Worker #endif
9*890232f2SAndroid Build Coastguard Worker 
10*890232f2SAndroid Build Coastguard Worker int testing_fails = 0;
11*890232f2SAndroid Build Coastguard Worker static TestFailEventListener fail_listener_ = nullptr;
12*890232f2SAndroid Build Coastguard Worker 
TestFail(const char * expval,const char * val,const char * exp,const char * file,int line,const char * func)13*890232f2SAndroid Build Coastguard Worker void TestFail(const char *expval, const char *val, const char *exp,
14*890232f2SAndroid Build Coastguard Worker               const char *file, int line, const char *func) {
15*890232f2SAndroid Build Coastguard Worker   TEST_OUTPUT_LINE("EXPECTED: \"%s\"", expval);
16*890232f2SAndroid Build Coastguard Worker   TEST_OUTPUT_LINE("VALUE: \"%s\"", val);
17*890232f2SAndroid Build Coastguard Worker   TEST_OUTPUT_LINE("TEST FAILED: %s:%d, %s in %s", file, line, exp,
18*890232f2SAndroid Build Coastguard Worker                    func ? func : "");
19*890232f2SAndroid Build Coastguard Worker   testing_fails++;
20*890232f2SAndroid Build Coastguard Worker 
21*890232f2SAndroid Build Coastguard Worker   // Notify, emulate 'gtest::OnTestPartResult' event handler.
22*890232f2SAndroid Build Coastguard Worker   if (fail_listener_) (*fail_listener_)(expval, val, exp, file, line, func);
23*890232f2SAndroid Build Coastguard Worker 
24*890232f2SAndroid Build Coastguard Worker   assert(0);  // ignored in Release if NDEBUG defined
25*890232f2SAndroid Build Coastguard Worker }
26*890232f2SAndroid Build Coastguard Worker 
TestEqStr(const char * expval,const char * val,const char * exp,const char * file,int line,const char * func)27*890232f2SAndroid Build Coastguard Worker void TestEqStr(const char *expval, const char *val, const char *exp,
28*890232f2SAndroid Build Coastguard Worker                const char *file, int line, const char *func) {
29*890232f2SAndroid Build Coastguard Worker   if (strcmp(expval, val) != 0) {
30*890232f2SAndroid Build Coastguard Worker     TestFail(expval, val, exp, file, line, func);
31*890232f2SAndroid Build Coastguard Worker   }
32*890232f2SAndroid Build Coastguard Worker }
33*890232f2SAndroid Build Coastguard Worker 
34*890232f2SAndroid Build Coastguard Worker #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \
35*890232f2SAndroid Build Coastguard Worker     defined(_DEBUG)
36*890232f2SAndroid Build Coastguard Worker #  define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC
37*890232f2SAndroid Build Coastguard Worker #endif
38*890232f2SAndroid Build Coastguard Worker 
InitTestEngine(TestFailEventListener listener)39*890232f2SAndroid Build Coastguard Worker void InitTestEngine(TestFailEventListener listener) {
40*890232f2SAndroid Build Coastguard Worker   testing_fails = 0;
41*890232f2SAndroid Build Coastguard Worker   // Disable stdout buffering to prevent information lost on assertion or core
42*890232f2SAndroid Build Coastguard Worker   // dump.
43*890232f2SAndroid Build Coastguard Worker   setvbuf(stdout, nullptr, _IONBF, 0);
44*890232f2SAndroid Build Coastguard Worker   setvbuf(stderr, nullptr, _IONBF, 0);
45*890232f2SAndroid Build Coastguard Worker 
46*890232f2SAndroid Build Coastguard Worker   flatbuffers::SetupDefaultCRTReportMode();
47*890232f2SAndroid Build Coastguard Worker 
48*890232f2SAndroid Build Coastguard Worker   // clang-format off
49*890232f2SAndroid Build Coastguard Worker 
50*890232f2SAndroid Build Coastguard Worker   #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
51*890232f2SAndroid Build Coastguard Worker     // For more thorough checking:
52*890232f2SAndroid Build Coastguard Worker     // _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF
53*890232f2SAndroid Build Coastguard Worker     auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
54*890232f2SAndroid Build Coastguard Worker     _CrtSetDbgFlag(flags | _CRTDBG_ALLOC_MEM_DF);
55*890232f2SAndroid Build Coastguard Worker   #endif
56*890232f2SAndroid Build Coastguard Worker   // clang-format on
57*890232f2SAndroid Build Coastguard Worker 
58*890232f2SAndroid Build Coastguard Worker   fail_listener_ = listener;
59*890232f2SAndroid Build Coastguard Worker }
60*890232f2SAndroid Build Coastguard Worker 
CloseTestEngine(bool force_report)61*890232f2SAndroid Build Coastguard Worker int CloseTestEngine(bool force_report) {
62*890232f2SAndroid Build Coastguard Worker   if (!testing_fails || force_report) {
63*890232f2SAndroid Build Coastguard Worker #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
64*890232f2SAndroid Build Coastguard Worker     auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
65*890232f2SAndroid Build Coastguard Worker     flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;
66*890232f2SAndroid Build Coastguard Worker     flags |= _CRTDBG_LEAK_CHECK_DF;
67*890232f2SAndroid Build Coastguard Worker     _CrtSetDbgFlag(flags);
68*890232f2SAndroid Build Coastguard Worker #endif
69*890232f2SAndroid Build Coastguard Worker   }
70*890232f2SAndroid Build Coastguard Worker   return (0 != testing_fails);
71*890232f2SAndroid Build Coastguard Worker }
72