god 0.13.4 → 0.13.5
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/History.txt +13 -0
- data/doc/god.asciidoc +50 -8
- data/ext/god/extconf.rb +1 -0
- data/ext/god/kqueue_handler.c +9 -1
- data/ext/god/netlink_handler.c +17 -0
- data/god.gemspec +12 -3
- data/lib/god.rb +3 -1
- data/lib/god/contacts/slack.rb +100 -0
- data/lib/god/contacts/statsd.rb +46 -0
- data/lib/god/contacts/webhook.rb +1 -0
- data/lib/god/process.rb +10 -5
- data/test/helper.rb +8 -3
- data/test/test_airbrake.rb +1 -1
- data/test/test_behavior.rb +2 -2
- data/test/test_campfire.rb +1 -1
- data/test/test_condition.rb +3 -3
- data/test/test_conditions_disk_usage.rb +1 -1
- data/test/test_conditions_http_response_code.rb +1 -1
- data/test/test_conditions_process_running.rb +1 -1
- data/test/test_conditions_socket_responding.rb +1 -1
- data/test/test_conditions_tries.rb +3 -3
- data/test/test_contact.rb +9 -9
- data/test/test_driver.rb +4 -3
- data/test/test_email.rb +1 -1
- data/test/test_event_handler.rb +2 -2
- data/test/test_god.rb +9 -7
- data/test/test_handlers_kqueue_handler.rb +1 -1
- data/test/test_hipchat.rb +1 -1
- data/test/test_jabber.rb +1 -1
- data/test/test_logger.rb +3 -3
- data/test/test_metric.rb +1 -1
- data/test/test_process.rb +7 -3
- data/test/test_prowl.rb +1 -1
- data/test/test_registry.rb +1 -1
- data/test/test_slack.rb +56 -0
- data/test/test_socket.rb +1 -1
- data/test/test_statsd.rb +22 -0
- data/test/test_sugar.rb +1 -1
- data/test/test_system_portable_poller.rb +1 -1
- data/test/test_system_process.rb +1 -1
- data/test/test_task.rb +4 -4
- data/test/test_timeline.rb +1 -1
- data/test/test_trigger.rb +5 -1
- data/test/test_watch.rb +1 -1
- data/test/test_webhook.rb +1 -1
- metadata +240 -223
    
        data/test/helper.rb
    CHANGED
    
    | @@ -7,7 +7,8 @@ require File.join(File.dirname(__FILE__), *%w[.. lib god sys_logger]) | |
| 7 7 | 
             
            require File.join(File.dirname(__FILE__), *%w[.. lib god])
         | 
| 8 8 | 
             
            God::EventHandler.load
         | 
| 9 9 |  | 
| 10 | 
            -
            require ' | 
| 10 | 
            +
            require 'minitest/autorun'
         | 
| 11 | 
            +
            require 'minitest/unit'
         | 
| 11 12 | 
             
            require 'set'
         | 
| 12 13 |  | 
| 13 14 | 
             
            include God
         | 
| @@ -115,12 +116,16 @@ end | |
| 115 116 | 
             
            #   end
         | 
| 116 117 | 
             
            # end
         | 
| 117 118 |  | 
| 118 | 
            -
            module  | 
| 119 | 
            +
            module Minitest::Assertions
         | 
| 119 120 | 
             
              def assert_abort
         | 
| 120 | 
            -
                 | 
| 121 | 
            +
                assert_raises SystemExit do
         | 
| 121 122 | 
             
                  yield
         | 
| 122 123 | 
             
                end
         | 
| 123 124 | 
             
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              def assert_nothing_raised
         | 
| 127 | 
            +
                yield
         | 
| 128 | 
            +
              end
         | 
| 124 129 | 
             
            end
         | 
| 125 130 |  | 
| 126 131 | 
             
            # This allows you to be a good OOP citizen and honor encapsulation, but
         | 
    
        data/test/test_airbrake.rb
    CHANGED
    
    
    
        data/test/test_behavior.rb
    CHANGED
    
    | @@ -1,12 +1,12 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestBehavior < Test | 
| 3 | 
            +
            class TestBehavior < Minitest::Test
         | 
| 4 4 | 
             
              def test_generate_should_return_an_object_corresponding_to_the_given_type
         | 
| 5 5 | 
             
                assert_equal Behaviors::FakeBehavior, Behavior.generate(:fake_behavior, nil).class
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              def test_generate_should_raise_on_invalid_type
         | 
| 9 | 
            -
                 | 
