summaryrefslogtreecommitdiffstats
path: root/util/system/backtrace_ut.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/system/backtrace_ut.cpp
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/system/backtrace_ut.cpp')
-rw-r--r--util/system/backtrace_ut.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/util/system/backtrace_ut.cpp b/util/system/backtrace_ut.cpp
new file mode 100644
index 00000000000..9b5ead71bc1
--- /dev/null
+++ b/util/system/backtrace_ut.cpp
@@ -0,0 +1,85 @@
+#include "backtrace.h"
+
+#include <util/generic/array_ref.h>
+#include <library/cpp/testing/unittest/registar.h>
+
+#include <util/stream/output.h>
+
+using PFunc = int (*)(void**, size_t);
+
+int Dbg1(void** buf, size_t len) {
+ volatile int ret = (int)BackTrace(buf, len);
+ return ret;
+}
+
+int Dbg2(void** buf, size_t len) {
+ volatile int ret = (int)BackTrace(buf, len);
+ return ret;
+}
+
+void FormatBackTraceReplacement(IOutputStream* out, void* const*, size_t) {
+ *out << "WorksLikeACharm" << Endl;
+}
+
+void SomeMethod() {
+ TStringStream out;
+
+ FormatBackTrace(&out);
+
+#if defined(_musl_)
+ // musl dladdr broken for us now
+ return;
+#endif
+
+ UNIT_ASSERT(out.Empty() || out.Str().find("SomeMethod") != TString::npos);
+}
+
+class TBackTraceTest: public TTestBase {
+ UNIT_TEST_SUITE(TBackTraceTest);
+ UNIT_TEST(TestBackTrace)
+ UNIT_TEST(TestBackTraceView)
+ UNIT_TEST(TestPrintBackTrace)
+ UNIT_TEST(TestSetFormatBackTraceFn)
+ UNIT_TEST_SUITE_END();
+
+ void TestPrintBackTrace() {
+ SomeMethod();
+ }
+
+ void TestSetFormatBackTraceFn() {
+ TFormatBackTraceFn prevFn = SetFormatBackTraceFn(FormatBackTraceReplacement);
+ TStringStream out;
+ FormatBackTrace(&out);
+ SetFormatBackTraceFn(prevFn);
+ UNIT_ASSERT(out.Str().Contains("WorksLikeACharm"));
+ TestPrintBackTrace();
+ }
+
+ void TestBackTrace() {
+ //PrintBackTrace();
+ void* buf1[100];
+ size_t ret1;
+
+ void* buf2[100];
+ size_t ret2;
+
+ volatile PFunc func = &Dbg1;
+ ret1 = (*func)(buf1, 100);
+ func = &Dbg2;
+ ret2 = (*func)(buf2, 100);
+
+ UNIT_ASSERT_EQUAL(ret1, ret2);
+ }
+
+ void TestBackTraceView() {
+ try {
+ throw TWithBackTrace<yexception>();
+ } catch (const yexception& e) {
+ const TBackTrace bt = *e.BackTrace();
+ const TBackTraceView btView = bt;
+ UNIT_ASSERT_VALUES_EQUAL(btView.size(), bt.size());
+ }
+ }
+};
+
+UNIT_TEST_SUITE_REGISTRATION(TBackTraceTest);