1*5a923131SAndroid Build Coastguard Worker //
2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2012 The Android Open Source Project
3*5a923131SAndroid Build Coastguard Worker //
4*5a923131SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*5a923131SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*5a923131SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*5a923131SAndroid Build Coastguard Worker //
8*5a923131SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
9*5a923131SAndroid Build Coastguard Worker //
10*5a923131SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*5a923131SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*5a923131SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5a923131SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*5a923131SAndroid Build Coastguard Worker // limitations under the License.
15*5a923131SAndroid Build Coastguard Worker //
16*5a923131SAndroid Build Coastguard Worker
17*5a923131SAndroid Build Coastguard Worker #include "update_engine/common/terminator.h"
18*5a923131SAndroid Build Coastguard Worker
19*5a923131SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*5a923131SAndroid Build Coastguard Worker #include <gtest/gtest-spi.h>
21*5a923131SAndroid Build Coastguard Worker
22*5a923131SAndroid Build Coastguard Worker using testing::ExitedWithCode;
23*5a923131SAndroid Build Coastguard Worker
24*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine {
25*5a923131SAndroid Build Coastguard Worker
26*5a923131SAndroid Build Coastguard Worker class TerminatorTest : public ::testing::Test {
27*5a923131SAndroid Build Coastguard Worker protected:
SetUp()28*5a923131SAndroid Build Coastguard Worker void SetUp() override {
29*5a923131SAndroid Build Coastguard Worker Terminator::Init();
30*5a923131SAndroid Build Coastguard Worker ASSERT_FALSE(Terminator::exit_blocked());
31*5a923131SAndroid Build Coastguard Worker ASSERT_FALSE(Terminator::exit_requested());
32*5a923131SAndroid Build Coastguard Worker }
TearDown()33*5a923131SAndroid Build Coastguard Worker void TearDown() override {
34*5a923131SAndroid Build Coastguard Worker // Makes sure subsequent non-Terminator tests don't get accidentally
35*5a923131SAndroid Build Coastguard Worker // terminated.
36*5a923131SAndroid Build Coastguard Worker Terminator::Init();
37*5a923131SAndroid Build Coastguard Worker }
38*5a923131SAndroid Build Coastguard Worker };
39*5a923131SAndroid Build Coastguard Worker
40*5a923131SAndroid Build Coastguard Worker typedef TerminatorTest TerminatorDeathTest;
41*5a923131SAndroid Build Coastguard Worker
42*5a923131SAndroid Build Coastguard Worker namespace {
UnblockExitThroughUnblocker()43*5a923131SAndroid Build Coastguard Worker void UnblockExitThroughUnblocker() {
44*5a923131SAndroid Build Coastguard Worker ScopedTerminatorExitUnblocker unblocker = ScopedTerminatorExitUnblocker();
45*5a923131SAndroid Build Coastguard Worker }
46*5a923131SAndroid Build Coastguard Worker
RaiseSIGTERM()47*5a923131SAndroid Build Coastguard Worker void RaiseSIGTERM() {
48*5a923131SAndroid Build Coastguard Worker ASSERT_EXIT(raise(SIGTERM), ExitedWithCode(2), "");
49*5a923131SAndroid Build Coastguard Worker }
50*5a923131SAndroid Build Coastguard Worker } // namespace
51*5a923131SAndroid Build Coastguard Worker
TEST_F(TerminatorTest,HandleSignalTest)52*5a923131SAndroid Build Coastguard Worker TEST_F(TerminatorTest, HandleSignalTest) {
53*5a923131SAndroid Build Coastguard Worker Terminator::set_exit_blocked(true);
54*5a923131SAndroid Build Coastguard Worker Terminator::HandleSignal(SIGTERM);
55*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(Terminator::exit_requested());
56*5a923131SAndroid Build Coastguard Worker }
57*5a923131SAndroid Build Coastguard Worker
TEST_F(TerminatorTest,ScopedTerminatorExitUnblockerTest)58*5a923131SAndroid Build Coastguard Worker TEST_F(TerminatorTest, ScopedTerminatorExitUnblockerTest) {
59*5a923131SAndroid Build Coastguard Worker Terminator::set_exit_blocked(true);
60*5a923131SAndroid Build Coastguard Worker ASSERT_TRUE(Terminator::exit_blocked());
61*5a923131SAndroid Build Coastguard Worker ASSERT_FALSE(Terminator::exit_requested());
62*5a923131SAndroid Build Coastguard Worker UnblockExitThroughUnblocker();
63*5a923131SAndroid Build Coastguard Worker ASSERT_FALSE(Terminator::exit_blocked());
64*5a923131SAndroid Build Coastguard Worker ASSERT_FALSE(Terminator::exit_requested());
65*5a923131SAndroid Build Coastguard Worker }
66*5a923131SAndroid Build Coastguard Worker
TEST_F(TerminatorDeathTest,ExitTest)67*5a923131SAndroid Build Coastguard Worker TEST_F(TerminatorDeathTest, ExitTest) {
68*5a923131SAndroid Build Coastguard Worker ASSERT_EXIT(Terminator::Exit(), ExitedWithCode(2), "");
69*5a923131SAndroid Build Coastguard Worker Terminator::set_exit_blocked(true);
70*5a923131SAndroid Build Coastguard Worker ASSERT_EXIT(Terminator::Exit(), ExitedWithCode(2), "");
71*5a923131SAndroid Build Coastguard Worker }
72*5a923131SAndroid Build Coastguard Worker
TEST_F(TerminatorDeathTest,RaiseSignalTest)73*5a923131SAndroid Build Coastguard Worker TEST_F(TerminatorDeathTest, RaiseSignalTest) {
74*5a923131SAndroid Build Coastguard Worker RaiseSIGTERM();
75*5a923131SAndroid Build Coastguard Worker Terminator::set_exit_blocked(true);
76*5a923131SAndroid Build Coastguard Worker EXPECT_FATAL_FAILURE(RaiseSIGTERM(), "");
77*5a923131SAndroid Build Coastguard Worker }
78*5a923131SAndroid Build Coastguard Worker
TEST_F(TerminatorDeathTest,ScopedTerminatorExitUnblockerExitTest)79*5a923131SAndroid Build Coastguard Worker TEST_F(TerminatorDeathTest, ScopedTerminatorExitUnblockerExitTest) {
80*5a923131SAndroid Build Coastguard Worker Terminator::set_exit_blocked(true);
81*5a923131SAndroid Build Coastguard Worker Terminator::exit_requested_ = 1;
82*5a923131SAndroid Build Coastguard Worker ASSERT_EXIT(UnblockExitThroughUnblocker(), ExitedWithCode(2), "");
83*5a923131SAndroid Build Coastguard Worker }
84*5a923131SAndroid Build Coastguard Worker
85*5a923131SAndroid Build Coastguard Worker } // namespace chromeos_update_engine
86