bunny 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0ff7b5af604687e3c750723a694563dbb26531b
4
- data.tar.gz: 46b8f5c4414063ffa1732b76b60d62aa38f16e5d
3
+ metadata.gz: 790cbbf1db8e302bc827c5bea5f7402246666232
4
+ data.tar.gz: 5db72065394300e1836777389d4cefc96f2213b2
5
5
  SHA512:
6
- metadata.gz: e30fd008a99b0c0747c7b561d9026c04364a6eadb18f1eed34691aa49d3b504a251f210c58bd9251b3fc18ad8d10001b8a954c7c73d43ae068dd27f8ff03470a
7
- data.tar.gz: 2147b893b63274e8c1d9f6a9e01f3bd02a84446d26d533912f2525a3b1bb51c1409c100cd973bb6e9c88676266924c9f08f5c9e241bf7f1d8d278963eca31720
6
+ metadata.gz: a209a0ee2b9d6bb19616d647f7070dbf6834aff8faa3136e1ae452fa0aae5980c9bc4bffedb6a8f4062f92b3469580936c3c94deca3d386120543ae11f737538
7
+ data.tar.gz: ca0250521c37790299f627edf42db7598ddfe21d1cfd749f84745f5003c160d3c12fa52dbbb3c899aa709125f715bfe55c53697ef2bf05b0db89ec98b5ad6934
@@ -1,12 +1,78 @@
1
1
  ## Pre-requisites
2
2
 
