this repo has no description
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