aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/spdlog/tests/test_backtrace.cpp
blob: 4d78c0c217a6503530af454684faa64d612cae74 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "includes.h"
#include "test_sink.h"
#include "spdlog/async.h"

TEST_CASE("bactrace1", "[bactrace]") {
    using spdlog::sinks::test_sink_st;
    auto test_sink = std::make_shared<test_sink_st>();
    size_t backtrace_size = 5;

    spdlog::logger logger("test-backtrace", test_sink);
    logger.set_pattern("%v");
    logger.enable_backtrace(backtrace_size);

    logger.info("info message");
    for (int i = 0; i < 100; i++) logger.debug("debug message {}", i);

    REQUIRE(test_sink->lines().size() == 1);
    REQUIRE(test_sink->lines()[0] == "info message");

    logger.dump_backtrace();
    REQUIRE(test_sink->lines().size() == backtrace_size + 3);
    REQUIRE(test_sink->lines()[1] == "****************** Backtrace Start ******************");
    REQUIRE(test_sink->lines()[2] == "debug message 95");
    REQUIRE(test_sink->lines()[3] == "debug message 96");
    REQUIRE(test_sink->lines()[4] == "debug message 97");
    REQUIRE(test_sink->lines()[5] == "debug message 98");
    REQUIRE(test_sink->lines()[6] == "debug message 99");
    REQUIRE(test_sink->lines()[7] == "****************** Backtrace End ********************");
}

TEST_CASE("bactrace-empty", "[bactrace]") {
    using spdlog::sinks::test_sink_st;
    auto test_sink = std::make_shared<test_sink_st>();
    size_t backtrace_size = 5;

    spdlog::logger logger("test-backtrace", test_sink);
    logger.set_pattern("%v");
    logger.enable_backtrace(backtrace_size);
    logger.dump_backtrace();
    REQUIRE(test_sink->lines().size() == 0);
}

TEST_CASE("bactrace-async", "[bactrace]") {
    using spdlog::sinks::test_sink_mt;
    auto test_sink = std::make_shared<test_sink_mt>();
    using spdlog::details::os::sleep_for_millis;

    size_t backtrace_size = 5;

    spdlog::init_thread_pool(120, 1);
    auto logger = std::make_shared<spdlog::async_logger>("test-bactrace-async", test_sink,
                                                         spdlog::thread_pool());
    logger->set_pattern("%v");
    logger->enable_backtrace(backtrace_size);

    logger->info("info message");
    for (int i = 0; i < 100; i++) logger->debug("debug message {}", i);

    sleep_for_millis(100);
    REQUIRE(test_sink->lines().size() == 1);
    REQUIRE(test_sink->lines()[0] == "info message");

    logger->dump_backtrace();
    sleep_for_millis(100);  //  give time for the async dump to complete
    REQUIRE(test_sink->lines().size() == backtrace_size + 3);
    REQUIRE(test_sink->lines()[1] == "****************** Backtrace Start ******************");
    REQUIRE(test_sink->lines()[2] == "debug message 95");
    REQUIRE(test_sink->lines()[3] == "debug message 96");
    REQUIRE(test_sink->lines()[4] == "debug message 97");
    REQUIRE(test_sink->lines()[5] == "debug message 98");
    REQUIRE(test_sink->lines()[6] == "debug message 99");
    REQUIRE(test_sink->lines()[7] == "****************** Backtrace End ********************");
}