3
- The project uses Bundler for dependency management and requires RabbitMQ `3.4+` to be running
4
- locally. Prior to running the tests, configure the RabbitMQ permissions
5
- by running `./bin/ci/before_script`. Make
6
- sure you have those two installed and then run tests:
3
+ The project uses Bundler for dependency management and requires RabbitMQ `3.5+` to be running
4
+ locally with the `rabbitmq-management` and `rabbitmq_consistent_hash_exchange` plugins enabled.
5
+
6
+
7
+ ### Running the Specs
8
+
9
+ The specs require RabbitMQ to be running locally with a specific set of vhosts
10
+ and users. RabbitMQ can be provisioned and started any way that's convenient to you
11
+ as long as it has a suitable TLS keys configuration and management plugin enabled.
12
+ Make sure you have a recent version of RabbitMQ (> `3.5.3`).
13
+
14
+ You can also start a clean RabbitMQ server
15
+ node on your machine specifically for the bunny specs.
16
+ This can be done either by using a locally installed RabbitMQ server or by
17
+ running a RabbitMQ server in a Docker container.
18
+
19
+ #### Using a locally installed RabbitMQ server
20
+
21
+ Run the following command from the base directory of the gem:
22
+
23
+ ```
24
+ RABBITMQ_NODENAME=bunny RABBITMQ_CONFIG_FILE=./spec/config/rabbitmq RABBITMQ_ENABLED_PLUGINS_FILE=./spec/config/enabled_plugins rabbitmq-server
25
+ ```
26
+
27
+ The specs use the RabbitMQ management plugin and require a TLS port to be available. The config files in the spec/config directory enable these.
28
+
29
+ Next up you'll need to prepare your node for the specs (just once):
30
+
31
+ ```
32
+ RABBITMQ_NODENAME=bunny ./bin/ci/before_build
33
+ ```
34
+
35
+ And then run the core integration suite:
36
+
37
+ ```
38
+ RABBITMQ_NODENAME=bunny CI=true rspec
39
+ ```
40
+
41
+ #### Running a RabbitMQ server in a Docker container
42
+
43
+ First off you have to [install Docker](https://docs.docker.com/engine/installation/) (>= 1.9).
44
+
45
+ After Docker has been installed (and the `docker` command is available on your command line path), run
46
+
47
+ ./bin/ci/start_rabbitmq
48
+
49
+ The first time you do this, it will take some time, since it has to download everything it needs
50
+ to build the Docker image.
51
+
52
+ The RabbitMQ server will run in the foreground in the terminal where you started it. You can stop
53
+ it by pressing CTRL+C.
54
+
55
+ ### Running Test Suites
56
+
57
+ Prior to running the tests, configure the RabbitMQ permissions
58
+ by running `./bin/ci/before_script`. The script uses `rabbitmqctl` and `rabbitmq-plugins`
59
+ to set up RabbitMQ in a way that Bunny test suites expect. Two environment variables,
60
+ `RABBITMQCTL` and `RABBITMQ_PLUGINS`, are available to control what `rabbitmqctl` and
61
+ `rabbitmq-plugins` commands will be used. By default they are taken from `PATH`
62
+ and prefixed with `sudo`.
63
+
64
+ Make sure you have those two installed and then run integration tests:
7
65
 
8
66
  bundle install
9
- bundle exec rspec -cfd spec/
67
+ rake integration
68
+
69
+ It is possible to run all tests:
70
+
71
+ bundle exec rspec -c
72
+
73
+ It is possible to run only integration and regression tests but exclude unit and stress tests:
74
+
75
+ CI=true bundle exec rspec -c spec/higher_level_api/ spec/lower_level_api spec/issues && bundle exec rspec -c spec/higher_level_api/integration/connection_recovery_spec.rb
10
76
 
11
77
  ## Pull Requests
12
78
 
@@ -1,4 +1,13 @@
1
- ## Changes between Bunny 2.3.0 and 2.3.1 (Apr 4th, 2016)
1
+ ## Changes between Bunny 2.3.0 and 2.4.0 (unreleased)
2
+
3
+ ### Unconfirmed Delivery Tag Set Reset on Network Recovery
4
+
5
+ Channels will now reset their unconfirmed delivery tag set after
6
+ recovery.
7
+
8
+ GitHub issue: [#406](https://github.com/ruby-amqp/bunny/pull/406)
9
+
10
+ Contributed by Bill Ruddock.
2
11
 
3
12
  ### Support (Quoted) IPv6 Addresses in Address Lists
4
13
 
@@ -15,6 +24,22 @@ GitHub issue: [#359](https://github.com/ruby-amqp/bunny/issues/359)
15
24
 
16
25
  Contributed by Donal McBreen.
17
26
 
27
+ ### Client-Provided Session `:properties` Merged with Defaults
28
+
29
+ Client-Provided Session `:properties` will now be merged with defaults
30
+ instead of replacing them. This makes it much more convenient to
31
+ override a single key.
32
+
33
+ ### More Predictable RABBITMQ_URL Handling
34
+
35
+ `RABBITMQ_URL` no longer will be used if any other
36
+ connection options are provided. This makes it possible
37
+ to use `RABBITMQ_URL` for some connections and options
38
+ for others in a single OS process.
39
+
40
+ GitHub issue: [#403](https://github.com/ruby-amqp/bunny/pull/403)
41
+
42
+ Contributed by Jimmy Petersen.
18
43
 
19
44
 
20
45
  ## Changes between Bunny 2.2.0 and 2.3.0 (Feb 26th, 2016)
@@ -25,6 +50,8 @@ Contributed by Donal McBreen.
25
50
  when set to `true`, makes consumer work pool threads to have
26
51
  `Thread#abort_on_exception` set on them.
27
52
 
53
+ GH issue: [#382](https://github.com/ruby-amqp/bunny/pull/382)
54
+
28
55
  Contributed by Seamus Abshere.
29
56
 
30
57
  ### Explicit Transport Closure on Recovery
data/README.md CHANGED
@@ -48,7 +48,7 @@ Specific examples:
48
48
 
49
49
  Modern Bunny versions support
50
50
 
51
- * CRuby 2.2, 2.1, 2.0
51
+ * CRuby 2.0 through 2.3
52
52
 
53
53
  Bunny works sufficiently well on JRuby but there are known
54
54
  JRuby bugs in versions prior to JRuby 9000 that cause high CPU burn. JRuby users should
@@ -88,7 +88,7 @@ gem install bunny
88
88
  To use Bunny in a project managed with Bundler:
89
89
 
90
90
  ``` ruby
91
- gem "bunny", ">= 2.2.2"
91
+ gem "bunny", ">= 2.3.1"
92
92
  ```
93
93
 
94
94
 
@@ -183,36 +183,6 @@ try to explain what behavior you expected and why. Bonus points for
183
183
  contributing failing test cases.
184
184
 
185
185
 
186
- ### Running the Specs
187
-
188
- The specs require RabbitMQ to be running locally with a specific set of vhosts
189
- and users. RabbitMQ can be provisioned and started any that's convenient to you
190
- as long as it has a suitable TLS keys configuration and management plugin enabled.
191
- Make sure you have a recent version of RabbitMQ (> `3.5.3`).
192
-
193
- You can also start a clean RabbitMQ server
194
- node on your machine specifically for the bunny specs.
195
- To do so, run the following command
196
- from the base directory of the gem:
197
-
198
- ```
199
- RABBITMQ_NODENAME=bunny RABBITMQ_CONFIG_FILE=./spec/config/rabbitmq RABBITMQ_ENABLED_PLUGINS_FILE=./spec/config/enabled_plugins rabbitmq-server
200
- ```
201
-
202
- The specs use the RabbitMQ management plugin and require a TLS port to be available. The config files in the spec/config directory enable these.
203
-
204
- Next up you'll need to prepare your node for the specs (just once):
205
-
206
- ```
207
- RABBITMQ_NODENAME=bunny ./bin/ci/before_build
208
- ```
209
-
210
- And then run the core integration suite:
211
-
212
- ```
213
- RABBITMQ_NODENAME=bunny CI=true rspec
214
- ```
215
-
216
186
  ## Other Ruby RabbitMQ Clients
217
187
 
218
188
  The other widely used Ruby RabbitMQ client is [March Hare](http://rubymarchhare.info) (JRuby-only).
@@ -221,22 +191,8 @@ It's a mature library that require RabbitMQ 3.3.x or later.
221
191
 
222
192
  ## Contributing
223
193
 
224
- First, clone the repository and run
225
-
226
- bundle install --binstubs
227
-
228
- then set up RabbitMQ vhosts with
229
-
230
- ./bin/ci/before_build
231
-
232
- (if needed, set `RABBITMQCTL` env variable to point to `rabbitmqctl` you want to use)
233
-
234
- and then run tests with
235
-
236
- CI=true ./bin/rspec -cf documentation spec
237
-
238
- After that create a branch and make your changes on it. Once you are done with your changes and all tests pass, submit a pull request
239
- on GitHub.
194
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for more information
195
+ about running various test suites.
240
196
 
241
197
 
242
198
  ## License
@@ -0,0 +1,27 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:integration) do |t|
5
+ # excludes unit tests as those involve many iterations
6
+ # and sometimes suffer from obscure interference from integration tests (!)
7
+ t.pattern = ["spec/higher_level_api/integration", "spec/lower_level_api/integration", "spec/issues", "spec/stress"].
8
+ map { |dir| Dir.glob(File.join(dir, "**", "*_spec.rb")) }.reduce(&:+) - ["spec/higher_level_api/integration/tls_connection_spec.rb"]
9
+
10
+ t.rspec_opts = "--format progress"
11
+ end
12
+
13
+ RSpec::Core::RakeTask.new(:unit) do |t|
14
+ t.pattern = Dir.glob("spec/unit/**/*_spec.rb")
15
+
16
+ t.rspec_opts = "--format progress --backtrace"
17
+ end
18
+
19
+ RSpec::Core::RakeTask.new(:recovery_integration) do |t|
20
+ # otherwise all examples will be skipped
21
+ ENV.delete("CI")
22
+ t.pattern = Dir.glob("spec/higher_level_api/integration/connection_recovery_spec.rb")
23
+
24
+ t.rspec_opts = "--format progress --backtrace"
25
+ end
26
+
27
+ task :default => :integration
@@ -0,0 +1,14 @@
1
+ FROM debian:jessie
2
+
3
+ RUN apt-get -q update && \
4
+ apt-get install -yq --no-install-recommends wget ca-certificates
5
+
6
+ RUN echo 'deb http://www.rabbitmq.com/debian/ testing main' > /etc/apt/sources.list.d/rabbitmq.list && \
7
+ wget -O- https://www.rabbitmq.com/rabbitmq-signing-key-public.asc | apt-key add -
8
+
9
+ RUN apt-get -q update && \
10
+ apt-get install -yq --no-install-recommends rabbitmq-server
11
+
12
+ COPY docker-entrypoint.sh /
13
+
14
+ ENTRYPOINT /docker-entrypoint.sh
@@ -0,0 +1,40 @@
1
+ #!/bin/sh
2
+ server=rabbitmq-server
3
+ ctl=rabbitmqctl
4
+ plugins=rabbitmq-plugins
5
+ delay=3
6
+
7
+ echo '[Configuration] Starting RabbitMQ in detached mode.'
8
+
9
+ $server -detached
10
+
11
+ echo "[Configuration] Waiting $delay seconds for RabbitMQ to start."
12
+
13
+ sleep $delay
14
+
15
+ echo '*** Enabling plugins ***'
16
+ $plugins enable --online rabbitmq_management
17
+ $plugins enable --online rabbitmq_consistent_hash_exchange
18
+
19
+ echo '*** Creating users ***'
20
+ $ctl add_user bunny_gem bunny_password
21
+ $ctl add_user bunny_reader reader_password
22
+
23
+ echo '*** Creating virtual hosts ***'
24
+ $ctl add_vhost bunny_testbed
25
+
26
+ echo '*** Setting virtual host permissions ***'
27
+ $ctl set_permissions -p / guest '.*' '.*' '.*'
28
+ $ctl set_permissions -p bunny_testbed bunny_gem '.*' '.*' '.*'
29
+ $ctl set_permissions -p bunny_testbed guest '.*' '.*' '.*'
30
+ $ctl set_permissions -p bunny_testbed bunny_reader '^---$' '^---$' '.*'
31
+
32
+ $ctl stop
33
+
34
+ echo "[Configuration] Waiting $delay seconds for RabbitMQ to stop."
35
+
36
+ sleep $delay
37
+
38
+ echo 'Starting RabbitMQ in foreground (CTRL-C to exit)'
39
+
40
+ exec $server
@@ -58,7 +58,7 @@ module Bunny
58
58
  # @see http://rubybunny.info/articles/getting_started.html
59
59
  # @see http://rubybunny.info/articles/connecting.html
60
60
  # @api public
61
- def self.new(connection_string_or_opts = {}, opts = {}, &block)
61
+ def self.new(connection_string_or_opts = ENV['RABBITMQ_URL'], opts = {}, &block)
62
62
  if connection_string_or_opts.respond_to?(:keys) && opts.empty?
63
63
  opts = connection_string_or_opts
64
64
  end
@@ -70,7 +70,7 @@ module Bunny
70
70
  end
71
71
 
72
72
 
73
- def self.run(connection_string_or_opts = {}, opts = {}, &block)
73
+ def self.run(connection_string_or_opts = ENV['RABBITMQ_URL'], opts = {}, &block)
74
74
  raise ArgumentError, 'Bunny#run requires a block' unless block
75
75
 
76
76
  client = Session.new(connection_string_or_opts, opts)
@@ -366,7 +366,7 @@ module Bunny
366
366
  # @see http://rubybunny.info/articles/exchanges.html Exchanges and Publishing guide
367
367
  # @api public
368
368
  def default_exchange
369
- self.direct(AMQ::Protocol::EMPTY_STRING, :no_declare => true)
369
+ Exchange.default(self)
370
370
  end
371
371
 
372
372
  # Declares a headers exchange or looks it up in the cache of previously
@@ -427,26 +427,6 @@ module Bunny
427
427
 
428
428
  # @group QoS and Flow Control
429
429
 
430
- # Sets how many messages will be given to consumers on this channel before they
431
- # have to acknowledge or reject one of the previously consumed messages
432
- #
433
- # @param [Integer] prefetch_count Prefetch (QoS setting) for this channel
434
- # @param [Boolean] global
435
- # Whether to use global mode for prefetch:
436
- # - +false+: per-consumer
437
- # - +true+: per-channel
438
- # Note that the default value (+false+) hasn't actually changed, but
439
- # previous documentation described that as meaning per-channel and
440
- # unsupported in RabbitMQ, whereas it now actually appears to mean
441
- # per-consumer and supported
442
- # (https://www.rabbitmq.com/consumer-prefetch.html).
443
- # @see http://rubybunny.info/articles/exchanges.html Exchanges and Publishing guide
444
- # @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
445
- # @api public
446
- def prefetch(count, global = false)
447
- self.basic_qos(count, global)
448
- end
449
-
450
430
  # Flow control. When set to false, RabbitMQ will stop delivering messages on this
451
431
  # channel.
452
432
  #
@@ -649,8 +629,8 @@ module Bunny
649
629
  # @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
650
630
  # @api public
651
631
  def basic_qos(count, global = false)
652
- raise ArgumentError.new("prefetch count must be a positive integer, given: #{prefetch_count}") if count < 0
653
- raise ArgumentError.new("prefetch count must be no greater than #{MAX_PREFETCH_COUNT}, given: #{prefetch_count}") if count > MAX_PREFETCH_COUNT
632
+ raise ArgumentError.new("prefetch count must be a positive integer, given: #{count}") if count < 0
633
+ raise ArgumentError.new("prefetch count must be no greater than #{MAX_PREFETCH_COUNT}, given: #{count}") if count > MAX_PREFETCH_COUNT
654
634
  raise_if_no_longer_open!
655
635
 
656
636
  @connection.send_frame(AMQ::Protocol::Basic::Qos.encode(@id, 0, count, global))
@@ -665,6 +645,7 @@ module Bunny
665
645
 
666
646
  @last_basic_qos_ok
667
647
  end
648
+ alias prefetch basic_qos
668
649
 
669
650
  # Redeliver unacknowledged messages
670
651
  #
@@ -1514,6 +1495,7 @@ module Bunny
1514
1495
  # @api plugin
1515
1496
  def recover_confirm_mode
1516
1497
  if using_publisher_confirmations?
1498
+ @unconfirmed_set.clear
1517
1499
  @delivery_tag_offset = @next_publish_seq_no - 1
1518
1500
  confirm_select(@confirms_callback)
1519
1501
  end
@@ -37,7 +37,6 @@ module Bunny
37
37
  @channel = channel
38
38
  @name = name
39
39
  @options = self.class.add_default_options(name, opts)
40
- @consumers = Hash.new
41
40
 
42
41
  @durable = @options[:durable]
43
42
  @exclusive = @options[:exclusive]
@@ -92,11 +92,11 @@ module Bunny
92
92
  end
93
93
 
94
94
  def stopped?
95
- @mutex.synchronize { @stopped = true }
95
+ @mutex.synchronize { @stopped }
96
96
  end
97
97
 
98
98
  def stopping?
99
- @mutex.synchronize { @stopping = true }
99
+ @mutex.synchronize { @stopping }
100
100
  end
101
101
 
102
102
  def terminate_with(e)
@@ -125,12 +125,12 @@ module Bunny
125
125
  # @see http://rubybunny.info/articles/connecting.html Connecting to RabbitMQ guide
126
126
  # @see http://rubybunny.info/articles/tls.html TLS/SSL guide
127
127
  # @api public
128
- def initialize(connection_string_or_opts = Hash.new, optz = Hash.new)
129
- opts = case (ENV["RABBITMQ_URL"] || connection_string_or_opts)
128
+ def initialize(connection_string_or_opts = ENV['RABBITMQ_URL'], optz = Hash.new)
129
+ opts = case (connection_string_or_opts)
130
130
  when nil then
131
131
  Hash.new
132
132
  when String then
133
- self.class.parse_uri(ENV["RABBITMQ_URL"] || connection_string_or_opts)
133
+ self.class.parse_uri(connection_string_or_opts)
134
134
  when Hash then
135
135
  connection_string_or_opts
136
136
  end.merge(optz)
@@ -179,7 +179,7 @@ module Bunny
179
179
  @channel_max = @client_channel_max
180
180
  @client_heartbeat = self.heartbeat_from(opts)
181
181
 
182
- @client_properties = opts[:properties] || DEFAULT_CLIENT_PROPERTIES
182
+ @client_properties = DEFAULT_CLIENT_PROPERTIES.merge(opts.fetch(:properties, {}))
183
183
  @mechanism = opts.fetch(:auth_mechanism, "PLAIN")
184
184
  @credentials_encoder = credentials_encoder_for(@mechanism)
185
185
  @locale = @opts.fetch(:locale, DEFAULT_LOCALE)
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "2.3.1"
5
+ VERSION = "2.4.0"
6
6
  end
@@ -36,7 +36,10 @@ describe Bunny::Channel, "#prefetch" do
36
36
  ch = connection.create_channel
37
37
  expect {
38
38
  ch.prefetch(100_000)
39
- }.to raise_error(ArgumentError)
39
+ }.to raise_error(
40
+ ArgumentError,
41
+ "prefetch count must be no greater than #{Bunny::Channel::MAX_PREFETCH_COUNT}, given: 100000"
42
+ )
40
43
  end
41
44
  end
42
45
 
@@ -45,7 +48,10 @@ describe Bunny::Channel, "#prefetch" do
45
48
  ch = connection.create_channel
46
49
  expect {
47
50
  ch.prefetch(-2)
48
- }.to raise_error(ArgumentError)
51
+ }.to raise_error(
52
+ ArgumentError,
53
+ "prefetch count must be a positive integer, given: -2"
54
+ )
49
55
  end
50
56
  end
51
57
  end
@@ -5,7 +5,7 @@ unless ENV["CI"]
5
5
  describe "Concurrent consumers sharing a connection" do
6
6
  before :all do
7
7
  @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed",
8
- :automatic_recovery => false, :continuation_timeout => 6000)
8
+ :automatic_recovery => false)
9
9
  @connection.start
10
10
  end
11
11
 
@@ -21,12 +21,13 @@ unless ENV["CI"]
21
21
  let(:colors) { ["red", "blue", "white"] }
22
22
 
23
23
  let(:n) { 32 }
24
- let(:m) { 1000 }
24
+ let(:m) { 5000 }
25
25
 
26
26
  it "successfully drain all queues" do
27
- ch = @connection.create_channel
27
+ ch0 = @connection.create_channel
28
+ ch0.confirm_select
28
29
  body = "абвг"
29
- x = ch.topic("bunny.stress.concurrent.consumers.topic", :durable => true)
30
+ x = ch0.topic("bunny.stress.concurrent.consumers.topic", :durable => true)
30
31
 
31
32
  chs = {}
32
33
  n.times do |i|
@@ -54,14 +55,16 @@ unless ENV["CI"]
54
55
  x.publish(body, :routing_key => colors.sample)
55
56
  end
56
57
  puts "Published #{(i + 1) * m} messages..."
58
+ ch0.wait_for_confirms
57
59
  end
58
60
 
59
61
  while any_not_drained?(qs)
60
62
  sleep 1.0
61
63
  end
62
- puts "Drained all the queues..."
64
+ puts "Drained all queues, winding down..."
63
65
 
64
- ch.close
66
+ ch0.close
67
+ chs.each { |_, ch| ch.close }
65
68
  end
66
69
  end
67
70
  end
@@ -4,7 +4,7 @@ require "spec_helper"
4
4
  unless ENV["CI"]
5
5
  describe "Concurrent publishers sharing a connection" do
6
6
  before :all do
7
- @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatically_recover => false, :continuation_timeout => 20.0)
7
+ @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatically_recover => false)
8
8
  @connection.start
