resurrected_god 0.14.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.
- checksums.yaml +7 -0
- data/Announce.txt +135 -0
- data/Gemfile +5 -0
- data/LICENSE +22 -0
- data/README.md +33 -0
- data/Rakefile +129 -0
- data/bin/god +134 -0
- data/doc/god.asciidoc +1592 -0
- data/doc/intro.asciidoc +20 -0
- data/ext/god/.gitignore +5 -0
- data/ext/god/extconf.rb +56 -0
- data/ext/god/kqueue_handler.c +133 -0
- data/ext/god/netlink_handler.c +182 -0
- data/lib/god/behavior.rb +52 -0
- data/lib/god/behaviors/clean_pid_file.rb +21 -0
- data/lib/god/behaviors/clean_unix_socket.rb +21 -0
- data/lib/god/behaviors/notify_when_flapping.rb +51 -0
- data/lib/god/cli/command.rb +268 -0
- data/lib/god/cli/run.rb +170 -0
- data/lib/god/cli/version.rb +23 -0
- data/lib/god/compat19.rb +33 -0
- data/lib/god/condition.rb +96 -0
- data/lib/god/conditions/always.rb +36 -0
- data/lib/god/conditions/complex.rb +86 -0
- data/lib/god/conditions/cpu_usage.rb +80 -0
- data/lib/god/conditions/degrading_lambda.rb +52 -0
- data/lib/god/conditions/disk_usage.rb +32 -0
- data/lib/god/conditions/file_mtime.rb +28 -0
- data/lib/god/conditions/file_touched.rb +44 -0
- data/lib/god/conditions/flapping.rb +128 -0
- data/lib/god/conditions/http_response_code.rb +184 -0
- data/lib/god/conditions/lambda.rb +25 -0
- data/lib/god/conditions/memory_usage.rb +82 -0
- data/lib/god/conditions/process_exits.rb +66 -0
- data/lib/god/conditions/process_running.rb +63 -0
- data/lib/god/conditions/socket_responding.rb +142 -0
- data/lib/god/conditions/tries.rb +44 -0
- data/lib/god/configurable.rb +57 -0
- data/lib/god/contact.rb +114 -0
- data/lib/god/contacts/airbrake.rb +44 -0
- data/lib/god/contacts/campfire.rb +121 -0
- data/lib/god/contacts/email.rb +130 -0
- data/lib/god/contacts/hipchat.rb +117 -0
- data/lib/god/contacts/jabber.rb +75 -0
- data/lib/god/contacts/prowl.rb +57 -0
- data/lib/god/contacts/scout.rb +55 -0
- data/lib/god/contacts/sensu.rb +59 -0
- data/lib/god/contacts/slack.rb +98 -0
- data/lib/god/contacts/statsd.rb +46 -0
- data/lib/god/contacts/twitter.rb +51 -0
- data/lib/god/contacts/webhook.rb +74 -0
- data/lib/god/driver.rb +238 -0
- data/lib/god/errors.rb +24 -0
- data/lib/god/event_handler.rb +112 -0
- data/lib/god/event_handlers/dummy_handler.rb +13 -0
- data/lib/god/event_handlers/kqueue_handler.rb +17 -0
- data/lib/god/event_handlers/netlink_handler.rb +13 -0
- data/lib/god/logger.rb +109 -0
- data/lib/god/metric.rb +87 -0
- data/lib/god/process.rb +381 -0
- data/lib/god/registry.rb +32 -0
- data/lib/god/simple_logger.rb +59 -0
- data/lib/god/socket.rb +113 -0
- data/lib/god/sugar.rb +62 -0
- data/lib/god/sys_logger.rb +45 -0
- data/lib/god/system/portable_poller.rb +42 -0
- data/lib/god/system/process.rb +50 -0
- data/lib/god/system/slash_proc_poller.rb +92 -0
- data/lib/god/task.rb +552 -0
- data/lib/god/timeline.rb +25 -0
- data/lib/god/trigger.rb +43 -0
- data/lib/god/version.rb +4 -0
- data/lib/god/watch.rb +340 -0
- data/lib/god.rb +777 -0
- data/test/configs/child_events/child_events.god +44 -0
- data/test/configs/child_events/simple_server.rb +3 -0
- data/test/configs/child_polls/child_polls.god +37 -0
- data/test/configs/child_polls/simple_server.rb +12 -0
- data/test/configs/complex/complex.god +59 -0
- data/test/configs/complex/simple_server.rb +3 -0
- data/test/configs/contact/contact.god +118 -0
- data/test/configs/contact/simple_server.rb +3 -0
- data/test/configs/daemon_events/daemon_events.god +37 -0
- data/test/configs/daemon_events/simple_server.rb +8 -0
- data/test/configs/daemon_events/simple_server_stop.rb +11 -0
- 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 +31 -0
- data/test/configs/degrading_lambda/tcp_server.rb +15 -0
- data/test/configs/keepalive/keepalive.god +9 -0
- data/test/configs/keepalive/keepalive.rb +12 -0
- data/test/configs/lifecycle/lifecycle.god +25 -0
- data/test/configs/matias/matias.god +50 -0
- data/test/configs/real.rb +59 -0
- data/test/configs/running_load/running_load.god +16 -0
- data/test/configs/stop_options/simple_server.rb +12 -0
- data/test/configs/stop_options/stop_options.god +39 -0
- data/test/configs/stress/simple_server.rb +3 -0
- data/test/configs/stress/stress.god +15 -0
- data/test/configs/task/logs/.placeholder +0 -0
- data/test/configs/task/task.god +26 -0
- data/test/configs/test.rb +61 -0
- data/test/configs/usr1_trapper.rb +10 -0
- data/test/helper.rb +172 -0
- data/test/suite.rb +6 -0
- data/test/test_airbrake.rb +14 -0
- data/test/test_behavior.rb +18 -0
- data/test/test_campfire.rb +22 -0
- data/test/test_condition.rb +52 -0
- data/test/test_conditions_disk_usage.rb +50 -0
- data/test/test_conditions_http_response_code.rb +109 -0
- data/test/test_conditions_process_running.rb +40 -0
- data/test/test_conditions_socket_responding.rb +176 -0
- data/test/test_conditions_tries.rb +67 -0
- data/test/test_contact.rb +109 -0
- data/test/test_driver.rb +26 -0
- data/test/test_email.rb +34 -0
- data/test/test_event_handler.rb +82 -0
- data/test/test_god.rb +710 -0
- data/test/test_god_system.rb +201 -0
- data/test/test_handlers_kqueue_handler.rb +16 -0
- data/test/test_hipchat.rb +23 -0
- data/test/test_jabber.rb +29 -0
- data/test/test_logger.rb +55 -0
- data/test/test_metric.rb +74 -0
- data/test/test_process.rb +263 -0
- data/test/test_prowl.rb +15 -0
- data/test/test_registry.rb +15 -0
- data/test/test_sensu.rb +11 -0
- data/test/test_slack.rb +57 -0
- data/test/test_socket.rb +34 -0
- data/test/test_statsd.rb +22 -0
- data/test/test_sugar.rb +42 -0
- data/test/test_system_portable_poller.rb +17 -0
- data/test/test_system_process.rb +30 -0
- data/test/test_task.rb +246 -0
- data/test/test_timeline.rb +37 -0
- data/test/test_trigger.rb +63 -0
- data/test/test_watch.rb +286 -0
- data/test/test_webhook.rb +22 -0
- metadata +476 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
LOG_DIR = File.join(File.dirname(__FILE__), *%w[logs])
|
|
2
|
+
|
|
3
|
+
God.task do |t|
|
|
4
|
+
t.name = 'task'
|
|
5
|
+
t.valid_states = [:ok, :clean]
|
|
6
|
+
t.initial_state = :ok
|
|
7
|
+
t.interval = 5
|
|
8
|
+
|
|
9
|
+
# t.clean = lambda do
|
|
10
|
+
# Dir[File.join(LOG_DIR, '*.log')].each do |f|
|
|
11
|
+
# File.delete(f)
|
|
12
|
+
# end
|
|
13
|
+
# end
|
|
14
|
+
|
|
15
|
+
t.clean = "rm #{File.join(LOG_DIR, '*.log')}"
|
|
16
|
+
|
|
17
|
+
t.transition(:clean, :ok)
|
|
18
|
+
|
|
19
|
+
t.transition(:ok, :clean) do |on|
|
|
20
|
+
on.condition(:lambda) do |c|
|
|
21
|
+
c.lambda = lambda do
|
|
22
|
+
Dir[File.join(LOG_DIR, '*.log')].size > 1
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
ENV['GOD_TEST_RAILS_ROOT'] || abort("Set a rails root for testing in an environment variable called GOD_TEST_RAILS_ROOT")
|
|
2
|
+
|
|
3
|
+
RAILS_ROOT = ENV['GOD_TEST_RAILS_ROOT']
|
|
4
|
+
|
|
5
|
+
port = 5000
|
|
6
|
+
|
|
7
|
+
God.watch do |w|
|
|
8
|
+
w.name = "local-#{port}"
|
|
9
|
+
w.interval = 5.seconds
|
|
10
|
+
w.start = "mongrel_rails start -P ./log/mongrel.pid -c #{RAILS_ROOT} -p #{port} -d"
|
|
11
|
+
w.restart = "mongrel_rails restart -P ./log/mongrel.pid -c #{RAILS_ROOT}"
|
|
12
|
+
w.stop = "mongrel_rails stop -P ./log/mongrel.pid -c #{RAILS_ROOT}"
|
|
13
|
+
w.group = 'mongrels'
|
|
14
|
+
w.pid_file = File.join(RAILS_ROOT, "log/mongrel.pid")
|
|
15
|
+
|
|
16
|
+
# clean pid files before start if necessary
|
|
17
|
+
w.behavior(:clean_pid_file)
|
|
18
|
+
|
|
19
|
+
# determine the state on startup
|
|
20
|
+
w.transition(:init, { true => :up, false => :start }) do |on|
|
|
21
|
+
on.condition(:process_running) do |c|
|
|
22
|
+
c.running = true
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# determine when process has finished starting
|
|
27
|
+
w.transition([:start, :restart], :up) do |on|
|
|
28
|
+
on.condition(:process_running) do |c|
|
|
29
|
+
c.running = true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# start if process is not running
|
|
34
|
+
w.transition(:up, :start) do |on|
|
|
35
|
+
on.condition(:process_exits)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# restart if memory or cpu is too high
|
|
39
|
+
w.transition(:up, :restart) do |on|
|
|
40
|
+
on.condition(:memory_usage) do |c|
|
|
41
|
+
c.interval = 1
|
|
42
|
+
c.above = 50.megabytes
|
|
43
|
+
c.times = [3, 5]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
on.condition(:cpu_usage) do |c|
|
|
47
|
+
c.interval = 1
|
|
48
|
+
c.above = 10.percent
|
|
49
|
+
c.times = [3, 5]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
on.condition(:http_response_code) do |c|
|
|
53
|
+
c.host = 'localhost'
|
|
54
|
+
c.port = port
|
|
55
|
+
c.path = '/'
|
|
56
|
+
c.code_is_not = 200
|
|
57
|
+
c.timeout = 10.seconds
|
|
58
|
+
c.times = [3, 5]
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
data/test/helper.rb
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__) # For use/testing when no gem is installed
|
|
2
|
+
|
|
3
|
+
# Use this flag to actually load all of the god infrastructure
|
|
4
|
+
$load_god = true
|
|
5
|
+
|
|
6
|
+
require File.join(File.dirname(__FILE__), *%w[.. lib god sys_logger])
|
|
7
|
+
require File.join(File.dirname(__FILE__), *%w[.. lib god])
|
|
8
|
+
God::EventHandler.load
|
|
9
|
+
|
|
10
|
+
require 'minitest/autorun'
|
|
11
|
+
require 'minitest/unit'
|
|
12
|
+
require 'set'
|
|
13
|
+
|
|
14
|
+
include God
|
|
15
|
+
|
|
16
|
+
if Process.uid != 0 and RbConfig::CONFIG['host_os'] == "linux"
|
|
17
|
+
abort <<-EOF
|
|
18
|
+
\n
|
|
19
|
+
*********************************************************************
|
|
20
|
+
* *
|
|
21
|
+
* You need to run these tests as root *
|
|
22
|
+
* chroot and netlink (linux only) require it *
|
|
23
|
+
* *
|
|
24
|
+
*********************************************************************
|
|
25
|
+
EOF
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
begin
|
|
29
|
+
require 'mocha/setup'
|
|
30
|
+
rescue LoadError
|
|
31
|
+
unless gems ||= false
|
|
32
|
+
require 'rubygems'
|
|
33
|
+
gems = true
|
|
34
|
+
retry
|
|
35
|
+
else
|
|
36
|
+
abort "=> You need the Mocha gem to run these tests."
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
module God
|
|
41
|
+
module Conditions
|
|
42
|
+
class FakeCondition < Condition
|
|
43
|
+
def test
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class FakePollCondition < PollCondition
|
|
49
|
+
def test
|
|
50
|
+
true
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class FakeEventCondition < EventCondition
|
|
55
|
+
def register
|
|
56
|
+
end
|
|
57
|
+
def deregister
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
module Behaviors
|
|
63
|
+
class FakeBehavior < Behavior
|
|
64
|
+
def before_start
|
|
65
|
+
'foo'
|
|
66
|
+
end
|
|
67
|
+
def after_start
|
|
68
|
+
'bar'
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
module Contacts
|
|
74
|
+
class FakeContact < Contact
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class InvalidContact
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.reset
|
|
82
|
+
self.watches = nil
|
|
83
|
+
self.groups = nil
|
|
84
|
+
self.server = nil
|
|
85
|
+
self.inited = nil
|
|
86
|
+
self.host = nil
|
|
87
|
+
self.port = nil
|
|
88
|
+
self.pid_file_directory = nil
|
|
89
|
+
self.registry.reset
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def silence_warnings
|
|
94
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
|
95
|
+
yield
|
|
96
|
+
ensure
|
|
97
|
+
$VERBOSE = old_verbose
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
LOG.instance_variable_set(:@io, StringIO.new())
|
|
101
|
+
|
|
102
|
+
def output_logs
|
|
103
|
+
io = LOG.instance_variable_get(:@io)
|
|
104
|
+
LOG.instance_variable_set(:@io, $stderr)
|
|
105
|
+
yield
|
|
106
|
+
ensure
|
|
107
|
+
LOG.instance_variable_set(:@io, io)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# module Kernel
|
|
111
|
+
# def abort(text)
|
|
112
|
+
# raise SystemExit, text
|
|
113
|
+
# end
|
|
114
|
+
# def exit(code)
|
|
115
|
+
# raise SystemExit, "Exit code: #{code}"
|
|
116
|
+
# end
|
|
117
|
+
# end
|
|
118
|
+
|
|
119
|
+
module Minitest::Assertions
|
|
120
|
+
def assert_abort
|
|
121
|
+
assert_raises SystemExit do
|
|
122
|
+
yield
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def assert_nothing_raised
|
|
127
|
+
yield
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# This allows you to be a good OOP citizen and honor encapsulation, but
|
|
132
|
+
# still make calls to private methods (for testing) by doing
|
|
133
|
+
#
|
|
134
|
+
# obj.bypass.private_thingie(arg1, arg2)
|
|
135
|
+
#
|
|
136
|
+
# Which is easier on the eye than
|
|
137
|
+
#
|
|
138
|
+
# obj.send(:private_thingie, arg1, arg2)
|
|
139
|
+
#
|
|
140
|
+
class Object
|
|
141
|
+
class Bypass
|
|
142
|
+
instance_methods.each do |m|
|
|
143
|
+
undef_method m unless m =~ /^(__|object_id)/
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def initialize(ref)
|
|
147
|
+
@ref = ref
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def method_missing(sym, *args)
|
|
151
|
+
@ref.__send__(sym, *args)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def bypass
|
|
156
|
+
Bypass.new(self)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Make sure we return valid exit codes
|
|
161
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" && RUBY_VERSION >= "1.9"
|
|
162
|
+
module Kernel
|
|
163
|
+
alias :__at_exit :at_exit
|
|
164
|
+
def at_exit(&block)
|
|
165
|
+
__at_exit do
|
|
166
|
+
exit_status = $!.status if $!.is_a?(SystemExit)
|
|
167
|
+
block.call
|
|
168
|
+
exit exit_status if exit_status
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
data/test/suite.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require File.dirname(__FILE__) + '/helper'
|
|
3
|
+
|
|
4
|
+
class TestAirbrake < Minitest::Test
|
|
5
|
+
def test_notify
|
|
6
|
+
airbrake = God::Contacts::Airbrake.new
|
|
7
|
+
airbrake.apikey = "put_your_apikey_here"
|
|
8
|
+
airbrake.name = "Airbrake"
|
|
9
|
+
|
|
10
|
+
Airbrake.expects(:notify).returns "123"
|
|
11
|
+
|
|
12
|
+
airbrake.notify("Test message for airbrake", Time.now, "airbrake priority", "airbrake category", "")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestBehavior < Minitest::Test
|
|
4
|
+
def test_generate_should_return_an_object_corresponding_to_the_given_type
|
|
5
|
+
assert_equal Behaviors::FakeBehavior, Behavior.generate(:fake_behavior, nil).class
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_generate_should_raise_on_invalid_type
|
|
9
|
+
assert_raises NoSuchBehaviorError do
|
|
10
|
+
Behavior.generate(:foo, nil)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_complain
|
|
15
|
+
SysLogger.expects(:log).with(:error, 'foo')
|
|
16
|
+
assert !Behavior.allocate.bypass.complain('foo')
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestCampfire < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@campfire = God::Contacts::Campfire.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_exists
|
|
9
|
+
God::Contacts::Campfire
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_notify
|
|
13
|
+
@campfire.subdomain = 'github'
|
|
14
|
+
@campfire.token = 'abc'
|
|
15
|
+
@campfire.room = 'danger'
|
|
16
|
+
|
|
17
|
+
time = Time.now
|
|
18
|
+
body = "[#{time.strftime('%H:%M:%S')}] host - msg"
|
|
19
|
+
Marshmallow::Connection.any_instance.expects(:speak).with('danger', body)
|
|
20
|
+
@campfire.notify('msg', time, 'prio', 'cat', 'host')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class BadlyImplementedCondition < PollCondition
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class TestCondition < Minitest::Test
|
|
7
|
+
|
|
8
|
+
# generate
|
|
9
|
+
|
|
10
|
+
def test_generate_should_return_an_object_corresponding_to_the_given_type
|
|
11
|
+
assert_equal Conditions::ProcessRunning, Condition.generate(:process_running, nil).class
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_generate_should_raise_on_invalid_type
|
|
15
|
+
assert_raises NoSuchConditionError do
|
|
16
|
+
Condition.generate(:foo, nil)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_generate_should_abort_on_event_condition_without_loaded_event_system
|
|
21
|
+
God::EventHandler.stubs(:operational?).returns(false)
|
|
22
|
+
assert_abort do
|
|
23
|
+
God::EventHandler.start
|
|
24
|
+
Condition.generate(:process_exits, nil).class
|
|
25
|
+
end
|
|
26
|
+
ensure
|
|
27
|
+
God::EventHandler.stop
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_generate_should_return_a_good_error_message_for_invalid_types
|
|
31
|
+
emsg = "No Condition found with the class name God::Conditions::FooBar"
|
|
32
|
+
rmsg = nil
|
|
33
|
+
|
|
34
|
+
begin
|
|
35
|
+
Condition.generate(:foo_bar, nil)
|
|
36
|
+
rescue => e
|
|
37
|
+
rmsg = e.message
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
assert_equal emsg, rmsg
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# test
|
|
44
|
+
|
|
45
|
+
def test_test_should_raise_if_not_defined_in_subclass
|
|
46
|
+
c = BadlyImplementedCondition.new
|
|
47
|
+
|
|
48
|
+
assert_raises AbstractMethodNotOverriddenError do
|
|
49
|
+
c.test
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestConditionsDiskUsage < Minitest::Test
|
|
4
|
+
# valid?
|
|
5
|
+
|
|
6
|
+
def test_valid_should_return_false_if_no_above_given
|
|
7
|
+
c = Conditions::DiskUsage.new
|
|
8
|
+
c.mount_point = '/'
|
|
9
|
+
c.watch = stub(:name => 'foo')
|
|
10
|
+
assert_equal false, c.valid?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_valid_should_return_false_if_no_mount_point_given
|
|
14
|
+
c = Conditions::DiskUsage.new
|
|
15
|
+
c.above = 90
|
|
16
|
+
c.watch = stub(:name => 'foo')
|
|
17
|
+
assert_equal false, c.valid?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_valid_should_return_true_if_required_options_all_set
|
|
21
|
+
c = Conditions::DiskUsage.new
|
|
22
|
+
c.above = 90
|
|
23
|
+
c.mount_point = '/'
|
|
24
|
+
c.watch = stub(:name => 'foo')
|
|
25
|
+
|
|
26
|
+
assert_equal true, c.valid?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# test
|
|
30
|
+
|
|
31
|
+
def test_test_should_return_true_if_above_limit
|
|
32
|
+
c = Conditions::DiskUsage.new
|
|
33
|
+
c.above = 90
|
|
34
|
+
c.mount_point = '/'
|
|
35
|
+
|
|
36
|
+
c.expects(:`).returns('91')
|
|
37
|
+
|
|
38
|
+
assert_equal true, c.test
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_test_should_return_false_if_below_limit
|
|
42
|
+
c = Conditions::DiskUsage.new
|
|
43
|
+
c.above = 90
|
|
44
|
+
c.mount_point = '/'
|
|
45
|
+
|
|
46
|
+
c.expects(:`).returns('90')
|
|
47
|
+
|
|
48
|
+
assert_equal false, c.test
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestHttpResponseCode < Minitest::Test
|
|
4
|
+
def valid_condition
|
|
5
|
+
c = Conditions::HttpResponseCode.new()
|
|
6
|
+
c.watch = stub(:name => 'foo')
|
|
7
|
+
c.host = 'localhost'
|
|
8
|
+
c.port = 8080
|
|
9
|
+
c.path = '/'
|
|
10
|
+
c.timeout = 10
|
|
11
|
+
c.code_is = 200
|
|
12
|
+
c.times = 1
|
|
13
|
+
yield(c) if block_given?
|
|
14
|
+
c.prepare
|
|
15
|
+
c
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# valid?
|
|
19
|
+
|
|
20
|
+
def test_valid_condition_is_valid
|
|
21
|
+
c = valid_condition
|
|
22
|
+
assert c.valid?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_valid_should_return_false_if_both_code_is_and_code_is_not_are_set
|
|
26
|
+
c = valid_condition do |cc|
|
|
27
|
+
cc.code_is_not = 500
|
|
28
|
+
end
|
|
29
|
+
assert !c.valid?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_valid_should_return_false_if_no_host_set
|
|
33
|
+
c = valid_condition do |cc|
|
|
34
|
+
cc.host = nil
|
|
35
|
+
end
|
|
36
|
+
assert !c.valid?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# test
|
|
40
|
+
|
|
41
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_response_is_500
|
|
42
|
+
c = valid_condition
|
|
43
|
+
Net::HTTP.any_instance.expects(:start).yields(mock(:read_timeout= => nil, :get => mock(:code => 500)))
|
|
44
|
+
assert_equal false, c.test
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_test_should_return_false_if_code_is_not_is_set_to_200_and_response_is_200
|
|
48
|
+
c = valid_condition do |cc|
|
|
49
|
+
cc.code_is = nil
|
|
50
|
+
cc.code_is_not = [200]
|
|
51
|
+
end
|
|
52
|
+
Net::HTTP.any_instance.expects(:start).yields(mock(:read_timeout= => nil, :get => mock(:code => 200)))
|
|
53
|
+
assert_equal false, c.test
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_test_should_return_true_if_code_is_is_set_to_200_and_response_is_200
|
|
57
|
+
c = valid_condition
|
|
58
|
+
Net::HTTP.any_instance.expects(:start).yields(mock(:read_timeout= => nil, :get => mock(:code => 200)))
|
|
59
|
+
assert_equal true, c.test
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_test_should_return_false_if_code_is_not_is_set_to_200_but_response_is_500
|
|
63
|
+
c = valid_condition do |cc|
|
|
64
|
+
cc.code_is = nil
|
|
65
|
+
cc.code_is_not = [200]
|
|
66
|
+
end
|
|
67
|
+
Net::HTTP.any_instance.expects(:start).yields(mock(:read_timeout= => nil, :get => mock(:code => 500)))
|
|
68
|
+
assert_equal true, c.test
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_response_times_out
|
|
72
|
+
c = valid_condition
|
|
73
|
+
Net::HTTP.any_instance.expects(:start).raises(Timeout::Error, '')
|
|
74
|
+
assert_equal false, c.test
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_test_should_return_true_if_code_is_not_is_set_to_200_and_response_times_out
|
|
78
|
+
c = valid_condition do |cc|
|
|
79
|
+
cc.code_is = nil
|
|
80
|
+
cc.code_is_not = [200]
|
|
81
|
+
end
|
|
82
|
+
Net::HTTP.any_instance.expects(:start).raises(Timeout::Error, '')
|
|
83
|
+
assert_equal true, c.test
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_cant_connect
|
|
87
|
+
c = valid_condition
|
|
88
|
+
Net::HTTP.any_instance.expects(:start).raises(Errno::ECONNREFUSED, '')
|
|
89
|
+
assert_equal false, c.test
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_test_should_return_true_if_code_is_not_is_set_to_200_and_cant_connect
|
|
93
|
+
c = valid_condition do |cc|
|
|
94
|
+
cc.code_is = nil
|
|
95
|
+
cc.code_is_not = [200]
|
|
96
|
+
end
|
|
97
|
+
Net::HTTP.any_instance.expects(:start).raises(Errno::ECONNREFUSED, '')
|
|
98
|
+
assert_equal true, c.test
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_test_should_return_true_if_code_is_is_set_to_200_and_response_is_200_twice_for_times_two_of_two
|
|
102
|
+
c = valid_condition do |cc|
|
|
103
|
+
cc.times = [2, 2]
|
|
104
|
+
end
|
|
105
|
+
Net::HTTP.any_instance.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 200))).times(2)
|
|
106
|
+
assert_equal false, c.test
|
|
107
|
+
assert_equal true, c.test
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestConditionsProcessRunning < Minitest::Test
|
|
4
|
+
def test_missing_pid_file_returns_opposite
|
|
5
|
+
[true, false].each do |r|
|
|
6
|
+
c = Conditions::ProcessRunning.new
|
|
7
|
+
c.running = r
|
|
8
|
+
c.stubs(:watch).returns(stub(:pid => 99999999, :name => 'foo'))
|
|
9
|
+
assert_equal !r, c.test
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_not_running_returns_opposite
|
|
14
|
+
[true, false].each do |r|
|
|
15
|
+
c = Conditions::ProcessRunning.new
|
|
16
|
+
c.running = r
|
|
17
|
+
|
|
18
|
+
File.stubs(:exist?).returns(true)
|
|
19
|
+
c.stubs(:watch).returns(stub(:pid => 123))
|
|
20
|
+
File.stubs(:read).returns('5')
|
|
21
|
+
System::Process.any_instance.stubs(:exists?).returns(false)
|
|
22
|
+
|
|
23
|
+
assert_equal !r, c.test
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_running_returns_same
|
|
28
|
+
[true, false].each do |r|
|
|
29
|
+
c = Conditions::ProcessRunning.new
|
|
30
|
+
c.running = r
|
|
31
|
+
|
|
32
|
+
File.stubs(:exist?).returns(true)
|
|
33
|
+
c.stubs(:watch).returns(stub(:pid => 123))
|
|
34
|
+
File.stubs(:read).returns('5')
|
|
35
|
+
System::Process.any_instance.stubs(:exists?).returns(true)
|
|
36
|
+
|
|
37
|
+
assert_equal r, c.test
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|