OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <sstream> | |
6 #include <string> | |
7 | |
8 #include "base/debug_util.h" | |
9 #include "base/logging.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 // Note: On Linux, this test currently only fully works on Debug builds. | |
13 // See comments in the #ifdef soup if you intend to change this. | |
14 // Flaky, crbug.com/32070. | |
15 TEST(StackTrace, FLAKY_OutputToStream) { | |
16 StackTrace trace; | |
17 | |
18 // Dump the trace into a string. | |
19 std::ostringstream os; | |
20 trace.OutputToStream(&os); | |
21 std::string backtrace_message = os.str(); | |
22 | |
23 #if defined(OS_POSIX) && !defined(OS_MACOSX) && NDEBUG | |
24 // Stack traces require an extra data table that bloats our binaries, | |
25 // so they're turned off for release builds. We stop the test here, | |
26 // at least letting us verify that the calls don't crash. | |
27 return; | |
28 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) && NDEBUG | |
29 | |
30 size_t frames_found = 0; | |
31 trace.Addresses(&frames_found); | |
32 ASSERT_GE(frames_found, 5u) << | |
33 "No stack frames found. Skipping rest of test."; | |
34 | |
35 // Check if the output has symbol initialization warning. If it does, fail. | |
36 ASSERT_EQ(backtrace_message.find("Dumping unresolved backtrace"), | |
37 std::string::npos) << | |
38 "Unable to resolve symbols. Skipping rest of test."; | |
39 | |
40 #if defined(OS_MACOSX) | |
41 #if 0 | |
42 // Disabled due to -fvisibility=hidden in build config. | |
43 | |
44 // Symbol resolution via the backtrace_symbol function does not work well | |
45 // in OS X. | |
46 // See this thread: | |
47 // | |
48 // http://lists.apple.com/archives/darwin-dev/2009/Mar/msg00111.html | |
49 // | |
50 // Just check instead that we find our way back to the "start" symbol | |
51 // which should be the first symbol in the trace. | |
52 // | |
53 // TODO(port): Find a more reliable way to resolve symbols. | |
54 | |
55 // Expect to at least find main. | |
56 EXPECT_TRUE(backtrace_message.find("start") != std::string::npos) | |
57 << "Expected to find start in backtrace:\n" | |
58 << backtrace_message; | |
59 | |
60 #endif | |
61 #elif defined(__GLIBCXX__) | |
62 // This branch is for gcc-compiled code, but not Mac due to the | |
63 // above #if. | |
64 // Expect a demangled symbol. | |
65 EXPECT_TRUE(backtrace_message.find("testing::Test::Run()") != | |
66 std::string::npos) | |
67 << "Expected a demangled symbol in backtrace:\n" | |
68 << backtrace_message; | |
69 | |
70 #elif 0 | |
71 // This is the fall-through case; it used to cover Windows. | |
72 // But it's disabled because of varying buildbot configs; | |
73 // some lack symbols. | |
74 | |
75 // Expect to at least find main. | |
76 EXPECT_TRUE(backtrace_message.find("main") != std::string::npos) | |
77 << "Expected to find main in backtrace:\n" | |
78 << backtrace_message; | |
79 | |
80 #if defined(OS_WIN) | |
81 // MSVC doesn't allow the use of C99's __func__ within C++, so we fake it with | |
82 // MSVC's __FUNCTION__ macro. | |
83 #define __func__ __FUNCTION__ | |
84 #endif | |
85 | |
86 // Expect to find this function as well. | |
87 // Note: This will fail if not linked with -rdynamic (aka -export_dynamic) | |
88 EXPECT_TRUE(backtrace_message.find(__func__) != std::string::npos) | |
89 << "Expected to find " << __func__ << " in backtrace:\n" | |
90 << backtrace_message; | |
91 | |
92 #endif // define(OS_MACOSX) | |
93 } | |
94 | |
95 // The test is used for manual testing, e.g., to see the raw output. | |
96 TEST(StackTrace, DebugOutputToStream) { | |
97 StackTrace trace; | |
98 std::ostringstream os; | |
99 trace.OutputToStream(&os); | |
100 VLOG(1) << os.str(); | |
101 } | |
102 | |
103 // The test is used for manual testing, e.g., to see the raw output. | |
104 TEST(StackTrace, DebugPrintBacktrace) { | |
105 StackTrace().PrintBacktrace(); | |
106 } | |
OLD | NEW |