File: global_log_handle_singleton_lifetime_test.cc

package info (click to toggle)
opentelemetry-cpp 1.19.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,744 kB
  • sloc: cpp: 79,029; sh: 1,640; makefile: 43; python: 31
file content (107 lines) | stat: -rw-r--r-- 3,624 bytes parent folder | download | duplicates (2)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#include <gtest/gtest.h>
#include <cstdlib>
#include <iostream>
#include <string>

#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/sdk/common/attribute_utils.h"
#include "opentelemetry/sdk/common/global_log_handler.h"

class GlobalLogHandlerChecker
{
public:
  GlobalLogHandlerChecker() {}
  ~GlobalLogHandlerChecker()
  {
    using opentelemetry::sdk::common::internal_log::GlobalLogHandler;
    auto handle = GlobalLogHandler::GetLogHandler();
    if (handle && custom_handler_destroyed)
    {
      OTEL_INTERNAL_LOG_ERROR("GlobalLogHandler should be destroyed here");
      abort();
    }
    std::cout << "GlobalLogHandlerChecker destroyed and check pass.\n";
  }

  void Print() { std::cout << "GlobalLogHandlerChecker constructed\n"; }

  GlobalLogHandlerChecker(const GlobalLogHandlerChecker &)            = delete;
  GlobalLogHandlerChecker(GlobalLogHandlerChecker &&)                 = delete;
  GlobalLogHandlerChecker &operator=(const GlobalLogHandlerChecker &) = delete;
  GlobalLogHandlerChecker &operator=(GlobalLogHandlerChecker &&)      = delete;

  static bool custom_handler_destroyed;
};
bool GlobalLogHandlerChecker::custom_handler_destroyed = false;

namespace
{
static GlobalLogHandlerChecker &ConstructChecker()
{
  static GlobalLogHandlerChecker checker;
  return checker;
}
}  // namespace

class CustomLogHandler : public opentelemetry::sdk::common::internal_log::LogHandler
{
public:
  ~CustomLogHandler() override
  {
    GlobalLogHandlerChecker::custom_handler_destroyed = true;
    std::cout << "Custom Gobal Log Handle destroyed\n";
  }

  void Handle(opentelemetry::sdk::common::internal_log::LogLevel level,
              const char *,
              int,
              const char *msg,
              const opentelemetry::sdk::common::AttributeMap &) noexcept override
  {
    if (level == opentelemetry::sdk::common::internal_log::LogLevel::Debug)
    {
      std::cout << "Custom Gobal Log Handle[Debug]: " << msg << "\n";
    }
    else if (level == opentelemetry::sdk::common::internal_log::LogLevel::Error)
    {
      std::cout << "Custom Gobal Log Handle[Error]: " << msg << "\n";
    }
    else if (level == opentelemetry::sdk::common::internal_log::LogLevel::Info)
    {
      std::cout << "Custom Gobal Log Handle[Info]: " << msg << "\n";
    }
    else if (level == opentelemetry::sdk::common::internal_log::LogLevel::Warning)
    {
      std::cout << "Custom Gobal Log Handle[Warning]: " << msg << "\n";
    }
    ++count;
  }

  size_t count = 0;
};

TEST(GlobalLogHandleSingletonTest, Lifetime)
{
  // Setup a new static variable which will be destroyed after the global handle
  ConstructChecker().Print();

  using opentelemetry::sdk::common::internal_log::GlobalLogHandler;
  using opentelemetry::sdk::common::internal_log::LogHandler;

  auto custom_log_handler = opentelemetry::nostd::shared_ptr<LogHandler>(new CustomLogHandler{});
  opentelemetry::sdk::common::internal_log::GlobalLogHandler::SetLogHandler(custom_log_handler);
  auto before_count = static_cast<CustomLogHandler *>(custom_log_handler.get())->count;
  opentelemetry::sdk::common::AttributeMap attributes = {
      {"url", "https://opentelemetry.io/"}, {"content-length", 0}, {"content-type", "text/html"}};
  OTEL_INTERNAL_LOG_ERROR("Error message");
  OTEL_INTERNAL_LOG_DEBUG("Debug message. Headers:", attributes);
  EXPECT_EQ(before_count + 1, static_cast<CustomLogHandler *>(custom_log_handler.get())->count);

  {
    auto handle = GlobalLogHandler::GetLogHandler();
    EXPECT_TRUE(!!handle);
  }
}