9
9
  end
10
10
 
@@ -16,17 +16,13 @@ unless ENV["CI"]
16
16
  let(:rate) { 5_000 }
17
17
 
18
18
  it "successfully finish publishing" do
19
- ch = @connection.create_channel
20
-
21
- q = ch.queue("", :exclusive => true)
22
19
  body = "сообщение"
23
20
 
24
- # let the queue name be sent back by RabbitMQ
25
- sleep 0.25
26
-
27
21
  chs = {}
28
22
  concurrency.times do |i|
29
- chs[i] = @connection.create_channel
23
+ ch = @connection.create_channel
24
+ ch.confirm_select
25
+ chs[i] = ch
30
26
  end
31
27
 
32
28
  ts = []
@@ -34,14 +30,13 @@ unless ENV["CI"]
34
30
  concurrency.times do |i|
35
31
  t = Thread.new do
36
32
  cht = chs[i]
37
- x = ch.default_exchange
33
+ x = cht.default_exchange
38
34
 
39
- 5.times do |i|
40
- rate.times do
41
- x.publish(body, :routing_key => q.name)
42
- end
43
- puts "Published #{(i + 1) * rate} messages..."
35
+ rate.times do
36
+ x.publish(body)
44
37
  end
38
+ puts "Published #{rate} messages..."
39
+ cht.wait_for_confirms
45
40
  end
