1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
require File.expand_path('../../../spec_helper', __FILE__)
ruby_version_is "2.4" do
describe "Thread.report_on_exception" do
it "defaults to false" do
ruby_exe("p Thread.report_on_exception").should == "false\n"
end
end
describe "Thread.report_on_exception=" do
before :each do
@report_on_exception = Thread.report_on_exception
end
after :each do
Thread.report_on_exception = @report_on_exception
end
it "changes the default value for new threads" do
Thread.report_on_exception = true
Thread.report_on_exception.should == true
t = Thread.new {}
t.join
t.report_on_exception.should == true
end
end
describe "Thread#report_on_exception" do
it "returns whether the Thread will print a backtrace if it exits with an exception" do
t = Thread.new { Thread.current.report_on_exception = true }
t.join
t.report_on_exception.should == true
t = Thread.new { Thread.current.report_on_exception = false }
t.join
t.report_on_exception.should == false
end
end
describe "Thread#report_on_exception=" do
describe "when set to true" do
it "prints a backtrace on $stderr if it terminates with an exception" do
t = nil
-> {
t = Thread.new {
Thread.current.report_on_exception = true
raise RuntimeError, "Thread#report_on_exception specs"
}
Thread.pass while t.alive?
}.should output("", /Thread.+terminated with exception.+Thread#report_on_exception specs/m)
-> {
t.join
}.should raise_error(RuntimeError, "Thread#report_on_exception specs")
end
end
describe "when set to false" do
it "lets the thread terminates silently with an exception" do
t = nil
-> {
t = Thread.new {
Thread.current.report_on_exception = false
raise RuntimeError, "Thread#report_on_exception specs"
}
Thread.pass while t.alive?
}.should output("", "")
-> {
t.join
}.should raise_error(RuntimeError, "Thread#report_on_exception specs")
end
end
ruby_bug "#13163", "2.4"..."2.5" do
describe "when used in conjunction with Thread#abort_on_exception" do
it "first reports then send the exception back to the main Thread" do
t = nil
mutex = Mutex.new
mutex.lock
-> {
t = Thread.new {
Thread.current.abort_on_exception = true
Thread.current.report_on_exception = true
mutex.lock
mutex.unlock
raise RuntimeError, "Thread#report_on_exception specs"
}
-> {
mutex.sleep(5)
}.should raise_error(RuntimeError, "Thread#report_on_exception specs")
}.should output("", /Thread.+terminated with exception.+Thread#report_on_exception specs/m)
-> {
t.join
}.should raise_error(RuntimeError, "Thread#report_on_exception specs")
end
end
end
end
end
|