hutch 0.18.0 → 1.1.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 +5 -5
 - data/.gitignore +3 -0
 - data/.rspec +1 -0
 - data/.travis.yml +20 -8
 - data/.yardopts +5 -0
 - data/CHANGELOG.md +466 -2
 - data/Gemfile +18 -4
 - data/Guardfile +13 -4
 - data/LICENSE +2 -1
 - data/README.md +397 -32
 - data/Rakefile +8 -1
 - data/bin/ci/before_build.sh +20 -0
 - data/bin/ci/install_on_debian.sh +46 -0
 - data/hutch.gemspec +6 -7
 - data/lib/hutch/acknowledgements/base.rb +16 -0
 - data/lib/hutch/acknowledgements/nack_on_all_failures.rb +19 -0
 - data/lib/hutch/adapters/march_hare.rb +1 -1
 - data/lib/hutch/broker.rb +127 -103
 - data/lib/hutch/cli.rb +66 -25
 - data/lib/hutch/config.rb +230 -55
 - data/lib/hutch/consumer.rb +42 -3
 - data/lib/hutch/error_handlers/airbrake.rb +44 -16
 - data/lib/hutch/error_handlers/base.rb +15 -0
 - data/lib/hutch/error_handlers/bugsnag.rb +30 -0
 - data/lib/hutch/error_handlers/honeybadger.rb +33 -18
 - data/lib/hutch/error_handlers/logger.rb +12 -6
 - data/lib/hutch/error_handlers/rollbar.rb +28 -0
 - data/lib/hutch/error_handlers/sentry.rb +15 -12
 - data/lib/hutch/error_handlers/sentry_raven.rb +31 -0
 - data/lib/hutch/error_handlers.rb +3 -0
 - data/lib/hutch/exceptions.rb +8 -1
 - data/lib/hutch/logging.rb +5 -5
 - data/lib/hutch/message.rb +2 -4
 - data/lib/hutch/publisher.rb +75 -0
 - data/lib/hutch/serializers/identity.rb +19 -0
 - data/lib/hutch/serializers/json.rb +22 -0
 - data/lib/hutch/tracers/datadog.rb +17 -0
 - data/lib/hutch/tracers.rb +1 -0
 - data/lib/hutch/version.rb +1 -2
 - data/lib/hutch/waiter.rb +104 -0
 - data/lib/hutch/worker.rb +81 -75
 - data/lib/hutch.rb +15 -6
 - data/lib/yard-settings/handler.rb +38 -0
 - data/lib/yard-settings/yard-settings.rb +2 -0
 - data/spec/hutch/broker_spec.rb +162 -77
 - data/spec/hutch/cli_spec.rb +16 -3
 - data/spec/hutch/config_spec.rb +121 -22
 - data/spec/hutch/consumer_spec.rb +82 -4
 - data/spec/hutch/error_handlers/airbrake_spec.rb +25 -10
 - data/spec/hutch/error_handlers/bugsnag_spec.rb +55 -0
 - data/spec/hutch/error_handlers/honeybadger_spec.rb +24 -2
 - data/spec/hutch/error_handlers/logger_spec.rb +14 -1
 - data/spec/hutch/error_handlers/rollbar_spec.rb +45 -0
 - data/spec/hutch/error_handlers/sentry_raven_spec.rb +37 -0
 - data/spec/hutch/error_handlers/sentry_spec.rb +21 -2
 - data/spec/hutch/logger_spec.rb +12 -6
 - data/spec/hutch/message_spec.rb +2 -2
 - data/spec/hutch/serializers/json_spec.rb +17 -0
 - data/spec/hutch/tracers/datadog_spec.rb +44 -0
 - data/spec/hutch/waiter_spec.rb +51 -0
 - data/spec/hutch/worker_spec.rb +89 -5
 - data/spec/spec_helper.rb +7 -5
 - data/templates/default/class/html/settings.erb +0 -0
 - data/templates/default/class/setup.rb +4 -0
 - data/templates/default/fulldoc/html/css/hutch.css +13 -0
 - data/templates/default/layout/html/setup.rb +7 -0
 - data/templates/default/method_details/html/settings.erb +5 -0
 - data/templates/default/method_details/setup.rb +4 -0
 - data/templates/default/method_details/text/settings.erb +0 -0
 - data/templates/default/module/html/settings.erb +40 -0
 - data/templates/default/module/setup.rb +4 -0
 - metadata +62 -43
 - data/circle.yml +0 -3
 
    
        data/spec/hutch/consumer_spec.rb
    CHANGED
    
    | 
         @@ -28,6 +28,32 @@ describe Hutch::Consumer do 
     | 