46
41
  t.abort_on_exception = true
47
42
 
@@ -51,6 +46,8 @@ unless ENV["CI"]
51
46
  ts.each do |t|
52
47
  t.join
53
48
  end
49
+
50
+ chs.each { |_, ch| ch.close }
54
51
  end
55
52
  end
56
53
  end
@@ -0,0 +1,131 @@
1
+ require "spec_helper"
2
+
3
+ unless ENV["CI"]
4
+ describe "Publisher with wait_for_confirms suffering a lost connection" do
5
+ before :all do
6
+ @connection = Bunny.new(
7
+ :user => "bunny_gem",
8
+ :password => "bunny_password",
9
+ :vhost => "bunny_testbed",
10
+ :recover_from_connection_close => true,
11
+ :network_recovery_interval => 0.2,
12
+ :recovery_attempts => 3,
13
+ :continuation_timeout => 3_000)
14
+ @connection.start
15
+ end
16
+
17
+ after :all do
18
+ @connection.close
19
+ end
20
+
21
+ let(:rate) { 50 }
22
+ let(:inner_rate) { 5 }
23
+ let(:max_retries) { 3 }
24
+ let(:routing_key) { 'confirms' }
25
+
26
+ let(:http_client) { RabbitMQ::HTTP::Client.new('http://127.0.0.1:15672') }
27
+
28
+ let!(:ch_pub) { @connection.create_channel.tap { |ch| ch.confirm_select } }
29
+ let!(:ch_sub) { @connection.create_channel }
30
+ let!(:topic) { 'bunny.stress.concurrent.confirms.topic' }
31
+ let!(:x) { ch_pub.topic(topic, :durable => true) }
32
+ let!(:q) do
33
+ ch_sub.queue('', :durable => true).tap do |q|
34
+ q.bind(x.name, :routing_key => routing_key)
35
+ q.purge
36
+ end
37
+ end
38
+
39
+ def close_all_connections!
40
+ http_client.list_connections.each do |conn_info|
41
+ begin
42
+ http_client.close_connection(conn_info.name)
43
+ rescue Bunny::ConnectionForced => e
44
+ # This is not a problem, but the specs intermittently believe it is.
45
+ printf "Rescued forced connection: #{e.inspect}\n"
46
+ end
47
+ end
48
+ end
49
+
50
+ def wait_for_recovery
51
+ sleep 1.5
52
+ end
53
+
54
+ after do
55
+ unless ch_sub.closed?
56
+ q.delete
57
+ ch_sub.close
58
+ end
59
+ ch_pub.close unless ch_pub.closed?
60
+ end
61
+
62
+ it "successfully publish and consume all messages" do
63
+ begin
64
+ subscriber_mutex = Mutex.new
65
+ ids_received = Set.new
66
+ message_count = nil
67
+
68
+ sub = Thread.new do
69
+ begin
70
+ q.subscribe do |delivery_info, meta, payload|
71
+ subscriber_mutex.synchronize do
72
+ ids_received << payload.to_i
73
+ message_count = q.message_count
74
+ end
75
+ end
76
+ end
77
+ end
78
+ sub.abort_on_exception = true
79
+
80
+ pub = Thread.new do
81
+ rate.times do |i|
82
+ retries = 0
83
+ begin
84
+ inner_rate.times do |j|
85
+ id = i * inner_rate + j
86
+ x.publish(id.to_s, :routing_key => routing_key)
87
+ end
88
+ until ch_pub.unconfirmed_set.empty?
89
+ unless ch_pub.wait_for_confirms
90
+ raise "Not all messages acknowledged, nacks: #{ch_pub.nacked_set.inspect}"
91
+ end
92
+ end
93
+ rescue => e
94
+ puts "Rescued error in iteration #{i}: #{e.inspect}"
95
+ retries += 1
96
+ raise if retries > max_retries
97
+
98
+ puts "sleeping before retry #{retries}"
99
+ sleep 0.5
100
+ retry
101
+ end
102
+ end
103
+ puts "Published #{rate * inner_rate} messages..."
104
+ end
105
+ pub.abort_on_exception = true
106
+ sleep 0.2 while ids_received.size < 10
107
+
108
+ close_all_connections!
109
+ wait_for_recovery
110
+
111
+ pub.join
112
+
113
+ sleep 0.1 until message_count == 0
114
+ puts "Drained queue, winding down..."
115
+
116
+ q.delete
117
+ ch_pub.close
118
+ ch_sub.close
119
+ sub.kill
120
+
121
+ expect(ch_pub.unconfirmed_set).to be_empty
122
+
123
+ expected_ids = Set.new((rate * inner_rate).times)
124
+ missing_ids = expected_ids - ids_received
125
+ expect(missing_ids).to eq(Set.new)
126
+ ensure
127
+ sub.kill
128
+ end
129
+ end
130
+ end
131
+ end
@@ -1,18 +1,18 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
18
18
  -----END CERTIFICATE-----
