dia 1.5.pre.2 → 1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.md +3 -4
- data/README.md +26 -0
- data/lib/dia.rb +1 -1
- data/lib/dia/sandbox.rb +18 -6
- data/test/suite/exception()_test.rb +55 -0
- data/test/suite/exception_raised?_test.rb +22 -0
- data/test/suite/exceptions_test.rb +12 -0
- metadata +11 -13
- data/test/suite/exceptions_text.rb +0 -41
data/NEWS.md
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
## NEWS
|
2
2
|
|
3
3
|
### 1.5
|
4
|
-
* Added Dia::Sandbox#
|
5
|
-
|
4
|
+
* Added Dia::Sandbox#exit_status()
|
5
|
+
* Added Dia::Sandbox#exception_raised?().
|
6
|
+
* Added Dia::Sandbox#exception()
|
6
7
|
* Fixed a small bug introduced in 1.5.pre - a typo, only encountered if
|
7
8
|
Dia::SandboxException was raised.
|
8
9
|
* Dia::Sandbox#running?, Dia::Sandbox#exit_status, and Dia::Sandbox#terminate
|
9
10
|
will return nil if you call them before calling Dia::Sandbox#run().
|
10
|
-
* Added Dia::Sandbox#exit_status for collecting the exit status of a child
|
11
|
-
process running under a sandbox.
|
12
11
|
* Dia::Sandbox#run was not returning the PID of the process running under a
|
13
12
|
sandbox like told in the documentation - it is now.
|
14
13
|
|
data/README.md
CHANGED
@@ -121,6 +121,32 @@ capturing it so Dia can forward the exception to the parent process.
|
|
121
121
|
|
122
122
|
puts sandbox.exception().class # prints "RuntimeError"
|
123
123
|
|
124
|
+
**Checking if an exception has been raised in a sandbox**
|
125
|
+
|
126
|
+
Since 1.5, Sandbox#exception_raised?() is available for checking if a block of
|
127
|
+
ruby code running under a sandbox has raised an exception.
|
128
|
+
|
129
|
+
require 'rubygems'
|
130
|
+
require 'dia'
|
131
|
+
|
132
|
+
require 'rubygems'
|
133
|
+
require 'dia'
|
134
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
135
|
+
raise()
|
136
|
+
end
|
137
|
+
|
138
|
+
sandbox.run()
|
139
|
+
sleep(0.1) # Let the parent receive the exception.
|
140
|
+
# Only neccesary for scenarios where an exception is raised
|
141
|
+
# rather quickly.
|
142
|
+
|
143
|
+
sandbox.exception_raised?() # => true
|
144
|
+
|
145
|
+
`#exception()` & `#exception_raised?()` can only be applied to Ruby blocks. For
|
146
|
+
the 2.0 release, a redesign is planned that will fix this issue, as well as
|
147
|
+
data encapsulation issues(ie: @app shouldn't belong to a class that doesn't make
|
148
|
+
use of it, which is the case if you're sandboxing a ruby block).
|
149
|
+
|
124
150
|
.. Please see the yardoc [documentation](http://yardoc.org/docs/robgleeson-Dia) for more in-depth coverage of these methods,
|
125
151
|
in particular the documentation for the `Dia::Sandbox` class.
|
126
152
|
|
data/lib/dia.rb
CHANGED
data/lib/dia/sandbox.rb
CHANGED
@@ -53,8 +53,21 @@ module Dia
|
|
53
53
|
initialize_streams()
|
54
54
|
end
|
55
55
|
|
56
|
-
# The
|
57
|
-
#
|
56
|
+
# The #exception_raised?() method returns true if an exception has been
|
57
|
+
# raised in the last call to #run(), and false otherwise.
|
58
|
+
#
|
59
|
+
# @return [Boolean] Returns true or false.
|
60
|
+
# @since 1.5
|
61
|
+
def exception_raised?()
|
62
|
+
!!exception()
|
63
|
+
end
|
64
|
+
|
65
|
+
# The exception() method returns the last exception raised after a
|
66
|
+
# a call to #run(), or nil.
|
67
|
+
#
|
68
|
+
# Every call to #run() resets the variable storing the exception object
|
69
|
+
# to nil, and it will only be a non-nil value if the last call to #run()
|
70
|
+
# raised an exception.
|
58
71
|
#
|
59
72
|
# This method can be used if you need access(from the parent process)
|
60
73
|
# to an exception raised in your sandbox.
|
@@ -70,13 +83,11 @@ module Dia
|
|
70
83
|
def exception()
|
71
84
|
@write.close()
|
72
85
|
if @read.ready?()
|
73
|
-
|
74
|
-
else
|
75
|
-
ret = nil
|
86
|
+
@e = Marshal.load(@read.readlines().join())
|
76
87
|
end
|
77
88
|
@read.close()
|
78
89
|
initialize_streams()
|
79
|
-
|
90
|
+
@e
|
80
91
|
end
|
81
92
|
|
82
93
|
# The run method will spawn a child process and run the application _or_
|
@@ -102,6 +113,7 @@ module Dia
|
|
102
113
|
# @return [Fixnum] The Process ID(PID) that the sandboxed
|
103
114
|
# application is being run under.
|
104
115
|
def run(*args)
|
116
|
+
@e = nil
|
105
117
|
initialize_streams()
|
106
118
|
@pid = fork do
|
107
119
|
begin
|
@@ -0,0 +1,55 @@
|
|
1
|
+
BareTest.suite('Dia::Sandbox#exception()') do
|
2
|
+
assert('#exception() will return an exception raised in the sandbox') do
|
3
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
4
|
+
raise()
|
5
|
+
end
|
6
|
+
|
7
|
+
sandbox.run()
|
8
|
+
sleep(0.1)
|
9
|
+
equal(RuntimeError, sandbox.exception.class())
|
10
|
+
end
|
11
|
+
|
12
|
+
assert('#exception() returns nil if called before ' \
|
13
|
+
'Dia::Sandbox#run()') do
|
14
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
15
|
+
# ...
|
16
|
+
end
|
17
|
+
equal(nil, sandbox.exception())
|
18
|
+
end
|
19
|
+
|
20
|
+
assert('#exception() returns an exception object the first' \
|
21
|
+
' and second time it is called after a single call to #run()') do
|
22
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
23
|
+
raise()
|
24
|
+
end
|
25
|
+
|
26
|
+
sandbox.run()
|
27
|
+
sleep(0.1)
|
28
|
+
equal(RuntimeError, sandbox.exception().class)
|
29
|
+
equal(RuntimeError, sandbox.exception().class)
|
30
|
+
end
|
31
|
+
|
32
|
+
assert('#exception() will be set to nil after the first call to ' \
|
33
|
+
'#run raises an exception, and the second does not') do
|
34
|
+
|
35
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
36
|
+
raise()
|
37
|
+
end
|
38
|
+
|
39
|
+
sandbox.run()
|
40
|
+
sleep(0.1)
|
41
|
+
equal(RuntimeError, sandbox.exception().class)
|
42
|
+
sandbox.instance_variable_set("@blk", proc { })
|
43
|
+
sandbox.run()
|
44
|
+
equal(nil, sandbox.exception())
|
45
|
+
end
|
46
|
+
|
47
|
+
assert('#exception() can marshal data containing one or more \n') do
|
48
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
49
|
+
fork {}
|
50
|
+
end
|
51
|
+
sandbox.run()
|
52
|
+
sleep(0.5)
|
53
|
+
equal(Errno::EPERM, sandbox.exception().class)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
BareTest.suite('Dia::Sandbox#exception_raised?()',
|
2
|
+
:tags => [ :exception_raised] ) do
|
3
|
+
assert('#exception_raised?() returns false when no exception has been ' \
|
4
|
+
'raised') do
|
5
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
6
|
+
# ...
|
7
|
+
end
|
8
|
+
sandbox.run()
|
9
|
+
sleep(0.1)
|
10
|
+
equal(false, sandbox.exception_raised?())
|
11
|
+
end
|
12
|
+
|
13
|
+
assert('#exception_raised?() returns true when an exception has been ' \
|
14
|
+
'raised') do
|
15
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
16
|
+
raise(StandardError, 'Exception')
|
17
|
+
end
|
18
|
+
sandbox.run()
|
19
|
+
sleep(0.1)
|
20
|
+
equal(true, sandbox.exception_raised?())
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
BareTest.suite('Exceptions', :tags => [ :sandbox_init_exception ]) do
|
2
|
+
assert('Dia::SandboxException is raised if a call to sandbox_init() fails') do
|
3
|
+
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
4
|
+
# ...
|
5
|
+
end
|
6
|
+
sandbox.instance_variable_set("@profile", "i am going to break")
|
7
|
+
sandbox.run
|
8
|
+
sleep(0.1)
|
9
|
+
equal(Dia::SandboxException, sandbox.exception().class)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
metadata
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 5
|
8
|
-
|
9
|
-
- 2
|
10
|
-
version: 1.5.pre.2
|
8
|
+
version: "1.5"
|
11
9
|
platform: ruby
|
12
10
|
authors:
|
13
11
|
- Robert Gleeson
|
@@ -15,7 +13,7 @@ autorequire:
|
|
15
13
|
bindir: bin
|
16
14
|
cert_chain: []
|
17
15
|
|
18
|
-
date: 2010-05-
|
16
|
+
date: 2010-05-10 00:00:00 +01:00
|
19
17
|
default_executable:
|
20
18
|
dependencies:
|
21
19
|
- !ruby/object:Gem::Dependency
|
@@ -80,11 +78,11 @@ files:
|
|
80
78
|
- lib/dia.rb
|
81
79
|
- .yardopts
|
82
80
|
- LICENSE
|
83
|
-
has_rdoc:
|
81
|
+
has_rdoc: true
|
84
82
|
homepage:
|
85
83
|
licenses: []
|
86
84
|
|
87
|
-
post_install_message: " ********************************************************************\n Dia (1.5
|
85
|
+
post_install_message: " ********************************************************************\n Dia (1.5)\n \n Thanks for installing Dia, 1.5! \n \n Keep up with the latest @ GitHub:\n http://github.com/robgleeson/dia\n ********************************************************************\n"
|
88
86
|
rdoc_options: []
|
89
87
|
|
90
88
|
require_paths:
|
@@ -98,13 +96,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
96
|
version: "0"
|
99
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
98
|
requirements:
|
101
|
-
- - "
|
99
|
+
- - ">="
|
102
100
|
- !ruby/object:Gem::Version
|
103
101
|
segments:
|
104
|
-
-
|
105
|
-
|
106
|
-
- 1
|
107
|
-
version: 1.3.1
|
102
|
+
- 0
|
103
|
+
version: "0"
|
108
104
|
requirements: []
|
109
105
|
|
110
106
|
rubyforge_project:
|
@@ -115,7 +111,9 @@ summary: Dia allows you to sandbox application(s) or block(s) of rubyon the OSX
|
|
115
111
|
test_files:
|
116
112
|
- test/setup.rb
|
117
113
|
- test/suite/check_if_sandbox_is_alive_test.rb
|
118
|
-
- test/suite/
|
114
|
+
- test/suite/exception()_test.rb
|
115
|
+
- test/suite/exception_raised?_test.rb
|
116
|
+
- test/suite/exceptions_test.rb
|
119
117
|
- test/suite/exit_status_test.rb
|
120
118
|
- test/suite/passing_parameters_to_constructer_test.rb
|
121
119
|
- test/suite/run_block_in_sandbox_test.rb
|
@@ -1,41 +0,0 @@
|
|
1
|
-
BareTest.suite('Exceptions', :tags => [ :exception ]) do
|
2
|
-
assert('Dia::SandboxException is raised if a call to sandbox_init() fails') do
|
3
|
-
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
4
|
-
# ...
|
5
|
-
end
|
6
|
-
sandbox.instance_variable_set("@profile", "i am going to break")
|
7
|
-
sandbox.run
|
8
|
-
sleep(0.1)
|
9
|
-
equal(Dia::SandboxException, sandbox.exception().class)
|
10
|
-
end
|
11
|
-
|
12
|
-
assert('Dia::Sandbox#exception() will return an exception raised in the sandbox') do
|
13
|
-
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
14
|
-
raise()
|
15
|
-
end
|
16
|
-
|
17
|
-
sandbox.run()
|
18
|
-
sleep(0.1)
|
19
|
-
equal(RuntimeError, sandbox.exception.class())
|
20
|
-
end
|
21
|
-
|
22
|
-
assert('Dia::Sandbox#exception() returns nil if called before ' \
|
23
|
-
'Dia::Sandbox#run()') do
|
24
|
-
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
25
|
-
# ...
|
26
|
-
end
|
27
|
-
equal(nil, sandbox.exception())
|
28
|
-
end
|
29
|
-
|
30
|
-
assert('Dia::Sandbox#exception() returns nil after a second call') do
|
31
|
-
sandbox = Dia::Sandbox.new(Dia::Profiles::NO_OS_SERVICES) do
|
32
|
-
raise()
|
33
|
-
end
|
34
|
-
|
35
|
-
sandbox.run()
|
36
|
-
sleep(0.1)
|
37
|
-
equal(RuntimeError, sandbox.exception().class)
|
38
|
-
equal(nil, sandbox.exception())
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|