--- /dev/null
+#include <gtest/gtest.h>
+
+#include "log/Log.h"
+#include "common/Clock.h"
+#include "common/PrebufferedStreambuf.h"
+#include "include/coredumpctl.h"
+#include "SubsystemMap.h"
+
+using namespace ceph::logging;
+
+TEST(Log, Simple)
+{
+ SubsystemMap subs;
+ subs.add(0, "none", 10, 10);
+ subs.add(1, "foosys", 20, 1);
+ subs.add(2, "bar", 20, 2);
+ subs.add(3, "baz", 10, 3);
+
+ Log log(&subs);
+ log.start();
+
+ log.set_log_file("/tmp/foo");
+ log.reopen_log_file();
+
+ log.set_stderr_level(5, -1);
+
+
+ for (int i=0; i<100; i++) {
+ int sys = i % 4;
+ int l = 5 + (i%4);
+ if (subs.should_gather(sys, l)) {
+ Entry *e = new Entry(ceph_clock_now(),
+ pthread_self(),
+ l,
+ sys,
+ "hello world");
+ log.submit_entry(e);
+ }
+ }
+
+ log.flush();
+
+ log.dump_recent();
+
+ log.stop();
+}
+
+int many = 10000;
+
+TEST(Log, ManyNoGather)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 1, 1);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l))
+ log.submit_entry(new Entry(ceph_clock_now(), pthread_self(), l, 1));
+ }
+ log.flush();
+ log.stop();
+}
+
+
+TEST(Log, ManyGatherLog)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l))
+ log.submit_entry(new Entry(ceph_clock_now(), pthread_self(), l, 1,
+ "this is a long string asdf asdf asdf asdf asdf asdf asd fasd fasdf "));
+ }
+ log.flush();
+ log.stop();
+}
+
+TEST(Log, ManyGatherLogStringAssign)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l)) {
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), l, 1);
+ ostringstream oss;
+ oss << "this i a long stream asdf asdf asdf asdf asdf asdf asdf asdf asdf as fd";
+ e->set_str(oss.str());
+ log.submit_entry(e);
+ }
+ }
+ log.flush();
+ log.stop();
+}
+TEST(Log, ManyGatherLogStringAssignWithReserve)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l)) {
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), l, 1);
+ ostringstream oss;
+ oss.str().reserve(80);
+ oss << "this i a long stream asdf asdf asdf asdf asdf asdf asdf asdf asdf as fd";
+ e->set_str(oss.str());
+ log.submit_entry(e);
+ }
+ }
+ log.flush();
+ log.stop();
+}
+
+TEST(Log, ManyGatherLogPrebuf)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l)) {
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), l, 1);
+ PrebufferedStreambuf psb(e->m_static_buf, sizeof(e->m_static_buf));
+ ostream oss(&psb);
+ oss << "this i a long stream asdf asdf asdf asdf asdf asdf asdf asdf asdf as fd";
+ //e->m_str = oss.str();
+ log.submit_entry(e);
+ }
+ }
+ log.flush();
+ log.stop();
+}
+
+TEST(Log, ManyGatherLogPrebufOverflow)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l)) {
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), l, 1);
+ PrebufferedStreambuf psb(e->m_static_buf, sizeof(e->m_static_buf));
+ ostream oss(&psb);
+ oss << "this i a long stream asdf asdf asdf asdf asdf asdf asdf asdf asdf as fd"
+ << std::string(sizeof(e->m_static_buf) * 2, '-') ;
+ //e->m_str = oss.str();
+ log.submit_entry(e);
+ }
+ }
+ log.flush();
+ log.stop();
+}
+
+TEST(Log, ManyGather)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 1);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ for (int i=0; i<many; i++) {
+ int l = 10;
+ if (subs.should_gather(1, l))
+ log.submit_entry(new Entry(ceph_clock_now(), pthread_self(), l, 1));
+ }
+ log.flush();
+ log.stop();
+}
+
+void do_segv()
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 1);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+
+ log.inject_segv();
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), 10, 1);
+ {
+ PrCtl unset_dumpable;
+ log.submit_entry(e); // this should segv
+ }
+
+ log.flush();
+ log.stop();
+}
+
+TEST(Log, InternalSegv)
+{
+ ASSERT_DEATH(do_segv(), ".*");
+}
+
+TEST(Log, LargeLog)
+{
+ SubsystemMap subs;
+ subs.add(1, "foo", 20, 10);
+ Log log(&subs);
+ log.start();
+ log.set_log_file("/tmp/big");
+ log.reopen_log_file();
+ int l = 10;
+ Entry *e = new Entry(ceph_clock_now(), pthread_self(), l, 1);
+
+ std::string msg(10000000, 0);
+ e->set_str(msg);
+ log.submit_entry(e);
+ log.flush();
+ log.stop();
+}