| 9 | 
            +
                assert_raises NoSuchBehaviorError do
         | 
| 10 10 | 
             
                  Behavior.generate(:foo, nil)
         | 
| 11 11 | 
             
                end
         | 
| 12 12 | 
             
              end
         | 
    
        data/test/test_campfire.rb
    CHANGED
    
    
    
        data/test/test_condition.rb
    CHANGED
    
    | @@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/helper' | |
| 3 3 | 
             
            class BadlyImplementedCondition < PollCondition
         | 
| 4 4 | 
             
            end
         | 
| 5 5 |  | 
| 6 | 
            -
            class TestCondition < Test | 
| 6 | 
            +
            class TestCondition < Minitest::Test
         | 
| 7 7 |  | 
| 8 8 | 
             
              # generate
         | 
| 9 9 |  | 
| @@ -12,7 +12,7 @@ class TestCondition < Test::Unit::TestCase | |
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 14 | 
             
              def test_generate_should_raise_on_invalid_type
         | 
| 15 | 
            -
                 | 
| 15 | 
            +
                assert_raises NoSuchConditionError do
         | 
| 16 16 | 
             
                  Condition.generate(:foo, nil)
         | 
| 17 17 | 
             
                end
         | 
| 18 18 | 
             
              end
         | 
| @@ -45,7 +45,7 @@ class TestCondition < Test::Unit::TestCase | |
| 45 45 | 
             
              def test_test_should_raise_if_not_defined_in_subclass
         | 
| 46 46 | 
             
                c = BadlyImplementedCondition.new
         | 
| 47 47 |  | 
| 48 | 
            -
                 | 
| 48 | 
            +
                assert_raises AbstractMethodNotOverriddenError do
         | 
| 49 49 | 
             
                  c.test
         | 
| 50 50 | 
             
                end
         | 
| 51 51 | 
             
              end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestConditionsProcessRunning < Test | 
| 3 | 
            +
            class TestConditionsProcessRunning < Minitest::Test
         | 
| 4 4 | 
             
              def test_missing_pid_file_returns_opposite
         | 
| 5 5 | 
             
                [true, false].each do |r|
         | 
| 6 6 | 
             
                  c = Conditions::ProcessRunning.new
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestConditionsTries < Test | 
| 3 | 
            +
            class TestConditionsTries < Minitest::Test
         | 
| 4 4 | 
             
              # valid?
         | 
| 5 5 |  | 
| 6 6 | 
             
              def test_valid_should_return_false_if_times_not_set
         | 
| @@ -11,7 +11,7 @@ class TestConditionsTries < Test::Unit::TestCase | |
| 11 11 | 
             
            end
         | 
| 12 12 |  | 
| 13 13 |  | 
| 14 | 
            -
            class TestConditionsTries < Test | 
| 14 | 
            +
            class TestConditionsTries < Minitest::Test
         | 
| 15 15 | 
             
              def setup
         | 
| 16 16 | 
             
                @c = Conditions::Tries.new
         | 
| 17 17 | 
             
                @c.times = 3
         | 
| @@ -42,7 +42,7 @@ class TestConditionsTries < Test::Unit::TestCase | |
| 42 42 | 
             
            end
         | 
| 43 43 |  | 
| 44 44 |  | 
| 45 | 
            -
            class TestConditionsTriesWithin < Test | 
| 45 | 
            +
            class TestConditionsTriesWithin < Minitest::Test
         | 
| 46 46 | 
             
              def setup
         | 
| 47 47 | 
             
                @c = Conditions::Tries.new
         | 
| 48 48 | 
             
                @c.times = 3
         | 
    
        data/test/test_contact.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestContact < Test | 
| 3 | 
            +
            class TestContact < Minitest::Test
         | 
| 4 4 | 
             
              def test_exists
         | 
| 5 5 | 
             
                God::Contact
         | 
| 6 6 | 
             
              end
         | 
| @@ -8,7 +8,7 @@ class TestContact < Test::Unit::TestCase | |
| 8 8 | 
             
              # generate
         | 
| 9 9 |  | 
| 10 10 | 
             
              def test_generate_should_raise_on_invalid_kind
         | 
| 11 | 
            -
                 | 
| 11 | 
            +
                assert_raises(NoSuchContactError) do
         | 
| 12 12 | 
             
                  Contact.generate(:invalid)
         | 
| 13 13 | 
             
                end
         | 
| 14 14 | 
             
              end
         | 
| @@ -59,42 +59,42 @@ class TestContact < Test::Unit::TestCase | |
| 59 59 |  | 
| 60 60 | 
             
              def test_normalize_should_raise_on_non_string_array_hash
         | 
