1 #include "quiche/common/platform/api/quiche_stack_trace.h" 2 3 #include <cstdint> 4 5 #include "absl/base/attributes.h" 6 #include "absl/base/optimization.h" 7 #include "absl/strings/str_cat.h" 8 #include "quiche/common/platform/api/quiche_test.h" 9 10 namespace quiche { 11 namespace test { 12 namespace { 13 ShouldRunTest()14bool ShouldRunTest() { 15 #if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE) 16 return QuicheShouldRunStackTraceTest(); 17 #else 18 // If QuicheDesignatedStackTraceTestFunction gets inlined, the test will 19 // inevitably fail, since the function won't be on the stack trace. Disable 20 // the test in that scenario. 21 return false; 22 #endif 23 } 24 QuicheDesignatedStackTraceTestFunction()25ABSL_ATTRIBUTE_NOINLINE std::string QuicheDesignatedStackTraceTestFunction() { 26 std::string result = QuicheStackTrace(); 27 ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); 28 return result; 29 } 30 31 ABSL_ATTRIBUTE_NOINLINE std::string QuicheDesignatedTwoStepStackTraceTestFunction()32QuicheDesignatedTwoStepStackTraceTestFunction() { 33 std::string result = SymbolizeStackTrace(CurrentStackTrace()); 34 ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); 35 return result; 36 } 37 TEST(QuicheStackTraceTest,GetStackTrace)38TEST(QuicheStackTraceTest, GetStackTrace) { 39 if (!ShouldRunTest()) { 40 return; 41 } 42 43 std::string stacktrace = QuicheDesignatedStackTraceTestFunction(); 44 EXPECT_THAT(stacktrace, 45 testing::HasSubstr("QuicheDesignatedStackTraceTestFunction")); 46 } 47 TEST(QuicheStackTraceTest,GetStackTraceInTwoSteps)48TEST(QuicheStackTraceTest, GetStackTraceInTwoSteps) { 49 if (!ShouldRunTest()) { 50 return; 51 } 52 53 std::string stacktrace = QuicheDesignatedTwoStepStackTraceTestFunction(); 54 EXPECT_THAT(stacktrace, testing::HasSubstr( 55 "QuicheDesignatedTwoStepStackTraceTestFunction")); 56 } 57 58 } // namespace 59 } // namespace test 60 } // namespace quiche 61