xref: /aosp_15_r20/external/libbrillo/brillo/asynchronous_signal_handler_test.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #include "brillo/asynchronous_signal_handler.h"
6*1a96fba6SXin Li 
7*1a96fba6SXin Li #include <signal.h>
8*1a96fba6SXin Li #include <sys/types.h>
9*1a96fba6SXin Li #include <unistd.h>
10*1a96fba6SXin Li 
11*1a96fba6SXin Li #include <vector>
12*1a96fba6SXin Li 
13*1a96fba6SXin Li #include <base/bind.h>
14*1a96fba6SXin Li #include <base/macros.h>
15*1a96fba6SXin Li #include <base/message_loop/message_loop.h>
16*1a96fba6SXin Li #include <base/run_loop.h>
17*1a96fba6SXin Li #include <brillo/message_loops/base_message_loop.h>
18*1a96fba6SXin Li #include <gtest/gtest.h>
19*1a96fba6SXin Li 
20*1a96fba6SXin Li namespace brillo {
21*1a96fba6SXin Li 
22*1a96fba6SXin Li class AsynchronousSignalHandlerTest : public ::testing::Test {
23*1a96fba6SXin Li  public:
AsynchronousSignalHandlerTest()24*1a96fba6SXin Li   AsynchronousSignalHandlerTest() {}
~AsynchronousSignalHandlerTest()25*1a96fba6SXin Li   virtual ~AsynchronousSignalHandlerTest() {}
26*1a96fba6SXin Li 
SetUp()27*1a96fba6SXin Li   virtual void SetUp() {
28*1a96fba6SXin Li     brillo_loop_.SetAsCurrent();
29*1a96fba6SXin Li     handler_.Init();
30*1a96fba6SXin Li   }
31*1a96fba6SXin Li 
TearDown()32*1a96fba6SXin Li   virtual void TearDown() {}
33*1a96fba6SXin Li 
RecordInfoAndQuit(bool response,const struct signalfd_siginfo & info)34*1a96fba6SXin Li   bool RecordInfoAndQuit(bool response, const struct signalfd_siginfo& info) {
35*1a96fba6SXin Li     infos_.push_back(info);
36*1a96fba6SXin Li     brillo_loop_.PostTask(FROM_HERE, brillo_loop_.QuitClosure());
37*1a96fba6SXin Li     return response;
38*1a96fba6SXin Li   }
39*1a96fba6SXin Li 
40*1a96fba6SXin Li  protected:
41*1a96fba6SXin Li   base::MessageLoopForIO base_loop_;
42*1a96fba6SXin Li   BaseMessageLoop brillo_loop_{&base_loop_};
43*1a96fba6SXin Li   std::vector<struct signalfd_siginfo> infos_;
44*1a96fba6SXin Li   AsynchronousSignalHandler handler_;
45*1a96fba6SXin Li 
46*1a96fba6SXin Li  private:
47*1a96fba6SXin Li   DISALLOW_COPY_AND_ASSIGN(AsynchronousSignalHandlerTest);
48*1a96fba6SXin Li };
49*1a96fba6SXin Li 
TEST_F(AsynchronousSignalHandlerTest,CheckTerm)50*1a96fba6SXin Li TEST_F(AsynchronousSignalHandlerTest, CheckTerm) {
51*1a96fba6SXin Li   handler_.RegisterHandler(
52*1a96fba6SXin Li       SIGTERM,
53*1a96fba6SXin Li       base::Bind(&AsynchronousSignalHandlerTest::RecordInfoAndQuit,
54*1a96fba6SXin Li                  base::Unretained(this),
55*1a96fba6SXin Li                  true));
56*1a96fba6SXin Li   EXPECT_EQ(0, infos_.size());
57*1a96fba6SXin Li   EXPECT_EQ(0, kill(getpid(), SIGTERM));
58*1a96fba6SXin Li 
59*1a96fba6SXin Li   // Spin the message loop.
60*1a96fba6SXin Li   MessageLoop::current()->Run();
61*1a96fba6SXin Li 
62*1a96fba6SXin Li   ASSERT_EQ(1, infos_.size());
63*1a96fba6SXin Li   EXPECT_EQ(SIGTERM, infos_[0].ssi_signo);
64*1a96fba6SXin Li }
65*1a96fba6SXin Li 
TEST_F(AsynchronousSignalHandlerTest,CheckSignalUnregistration)66*1a96fba6SXin Li TEST_F(AsynchronousSignalHandlerTest, CheckSignalUnregistration) {
67*1a96fba6SXin Li   handler_.RegisterHandler(
68*1a96fba6SXin Li       SIGCHLD,
69*1a96fba6SXin Li       base::Bind(&AsynchronousSignalHandlerTest::RecordInfoAndQuit,
70*1a96fba6SXin Li                  base::Unretained(this),
71*1a96fba6SXin Li                  true));
72*1a96fba6SXin Li   EXPECT_EQ(0, infos_.size());
73*1a96fba6SXin Li   EXPECT_EQ(0, kill(getpid(), SIGCHLD));
74*1a96fba6SXin Li 
75*1a96fba6SXin Li   // Spin the message loop.
76*1a96fba6SXin Li   MessageLoop::current()->Run();
77*1a96fba6SXin Li 
78*1a96fba6SXin Li   ASSERT_EQ(1, infos_.size());
79*1a96fba6SXin Li   EXPECT_EQ(SIGCHLD, infos_[0].ssi_signo);
80*1a96fba6SXin Li 
81*1a96fba6SXin Li   EXPECT_EQ(0, kill(getpid(), SIGCHLD));
82*1a96fba6SXin Li 
83*1a96fba6SXin Li   // Run the loop with a timeout, as no message are expected.
84*1a96fba6SXin Li   brillo_loop_.PostDelayedTask(FROM_HERE,
85*1a96fba6SXin Li                                base::Bind(&MessageLoop::BreakLoop,
86*1a96fba6SXin Li                                           base::Unretained(&brillo_loop_)),
87*1a96fba6SXin Li                                base::TimeDelta::FromMilliseconds(10));
88*1a96fba6SXin Li   MessageLoop::current()->Run();
89*1a96fba6SXin Li 
90*1a96fba6SXin Li   // The signal handle should have been unregistered. No new message are
91*1a96fba6SXin Li   // expected.
92*1a96fba6SXin Li   EXPECT_EQ(1, infos_.size());
93*1a96fba6SXin Li }
94*1a96fba6SXin Li 
TEST_F(AsynchronousSignalHandlerTest,CheckMultipleSignal)95*1a96fba6SXin Li TEST_F(AsynchronousSignalHandlerTest, CheckMultipleSignal) {
96*1a96fba6SXin Li   const uint8_t NB_SIGNALS = 5;
97*1a96fba6SXin Li   handler_.RegisterHandler(
98*1a96fba6SXin Li       SIGCHLD,
99*1a96fba6SXin Li       base::Bind(&AsynchronousSignalHandlerTest::RecordInfoAndQuit,
100*1a96fba6SXin Li                  base::Unretained(this),
101*1a96fba6SXin Li                  false));
102*1a96fba6SXin Li   EXPECT_EQ(0, infos_.size());
103*1a96fba6SXin Li   for (int i = 0; i < NB_SIGNALS; ++i) {
104*1a96fba6SXin Li     EXPECT_EQ(0, kill(getpid(), SIGCHLD));
105*1a96fba6SXin Li 
106*1a96fba6SXin Li     // Spin the message loop.
107*1a96fba6SXin Li     MessageLoop::current()->Run();
108*1a96fba6SXin Li   }
109*1a96fba6SXin Li 
110*1a96fba6SXin Li   ASSERT_EQ(NB_SIGNALS, infos_.size());
111*1a96fba6SXin Li   for (int i = 0; i < NB_SIGNALS; ++i) {
112*1a96fba6SXin Li     EXPECT_EQ(SIGCHLD, infos_[i].ssi_signo);
113*1a96fba6SXin Li   }
114*1a96fba6SXin Li }
115*1a96fba6SXin Li 
116*1a96fba6SXin Li // TODO(crbug/1011829): This test is flaky.
117*1a96fba6SXin Li #if 0
118*1a96fba6SXin Li TEST_F(AsynchronousSignalHandlerTest, CheckChld) {
119*1a96fba6SXin Li   handler_.RegisterHandler(
120*1a96fba6SXin Li       SIGCHLD,
121*1a96fba6SXin Li       base::Bind(&AsynchronousSignalHandlerTest::RecordInfoAndQuit,
122*1a96fba6SXin Li                  base::Unretained(this),
123*1a96fba6SXin Li                  false));
124*1a96fba6SXin Li   pid_t child_pid = fork();
125*1a96fba6SXin Li   if (child_pid == 0) {
126*1a96fba6SXin Li     _Exit(EXIT_SUCCESS);
127*1a96fba6SXin Li   }
128*1a96fba6SXin Li 
129*1a96fba6SXin Li   EXPECT_EQ(0, infos_.size());
130*1a96fba6SXin Li   // Spin the message loop.
131*1a96fba6SXin Li   MessageLoop::current()->Run();
132*1a96fba6SXin Li 
133*1a96fba6SXin Li   ASSERT_EQ(1, infos_.size());
134*1a96fba6SXin Li   EXPECT_EQ(SIGCHLD, infos_[0].ssi_signo);
135*1a96fba6SXin Li   EXPECT_EQ(child_pid, infos_[0].ssi_pid);
136*1a96fba6SXin Li   EXPECT_EQ(static_cast<int>(CLD_EXITED), infos_[0].ssi_code);
137*1a96fba6SXin Li   EXPECT_EQ(EXIT_SUCCESS, infos_[0].ssi_status);
138*1a96fba6SXin Li }
139*1a96fba6SXin Li #endif
140*1a96fba6SXin Li 
141*1a96fba6SXin Li }  // namespace brillo
142