| 61 61 | 
             
                input = 1
         | 
| 62 | 
            -
                 | 
| 62 | 
            +
                assert_raises ArgumentError do
         | 
| 63 63 | 
             
                  Contact.normalize(input)
         | 
| 64 64 | 
             
                end
         | 
| 65 65 | 
             
              end
         | 
| 66 66 |  | 
| 67 67 | 
             
              def test_normalize_should_raise_on_non_string_array_contacts_key
         | 
| 68 68 | 
             
                input = {:contacts => 1}
         | 
| 69 | 
            -
                 | 
| 69 | 
            +
                assert_raises ArgumentError do
         | 
| 70 70 | 
             
                  Contact.normalize(input)
         | 
| 71 71 | 
             
                end
         | 
| 72 72 | 
             
              end
         | 
| 73 73 |  | 
| 74 74 | 
             
              def test_normalize_should_raise_on_non_string_containing_array
         | 
| 75 75 | 
             
                input = [1]
         | 
| 76 | 
            -
                 | 
| 76 | 
            +
                assert_raises ArgumentError do
         | 
| 77 77 | 
             
                  Contact.normalize(input)
         | 
| 78 78 | 
             
                end
         | 
| 79 79 | 
             
              end
         | 
| 80 80 |  | 
| 81 81 | 
             
              def test_normalize_should_raise_on_non_string_containing_array_contacts_key
         | 
| 82 82 | 
             
                input = {:contacts => [1]}
         | 
| 83 | 
            -
                 | 
| 83 | 
            +
                assert_raises ArgumentError do
         | 
| 84 84 | 
             
                  Contact.normalize(input)
         | 
| 85 85 | 
             
                end
         | 
| 86 86 | 
             
              end
         | 
| 87 87 |  | 
| 88 88 | 
             
              def test_normalize_should_raise_on_absent_contacts_key
         | 
| 89 89 | 
             
                input = {}
         | 
| 90 | 
            -
                 | 
| 90 | 
            +
                assert_raises ArgumentError do
         | 
| 91 91 | 
             
                  Contact.normalize(input)
         | 
| 92 92 | 
             
                end
         | 
| 93 93 | 
             
              end
         | 
| 94 94 |  | 
| 95 95 | 
             
              def test_normalize_should_raise_on_extra_keys
         | 
| 96 96 | 
             
                input = {:contacts => ['tom'], :priority => 1, :category => 'product', :extra => 'foo'}
         | 
| 97 | 
            -
                 | 
| 97 | 
            +
                assert_raises ArgumentError do
         | 
| 98 98 | 
             
                  Contact.normalize(input)
         | 
| 99 99 | 
             
                end
         | 
| 100 100 | 
             
              end
         | 
| @@ -102,7 +102,7 @@ class TestContact < Test::Unit::TestCase | |
| 102 102 | 
             
              # notify
         | 
| 103 103 |  | 
| 104 104 | 
             
              def test_notify_should_be_abstract
         | 
| 105 | 
            -
                 | 
| 105 | 
            +
                assert_raises(AbstractMethodNotOverriddenError) do
         | 
| 106 106 | 
             
                  Contact.new.notify(:a, :b, :c, :d, :e)
         | 
| 107 107 | 
             
                end
         | 
| 108 108 | 
             
              end
         | 
    
        data/test/test_driver.rb
    CHANGED
    
    | @@ -1,14 +1,15 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestDriver < Test | 
| 3 | 
            +
            class TestDriver < Minitest::Test
         | 
| 4 4 | 
             
              def setup
         | 
| 5 5 |  | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              def test_push_pop_wait
         | 
| 9 | 
            -
                eq = God::DriverEventQueue.new
         | 
| 10 9 |  | 
| 11 | 
            -
                 | 
| 10 | 
            +
                eq = God::DriverEventQueue.new
         | 
| 11 | 
            +
                cond = eq.instance_variable_get(:@resource)
         | 
| 12 | 
            +
                cond.expects(:wait).times(1)
         | 
| 12 13 |  | 
| 13 14 | 
             
                eq.push(God::TimedEvent.new(0))
         | 
| 14 15 | 
             
                eq.push(God::TimedEvent.new(0.1))
         | 
    
        data/test/test_email.rb
    CHANGED
    
    
    
        data/test/test_event_handler.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ module God | |
| 17 17 | 
             
              end
         | 
| 18 18 | 
             
            end
         | 
| 19 19 |  | 
| 20 | 
            -
            class TestEventHandler < Test | 