|
| 
       28 
28 
     | 
    
         
             
                ComplexConsumer
         
     | 
| 
       29 
29 
     | 
    
         
             
              end
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
      
 31 
     | 
    
         
            +
              let(:consumer_using_quorum_queue) do
         
     | 
| 
      
 32 
     | 
    
         
            +
                unless defined? ConsumerUsingQuorumQueue
         
     | 
| 
      
 33 
     | 
    
         
            +
                  class ConsumerUsingQuorumQueue
         
     | 
| 
      
 34 
     | 
    
         
            +
                    include Hutch::Consumer
         
     | 
| 
      
 35 
     | 
    
         
            +
                    consume 'hutch.test1'
         
     | 
| 
      
 36 
     | 
    
         
            +
                    arguments foo: :bar
         
     | 
| 
      
 37 
     | 
    
         
            +
                    
         
     | 
| 
      
 38 
     | 
    
         
            +
                    quorum_queue
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
                ConsumerUsingQuorumQueue
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              let(:consumer_using_classic_queue) do
         
     | 
| 
      
 45 
     | 
    
         
            +
                unless defined? ConsumerUsingLazyQueue
         
     | 
| 
      
 46 
     | 
    
         
            +
                  class ConsumerUsingLazyQueue
         
     | 
| 
      
 47 
     | 
    
         
            +
                    include Hutch::Consumer
         
     | 
| 
      
 48 
     | 
    
         
            +
                    consume 'hutch.test1'
         
     | 
| 
      
 49 
     | 
    
         
            +
                    arguments foo: :bar
         
     | 
| 
      
 50 
     | 
    
         
            +
                    lazy_queue
         
     | 
| 
      
 51 
     | 
    
         
            +
                    classic_queue
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
                ConsumerUsingLazyQueue
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       31 
57 
     | 
    
         
             
              describe 'module inclusion' do
         
     | 
| 
       32 
58 
     | 
    
         
             
                it 'registers the class as a consumer' do
         
     | 
| 
       33 
59 
     | 
    
         
             
                  expect(Hutch).to receive(:register_consumer) do |klass|
         
     | 
| 
         @@ -71,6 +97,43 @@ describe Hutch::Consumer do 
     | 
|
| 
       71 
97 
     | 
    
         
             
                end
         
     | 
| 
       72 
98 
     | 
    
         
             
              end
         
     | 
| 
       73 
99 
     | 
    
         | 
| 
      
 100 
     | 
    
         
            +
              describe 'default queue mode' do
         
     | 
| 
      
 101 
     | 
    
         
            +
                it 'does not specify any mode by default' do
         
     | 
| 
      
 102 
     | 
    
         
            +
                  expect(simple_consumer.queue_mode).to eq(nil)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  expect(simple_consumer.queue_type).to eq(nil)
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
              describe '.lazy_queue' do
         
     | 
| 
      
 108 
     | 
    
         
            +
                context 'when queue mode has been set explicitly to lazy' do
         
     | 
| 
      
 109 
     | 
    
         
            +
                  it 'sets queue mode to lazy' do
         
     | 
| 
      
 110 
     | 
    
         
            +
                    expect(consumer_using_classic_queue.queue_mode).to eq('lazy')
         
     | 
| 
      
 111 
     | 
    
         
            +
                  end
         
     | 
| 
      
 112 
     | 
    
         
            +
                end
         
     | 
| 
      
 113 
     | 
    
         
            +
              end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
              describe '.classic_queue' do
         
     | 
| 
      
 116 
     | 
    
         
            +
                context 'when queue type has been set explicitly to classic' do
         
     | 
| 
      
 117 
     | 
    
         
            +
                  it 'sets queue type to classic' do
         
     | 
| 
      
 118 
     | 
    
         
            +
                    expect(consumer_using_classic_queue.queue_type).to eq('classic')
         
     | 
| 
      
 119 
     | 
    
         
            +
                  end
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
              end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
              describe '.quorum_queue' do
         
     | 
| 
      
 124 
     | 
    
         
            +
                context 'when queue type has been set explicitly to quorum' do
         
     | 
