god 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +26 -0
- data/Manifest.txt +15 -1
- data/Rakefile +2 -7
- data/bin/god +104 -16
- data/lib/god.rb +169 -37
- data/lib/god/behaviors/notify_when_flapping.rb +51 -0
- data/lib/god/condition.rb +1 -0
- data/lib/god/conditions/degrading_lambda.rb +47 -0
- data/lib/god/conditions/process_exits.rb +6 -2
- data/lib/god/conditions/tries.rb +33 -0
- data/lib/god/dependency_graph.rb +41 -0
- data/lib/god/errors.rb +6 -0
- data/lib/god/hub.rb +43 -20
- data/lib/god/logger.rb +44 -0
- data/lib/god/process.rb +91 -19
- data/lib/god/registry.rb +4 -0
- data/lib/god/server.rb +12 -2
- data/lib/god/timeline.rb +36 -0
- data/lib/god/watch.rb +27 -8
- data/test/configs/child_events/child_events.god +7 -2
- data/test/configs/child_polls/child_polls.god +3 -1
- data/test/configs/child_polls/simple_server.rb +1 -1
- data/test/configs/daemon_events/daemon_events.god +7 -3
- data/test/configs/daemon_polls/daemon_polls.god +17 -0
- data/test/configs/daemon_polls/simple_server.rb +6 -0
- data/test/configs/degrading_lambda/degrading_lambda.god +33 -0
- data/test/configs/degrading_lambda/tcp_server.rb +15 -0
- data/test/configs/real.rb +1 -1
- data/test/configs/running_load/running_load.god +16 -0
- data/test/configs/stress/simple_server.rb +3 -0
- data/test/configs/stress/stress.god +15 -0
- data/test/configs/test.rb +14 -2
- data/test/helper.rb +12 -2
- data/test/test_conditions_tries.rb +46 -0
- data/test/test_dependency_graph.rb +62 -0
- data/test/test_god.rb +289 -33
- data/test/test_handlers_kqueue_handler.rb +11 -7
- data/test/test_hub.rb +18 -0
- data/test/test_logger.rb +55 -0
- data/test/test_process.rb +135 -17
- data/test/test_registry.rb +2 -1
- data/test/test_server.rb +35 -4
- data/test/test_timeline.rb +14 -2
- data/test/test_watch.rb +7 -0
- metadata +21 -4
- data/lib/god/conditions/timeline.rb +0 -17
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class TestDependencyGraph < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@dg = DependencyGraph.new
|
6
|
+
end
|
7
|
+
|
8
|
+
# new
|
9
|
+
|
10
|
+
def test_new_should_accept_zero_arguments
|
11
|
+
assert @dg.instance_of?(DependencyGraph)
|
12
|
+
end
|
13
|
+
|
14
|
+
# add
|
15
|
+
|
16
|
+
def test_add_should_create_and_store_two_new_nodes
|
17
|
+
@dg.add('foo', 'bar')
|
18
|
+
assert_equal 2, @dg.nodes.size
|
19
|
+
assert @dg.nodes['foo'].instance_of?(DependencyGraph::Node)
|
20
|
+
assert @dg.nodes['bar'].instance_of?(DependencyGraph::Node)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_add_should_record_dependency
|
24
|
+
@dg.add('foo', 'bar')
|
25
|
+
assert_equal 1, @dg.nodes['foo'].dependencies.size
|
26
|
+
assert_equal @dg.nodes['bar'], @dg.nodes['foo'].dependencies.first
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_add_should_ignore_dups
|
30
|
+
@dg.add('foo', 'bar')
|
31
|
+
@dg.add('foo', 'bar')
|
32
|
+
assert_equal 2, @dg.nodes.size
|
33
|
+
assert_equal 1, @dg.nodes['foo'].dependencies.size
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
class TestDependencyGraphNode < Test::Unit::TestCase
|
39
|
+
def setup
|
40
|
+
@foo = DependencyGraph::Node.new('foo')
|
41
|
+
@bar = DependencyGraph::Node.new('bar')
|
42
|
+
end
|
43
|
+
|
44
|
+
# new
|
45
|
+
|
46
|
+
def test_new_should_accept_zero_arguments
|
47
|
+
assert @foo.instance_of?(DependencyGraph::Node)
|
48
|
+
end
|
49
|
+
|
50
|
+
# add
|
51
|
+
|
52
|
+
def test_add_should_store_node_as_dependency
|
53
|
+
@foo.add(@bar)
|
54
|
+
assert_equal 1, @foo.dependencies.size
|
55
|
+
end
|
56
|
+
|
57
|
+
# has_node?
|
58
|
+
|
59
|
+
def test_has_node
|
60
|
+
assert @foo.has_node?(@foo)
|
61
|
+
end
|
62
|
+
end
|
data/test/test_god.rb
CHANGED
@@ -3,6 +3,8 @@ require File.dirname(__FILE__) + '/helper'
|
|
3
3
|
class TestGod < Test::Unit::TestCase
|
4
4
|
def setup
|
5
5
|
Server.stubs(:new).returns(true)
|
6
|
+
God.stubs(:setup).returns(true)
|
7
|
+
God.stubs(:validater).returns(true)
|
6
8
|
God.reset
|
7
9
|
end
|
8
10
|
|
@@ -17,18 +19,23 @@ class TestGod < Test::Unit::TestCase
|
|
17
19
|
assert_equal Hash.new, God.watches
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
22
|
+
def test_init_should_abort_if_called_after_watch
|
23
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
24
|
+
|
25
|
+
assert_abort do
|
26
|
+
God.init { }
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
30
|
# pid_file_directory
|
26
31
|
|
27
32
|
def test_pid_file_directory_should_return_default_if_not_set_explicitly
|
33
|
+
God.init
|
28
34
|
assert_equal '/var/run/god', God.pid_file_directory
|
29
35
|
end
|
30
36
|
|
31
37
|
def test_pid_file_directory_equals_should_set
|
38
|
+
God.init
|
32
39
|
God.pid_file_directory = '/foo'
|
33
40
|
assert_equal '/foo', God.pid_file_directory
|
34
41
|
end
|
@@ -37,7 +44,11 @@ class TestGod < Test::Unit::TestCase
|
|
37
44
|
|
38
45
|
def test_watch_should_get_stored
|
39
46
|
watch = nil
|
40
|
-
God.watch
|
47
|
+
God.watch do |w|
|
48
|
+
w.name = 'foo'
|
49
|
+
w.start = 'bar'
|
50
|
+
watch = w
|
51
|
+
end
|
41
52
|
|
42
53
|
assert_equal 1, God.watches.size
|
43
54
|
assert_equal watch, God.watches.values.first
|
@@ -45,71 +56,148 @@ class TestGod < Test::Unit::TestCase
|
|
45
56
|
assert_equal 0, God.groups.size
|
46
57
|
end
|
47
58
|
|
59
|
+
def test_watch_should_get_stored_in_pending_watches
|
60
|
+
watch = nil
|
61
|
+
God.watch do |w|
|
62
|
+
w.name = 'foo'
|
63
|
+
w.start = 'bar'
|
64
|
+
watch = w
|
65
|
+
end
|
66
|
+
|
67
|
+
assert_equal 1, God.pending_watches.size
|
68
|
+
assert_equal watch, God.pending_watches.first
|
69
|
+
end
|
70
|
+
|
48
71
|
def test_watch_should_register_processes
|
49
72
|
assert_nil God.registry['foo']
|
50
|
-
God.watch
|
73
|
+
God.watch do |w|
|
74
|
+
w.name = 'foo'
|
75
|
+
w.start = 'bar'
|
76
|
+
end
|
51
77
|
assert_kind_of God::Process, God.registry['foo']
|
52
78
|
end
|
53
79
|
|
54
80
|
def test_watch_should_get_stored_by_group
|
81
|
+
a = nil
|
82
|
+
|
55
83
|
God.watch do |w|
|
84
|
+
a = w
|
56
85
|
w.name = 'foo'
|
86
|
+
w.start = 'bar'
|
57
87
|
w.group = 'test'
|
58
88
|
end
|
59
89
|
|
60
|
-
assert_equal({'test' => [
|
90
|
+
assert_equal({'test' => [a]}, God.groups)
|
61
91
|
end
|
62
92
|
|
63
93
|
def test_watches_should_get_stored_by_group
|
94
|
+
a = nil
|
95
|
+
b = nil
|
96
|
+
|
64
97
|
God.watch do |w|
|
98
|
+
a = w
|
65
99
|
w.name = 'foo'
|
100
|
+
w.start = 'bar'
|
66
101
|
w.group = 'test'
|
67
102
|
end
|
68
103
|
|
69
104
|
God.watch do |w|
|
105
|
+
b = w
|
70
106
|
w.name = 'bar'
|
107
|
+
w.start = 'baz'
|
71
108
|
w.group = 'test'
|
72
109
|
end
|
73
110
|
|
74
|
-
assert_equal({'test' => [
|
111
|
+
assert_equal({'test' => [a, b]}, God.groups)
|
75
112
|
end
|
76
113
|
|
77
114
|
def test_watch_should_allow_multiple_watches
|
78
|
-
God.watch { |w| w.name = 'foo' }
|
115
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
79
116
|
|
80
117
|
assert_nothing_raised do
|
81
|
-
God.watch { |w| w.name = 'bar' }
|
118
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
82
119
|
end
|
83
120
|
end
|
84
121
|
|
85
122
|
def test_watch_should_disallow_duplicate_watch_names
|
86
|
-
God.watch { |w| w.name = 'foo' }
|
123
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
87
124
|
|
88
125
|
assert_abort do
|
89
|
-
God.watch { |w| w.name = 'foo' }
|
126
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
90
127
|
end
|
91
128
|
end
|
92
129
|
|
93
130
|
def test_watch_should_disallow_identical_watch_and_group_names
|
94
|
-
God.watch { |w| w.name = 'foo'; w.group = 'bar' }
|
131
|
+
God.watch { |w| w.name = 'foo'; w.group = 'bar'; w.start = 'bar' }
|
95
132
|
|
96
133
|
assert_abort do
|
97
|
-
God.watch { |w| w.name = 'bar' }
|
134
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
98
135
|
end
|
99
136
|
end
|
100
137
|
|
101
138
|
def test_watch_should_disallow_identical_watch_and_group_names_other_way
|
102
|
-
God.watch { |w| w.name = 'bar' }
|
139
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
103
140
|
|
104
141
|
assert_abort do
|
105
|
-
God.watch { |w| w.name = 'foo'; w.group = 'bar' }
|
142
|
+
God.watch { |w| w.name = 'foo'; w.group = 'bar'; w.start = 'bar' }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_watch_should_unwatch_new_watch_if_running_and_duplicate_watch
|
147
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
148
|
+
God.running = true
|
149
|
+
|
150
|
+
assert_nothing_raised do
|
151
|
+
no_stdout do
|
152
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# unwatch
|
158
|
+
|
159
|
+
def test_unwatch_should_unmonitor_watch
|
160
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
161
|
+
w = God.watches['bar']
|
162
|
+
w.expects(:unmonitor)
|
163
|
+
God.unwatch(w)
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_unwatch_should_unregister_watch
|
167
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
168
|
+
w = God.watches['bar']
|
169
|
+
w.expects(:unregister!)
|
170
|
+
no_stdout do
|
171
|
+
God.unwatch(w)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_unwatch_should_remove_same_name_watches
|
176
|
+
God.watch { |w| w.name = 'bar'; w.start = 'bar' }
|
177
|
+
w = God.watches['bar']
|
178
|
+
no_stdout do
|
179
|
+
God.unwatch(w)
|
180
|
+
end
|
181
|
+
assert_equal 0, God.watches.size
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_unwatch_should_remove_from_group
|
185
|
+
God.watch do |w|
|
186
|
+
w.name = 'bar'
|
187
|
+
w.start = 'baz'
|
188
|
+
w.group = 'test'
|
189
|
+
end
|
190
|
+
w = God.watches['bar']
|
191
|
+
no_stdout do
|
192
|
+
God.unwatch(w)
|
106
193
|
end
|
194
|
+
assert !God.groups[w.group].include?(w)
|
107
195
|
end
|
108
196
|
|
109
197
|
# control
|
110
198
|
|
111
199
|
def test_control_should_monitor_on_start
|
112
|
-
God.watch { |w| w.name = 'foo' }
|
200
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
113
201
|
|
114
202
|
w = God.watches['foo']
|
115
203
|
w.expects(:monitor)
|
@@ -117,7 +205,7 @@ class TestGod < Test::Unit::TestCase
|
|
117
205
|
end
|
118
206
|
|
119
207
|
def test_control_should_move_to_restart_on_restart
|
120
|
-
God.watch { |w| w.name = 'foo' }
|
208
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
121
209
|
|
122
210
|
w = God.watches['foo']
|
123
211
|
w.expects(:move).with(:restart)
|
@@ -125,7 +213,7 @@ class TestGod < Test::Unit::TestCase
|
|
125
213
|
end
|
126
214
|
|
127
215
|
def test_control_should_unmonitor_and_stop_on_stop
|
128
|
-
God.watch { |w| w.name = 'foo' }
|
216
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
129
217
|
|
130
218
|
w = God.watches['foo']
|
131
219
|
w.expects(:unmonitor).returns(w)
|
@@ -134,7 +222,7 @@ class TestGod < Test::Unit::TestCase
|
|
134
222
|
end
|
135
223
|
|
136
224
|
def test_control_should_unmonitor_on_unmonitor
|
137
|
-
God.watch { |w| w.name = 'foo' }
|
225
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
138
226
|
|
139
227
|
w = God.watches['foo']
|
140
228
|
w.expects(:unmonitor).returns(w)
|
@@ -142,23 +230,152 @@ class TestGod < Test::Unit::TestCase
|
|
142
230
|
end
|
143
231
|
|
144
232
|
def test_control_should_raise_on_invalid_command
|
145
|
-
God.watch { |w| w.name = 'foo' }
|
233
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
146
234
|
|
147
235
|
assert_raise InvalidCommandError do
|
148
236
|
God.control('foo', 'invalid')
|
149
237
|
end
|
150
238
|
end
|
151
239
|
|
152
|
-
|
240
|
+
def test_control_should_operate_on_each_watch_in_group
|
241
|
+
God.watch do |w|
|
242
|
+
w.name = 'foo1'
|
243
|
+
w.start = 'go'
|
244
|
+
w.group = 'bar'
|
245
|
+
end
|
246
|
+
|
247
|
+
God.watch do |w|
|
248
|
+
w.name = 'foo2'
|
249
|
+
w.start = 'go'
|
250
|
+
w.group = 'bar'
|
251
|
+
end
|
252
|
+
|
253
|
+
God.watches['foo1'].expects(:monitor)
|
254
|
+
God.watches['foo2'].expects(:monitor)
|
255
|
+
|
256
|
+
God.control('bar', 'start')
|
257
|
+
end
|
153
258
|
|
154
|
-
|
155
|
-
|
156
|
-
|
259
|
+
# stop_all
|
260
|
+
|
261
|
+
# terminate
|
262
|
+
|
263
|
+
def test_terminate_should_exit
|
264
|
+
God.expects(:exit!).with(0)
|
265
|
+
God.terminate
|
266
|
+
end
|
267
|
+
|
268
|
+
# status
|
269
|
+
|
270
|
+
def test_status_should_show_state
|
271
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
272
|
+
|
273
|
+
w = God.watches['foo']
|
274
|
+
w.state = :up
|
275
|
+
assert_equal({'foo' => {:state => :up}}, God.status)
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_status_should_show_unmonitored_for_nil_state
|
279
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
280
|
+
|
281
|
+
w = God.watches['foo']
|
282
|
+
assert_equal({'foo' => {:state => :unmonitored}}, God.status)
|
283
|
+
end
|
284
|
+
|
285
|
+
# running_load
|
286
|
+
|
287
|
+
def test_running_load_should_eval_code
|
288
|
+
code = <<-EOF
|
289
|
+
God.watch do |w|
|
290
|
+
w.name = 'foo'
|
291
|
+
w.start = 'go'
|
292
|
+
end
|
293
|
+
EOF
|
294
|
+
|
295
|
+
no_stdout do
|
296
|
+
God.running_load(code)
|
297
|
+
end
|
298
|
+
|
299
|
+
assert_equal 1, God.watches.size
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_running_load_should_monitor_new_watches
|
303
|
+
code = <<-EOF
|
304
|
+
God.watch do |w|
|
305
|
+
w.name = 'foo'
|
306
|
+
w.start = 'go'
|
307
|
+
end
|
308
|
+
EOF
|
309
|
+
|
310
|
+
Watch.any_instance.expects(:monitor)
|
311
|
+
no_stdout do
|
312
|
+
God.running_load(code)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_running_load_should_not_monitor_new_watches_with_autostart_false
|
317
|
+
code = <<-EOF
|
318
|
+
God.watch do |w|
|
319
|
+
w.name = 'foo'
|
320
|
+
w.start = 'go'
|
321
|
+
w.autostart = false
|
322
|
+
end
|
323
|
+
EOF
|
324
|
+
|
325
|
+
Watch.any_instance.expects(:monitor).never
|
326
|
+
no_stdout do
|
327
|
+
God.running_load(code)
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_running_load_should_return_array_of_affected_watches
|
332
|
+
code = <<-EOF
|
333
|
+
God.watch do |w|
|
334
|
+
w.name = 'foo'
|
335
|
+
w.start = 'go'
|
336
|
+
end
|
337
|
+
EOF
|
338
|
+
|
339
|
+
w = nil
|
340
|
+
no_stdout do
|
341
|
+
w = God.running_load(code)
|
157
342
|
end
|
343
|
+
assert_equal 1, w.size
|
344
|
+
assert_equal 'foo', w.first.name
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_running_load_should_clear_pending_watches
|
348
|
+
code = <<-EOF
|
349
|
+
God.watch do |w|
|
350
|
+
w.name = 'foo'
|
351
|
+
w.start = 'go'
|
352
|
+
end
|
353
|
+
EOF
|
354
|
+
|
355
|
+
no_stdout do
|
356
|
+
God.running_load(code)
|
357
|
+
end
|
358
|
+
assert_equal 0, God.pending_watches.size
|
359
|
+
end
|
360
|
+
|
361
|
+
# load
|
362
|
+
|
363
|
+
def test_load_should_collect_and_load_globbed_path
|
364
|
+
Dir.expects(:[]).with('/path/to/*.thing').returns(['a', 'b'])
|
365
|
+
Kernel.expects(:load).with('a').once
|
366
|
+
Kernel.expects(:load).with('b').once
|
367
|
+
God.load('/path/to/*.thing')
|
158
368
|
end
|
159
369
|
|
370
|
+
# start
|
371
|
+
|
372
|
+
def test_start_should_kick_off_a_server_instance
|
373
|
+
Server.expects(:new).returns(true)
|
374
|
+
God.start
|
375
|
+
end
|
376
|
+
|
160
377
|
def test_start_should_start_event_handler
|
161
|
-
God.watch { |w| w.name = 'foo' }
|
378
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
162
379
|
Timer.any_instance.expects(:join)
|
163
380
|
EventHandler.expects(:start).once
|
164
381
|
no_stdout do
|
@@ -169,6 +386,7 @@ class TestGod < Test::Unit::TestCase
|
|
169
386
|
def test_start_should_begin_monitoring_autostart_watches
|
170
387
|
God.watch do |w|
|
171
388
|
w.name = 'foo'
|
389
|
+
w.start = 'go'
|
172
390
|
end
|
173
391
|
|
174
392
|
Timer.any_instance.expects(:join)
|
@@ -179,6 +397,7 @@ class TestGod < Test::Unit::TestCase
|
|
179
397
|
def test_start_should_not_begin_monitoring_non_autostart_watches
|
180
398
|
God.watch do |w|
|
181
399
|
w.name = 'foo'
|
400
|
+
w.start = 'go'
|
182
401
|
w.autostart = false
|
183
402
|
end
|
184
403
|
|
@@ -188,7 +407,7 @@ class TestGod < Test::Unit::TestCase
|
|
188
407
|
end
|
189
408
|
|
190
409
|
def test_start_should_get_and_join_timer
|
191
|
-
God.watch { |w| w.name = 'foo' }
|
410
|
+
God.watch { |w| w.name = 'foo'; w.start = 'bar' }
|
192
411
|
Timer.any_instance.expects(:join)
|
193
412
|
no_stdout do
|
194
413
|
God.start
|
@@ -201,13 +420,50 @@ class TestGod < Test::Unit::TestCase
|
|
201
420
|
God.expects(:start).once
|
202
421
|
God.at_exit_orig
|
203
422
|
end
|
423
|
+
end
|
424
|
+
|
425
|
+
|
426
|
+
class TestGodOther < Test::Unit::TestCase
|
427
|
+
def setup
|
428
|
+
Server.stubs(:new).returns(true)
|
429
|
+
God.internal_init
|
430
|
+
God.reset
|
431
|
+
end
|
204
432
|
|
205
|
-
|
433
|
+
def teardown
|
434
|
+
Timer.get.timer.kill
|
435
|
+
end
|
206
436
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
437
|
+
# setup
|
438
|
+
|
439
|
+
def test_setup_should_create_pid_file_directory_if_it_doesnt_exist
|
440
|
+
God.expects(:test).returns(false)
|
441
|
+
FileUtils.expects(:mkdir_p).with(God.pid_file_directory)
|
442
|
+
God.setup
|
212
443
|
end
|
213
|
-
|
444
|
+
|
445
|
+
def test_setup_should_raise_if_no_permissions_to_create_pid_file_directory
|
446
|
+
God.expects(:test).returns(false)
|
447
|
+
FileUtils.expects(:mkdir_p).raises(Errno::EACCES)
|
448
|
+
|
449
|
+
assert_abort do
|
450
|
+
God.setup
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
# validate
|
455
|
+
|
456
|
+
def test_validate_should_abort_if_pid_file_directory_is_unwriteable
|
457
|
+
God.expects(:test).returns(false)
|
458
|
+
assert_abort do
|
459
|
+
God.validater
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
def test_validate_should_not_abort_if_pid_file_directory_is_writeable
|
464
|
+
God.expects(:test).returns(true)
|
465
|
+
assert_nothing_raised do
|
466
|
+
God.validater
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|