@@ -1,27 +1,27 @@
1
1
  -----BEGIN RSA PRIVATE KEY-----
2
- MIIEowIBAAKCAQEAzfvqL+nOvDEb3wLFiuRXKbyrBvNbQ4jb1lVQTbagR1kpv0cM
3
- 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
- qWg9i/1JqXGS0M5FyaFZfu5Nc8ZGinjSqbP5de9ZJJIew/e0dSZ2JbshhbLyACIv
5
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- FgeMgysNtOn5hr+aRtayMQuR8jR6GTHW0ZO8gxBnQcfF0TNgDppOsn2eQ2ANQ9MY
17
- 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
- d9TgDwn1pCfsarnsn4DmA+1p7BuPLfNnLeIM69ECgYEAr9ZZ5evjoRlzuVAavnwK
19
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
27
27
  -----END RSA PRIVATE KEY-----
@@ -1,18 +1,18 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- OTA4NDg0MVowKjEXMBUGA1UEAxMObWVyY3VyaW8ubG9jYWwxDzANBgNVBAoTBmNs
5
- aWVudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJd+NA0M21Kj1CyH
6
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 482+zf5bGh+d0E7c4j0jfpf/1+VkfG/Vn5/EpG51DCvYtgg3F3PR39mDmnvKJu8p
16
- eYYvk3Jab0r/v3cLdt5GgZ4/WXZCdVpGgfDd60miXh7DUWilXBRuntVxZequF/ZI
17
- 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
18
18
  -----END CERTIFICATE-----