| 
      
 125 
     | 
    
         
            +
                  it 'sets queue type to quorum' do
         
     | 
| 
      
 126 
     | 
    
         
            +
                    expect(consumer_using_quorum_queue.queue_type).to eq('quorum')
         
     | 
| 
      
 127 
     | 
    
         
            +
                  end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                  it 'accepts initial group size as an option' do
         
     | 
| 
      
 130 
     | 
    
         
            +
                    consumer = simple_consumer
         
     | 
| 
      
 131 
     | 
    
         
            +
                    expect { consumer.quorum_queue(initial_group_size: 3) }
         
     | 
| 
      
 132 
     | 
    
         
            +
                      .to change { consumer.initial_group_size }.to(3)
         
     | 
| 
      
 133 
     | 
    
         
            +
                  end
         
     | 
| 
      
 134 
     | 
    
         
            +
                end
         
     | 
| 
      
 135 
     | 
    
         
            +
              end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
       74 
137 
     | 
    
         
             
              describe '.arguments' do
         
     | 
| 
       75 
138 
     | 
    
         
             
                let(:args) { { foo: :bar} }
         
     | 
| 
       76 
139 
     | 
    
         | 
| 
         @@ -82,15 +145,30 @@ describe Hutch::Consumer do 
     | 
|
| 
       82 
145 
     | 
    
         
             
              end
         
     | 
| 
       83 
146 
     | 
    
         | 
| 
       84 
147 
     | 
    
         
             
              describe '.get_arguments' do
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
148 
     | 
    
         
             
                context 'when defined' do
         
     | 
