blob: e9cb47560cb28ef528125479b4bb3f21affdaee3 [file] [log] [blame]
Austin Schuh60e77942022-05-16 17:48:24 -07001#include "aos/logging/dynamic_logging.h"
2
Sarah Newmana7e87932022-04-11 15:00:03 -07003#include <sys/stat.h>
4
5#include "aos/events/event_loop.h"
6#include "aos/events/simulated_event_loop.h"
Sarah Newmana7e87932022-04-11 15:00:03 -07007#include "aos/testing/path.h"
8#include "glog/logging.h"
9#include "gtest/gtest.h"
10
11using aos::testing::ArtifactPath;
12
13namespace aos {
14namespace logging {
15namespace testing {
16
17namespace chrono = std::chrono;
18
19class DynamicLoggingTest : public ::testing::Test {
20 public:
21 DynamicLoggingTest()
22 : config_(aos::configuration::ReadConfig(
23 ArtifactPath("aos/events/pingpong_config.json"))),
24 event_loop_factory_(&config_.message()),
25 event_loop_send_(event_loop_factory_.MakeEventLoop("send")),
26 event_loop_main_(event_loop_factory_.MakeEventLoop("main")) {}
27
28 aos::FlatbufferDetachedBuffer<aos::Configuration> config_;
29 SimulatedEventLoopFactory event_loop_factory_;
30
31 std::unique_ptr<EventLoop> event_loop_send_;
32 std::unique_ptr<EventLoop> event_loop_main_;
33};
34
35TEST_F(DynamicLoggingTest, TestVLog) {
36 aos::Sender<DynamicLogCommand> dynamic_log_command_sender =
37 event_loop_send_->MakeSender<DynamicLogCommand>("/aos");
38
39 // Set VLOG level to 1 at t=50us and then back to 0 at t=150us.
40 int log_level = 1;
41 aos::TimerHandler *timer_handler = event_loop_send_->AddTimer(
42 [this, &dynamic_log_command_sender, &log_level, &timer_handler]() {
43 aos::Sender<DynamicLogCommand>::Builder message =
44 dynamic_log_command_sender.MakeBuilder();
45 const auto name_str = message.fbb()->CreateString("main");
46
47 DynamicLogCommand::Builder builder =
48 message.MakeBuilder<DynamicLogCommand>();
49 builder.add_name(name_str);
50 builder.add_vlog_level(log_level);
51 CHECK_EQ(message.Send(builder.Finish()), RawSender::Error::kOk);
52 --log_level;
53 if (log_level >= 0) {
54 timer_handler->Setup(event_loop_send_->monotonic_now() +
55 chrono::microseconds(100));
56 }
57 });
58 timer_handler->Setup(event_loop_send_->monotonic_now() +
59 chrono::microseconds(50));
60
61 // VLOG(1) at t=0us, t=100us, t=200us
62 aos::TimerHandler *vlog_timer_handler =
63 event_loop_main_->AddTimer([]() { VLOG(1) << "VLOG 1"; });
64 vlog_timer_handler->Setup(event_loop_main_->monotonic_now(),
65 chrono::microseconds(100));
66
67 DynamicLogging dynamic_logging(event_loop_main_.get());
68
69 {
70 // Validate no log message in first 50us.
71 ::testing::internal::CaptureStderr();
72 event_loop_factory_.RunFor(chrono::microseconds(50));
73 std::string output = ::testing::internal::GetCapturedStderr();
74 EXPECT_EQ(output.find("VLOG 1"), std::string::npos);
75 }
76 {
77 // Validate 1 log message between 50us to 150us
78 ::testing::internal::CaptureStderr();
79 event_loop_factory_.RunFor(chrono::microseconds(100));
80 std::string output = ::testing::internal::GetCapturedStderr();
81 EXPECT_NE(output.find("VLOG 1"), std::string::npos);
82 }
83 {
84 // Validate no log message between 150us to 250us
85 ::testing::internal::CaptureStderr();
86 event_loop_factory_.RunFor(chrono::microseconds(100));
87 std::string output = ::testing::internal::GetCapturedStderr();
88 EXPECT_EQ(output.find("VLOG 1"), std::string::npos);
89 }
90}
91
92} // namespace testing
93} // namespace logging
94} // namespace aos