| Index: base/debug_util_unittest.cc
|
| diff --git a/base/debug_util_unittest.cc b/base/debug_util_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2636e45f04cc4f2ecc88ca803cbf0ef438992253
|
| --- /dev/null
|
| +++ b/base/debug_util_unittest.cc
|
| @@ -0,0 +1,72 @@
|
| +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <sstream>
|
| +#include <string>
|
| +
|
| +#include "base/debug_util.h"
|
| +#include "base/logging.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +TEST(StackTrace, OutputToStream) {
|
| + StackTrace trace;
|
| +
|
| + // Dump the trace into a string.
|
| + std::ostringstream os;
|
| + trace.OutputToStream(&os);
|
| + std::string backtrace_message = os.str();
|
| +
|
| + size_t frames_found = 0;
|
| + trace.Addresses(&frames_found);
|
| + if (frames_found == 0) {
|
| + LOG(ERROR) << "No stack frames found. Skipping rest of test.";
|
| + return;
|
| + }
|
| +
|
| + // Check if the output has symbol initialization warning. If it does, fail.
|
| + if (backtrace_message.find("Dumping unresolved backtrace") !=
|
| + std::string::npos) {
|
| + LOG(ERROR) << "Unable to resolve symbols. Skipping rest of test.";
|
| + return;
|
| + }
|
| +
|
| +#if defined(OS_MACOSX)
|
| +
|
| + // Symbol resolution via the backtrace_symbol funciton does not work well
|
| + // in OsX.
|
| + // See this thread:
|
| + //
|
| + // http://lists.apple.com/archives/darwin-dev/2009/Mar/msg00111.html
|
| + //
|
| + // Just check instead that we find our way back to the "start" symbol
|
| + // which should be the first symbol in the trace.
|
| + //
|
| + // TODO(port): Find a more reliable way to resolve symbols.
|
| +
|
| + // Expect to at least find main.
|
| + EXPECT_TRUE(backtrace_message.find("start") != std::string::npos)
|
| + << "Expected to find start in backtrace:\n"
|
| + << backtrace_message;
|
| +
|
| +#else // defined(OS_MACOSX)
|
| +
|
| + // Expect to at least find main.
|
| + EXPECT_TRUE(backtrace_message.find("main") != std::string::npos)
|
| + << "Expected to find main in backtrace:\n"
|
| + << backtrace_message;
|
| +
|
| +#if defined(OS_WIN)
|
| +// MSVC doesn't allow the use of C99's __func__ within C++, so we fake it with
|
| +// MSVC's __FUNCTION__ macro.
|
| +#define __func__ __FUNCTION__
|
| +#endif
|
| +
|
| + // Expect to find this function as well.
|
| + // Note: This will fail if not linked with -rdynamic (aka -export_dynamic)
|
| + EXPECT_TRUE(backtrace_message.find(__func__) != std::string::npos)
|
| + << "Expected to find " << __func__ << " in backtrace:\n"
|
| + << backtrace_message;
|
| +
|
| +#endif // define(OS_MACOSX)
|
| +}
|
|
|