1 /* 2 * Copyright (C) 2016 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 "android-base/quick_exit.h" 18 19 #include <gtest/gtest.h> 20 21 #include <errno.h> 22 #include <fcntl.h> 23 #include <unistd.h> 24 25 #include <string> 26 27 #include "android-base/test_utils.h" 28 29 // These tests are a bit sketchy, since each test run adds global state that affects subsequent 30 // tests (including ones not in this file!). Exit with 0 in Exiter and stick the at_quick_exit test 31 // at the end to hack around this. 32 struct Exiter { 33 ~Exiter() { 34 _Exit(0); 35 } 36 }; 37 38 TEST(quick_exit, smoke) { 39 ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(123), ""); 40 } 41 42 TEST(quick_exit, skip_static_destructors) { 43 static Exiter exiter; 44 ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(123), ""); 45 } 46 47 TEST(quick_exit, at_quick_exit) { 48 static int counter = 4; 49 // "Functions passed to at_quick_exit are called in reverse order of their registration." 50 ASSERT_EQ(0, android::base::at_quick_exit([]() { _exit(counter); })); 51 ASSERT_EQ(0, android::base::at_quick_exit([]() { counter += 2; })); 52 ASSERT_EQ(0, android::base::at_quick_exit([]() { counter *= 10; })); 53 ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(42), ""); 54 } 55