| 20 | 
            +
            class TestEventHandler < Minitest::Test
         | 
| 21 21 | 
             
              def setup
         | 
| 22 22 | 
             
                @h = God::EventHandler
         | 
| 23 23 | 
             
              end
         | 
| @@ -74,7 +74,7 @@ end | |
| 74 74 |  | 
| 75 75 | 
             
            # This doesn't currently work:
         | 
| 76 76 | 
             
            #
         | 
| 77 | 
            -
            # class TestEventHandlerOperational < Test | 
| 77 | 
            +
            # class TestEventHandlerOperational < Minitest::Test
         | 
| 78 78 | 
             
            #   def test_operational
         | 
| 79 79 | 
             
            #     God::EventHandler.start
         | 
| 80 80 | 
             
            #     assert God::EventHandler.loaded?
         | 
    
        data/test/test_god.rb
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            class TestGod < Test::Unit::TestCase
         | 
| 2 | 
            +
            class TestGod < MiniTest::Test
         | 
| 4 3 | 
             
              def setup
         | 
| 5 4 | 
             
                God::Socket.stubs(:new).returns(true)
         | 
| 6 5 | 
             
                God.stubs(:setup).returns(true)
         | 
| @@ -16,6 +15,10 @@ class TestGod < Test::Unit::TestCase | |
| 16 15 | 
             
                    w.driver.thread.kill
         | 
| 17 16 | 
             
                  end
         | 
| 18 17 | 
             
                end
         | 
| 18 | 
            +
                God.reset
         | 
| 19 | 
            +
                #Some of the tests in this file intentionally set pid_file_directory to an invalid value
         | 
| 20 | 
            +
                #This can cause a later test failure since God will call abort if pid_file_directory is not writable    
         | 
| 21 | 
            +
                God.pid_file_directory = '~/.god/pids'
         | 
| 19 22 | 
             
              end
         | 
| 20 23 |  | 
| 21 24 | 
             
              # applog
         | 
| @@ -32,11 +35,10 @@ class TestGod < Test::Unit::TestCase | |
| 32 35 | 
             
                assert_equal Hash.new, God.watches
         | 
| 33 36 | 
             
              end
         | 
| 34 37 |  | 
| 35 | 
            -
              # init
         | 
| 38 | 
            +
              # # init
         | 
| 36 39 |  | 
| 37 40 | 
             
              def test_pid_file_directory_should_abort_if_called_after_watch
         | 
| 38 41 | 
             
                God.watch { |w| w.name = 'foo'; w.start = 'bar' }
         | 
| 39 | 
            -
             | 
| 40 42 | 
             
                assert_abort do
         | 
| 41 43 | 
             
                  God.pid_file_directory = 'foo'
         | 
| 42 44 | 
             
                end
         | 
| @@ -313,7 +315,7 @@ class TestGod < Test::Unit::TestCase | |
| 313 315 | 
             
              def test_control_should_raise_on_invalid_command
         | 
| 314 316 | 
             
                God.watch { |w| w.name = 'foo'; w.start = 'bar' }
         | 
| 315 317 |  | 
| 316 | 
            -
                 | 
| 318 | 
            +
                assert_raises InvalidCommandError do
         | 
| 317 319 | 
             
                  God.control('foo', 'invalid')
         | 
| 318 320 | 
             
                end
         | 
| 319 321 | 
             
              end
         | 
| @@ -451,7 +453,7 @@ class TestGod < Test::Unit::TestCase | |
| 451 453 |  | 
| 452 454 | 
             
              def test_running_log_should_raise_on_unknown_watch
         | 
| 453 455 | 
             
                God.internal_init
         | 
| 454 | 
            -
                 | 
| 456 | 
            +
                assert_raises(NoSuchWatchError) do
         | 
| 455 457 | 
             
                  God.running_log('foo', Time.now)
         | 
| 456 458 | 
             
                end
         | 
| 457 459 | 
             
              end
         | 
| @@ -662,7 +664,7 @@ class TestGod < Test::Unit::TestCase | |
| 662 664 | 
             
            end
         | 
| 663 665 |  | 
| 664 666 |  | 
| 665 | 
            -
            # class TestGodOther < Test | 
| 667 | 
            +
            # class TestGodOther < Minitest::Test
         | 
| 666 668 | 
             
            #   def setup
         | 
| 667 669 | 
             
            #     God::Socket.stubs(:new).returns(true)
         | 
| 668 670 | 
             
            #     God.internal_init
         | 
