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.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/Announce.txt +135 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +22 -0
  5. data/README.md +33 -0
  6. data/Rakefile +129 -0
  7. data/bin/god +134 -0
  8. data/doc/god.asciidoc +1592 -0
  9. data/doc/intro.asciidoc +20 -0
  10. data/ext/god/.gitignore +5 -0
  11. data/ext/god/extconf.rb +56 -0
  12. data/ext/god/kqueue_handler.c +133 -0
  13. data/ext/god/netlink_handler.c +182 -0
  14. data/lib/god/behavior.rb +52 -0
  15. data/lib/god/behaviors/clean_pid_file.rb +21 -0
  16. data/lib/god/behaviors/clean_unix_socket.rb +21 -0
  17. data/lib/god/behaviors/notify_when_flapping.rb +51 -0
  18. data/lib/god/cli/command.rb +268 -0
  19. data/lib/god/cli/run.rb +170 -0
  20. data/lib/god/cli/version.rb +23 -0
  21. data/lib/god/compat19.rb +33 -0
  22. data/lib/god/condition.rb +96 -0
  23. data/lib/god/conditions/always.rb +36 -0
  24. data/lib/god/conditions/complex.rb +86 -0
  25. data/lib/god/conditions/cpu_usage.rb +80 -0
  26. data/lib/god/conditions/degrading_lambda.rb +52 -0
  27. data/lib/god/conditions/disk_usage.rb +32 -0
  28. data/lib/god/conditions/file_mtime.rb +28 -0
  29. data/lib/god/conditions/file_touched.rb +44 -0
  30. data/lib/god/conditions/flapping.rb +128 -0
  31. data/lib/god/conditions/http_response_code.rb +184 -0
  32. data/lib/god/conditions/lambda.rb +25 -0
  33. data/lib/god/conditions/memory_usage.rb +82 -0
  34. data/lib/god/conditions/process_exits.rb +66 -0
  35. data/lib/god/conditions/process_running.rb +63 -0
  36. data/lib/god/conditions/socket_responding.rb +142 -0
  37. data/lib/god/conditions/tries.rb +44 -0
  38. data/lib/god/configurable.rb +57 -0
  39. data/lib/god/contact.rb +114 -0
  40. data/lib/god/contacts/airbrake.rb +44 -0
  41. data/lib/god/contacts/campfire.rb +121 -0
  42. data/lib/god/contacts/email.rb +130 -0
  43. data/lib/god/contacts/hipchat.rb +117 -0
  44. data/lib/god/contacts/jabber.rb +75 -0
  45. data/lib/god/contacts/prowl.rb +57 -0
  46. data/lib/god/contacts/scout.rb +55 -0
  47. data/lib/god/contacts/sensu.rb +59 -0
  48. data/lib/god/contacts/slack.rb +98 -0
  49. data/lib/god/contacts/statsd.rb +46 -0
  50. data/lib/god/contacts/twitter.rb +51 -0
  51. data/lib/god/contacts/webhook.rb +74 -0
  52. data/lib/god/driver.rb +238 -0
  53. data/lib/god/errors.rb +24 -0
  54. data/lib/god/event_handler.rb +112 -0
  55. data/lib/god/event_handlers/dummy_handler.rb +13 -0
  56. data/lib/god/event_handlers/kqueue_handler.rb +17 -0
  57. data/lib/god/event_handlers/netlink_handler.rb +13 -0
  58. data/lib/god/logger.rb +109 -0
  59. data/lib/god/metric.rb +87 -0
  60. data/lib/god/process.rb +381 -0
  61. data/lib/god/registry.rb +32 -0
  62. data/lib/god/simple_logger.rb +59 -0
  63. data/lib/god/socket.rb +113 -0
  64. data/lib/god/sugar.rb +62 -0
  65. data/lib/god/sys_logger.rb +45 -0
  66. data/lib/god/system/portable_poller.rb +42 -0
  67. data/lib/god/system/process.rb +50 -0
  68. data/lib/god/system/slash_proc_poller.rb +92 -0
  69. data/lib/god/task.rb +552 -0
  70. data/lib/god/timeline.rb +25 -0
  71. data/lib/god/trigger.rb +43 -0
  72. data/lib/god/version.rb +4 -0
  73. data/lib/god/watch.rb +340 -0
  74. data/lib/god.rb +777 -0
  75. data/test/configs/child_events/child_events.god +44 -0
  76. data/test/configs/child_events/simple_server.rb +3 -0
  77. data/test/configs/child_polls/child_polls.god +37 -0
  78. data/test/configs/child_polls/simple_server.rb +12 -0
  79. data/test/configs/complex/complex.god +59 -0
  80. data/test/configs/complex/simple_server.rb +3 -0
  81. data/test/configs/contact/contact.god +118 -0
  82. data/test/configs/contact/simple_server.rb +3 -0
  83. data/test/configs/daemon_events/daemon_events.god +37 -0
  84. data/test/configs/daemon_events/simple_server.rb +8 -0
  85. data/test/configs/daemon_events/simple_server_stop.rb +11 -0
  86. data/test/configs/daemon_polls/daemon_polls.god +17 -0
  87. data/test/configs/daemon_polls/simple_server.rb +6 -0
  88. data/test/configs/degrading_lambda/degrading_lambda.god +31 -0
  89. data/test/configs/degrading_lambda/tcp_server.rb +15 -0
  90. data/test/configs/keepalive/keepalive.god +9 -0
  91. data/test/configs/keepalive/keepalive.rb +12 -0
  92. data/test/configs/lifecycle/lifecycle.god +25 -0
  93. data/test/configs/matias/matias.god +50 -0
  94. data/test/configs/real.rb +59 -0
  95. data/test/configs/running_load/running_load.god +16 -0
  96. data/test/configs/stop_options/simple_server.rb +12 -0
  97. data/test/configs/stop_options/stop_options.god +39 -0
  98. data/test/configs/stress/simple_server.rb +3 -0
  99. data/test/configs/stress/stress.god +15 -0
  100. data/test/configs/task/logs/.placeholder +0 -0
  101. data/test/configs/task/task.god +26 -0
  102. data/test/configs/test.rb +61 -0
  103. data/test/configs/usr1_trapper.rb +10 -0
  104. data/test/helper.rb +172 -0
  105. data/test/suite.rb +6 -0
  106. data/test/test_airbrake.rb +14 -0
  107. data/test/test_behavior.rb +18 -0
  108. data/test/test_campfire.rb +22 -0
  109. data/test/test_condition.rb +52 -0
  110. data/test/test_conditions_disk_usage.rb +50 -0
  111. data/test/test_conditions_http_response_code.rb +109 -0
  112. data/test/test_conditions_process_running.rb +40 -0
  113. data/test/test_conditions_socket_responding.rb +176 -0
  114. data/test/test_conditions_tries.rb +67 -0
  115. data/test/test_contact.rb +109 -0
  116. data/test/test_driver.rb +26 -0
  117. data/test/test_email.rb +34 -0
  118. data/test/test_event_handler.rb +82 -0
  119. data/test/test_god.rb +710 -0
  120. data/test/test_god_system.rb +201 -0
  121. data/test/test_handlers_kqueue_handler.rb +16 -0
  122. data/test/test_hipchat.rb +23 -0
  123. data/test/test_jabber.rb +29 -0
  124. data/test/test_logger.rb +55 -0
  125. data/test/test_metric.rb +74 -0
  126. data/test/test_process.rb +263 -0
  127. data/test/test_prowl.rb +15 -0
  128. data/test/test_registry.rb +15 -0
  129. data/test/test_sensu.rb +11 -0
  130. data/test/test_slack.rb +57 -0
  131. data/test/test_socket.rb +34 -0
  132. data/test/test_statsd.rb +22 -0
  133. data/test/test_sugar.rb +42 -0
  134. data/test/test_system_portable_poller.rb +17 -0
  135. data/test/test_system_process.rb +30 -0
  136. data/test/test_task.rb +246 -0
  137. data/test/test_timeline.rb +37 -0
  138. data/test/test_trigger.rb +63 -0
  139. data/test/test_watch.rb +286 -0
  140. data/test/test_webhook.rb +22 -0
  141. 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
@@ -0,0 +1,10 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ Signal.trap 'USR1' do
4
+ puts "can't stop won't stop"
5
+ end
6
+
7
+ loop do
8
+ puts 'server'
9
+ sleep 1
10
+ 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,6 @@
1
+ require 'test/unit'
2
+
3
+ tests = Dir["#{File.dirname(__FILE__)}/test_*.rb"]
4
+ tests.each do |file|
5
+ require file
6
+ end
@@ -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