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