this repo has no description
at trunk 120 lines 4.6 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "under-signal-module.h" 3 4#include <signal.h> 5 6#include "gtest/gtest.h" 7 8#include "builtins.h" 9#include "os.h" 10#include "runtime.h" 11#include "test-utils.h" 12 13namespace py { 14namespace testing { 15 16using UnderSignalModuleTest = RuntimeFixture; 17 18TEST_F(UnderSignalModuleTest, DefaultIntHandlerRaisesKeyboardInterrupt) { 19 EXPECT_TRUE(raised(runBuiltin(FUNC(_signal, default_int_handler)), 20 LayoutId::kKeyboardInterrupt)); 21} 22 23TEST_F(UnderSignalModuleTest, GetsignalWithNegativeRaisesValueError) { 24 HandleScope scope(thread_); 25 Object signum(&scope, SmallInt::fromWord(-1)); 26 EXPECT_TRUE(raisedWithStr(runBuiltin(FUNC(_signal, getsignal), signum), 27 LayoutId::kValueError, 28 "signal number out of range")); 29} 30 31TEST_F(UnderSignalModuleTest, GetsignalWithLargeNumberRaisesValueError) { 32 HandleScope scope(thread_); 33 Object signum(&scope, SmallInt::fromWord(128)); 34 EXPECT_TRUE(raisedWithStr(runBuiltin(FUNC(_signal, getsignal), signum), 35 LayoutId::kValueError, 36 "signal number out of range")); 37} 38 39TEST_F(UnderSignalModuleTest, GetsignalWithSigintReturnsCallback) { 40 HandleScope scope(thread_); 41 Object signum(&scope, SmallInt::fromWord(SIGINT)); 42 Object callback(&scope, runBuiltin(FUNC(_signal, getsignal), signum)); 43 EXPECT_EQ(callback, 44 moduleAtByCStr(runtime_, "_signal", "default_int_handler")); 45} 46 47TEST_F(UnderSignalModuleTest, TestNsigMatchesOS) { 48 HandleScope scope(thread_); 49 ASSERT_FALSE(runFromCStr(runtime_, "import _signal").isError()); 50 Object nsig(&scope, moduleAtByCStr(runtime_, "_signal", "NSIG")); 51 ASSERT_TRUE(nsig.isSmallInt()); 52 ASSERT_EQ(SmallInt::cast(*nsig).value(), OS::kNumSignals); 53} 54 55TEST_F(UnderSignalModuleTest, TestSigDflExists) { 56 HandleScope scope(thread_); 57 ASSERT_FALSE(runFromCStr(runtime_, "import _signal").isError()); 58 Object sig_dfl(&scope, moduleAtByCStr(runtime_, "_signal", "SIG_DFL")); 59 ASSERT_TRUE(sig_dfl.isSmallInt()); 60 ASSERT_EQ(SmallInt::cast(*sig_dfl).value(), reinterpret_cast<word>(SIG_DFL)); 61} 62 63TEST_F(UnderSignalModuleTest, TestSigIgnExists) { 64 HandleScope scope(thread_); 65 ASSERT_FALSE(runFromCStr(runtime_, "import _signal").isError()); 66 Object sig_dfl(&scope, moduleAtByCStr(runtime_, "_signal", "SIG_IGN")); 67 ASSERT_TRUE(sig_dfl.isSmallInt()); 68 ASSERT_EQ(SmallInt::cast(*sig_dfl).value(), reinterpret_cast<word>(SIG_IGN)); 69} 70 71TEST_F(UnderSignalModuleTest, TestSigintExists) { 72 HandleScope scope(thread_); 73 ASSERT_FALSE(runFromCStr(runtime_, "import _signal").isError()); 74 Object sigint(&scope, moduleAtByCStr(runtime_, "_signal", "SIGINT")); 75 ASSERT_TRUE(sigint.isSmallInt()); 76 EXPECT_TRUE(isIntEqualsWord(*sigint, SIGINT)); 77} 78 79TEST_F(UnderSignalModuleTest, SignalWithNegativeRaisesValueError) { 80 HandleScope scope(thread_); 81 Object signum(&scope, SmallInt::fromWord(-1)); 82 Object callback(&scope, kDefaultHandler); 83 EXPECT_TRUE(raised(runBuiltin(FUNC(_signal, signal), signum, callback), 84 LayoutId::kValueError)); 85} 86 87TEST_F(UnderSignalModuleTest, SignalWithLargeNumberRaisesValueError) { 88 HandleScope scope(thread_); 89 Object signum(&scope, SmallInt::fromWord(128)); 90 Object callback(&scope, kIgnoreHandler); 91 EXPECT_TRUE(raisedWithStr(runBuiltin(FUNC(_signal, signal), signum, callback), 92 LayoutId::kValueError, 93 "signal number out of range")); 94} 95 96TEST_F(UnderSignalModuleTest, SignalWithInvalidCallbackRaisesTypeError) { 97 HandleScope scope(thread_); 98 Object signum(&scope, SmallInt::fromWord(SIGINT)); 99 Object callback(&scope, runtime_->emptyTuple()); 100 EXPECT_TRUE(raisedWithStr(runBuiltin(FUNC(_signal, signal), signum, callback), 101 LayoutId::kTypeError, 102 "signal handler must be signal.SIG_IGN, " 103 "signal.SIG_DFL, or a callable object")); 104} 105 106TEST_F(UnderSignalModuleTest, SignalSetsSignalCallback) { 107 HandleScope scope(thread_); 108 Object signum(&scope, SmallInt::fromWord(SIGINT)); 109 Object sig_ign(&scope, kIgnoreHandler); 110 Object old_callback(&scope, 111 runBuiltin(FUNC(_signal, signal), signum, sig_ign)); 112 Object new_callback(&scope, runBuiltin(FUNC(_signal, getsignal), signum)); 113 EXPECT_EQ(new_callback, sig_ign); 114 115 ASSERT_FALSE(runBuiltin(FUNC(_signal, signal), signum, old_callback) 116 .isErrorException()); 117} 118 119} // namespace testing 120} // namespace py