initial code repo
[stor4nfv.git] / src / ceph / src / test / common / test_back_trace.cc
diff --git a/src/ceph/src/test/common/test_back_trace.cc b/src/ceph/src/test/common/test_back_trace.cc
new file mode 100644 (file)
index 0000000..ff626f5
--- /dev/null
@@ -0,0 +1,46 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <boost/algorithm/string.hpp>
+// std::regex support in libstdc++ 4.8 is incomplete, so let's stick to
+// boost::regex now.
+#include <boost/regex.hpp>
+#include <gtest/gtest.h>
+#include <sstream>
+#include <string>
+
+#include "common/BackTrace.h"
+#include "common/version.h"
+
+// a dummy function, so we can check "foo" in the backtrace.
+// do not mark this function as static or put it into an anonymous namespace,
+// otherwise it's function name will be removed in the backtrace.
+std::string foo()
+{
+  std::ostringstream oss;
+  oss << ceph::BackTrace(1);
+  return oss.str();
+}
+
+// a typical backtrace looks like:
+//
+// ceph version Development (no_version)
+// 1: (foo[abi:cxx11]()+0x4a) [0x5562231cf22a]
+// 2: (BackTrace_Basic_Test::TestBody()+0x28) [0x5562231cf2fc]
+TEST(BackTrace, Basic) {
+  std::string bt = foo();
+  std::vector<std::string> lines;
+  boost::split(lines, bt, boost::is_any_of("\n"));
+  const unsigned lineno = 1;
+  ASSERT_GT(lines.size(), lineno);
+  ASSERT_EQ(lines[0].find(pretty_version_to_str()), 1U);
+  boost::regex e{"^ 1: "
+#ifdef __FreeBSD__
+                "<foo.*>\\s"
+                "at\\s.*$"};
+#else
+                "\\(foo.*\\)\\s"
+                "\\[0x[[:xdigit:]]+\\]$"};
+#endif
+  EXPECT_TRUE(boost::regex_match(lines[lineno], e));
+}