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