| @@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/helper' | |
| 2 2 |  | 
| 3 3 | 
             
            if God::EventHandler.event_system == "kqueue"
         | 
| 4 4 |  | 
| 5 | 
            -
              class TestHandlersKqueueHandler < Test | 
| 5 | 
            +
              class TestHandlersKqueueHandler < Minitest::Test
         | 
| 6 6 | 
             
                def test_register_process
         | 
| 7 7 | 
             
                  KQueueHandler.expects(:monitor_process).with(1234, 2147483648)
         | 
| 8 8 | 
             
                  KQueueHandler.register_process(1234, [:proc_exit])
         | 
    
        data/test/test_hipchat.rb
    CHANGED
    
    
    
        data/test/test_jabber.rb
    CHANGED
    
    
    
        data/test/test_logger.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            class TestLogger < Test | 
| 3 | 
            +
            class TestLogger < Minitest::Test
         | 
| 4 4 | 
             
              def setup
         | 
| 5 5 | 
             
                @log = God::Logger.new(StringIO.new('/dev/null'))
         | 
| 6 6 | 
             
              end
         | 
| @@ -41,8 +41,8 @@ class TestLogger < Test::Unit::TestCase | |
| 41 41 |  | 
| 42 42 | 
             
                out = @log.watch_log_since('foo', t2)
         | 
| 43 43 |  | 
| 44 | 
            -
                 | 
| 45 | 
            -
                 | 
| 44 | 
            +
                assert(/one/ !~ out)
         | 
| 45 | 
            +
                assert(/two/ !~ out)
         | 
| 46 46 | 
             
                assert_match(/three/, out)
         | 
| 47 47 | 
             
              end
         | 
| 48 48 |  | 
    
        data/test/test_metric.rb
    CHANGED
    
    
    
        data/test/test_process.rb
    CHANGED
    
    | @@ -12,7 +12,7 @@ module God | |
| 12 12 | 
             
              end
         | 
| 13 13 | 
             
            end
         | 
| 14 14 |  | 
| 15 | 
            -
            class TestProcessChild < Test | 
| 15 | 
            +
            class TestProcessChild < Minitest::Test
         | 
| 16 16 | 
             
              def setup
         | 
| 17 17 | 
             
                God.internal_init
         | 
| 18 18 | 
             
                @p = God::Process.new
         | 
| @@ -45,6 +45,9 @@ class TestProcessChild < Test::Unit::TestCase | |
| 45 45 | 
             
                @p.log = '/tmp/foo.log'
         | 
| 46 46 | 
             
                @p.uid = 'root'
         | 
| 47 47 |  | 
| 48 | 
            +
                ::Process.stubs(:groups=)
         | 
| 49 | 
            +
                ::Process.stubs(:initgroups)
         | 
| 50 | 
            +
             | 
| 48 51 | 
             
                assert @p.valid?
         | 
| 49 52 | 
             
              end
         | 
| 50 53 |  | 
| @@ -142,13 +145,14 @@ end | |
| 142 145 | 
             
            #
         | 
| 143 146 | 
             
            ###############################################################################
         | 
| 144 147 |  | 
| 145 | 
            -
            class TestProcessDaemon < Test | 
| 148 | 
            +
            class TestProcessDaemon < Minitest::Test
         | 
| 146 149 | 
             
              def setup
         | 
| 147 150 | 
             
                God.internal_init
         | 
| 148 151 | 
             
                @p = God::Process.new
         | 
| 149 152 | 
             
                @p.name = 'foo'
         | 
| 150 153 | 
             
                @p.pid_file = 'blah.pid'
         | 
| 151 154 | 
             
                @p.stubs(:test).returns true # so we don't try to mkdir_p
         | 
| 155 | 
            +
                God::System::Process.stubs(:fetch_system_poller).returns(God::System::PortablePoller)
         | 
| 152 156 | 
             
                Process.stubs(:detach) # because we stub fork
         | 
| 153 157 | 
             
              end
         | 
| 154 158 |  | 
| @@ -243,7 +247,7 @@ class TestProcessDaemon < Test::Unit::TestCase | |
| 243 247 |  | 
| 244 248 | 
             
                assert @p.valid?
         | 
| 245 249 |  | 
| 246 | 
            -
                 | 
| 250 | 
            +
                assert_raises NotImplementedError do
         | 
| 247 251 | 
             
                  @p.call_action(:start)
         | 
| 248 252 | 
             
                end
         | 
| 249 253 | 
             
              end
         | 
    
        data/test/test_prowl.rb
    CHANGED