@@ -1,27 +1,27 @@
1
1
  -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ln4lvX2nZZNB98lgiT/QW8OjUzie8UOzIEa1EwTg2QQe8RKQJUszj5v3/aH77/6V
18
- QBtycEmT4GyHqn9ygbukfTW1aVD1/dFRd6Fqn7UCgYAwNxwlD1/jJ/eBOiV8swzq
19
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
27
27
  -----END RSA PRIVATE KEY-----
@@ -1,18 +1,18 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
18
18
  -----END CERTIFICATE-----
@@ -1,27 +1,27 @@
1
1
  -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- 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
- 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
- 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
- QzJYx5OaV1x/IsDbn+9A+FrgkLh/gFwJi/MJVQIDAQABAoIBAHwiOVR04eaYtSHW
8
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
27
27
  -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Duncan
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2016-04-04 00:00:00.000000000 Z
15
+ date: 2016-06-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: amq-protocol
@@ -46,6 +46,7 @@ files:
46
46
  - Gemfile
47
47
  - LICENSE
48
48
  - README.md
49
+ - Rakefile
49
50
  - benchmarks/basic_publish/with_128K_messages.rb
50
51
  - benchmarks/basic_publish/with_1k_messages.rb
51
52
  - benchmarks/basic_publish/with_4K_messages.rb