| 
       87 
     | 
    
         
            -
                  it { expect(complex_consumer.get_arguments).to  
     | 
| 
      
 149 
     | 
    
         
            +
                  it { expect(complex_consumer.get_arguments).to include(foo: :bar) }
         
     | 
| 
       88 
150 
     | 
    
         
             
                end
         
     | 
| 
       89 
151 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
                context 'when  
     | 
| 
       91 
     | 
    
         
            -
                  it  
     | 
| 
      
 152 
     | 
    
         
            +
                context 'when queue is lazy' do
         
     | 
| 
      
 153 
     | 
    
         
            +
                  it 'has the x-queue-mode argument set to lazy' do
         
     | 
| 
      
 154 
     | 
    
         
            +
                    expect(consumer_using_classic_queue.get_arguments['x-queue-mode'])
         
     | 
| 
      
 155 
     | 
    
         
            +
                      .to eq('lazy')
         
     | 
| 
      
 156 
     | 
    
         
            +
                  end
         
     | 
| 
       92 
157 
     | 
    
         
             
                end
         
     | 
| 
       93 
158 
     | 
    
         | 
| 
      
 159 
     | 
    
         
            +
                context "when queue's type is quorum" do
         
     | 
| 
      
 160 
     | 
    
         
            +
                  let(:arguments) { consumer_using_quorum_queue.get_arguments }
         
     | 
| 
      
 161 
     | 
    
         
            +
                  it 'has the x-queue-type argument set to quorum' do
         
     | 
| 
      
 162 
     | 
    
         
            +
                    expect(arguments['x-queue-type']).to eq('quorum')
         
     | 
| 
      
 163 
     | 
    
         
            +
                    expect(arguments).to_not have_key('x-quorum-initial-group-size')
         
     | 
| 
      
 164 
     | 
    
         
            +
                  end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                  it 'has the x-quorum-initial-group-size argument set to quorum' do
         
     | 
| 
      
 167 
     | 
    
         
            +
                    consumer_using_quorum_queue.quorum_queue(initial_group_size: 5)
         
     | 
| 
      
 168 
     | 
    
         
            +
                    expect(arguments['x-queue-type']).to eq('quorum')
         
     | 
| 
      
 169 
     | 
    
         
            +
                    expect(arguments['x-quorum-initial-group-size']).to eq(5)
         
     | 
| 
      
 170 
     | 
    
         
            +
                  end
         
     | 
| 
      
 171 
     | 
    
         
            +
                end
         
     | 
| 
       94 
172 
     | 
    
         
             
              end
         
     | 
| 
       95 
173 
     | 
    
         | 
| 
       96 
174 
     | 
    
         
             
              describe '.get_queue_name' do
         
     | 
| 
         @@ -14,21 +14,36 @@ describe Hutch::ErrorHandlers::Airbrake do 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                it "logs the error to Airbrake" do
         
     | 
| 
       16 
16 
     | 
    
         
             
                  message_id = "1"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  properties = OpenStruct.new(message_id: message_id)
         
     | 
| 
       17 
18 
     | 
    
         
             
                  payload = "{}"
         
     | 
| 
       18 
19 
     | 
    
         
             
                  consumer = double
         
     | 
| 
       19 
20 
     | 
    
         
             
                  ex = error
         
     | 
| 
       20 
21 
     | 
    
         
             
                  message = {
         
     | 
| 
       21 
     | 
    
         
            -
                    : 
     | 
| 
       22 
     | 
    
         
            -
                    : 
     | 
| 
       23 
     | 
    
         
            -
                    : 
     | 
| 
       24 
     | 
    
         
            -
                    :parameters => {
         
     | 
| 
       25 
     | 
    
         
            -
                      :payload => payload,
         
     | 
| 
       26 
     | 
    
         
            -
                      :consumer => consumer,
         
     | 
| 
       27 
     | 
    
         
            -
                    },
         
     | 
| 
       28 
     | 
    
         
            -
                    :cgi_data => ENV.to_hash,
         
     | 
| 
      
 22 
     | 
    
         
            +
                    payload: payload,
         
     | 
| 
      
 23 
     | 
    
         
            +
                    consumer: consumer,
         
     | 
| 
      
 24 
     | 
    
         
            +
                    cgi_data: ENV.to_hash,
         
     | 
| 
       29 
25 
     | 
    
         
             
                  }
         
     | 
| 
       30 
     | 
    
         
            -
                  expect(::Airbrake).to receive(: 
     | 
| 
       31 
     | 
    
         
            -
                  error_handler.handle( 
     | 
| 
      
 26 
     | 
    
         
            +
                  expect(::Airbrake).to receive(:notify).with(ex, message)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  error_handler.handle(properties, payload, consumer, ex)
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 32 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 33 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 34 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 35 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 36 
     | 
    
         
            +
                    err
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                it "logs the error to Airbrake" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 42 
     | 
    
         
            +
                  message = {
         
     | 
| 
      
 43 
     | 
    
         
            +
                    cgi_data: ENV.to_hash,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  }
         
     | 
| 
      
 45 
     | 
    
         
            +
                  expect(::Airbrake).to receive(:notify).with(ex, message)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  error_handler.handle_setup_exception(ex)
         
     | 
| 
       32 
47 
     | 
    
         
             
                end
         
     | 
| 
       33 
48 
     | 
    
         
             
              end
         
     | 
| 
       34 
49 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,55 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe Hutch::ErrorHandlers::Bugsnag do
         
     | 
| 
      
 6 
     | 
    
         
            +
              let(:error_handler) { described_class.new }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              before do
         
     | 
| 
      
 9 
     | 
    
         
            +
                Bugsnag.configure do |bugsnag|
         
     | 
| 
      
 10 
     | 
    
         
            +
                  bugsnag.api_key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              describe "#handle" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 17 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 19 
     | 
    
         
            +
                    err
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                it "logs the error to Bugsnag" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                  message_id = "1"
         
     | 
| 
      
 25 
     | 
    
         
            +
                  properties = OpenStruct.new(message_id: message_id)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  payload = "{}"
         
     | 
| 
      
 27 
     | 
    
         
            +
                  consumer = double
         
     | 
| 
      
 28 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 29 
     | 
    
         
            +
                  message = {
         
     | 
| 
      
 30 
     | 
    
         
            +
                    payload: payload,
         
     | 
| 
      
 31 
     | 
    
         
            +
                    consumer: consumer
         
     | 
| 
      
 32 
     | 
    
         
            +
                  }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  expect(::Bugsnag).to receive(:notify).with(ex).and_call_original
         
     | 
| 
      
 35 
     | 
    
         
            +
                  expect_any_instance_of(::Bugsnag::Report).to receive(:add_tab).with(:hutch, message)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  error_handler.handle(properties, payload, consumer, ex)
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              describe "#handle_setup_exception" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 43 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 44 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 45 
     | 
    
         
            +
                    err
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                it "logs the error to Bugsnag" do
         
     | 
| 
      
 50 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 51 
     | 
    
         
            +
                  expect(::Bugsnag).to receive(:notify).with(ex)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  error_handler.handle_setup_exception(ex)
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -14,6 +14,7 @@ describe Hutch::ErrorHandlers::Honeybadger do 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                it "logs the error to Honeybadger" do
         
     | 
| 
       16 
16 
     | 
    
         
             
                  message_id = "1"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  properties = OpenStruct.new(message_id: message_id)
         
     | 
| 
       17 
18 
     | 
    
         
             
                  payload = "{}"
         
     | 
| 
       18 
19 
     | 
    
         
             
                  consumer = double
         
     | 
| 
       19 
20 
     | 
    
         
             
                  ex = error
         
     | 
| 
         @@ -29,8 +30,29 @@ describe Hutch::ErrorHandlers::Honeybadger do 
     | 
|
| 
       29 
30 
     | 
    
         
             
                        :payload => payload
         
     | 
| 
       30 
31 
     | 
    
         
             
                      }
         
     | 
| 
       31 
32 
     | 
    
         
             
                  }
         
     | 
| 
       32 
     | 
    
         
            -
                  expect( 
     | 
| 
       33 
     | 
    
         
            -
                  error_handler.handle( 
     | 
| 
      
 33 
     | 
    
         
            +
                  expect(error_handler).to receive(:notify_honeybadger).with(message)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  error_handler.handle(properties, payload, consumer, ex)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 39 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 40 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 41 
     | 
    
         
            +
                    raise "Stuff went wrong during setup"
         
     | 
| 
      
 42 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 43 
     | 
    
         
            +
                    err
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                it "logs the error to Honeybadger" do
         
     | 
| 
      
 48 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 49 
     | 
    
         
            +
                  message = {
         
     | 
| 
      
 50 
     | 
    
         
            +
                    :error_class => ex.class.name,
         
     | 
| 
      
 51 
     | 
    
         
            +
                      :error_message => "#{ ex.class.name }: #{ ex.message }",
         
     | 
| 
      
 52 
     | 
    
         
            +
                      :backtrace => ex.backtrace,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  }
         
     | 
| 
      
 54 
     | 
    
         
            +
                  expect(error_handler).to receive(:notify_honeybadger).with(message)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  error_handler.handle_setup_exception(ex)
         
     | 
| 
       34 
56 
     | 
    
         
             
                end
         
     | 
| 
       35 
57 
     | 
    
         
             
              end
         
     | 
| 
       36 
58 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,12 +4,25 @@ describe Hutch::ErrorHandlers::Logger do 
     | 
|
| 
       4 
4 
     | 
    
         
             
              let(:error_handler) { Hutch::ErrorHandlers::Logger.new }
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              describe '#handle' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                let(:properties) { OpenStruct.new(message_id: "1") }
         
     | 
| 
      
 8 
     | 
    
         
            +
                let(:payload) { "{}" }
         
     | 
| 
       7 
9 
     | 
    
         
             
                let(:error) { double(message: "Stuff went wrong", class: "RuntimeError",
         
     | 
| 
       8 
10 
     | 
    
         
             
                                   backtrace: ["line 1", "line 2"]) }
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
                it "logs three separate lines" do
         
     | 
| 
       11 
13 
     | 
    
         
             
                  expect(Hutch::Logging.logger).to receive(:error).exactly(3).times
         
     | 
| 
       12 
     | 
    
         
            -
                  error_handler.handle( 
     | 
| 
      
 14 
     | 
    
         
            +
                  error_handler.handle(properties, payload, double, error)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 19 
     | 
    
         
            +
                let(:error) { double(message: "Stuff went wrong during setup",
         
     | 
| 
      
 20 
     | 
    
         
            +
                                   class: "RuntimeError",
         
     | 
| 
      
 21 
     | 
    
         
            +
                                   backtrace: ["line 1", "line 2"]) }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                it "logs two separate lines" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                  expect(Hutch::Logging.logger).to receive(:error).exactly(2).times
         
     | 
| 
      
 25 
     | 
    
         
            +
                  error_handler.handle_setup_exception(error)
         
     | 
| 
       13 
26 
     | 
    
         
             
                end
         
     | 
| 
       14 
27 
     | 
    
         
             
              end
         
     | 
| 
       15 
28 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Hutch::ErrorHandlers::Rollbar do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:error_handler) { Hutch::ErrorHandlers::Rollbar.new }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              describe '#handle' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 8 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 9 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 10 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 11 
     | 
    
         
            +
                    err
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                it "logs the error to Rollbar" do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  message_id = "1"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  properties = OpenStruct.new(message_id: message_id)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  payload = "{}"
         
     | 
| 
      
 19 
     | 
    
         
            +
                  consumer = double
         
     | 
| 
      
 20 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 21 
     | 
    
         
            +
                  message = {
         
     | 
| 
      
 22 
     | 
    
         
            +
                    payload: payload,
         
     | 
| 
      
 23 
     | 
    
         
            +
                    consumer: consumer
         
     | 
| 
      
 24 
     | 
    
         
            +
                  }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  expect(::Rollbar).to receive(:error).with(ex, message)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  error_handler.handle(properties, payload, consumer, ex)
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 31 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 32 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 33 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 34 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 35 
     | 
    
         
            +
                    err
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                it "logs the error to Rollbar" do
         
     | 
| 
      
 40 
     | 
    
         
            +
                  ex = error
         
     | 
| 
      
 41 
     | 
    
         
            +
                  expect(::Rollbar).to receive(:error).with(ex)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  error_handler.handle_setup_exception(ex)
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Hutch::ErrorHandlers::SentryRaven do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:error_handler) { Hutch::ErrorHandlers::SentryRaven.new }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              describe '#handle' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                let(:properties) { OpenStruct.new(message_id: "1") }
         
     | 
| 
      
 8 
     | 
    
         
            +
                let(:payload) { "{}" }
         
     | 
| 
      
 9 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 10 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 11 
     | 
    
         
            +
                    raise "Stuff went wrong"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 13 
     | 
    
         
            +
                    err
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                it "logs the error to Sentry" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
         
     | 
| 
      
 19 
     | 
    
         
            +
                  error_handler.handle(properties, payload, double, error)
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 24 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 25 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 26 
     | 
    
         
            +
                    raise "Stuff went wrong during setup"
         
     | 
| 
      
 27 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 28 
     | 
    
         
            +
                    err
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                it "logs the error to Sentry" do
         
     | 
| 
      
 33 
     | 
    
         
            +
                  expect(Raven).to receive(:capture_exception).with(error)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  error_handler.handle_setup_exception(error)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -4,6 +4,8 @@ describe Hutch::ErrorHandlers::Sentry do 
     | 
|
| 
       4 
4 
     | 
    
         
             
              let(:error_handler) { Hutch::ErrorHandlers::Sentry.new }
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              describe '#handle' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                let(:properties) { OpenStruct.new(message_id: "1") }
         
     | 
| 
      
 8 
     | 
    
         
            +
                let(:payload) { "{}" }
         
     | 
| 
       7 
9 
     | 
    
         
             
                let(:error) do
         
     | 
| 
       8 
10 
     | 
    
         
             
                  begin
         
     | 
| 
       9 
11 
     | 
    
         
             
                    raise "Stuff went wrong"
         
     | 
| 
         @@ -13,8 +15,25 @@ describe Hutch::ErrorHandlers::Sentry do 
     | 
|
| 
       13 
15 
     | 
    
         
             
                end
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
                it "logs the error to Sentry" do
         
     | 
| 
       16 
     | 
    
         
            -
                  expect( 
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
                  expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  error_handler.handle(properties, payload, double, error)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              describe '#handle_setup_exception' do
         
     | 
| 
      
 25 
     | 
    
         
            +
                let(:error) do
         
     | 
| 
      
 26 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 27 
     | 
    
         
            +
                    raise "Stuff went wrong during setup"
         
     | 
| 
      
 28 
     | 
    
         
            +
                  rescue RuntimeError => err
         
     | 
| 
      
 29 
     | 
    
         
            +
                    err
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                it "logs the error to Sentry" do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  error_handler.handle_setup_exception(error)
         
     | 
| 
       18 
37 
     | 
    
         
             
                end
         
     | 
| 
       19 
38 
     | 
    
         
             
              end
         
     | 
| 
       20 
39 
     | 
    
         
             
            end
         
     | 
    
        data/spec/hutch/logger_spec.rb
    CHANGED
    
    | 
         @@ -3,24 +3,30 @@ require 'spec_helper' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            describe Hutch::Logging do
         
     | 
| 
       4 
4 
     | 
    
         
             
              let(:dummy_object) do
         
     | 
| 
       5 
5 
     | 
    
         
             
                class DummyObject
         
     | 
| 
       6 
     | 
    
         
            -
                  include  
     | 
| 
      
 6 
     | 
    
         
            +
                  include described_class
         
     | 
| 
       7 
7 
     | 
    
         
             
                end
         
     | 
| 
       8 
8 
     | 
    
         
             
              end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              describe '#logger' do
         
     | 
| 
      
 11 
     | 
    
         
            +
                around do |example|
         
     | 
| 
      
 12 
     | 
    
         
            +
                  old_logger = described_class.logger
         
     | 
| 
      
 13 
     | 
    
         
            +
                  described_class.setup_logger
         
     | 
| 
      
 14 
     | 
    
         
            +
                  example.run
         
     | 
| 
      
 15 
     | 
    
         
            +
                  described_class.logger = old_logger
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
       11 
18 
     | 
    
         
             
                context 'with the default logger' do
         
     | 
| 
       12 
     | 
    
         
            -
                  subject {  
     | 
| 
      
 19 
     | 
    
         
            +
                  subject { described_class.logger }
         
     | 
| 
       13 
20 
     | 
    
         | 
| 
       14 
21 
     | 
    
         
             
                  it { is_expected.to be_instance_of(Logger) }
         
     | 
| 
       15 
22 
     | 
    
         
             
                end
         
     | 
| 
       16 
23 
     | 
    
         | 
| 
       17 
24 
     | 
    
         
             
                context 'with a custom logger' do
         
     | 
| 
       18 
     | 
    
         
            -
                  let(:dummy_logger) { double("Dummy logger" 
     | 
| 
       19 
     | 
    
         
            -
                  after { Hutch::Logging.setup_logger }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  let(:dummy_logger) { double("Dummy logger") }
         
     | 
| 
       20 
26 
     | 
    
         | 
| 
       21 
27 
     | 
    
         
             
                  it "users the custom logger" do
         
     | 
| 
       22 
     | 
    
         
            -
                     
     | 
| 
       23 
     | 
    
         
            -
                    expect( 
     | 
| 
      
 28 
     | 
    
         
            +
                    described_class.logger = dummy_logger
         
     | 
| 
      
 29 
     | 
    
         
            +
                    expect(described_class.logger).to eq(dummy_logger)
         
     | 
| 
       24 
30 
     | 
    
         
             
                  end
         
     | 
| 
       25 
31 
     | 
    
         
             
                end
         
     | 
| 
       26 
32 
     | 
    
         
             
              end
         
     | 
    
        data/spec/hutch/message_spec.rb
    CHANGED
    
    | 
         @@ -2,10 +2,10 @@ require 'hutch/message' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe Hutch::Message do
         
     | 
| 
       4 
4 
     | 
    
         
             
              let(:delivery_info) { double('Delivery Info') }
         
     | 
| 
       5 
     | 
    
         
            -
              let(:props) { double('Properties') }
         
     | 
| 
      
 5 
     | 
    
         
            +
              let(:props) { double('Properties', content_type: "application/json") }
         
     | 
| 
       6 
6 
     | 
    
         
             
              let(:body) {{ foo: 'bar' }.with_indifferent_access}
         
     | 
| 
       7 
7 
     | 
    
         
             
              let(:json_body) { MultiJson.dump(body) }
         
     | 
| 
       8 
     | 
    
         
            -
              subject(:message) { Hutch::Message.new(delivery_info, props, json_body) }
         
     | 
| 
      
 8 
     | 
    
         
            +
              subject(:message) { Hutch::Message.new(delivery_info, props, json_body, Hutch::Config[:serializer]) }
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              describe '#body' do
         
     | 
| 
       11 
11 
     | 
    
         
             
                subject { super().body }
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Hutch::Serializers::JSON do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:subject) { described_class }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              it "encode/decode" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                payload = { a: 1, b: 2 }
         
     | 
| 
      
 8 
     | 
    
         
            +
                encoded = subject.encode(payload)
         
     | 
| 
      
 9 
     | 
    
         
            +
                decoded = subject.decode(encoded)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                expect(encoded).to eq "{\"a\":1,\"b\":2}"
         
     | 
| 
      
 12 
     | 
    
         
            +
                expect(decoded).to eq("a" => 1, "b" => 2)
         
     | 
| 
      
 13 
     | 
    
         
            +
                expect(decoded[:a]).to eq 1
         
     | 
| 
      
 14 
     | 
    
         
            +
                expect(decoded[:b]).to eq 2
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Hutch::Tracers::Datadog do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "#handle" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                subject(:handle) { tracer.handle(message) }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                let(:tracer) { described_class.new(klass) }
         
     | 
| 
      
 8 
     | 
    
         
            +
                let(:klass)  do
         
     | 
| 
      
 9 
     | 
    
         
            +
                  Class.new do
         
     | 
| 
      
 10 
     | 
    
         
            +
                    attr_reader :message
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    def initialize
         
     | 
| 
      
 13 
     | 
    
         
            +
                      @message = nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    def class
         
     | 
| 
      
 17 
     | 
    
         
            +
                      OpenStruct.new(name: 'ClassName')
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                    def process(message)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      @message = message
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end.new
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
                let(:message) { double(:message) }
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                before do
         
     | 
| 
      
 28 
     | 
    
         
            +
                  allow(Datadog.tracer).to receive(:trace).and_call_original
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                it 'uses Datadog tracer' do
         
     | 
| 
      
 32 
     | 
    
         
            +
                  handle
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  expect(Datadog.tracer).to have_received(:trace).with('ClassName',
         
     | 
| 
      
 35 
     | 
    
         
            +
                    hash_including(service: 'hutch', span_type: 'rabbitmq'))
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                it 'processes the message' do
         
     | 
| 
      
 39 
     | 
    
         
            +
                  expect {
         
     | 
| 
      
 40 
     | 
    
         
            +
                    handle
         
     | 
| 
      
 41 
     | 
    
         
            +
                  }.to change { klass.message }.from(nil).to(message)
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'hutch/waiter'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Hutch::Waiter do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe '.wait_until_signaled' do
         
     | 
| 
      
 5 
     | 
    
         
            +
                let(:pid) { Process.pid }
         
     | 
| 
      
 6 
     | 
    
         
            +
                def start_kill_thread(signal)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  Thread.new do
         
     | 
| 
      
 8 
     | 
    
         
            +
                    # sleep allows the worker time to set up the signal handling
         
     | 
| 
      
 9 
     | 
    
         
            +
                    # before the kill signal is sent.
         
     | 
| 
      
 10 
     | 
    
         
            +
                    sleep 0.001
         
     | 
| 
      
 11 
     | 
    
         
            +
                    Process.kill signal, pid
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                context 'a QUIT signal is received', if: RSpec::Support::Ruby.mri? do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  it 'logs that hutch is stopping' do
         
     | 
| 
      
 17 
     | 
    
         
            +
                    expect(Hutch::Logging.logger).to receive(:info)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      .with('caught SIGQUIT, stopping hutch...')
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                    start_kill_thread('QUIT')
         
     | 
| 
      
 21 
     | 
    
         
            +
                    described_class.wait_until_signaled
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                context 'a TERM signal is received', if: !defined?(JRUBY_VERSION) do
         
     | 
| 
      
 26 
     | 
    
         
            +
                  it 'logs that hutch is stopping' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                    expect(Hutch::Logging.logger).to receive(:info)
         
     | 
| 
      
 28 
     | 
    
         
            +
                      .with('caught SIGTERM, stopping hutch...')
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    start_kill_thread('TERM')
         
     | 
| 
      
 31 
     | 
    
         
            +
                    described_class.wait_until_signaled
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                context 'a INT signal is received', if: !defined?(JRUBY_VERSION) do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  it 'logs that hutch is stopping' do
         
     | 
| 
      
 37 
     | 
    
         
            +
                    expect(Hutch::Logging.logger).to receive(:info)
         
     | 
| 
      
 38 
     | 
    
         
            +
                      .with('caught SIGINT, stopping hutch...')
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    start_kill_thread('INT')
         
     | 
| 
      
 41 
     | 
    
         
            +
                    described_class.wait_until_signaled
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              describe described_class::SHUTDOWN_SIGNALS do
         
     | 
| 
      
 47 
     | 
    
         
            +
                it 'includes only things in Signal.list.keys' do
         
     | 
| 
      
 48 
     | 
    
         
            +
                  expect(described_class).to eq(described_class & Signal.list.keys)
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     |