@@ -58,7 +59,10 @@ files:
58
59
  - benchmarks/synchronized_sorted_set.rb
59
60
  - benchmarks/write_vs_write_nonblock.rb
60
61
  - bin/ci/before_build
62
+ - bin/ci/start_rabbitmq
61
63
  - bunny.gemspec
64
+ - docker/Dockerfile
65
+ - docker/docker-entrypoint.sh
62
66
  - examples/connection/authentication_failure.rb
63
67
  - examples/connection/automatic_recovery_with_basic_get.rb
64
68
  - examples/connection/automatic_recovery_with_client_named_queues.rb
@@ -193,13 +197,11 @@ files:
193
197
  - spec/stress/concurrent_publishers_stress_spec.rb
194
198
  - spec/stress/connection_open_close_spec.rb
195
199
  - spec/stress/long_running_consumer_spec.rb
200
+ - spec/stress/wait_for_confirms_with_connection_loss_stress_spec.rb
196
201
  - spec/tls/ca_certificate.pem
197
202
  - spec/tls/ca_key.pem
198
- - spec/tls/cacert.pem
199
- - spec/tls/client_cert.pem
200
203
  - spec/tls/client_certificate.pem
201
204
  - spec/tls/client_key.pem
202
- - spec/tls/server_cert.pem
203
205
  - spec/tls/server_certificate.pem
204
206
  - spec/tls/server_key.pem
205
207
  - spec/unit/bunny_spec.rb
@@ -228,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
230
  version: '0'
229
231
  requirements: []
230
232
  rubyforge_project:
231
- rubygems_version: 2.5.1
233
+ rubygems_version: 2.4.8
232
234
  signing_key:
233
235
  specification_version: 4
234
236
  summary: Popular easy to use Ruby client for RabbitMQ
@@ -295,13 +297,11 @@ test_files:
295
297
  - spec/stress/concurrent_publishers_stress_spec.rb
296
298
  - spec/stress/connection_open_close_spec.rb
297
299
  - spec/stress/long_running_consumer_spec.rb
300
+ - spec/stress/wait_for_confirms_with_connection_loss_stress_spec.rb
298
301
  - spec/tls/ca_certificate.pem
299
302
  - spec/tls/ca_key.pem
300
- - spec/tls/cacert.pem
301
- - spec/tls/client_cert.pem
302
303
  - spec/tls/client_certificate.pem
303
304
  - spec/tls/client_key.pem
304
- - spec/tls/server_cert.pem
305
305
  - spec/tls/server_certificate.pem
306
306
  - spec/tls/server_key.pem
307
307
  - spec/unit/bunny_spec.rb
@@ -1,18 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIC5DCCAcygAwIBAgIJAMa8aNd9TfEZMA0GCSqGSIb3DQEBBQUAMCIxETAPBgNV
3
- BAMTCE15VGVzdENBMQ0wCwYDVQQHEwQxODE1MB4XDTEzMDYwMjE1NTQwMFoXDTE0
4
- MDYwMjE1NTQwMFowIjERMA8GA1UEAxMITXlUZXN0Q0ExDTALBgNVBAcTBDE4MTUw
5
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSLh8ZM0+1wVrr4J9KZLLt
6
- VtGoKEhuTWYa+DvDbdUYaD/G06GfRqsM0eOKuJfoaMz3qY49j/bZXmuG64rGx5oq
7
- Lp6VBwAw1R3Pmw3rD7XgiK0/7mVmnC4nwQAs9/uCKeAMPHfMDAG33aalxb3FzJfa
8
- RUiSIY7y7Kt7nCVC53foTFxbt0EKm7wjey1S8P9XkCB8x+ZT5GetzoqulKxt/f1u
9
- 0K/gVnMUvFmflR4hsx5qBNV6wFEYwMfi+C6q184aJv7jmjumimf9IBOcOkZrDnQD
10
- +7HeOeZAbMgLtCaacD2SH72s3hIHvgetbIJva+zJkbjjjA+Ycd824WjG+CiOEIch
11
- AgMBAAGjHTAbMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB
12
- BQUAA4IBAQAvLziFQ56+vNyNAGDD8bQaUY8JElXj4X3vC0nFeN0zuPQz9Aa8UH4A
13
- Y7e/j3NS2mfYdqC8U3iYEXZwp4qk4/JZ9SkhRiaLbeIF7VT+xg+K/HDmBmwNZpQL
14
- b9bNBk9BeRMv4jJUuM/BE04nmqQnbD8h2QleT0A7uVe94ym86rHcimCYmZT7wEZ0
15
- D3TZPRnETwe2WtpAU3qB6Zd2ug/GulFdeugHe8bM0Kjz+BiK+Tmsa0SIN31t/uu4
16
- Tcxk1uFldIGPURAgs6MXxBHohOdJySBLrjsJWlD02Oxv9LeCfxej/gA6pZ4Wiyh/
17
- VtkyWoFlx/8n2S7IH1bKqMFy0SU/Fp3F
18
- -----END CERTIFICATE-----
@@ -1,18 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQUFADAnMRUwEwYDVQQDEwxNeVRl
3
- c3RSb290Q0ExDjAMBgNVBAcTBTgwNTQ3MB4XDTE0MDkxMjA4NDg0MVoXDTI0MDkw
4
- OTA4NDg0MVowKjEXMBUGA1UEAxMObWVyY3VyaW8ubG9jYWwxDzANBgNVBAoTBmNs
5
- aWVudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJd+NA0M21Kj1CyH
6
- WmnLzUAQAi3GawvLnxwyrlW3nfl1BLEL2kLHrHYS7S0giL0T/Zziw9BqNB2Fba3l
7
- RbI8d0JppuMXRRHnFTY/fLYpQlcwB8hT17NBk8euoU1r2VopCwDKP8rxAxLLL9Im
8
- 2Cg+ksvZe+6yJPzAQ5aw1zc+UMSwJ8p2gAI7BI8Oekk506iccwbHwqVHH3DwCCXp
9
- 0dRtzMeRqZY9lC1wsLHVYLl/Pc/xWtqjuk0j5px6RtrBoW16MaK43zH1nFlEA8KH
10
- c0RVFaQsQMVYBbxsVq54rymGInmmSk+vy5ZoFC1ItBRPSSgI1beaL5/4B/dJGI74
11
- 7u/+cpsCAwEAAaMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwEwYDVR0lBAww
12
- CgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADggEBALPEuvS/1/0IBM/Kyi0MHa6m
13
- KjltIm2Cp8iaTkziy9r2UDckvSqv8GW0itE69126j4L1iVUYNIVemUvcAwaX3YLf
14
- nN80XMjNl8mpSKwCXvKKXUTAFUQN+SPMbEC7Uzip1WgJGyc2T9ka8iN+nd1T7btU
15
- 482+zf5bGh+d0E7c4j0jfpf/1+VkfG/Vn5/EpG51DCvYtgg3F3PR39mDmnvKJu8p
16
- eYYvk3Jab0r/v3cLdt5GgZ4/WXZCdVpGgfDd60miXh7DUWilXBRuntVxZequF/ZI
17
- obei8teP2T/4oos3GWPOLxEA8EnQsdUoXxK/2DTq+9G6PQTQNm2/kvR6hPKimBk=
18
- -----END CERTIFICATE-----
@@ -1,18 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIC+zCCAeOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADAnMRUwEwYDVQQDEwxNeVRl
3
- c3RSb290Q0ExDjAMBgNVBAcTBTgwNTQ3MB4XDTE0MDkxMjA4NDg0MloXDTI0MDkw
4
- OTA4NDg0MlowKjEXMBUGA1UEAxMObWVyY3VyaW8ubG9jYWwxDzANBgNVBAoTBnNl
5
- cnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALvQX6P7Tz0sNKNg
6
- yiEb71gg84gyOaaTnIbgPKHTJ9kFMLZFQ3HN05dHLwqH1noefauV6HVPESVVf01m
7
- Ph28jre9tBorPAaiIzuf2kKlpZolN7Q9d/5rb2Vw3dUpoZJoD4aL+u8cghmkzodV
8
- vts1WRIRjH/yTUc266+h6m9lIi9L9BCYMTAWOF0KHoXA2VgLLkQNv+2GKHFP32ZH
9
- 1vXa98fxErpJ//3jRwP5m4t0PDSPlAw++bOiwgZb8r+vEOCyZE15BoukSi8rtibc
10
- tSpYsbyvWaoe/JQfGPI3St84DhrUPPm2FUMyWMeTmldcfyLA25/vQPha4JC4f4Bc
11
- CYvzCVUCAwEAAaMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCBSAwEwYDVR0lBAww
12
- CgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADggEBADWhd3ikOdCFNZfDy9If9txm
13
- WtiBJ8g3oWjj99zIvb0CNqp0Xv5jvWgw8DYXG5FZAA7g5sKrihkxKTtpYnKsTZ40
14
- HEcGRUqF/Z1LLeh7/OYMx597yBn86ZcqUyBIaIsEhHNa+yC1zHWa4rg1vpDwY/iI
15
- Mbewjy9KyB4n6w+3TpSHvhpEa5OJiDOMFePURsS3io9r7MGfFVTM0Cho1qIYT1vt
16
- tOoUXpKAJxu+6TwDXzMwoSmjMw5GtchqhpCHQcHBH9z1rGHh/VShGl/+rif4JZ98
17
- natbZ91esBaJKbWLUxH1U9Aol8wwYD4MzK3rvfImgjgig+htAqhCMxLu1z9VE+o=
18
- -----END CERTIFICATE-----