onstomp 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. data/.gitignore +4 -0
  2. data/.yardopts +2 -1
  3. data/Rakefile +147 -0
  4. data/extra_doc/API.md +491 -0
  5. data/extra_doc/API.md.erb +33 -0
  6. data/extra_doc/DeveloperNarrative.md +123 -0
  7. data/extra_doc/UserNarrative.md +511 -0
  8. data/lib/onstomp.rb +5 -5
  9. data/lib/onstomp/client.rb +6 -1
  10. data/lib/onstomp/components/frame.rb +6 -6
  11. data/lib/onstomp/components/frame_headers.rb +18 -18
  12. data/lib/onstomp/components/scopes/transaction_scope.rb +11 -11
  13. data/lib/onstomp/components/subscription.rb +2 -2
  14. data/lib/onstomp/components/threaded_processor.rb +1 -1
  15. data/lib/onstomp/components/uri.rb +1 -1
  16. data/lib/onstomp/connections/base.rb +5 -5
  17. data/lib/onstomp/connections/heartbeating.rb +2 -2
  18. data/lib/onstomp/connections/serializers/stomp_1.rb +6 -6
  19. data/lib/onstomp/connections/serializers/stomp_1_1.rb +2 -2
  20. data/lib/onstomp/connections/stomp_1_0.rb +1 -1
  21. data/lib/onstomp/connections/stomp_1_1.rb +1 -1
  22. data/lib/onstomp/failover.rb +4 -0
  23. data/lib/onstomp/failover/buffers.rb +1 -0
  24. data/lib/onstomp/failover/buffers/receipts.rb +101 -0
  25. data/lib/onstomp/failover/buffers/written.rb +2 -2
  26. data/lib/onstomp/failover/client.rb +15 -12
  27. data/lib/onstomp/failover/failover_configurable.rb +3 -3
  28. data/lib/onstomp/failover/pools/base.rb +1 -1
  29. data/lib/onstomp/failover/uri.rb +41 -16
  30. data/lib/onstomp/interfaces/client_configurable.rb +1 -1
  31. data/lib/onstomp/interfaces/client_events.rb +30 -11
  32. data/lib/onstomp/interfaces/connection_events.rb +5 -1
  33. data/lib/onstomp/interfaces/event_manager.rb +2 -2
  34. data/lib/onstomp/interfaces/frame_methods.rb +169 -8
  35. data/lib/onstomp/interfaces/uri_configurable.rb +3 -3
  36. data/lib/onstomp/open-uri/client_extensions.rb +4 -4
  37. data/lib/onstomp/version.rb +2 -2
  38. data/onstomp.gemspec +0 -1
  39. data/spec/onstomp/components/threaded_processor_spec.rb +21 -0
  40. data/spec/onstomp/connections/base_spec.rb +15 -0
  41. data/spec/onstomp/failover/buffers/receipts_spec.rb +189 -0
  42. data/spec/onstomp/failover/buffers/written_spec.rb +167 -1
  43. data/spec/onstomp/failover/client_spec.rb +70 -1
  44. data/spec/onstomp/failover/failover_events_spec.rb +1 -2
  45. data/spec/onstomp/failover/uri_spec.rb +37 -4
  46. data/spec/onstomp/full_stacks/failover_spec.rb +76 -25
  47. data/spec/onstomp/full_stacks/onstomp_spec.rb +52 -8
  48. data/spec/onstomp/full_stacks/onstomp_ssh_spec.rb +83 -0
  49. data/spec/onstomp/full_stacks/test_broker.rb +45 -29
  50. metadata +11 -15
  51. data/DeveloperNarrative.md +0 -15
  52. data/UserNarrative.md +0 -8
@@ -61,8 +61,7 @@ module OnStomp::Failover
61
61
  end
62
62
  end
63
63
 
64
- [:connect_failure, :retries_exceeded,
65
- :lost, :connected].each do |ev|
64
+ [:connect_failure, :lost, :connected].each do |ev|
66
65
  it "should have an event :on_failover_#{ev}" do
67
66
  triggered = false
68
67
  events.send(:"on_failover_#{ev}") { |*_| triggered = true }
@@ -4,16 +4,49 @@ require 'spec_helper'
4
4
  module OnStomp::Failover
5
5
  describe URI, :failover => true do
6
6
  describe "parsing failover: URIs" do
7
- it "should parse the string and the internal URIs" do
8
- uri = ::URI.parse('failover:(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)?param=blah&param2=testing')
7
+ def parse_failover_uri str
8
+ OnStomp::Failover::URI::FAILOVER.parse str
9
+ end
10
+
11
+ it "should parse failover:(uri1,uri2...)?failoverParam1=..." do
12
+ uri = parse_failover_uri 'failover:(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)?param=blah&param2=testing'
13
+ uri.query.should == 'param=blah&param2=testing'
14
+ uri.failover_uris.map { |u| u.scheme }.should == ['stomp', 'stomp+ssl', 'stomp']
15
+ uri.failover_uris.map { |u| u.host }.should == ['host.domain.tld', nil, 'other.host.tld']
16
+ uri.failover_uris.map { |u| u.query }.should == [nil, 'param=value&param2=value2', nil]
17
+ uri.to_s.should == "failover:(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)?param=blah&param2=testing"
18
+ end
19
+ it "should parse failover://(uri1,uri2...)?failoverParam1=..." do
20
+ uri = parse_failover_uri 'failover://(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)?param=blah&param2=testing'
9
21
  uri.query.should == 'param=blah&param2=testing'
10
22
  uri.failover_uris.map { |u| u.scheme }.should == ['stomp', 'stomp+ssl', 'stomp']
11
23
  uri.failover_uris.map { |u| u.host }.should == ['host.domain.tld', nil, 'other.host.tld']
12
24
  uri.failover_uris.map { |u| u.query }.should == [nil, 'param=value&param2=value2', nil]
25
+ uri.to_s.should == "failover:(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)?param=blah&param2=testing"
26
+ end
27
+ it "should parse failover://uri1,uri2,..." do
28
+ uri = parse_failover_uri 'failover://stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld'
29
+ uri.query.should be_nil
30
+ uri.failover_uris.map { |u| u.scheme }.should == ['stomp', 'stomp+ssl', 'stomp']
31
+ uri.failover_uris.map { |u| u.host }.should == ['host.domain.tld', nil, 'other.host.tld']
32
+ uri.failover_uris.map { |u| u.query }.should == [nil, 'param=value&param2=value2', nil]
33
+ uri.to_s.should == "failover:(stomp://host.domain.tld,stomp+ssl:///?param=value&param2=value2,stomp://user:pass@other.host.tld)"
34
+ end
35
+ it "should parse an array of failover URIs" do
36
+ uris = [ "stomp://host.domain.tld",
37
+ ::URI.parse("stomp://user:pass@other.host.tld"),
38
+ "stomp+ssl:///?param=value&param2=value2"]
39
+ uri = parse_failover_uri uris
40
+ uri.query.should be_nil
41
+ uri.failover_uris.map { |u| u.scheme }.should == ['stomp', 'stomp', 'stomp+ssl']
42
+ uri.failover_uris.map { |u| u.host }.should == ['host.domain.tld', 'other.host.tld', nil]
43
+ uri.failover_uris.map { |u| u.query }.should == [nil, nil, 'param=value&param2=value2']
44
+ uri.to_s.should == "failover:(stomp://host.domain.tld,stomp://user:pass@other.host.tld,stomp+ssl:///?param=value&param2=value2)"
13
45
  end
14
- it "should raise an error if the failover URI doesn't match regex" do
46
+ it "should raise an error if it doesn't match the regex and isn't an array" do
15
47
  lambda {
16
- ::URI.parse('failover://stomp://host.domain.tld,stomp+ssl://sunday.after.you')
48
+ # The regex is pretty lax...
49
+ parse_failover_uri "failover:"
17
50
  }.should raise_error(OnStomp::Failover::InvalidFailoverURIError)
18
51
  end
19
52
  end
@@ -3,53 +3,104 @@ require 'spec_helper'
3
3
  require File.expand_path('../test_broker', __FILE__)
4
4
 
5
5
  describe OnStomp::Failover, "full stack test", :fullstack => true, :failover => true do
6
- let(:broker) {
7
- TestBroker.new
6
+ let(:brokers) {
7
+ [TestBroker.new(10102),
8
+ TestBroker.new(10103)]
8
9
  }
9
10
  before(:each) do
10
- broker.start
11
+ brokers.each &:start
11
12
  end
12
13
  after(:each) do
13
- broker.stop
14
+ brokers.each &:stop
14
15
  end
15
16
 
16
- describe "failing over" do
17
- it "should do something worthwhile" do
17
+ describe "failing over with a Written buffer" do
18
+ # We wrote [stomp://localhost:10102]: CONNECT / {:"accept-version"=>"1.0,1.1", :host=>"localhost", :"heart-beat"=>"0,0", :login=>"", :passcode=>""}
19
+ # We wrote [stomp://localhost:10102]: SEND / {:"x-onstomp-real-client"=>"2156558740", :destination=>"/queue/onstomp/failover/test", :"content-length"=>"22"}
20
+ # We wrote [stomp://localhost:10102]: BEGIN / {:"x-onstomp-real-client"=>"2156558740", :transaction=>"t-1234"}
21
+ # We wrote [stomp://localhost:10102]: SEND / {:transaction=>"t-1234", :"x-onstomp-real-client"=>"2156558740", :destination=>"/queue/onstomp/failover/test", :"content-length"=>"15"}
22
+ # We wrote [stomp://localhost:10102]: SUBSCRIBE / {:id=>"1", :"x-onstomp-real-client"=>"2156558740", :ack=>"auto", :destination=>"/queue/onstomp/failover/test"}
23
+ # We wrote [stomp://localhost:10102]: SEND / {:"x-onstomp-real-client"=>"2156558740", :destination=>"/queue/onstomp/failover/test", :"content-length"=>"18"}
24
+ # We wrote [stomp://localhost:10103]: CONNECT / {:"accept-version"=>"1.0,1.1", :host=>"localhost", :"heart-beat"=>"0,0", :login=>"", :passcode=>""}
25
+ # We wrote [stomp://localhost:10103]: DISCONNECT / {:"x-onstomp-real-client"=>"2156556660"}
26
+ # Received: ["CONNECT", "SEND", "BEGIN", "SEND", "SUBSCRIBE"]We wrote [stomp://localhost:10103]: BEGIN / {:"x-onstomp-real-client"=>"2156558740", :transaction=>"t-1234", :"x-onstomp-failover-replay"=>"1"}
27
+ #
28
+ # Transmitted: ["CONNECTED"]
29
+ # Received: ["CONNECT", "DISCONNECT"]
30
+ # Transmitted: ["CONNECTED"]
31
+ #
32
+ it "should failover" do
33
+ # Occasionally generates: ["CONNECT", "DISCONNECT", "BEGIN", "SEND", "SUBSCRIBE", "SEND", "COMMIT"]
18
34
  committed = false
35
+ brokers.first.kill_on_command 'SUBSCRIBE'
19
36
  killed = false
20
37
 
21
- client = OnStomp::Failover::Client.new('failover:(stomp:///,stomp:///)')
22
- client.on_commit do |c|
23
- committed = true
38
+ client = OnStomp::Failover::Client.new('failover:(stomp://localhost:10102,stomp://localhost:10103)')
39
+ client.on_subscribe do |s, rc|
40
+ # This frame will almost always get written to the first broker before the hangup occurs
41
+ client.send '/queue/onstomp/failover/test', 'are you receiving?',
42
+ :'x-onstomp-real-client' => rc.uri
43
+ end
44
+
45
+ client.connect
46
+ client.send '/queue/onstomp/failover/test', '4-3-2-1 Earth Below Me',
47
+ :'x-onstomp-real-client' => client.active_client.uri
48
+ client.begin 't-1234', :'x-onstomp-real-client' => client.active_client.uri
49
+ client.send '/queue/onstomp/failover/test', 'hello major tom',
50
+ :transaction => 't-1234', :'x-onstomp-real-client' => client.active_client.uri
51
+ client.subscribe('/queue/onstomp/failover/test', :'x-onstomp-real-client' => client.active_client.uri) do |m|
52
+ end
53
+ Thread.pass while client.connected?
54
+
55
+ client.send '/queue/onstomp/failover/test', 'Are you receiving?',
56
+ :'x-onstomp-real-client' => client.active_client.uri
57
+ sub = client.subscribe('/queue/onstomp/failover/test2', :'x-onstomp-real-client' => client.active_client.uri) do |m|
24
58
  end
59
+ client.unsubscribe sub, :'x-onstomp-real-client' => client.active_client.uri
60
+ client.commit 't-1234', :'x-onstomp-real-client' => client.active_client.uri
61
+
62
+ client.disconnect :'x-onstomp-real-client' => client.active_client.uri
63
+ brokers.each(&:join)
64
+ brokers.first.frames_received.map(&:command).should == ["CONNECT", "SEND", "BEGIN", "SEND", "SUBSCRIBE"]
65
+ brokers.last.frames_received.map(&:command).should == ["CONNECT", "BEGIN", "SEND", "SUBSCRIBE", "SEND", "COMMIT", "SEND", "DISCONNECT"]
66
+ end
67
+ end
68
+ describe "failing over with a Receipts buffer" do
69
+ it "should failover" do
70
+ committed = false
71
+ killed = false
72
+ brokers.first.kill_on_command 'SUBSCRIBE'
73
+
74
+ client = OnStomp::Failover::Client.new('failover:(stomp://localhost:10102,stomp://localhost:10103)',
75
+ :buffer => OnStomp::Failover::Buffers::Receipts)
25
76
  client.on_subscribe do |s, rc|
26
- broker.kill_sessions unless killed
27
- killed = true
77
+ # This frame will get written, but the broker will hang up before
78
+ # a RECEIPT is given, so it will get repeated
28
79
  client.send '/queue/onstomp/failover/test', 'are you receiving?',
29
- :'x-onstomp-real-client' => rc.object_id
80
+ :'x-onstomp-real-client' => rc.uri
30
81
  end
31
82
 
32
83
  client.connect
33
84
  client.send '/queue/onstomp/failover/test', '4-3-2-1 Earth Below Me',
34
- :'x-onstomp-real-client' => client.active_client.object_id
35
- client.begin 't-1234', :'x-onstomp-real-client' => client.active_client.object_id
85
+ :'x-onstomp-real-client' => client.active_client.uri
86
+ client.begin 't-1234', :'x-onstomp-real-client' => client.active_client.uri
36
87
  client.send '/queue/onstomp/failover/test', 'hello major tom',
37
- :transaction => 't-1234', :'x-onstomp-real-client' => client.active_client.object_id
38
- client.subscribe('/queue/onstomp/failover/test', :'x-onstomp-real-client' => client.active_client.object_id) do |m|
88
+ :transaction => 't-1234', :'x-onstomp-real-client' => client.active_client.uri
89
+ client.subscribe('/queue/onstomp/failover/test', :'x-onstomp-real-client' => client.active_client.uri) do |m|
39
90
  end
40
91
  Thread.pass while client.connected?
41
92
 
42
93
  client.send '/queue/onstomp/failover/test', 'Are you receiving?',
43
- :'x-onstomp-real-client' => client.active_client.object_id
44
- sub = client.subscribe('/queue/onstomp/failover/test2', :'x-onstomp-real-client' => client.active_client.object_id) do |m|
94
+ :'x-onstomp-real-client' => client.active_client.uri
95
+ sub = client.subscribe('/queue/onstomp/failover/test2', :'x-onstomp-real-client' => client.active_client.uri) do |m|
45
96
  end
46
- client.unsubscribe sub, :'x-onstomp-real-client' => client.active_client.object_id
47
- client.commit 't-1234', :'x-onstomp-real-client' => client.active_client.object_id
48
- # This is not waiting for debuffering?
49
- client.disconnect :'x-onstomp-real-client' => client.active_client.object_id
50
- broker.join
51
- killed.should be_true
52
- committed.should be_true
97
+ client.unsubscribe sub, :'x-onstomp-real-client' => client.active_client.uri
98
+ client.commit 't-1234', :'x-onstomp-real-client' => client.active_client.uri
99
+
100
+ client.disconnect :'x-onstomp-real-client' => client.active_client.uri
101
+ brokers.each(&:join)
102
+ brokers.first.frames_received.map(&:command).should == ["CONNECT", "SEND", "BEGIN", "SEND", "SUBSCRIBE"]
103
+ brokers.last.frames_received.map(&:command).should == ["CONNECT", "SEND", "BEGIN", "SEND", "SUBSCRIBE", "SEND", "SEND", "COMMIT", "SEND", "DISCONNECT"]
53
104
  end
54
105
  end
55
106
  end
@@ -2,14 +2,58 @@
2
2
  require 'spec_helper'
3
3
  require File.expand_path('../test_broker', __FILE__)
4
4
 
5
- describe OnStomp::Client, "full stack test", :fullstack => true do
6
- let(:broker) {
7
- TestBroker.new
8
- }
9
- before(:each) do
10
- broker.start
5
+ describe OnStomp::Client, "full stack test (stomp+ssl:)", :fullstack => true do
6
+ describe "STOMP 1.0" do
7
+ let(:broker) {
8
+ TestBroker.new 10101
9
+ }
10
+ before(:each) do
11
+ broker.start
12
+ end
13
+ after(:each) do
14
+ broker.stop
15
+ end
16
+
17
+ describe "connecting" do
18
+ it "should connect to the broker given a CA path" do
19
+ client = OnStomp::Client.new('stomp://localhost:10101')
20
+ client.connect
21
+ client.send '/queue/test', 'my message body', {
22
+ "this:is\na \\fun\\ header" => 'blather matter'
23
+ }
24
+ client.send '/queue/test', "\x01\x02\x03\x04\x05\x06".encode('BINARY'),
25
+ :'content-type' => 'application/octet-stream'
26
+ client.disconnect
27
+ broker.join
28
+ end
29
+ end
11
30
  end
12
- after(:each) do
13
- broker.stop
31
+ describe "STOMP 1.1" do
32
+ let(:broker) {
33
+ TestBroker.new(10101).tap do |b|
34
+ b.session_class = TestBroker::Session11
35
+ end
36
+ }
37
+ before(:each) do
38
+ broker.start
39
+ end
40
+ after(:each) do
41
+ broker.stop
42
+ end
43
+
44
+ describe "connecting" do
45
+ it "should connect to the broker given a CA path" do
46
+ client = OnStomp::Client.new('stomp://localhost:10101')
47
+ client.connect
48
+ client.send '/queue/test', 'my message body', {
49
+ "this:is\na \\fun\\ header" => 'blather matter'
50
+ }
51
+ client.send '/queue/test', "\x01\x02\x03\x04\x05\x06".encode('BINARY'),
52
+ :'content-type' => 'application/octet-stream'
53
+ client.disconnect
54
+ broker.join
55
+ end
56
+ end
14
57
  end
58
+
15
59
  end
@@ -0,0 +1,83 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require File.expand_path('../test_broker', __FILE__)
4
+
5
+ describe OnStomp::Client, "full stack test (stomp+ssl:)", :fullstack => true do
6
+ describe "STOMP 1.0" do
7
+ let(:broker) {
8
+ TestSSLBroker.new 10103
9
+ }
10
+ before(:each) do
11
+ broker.start
12
+ end
13
+ after(:each) do
14
+ broker.stop
15
+ end
16
+
17
+ describe "connecting with SSL options" do
18
+ it "should connect to the broker given a CA path" do
19
+ client = OnStomp::Client.new('stomp+ssl://localhost:10103', :ssl => {
20
+ :ca_file => File.expand_path('../ssl/demoCA/cacert.pem', __FILE__),
21
+ :post_connection_check => 'My Broker'
22
+ })
23
+ client.connect
24
+ client.send '/queue/test', 'my message body', {
25
+ "this:is\na \\fun\\ header" => 'blather matter'
26
+ }
27
+ client.send '/queue/test', "\x01\x02\x03\x04\x05\x06".encode('BINARY'),
28
+ :'content-type' => 'application/octet-stream'
29
+ client.disconnect
30
+ broker.join
31
+ end
32
+ it "should fail when post connection check does not match CN" do
33
+ client = OnStomp::Client.new('stomp+ssl://localhost:10103', :ssl => {
34
+ :ca_file => File.expand_path('../ssl/demoCA/cacert.pem', __FILE__),
35
+ :post_connection_check => 'Sweet Brokerage'
36
+ })
37
+ lambda {
38
+ client.connect
39
+ }.should raise_error('hostname was not match with the server certificate')
40
+ end
41
+ end
42
+ end
43
+ describe "STOMP 1.1" do
44
+ let(:broker) {
45
+ TestSSLBroker.new(10103).tap do |b|
46
+ b.session_class = TestBroker::Session11
47
+ end
48
+ }
49
+ before(:each) do
50
+ broker.start
51
+ end
52
+ after(:each) do
53
+ broker.stop
54
+ end
55
+
56
+ describe "connecting with SSL options" do
57
+ it "should connect to the broker given a CA path" do
58
+ client = OnStomp::Client.new('stomp+ssl://localhost:10103', :ssl => {
59
+ :ca_file => File.expand_path('../ssl/demoCA/cacert.pem', __FILE__),
60
+ :post_connection_check => 'My Broker'
61
+ })
62
+ client.connect
63
+ client.send '/queue/test', 'my message body', {
64
+ "this:is\na \\fun\\ header" => 'blather matter'
65
+ }
66
+ client.send '/queue/test', "\x01\x02\x03\x04\x05\x06".encode('BINARY'),
67
+ :'content-type' => 'application/octet-stream'
68
+ client.disconnect
69
+ broker.join
70
+ end
71
+ it "should fail when post connection check does not match CN" do
72
+ client = OnStomp::Client.new('stomp+ssl://localhost:10103', :ssl => {
73
+ :ca_file => File.expand_path('../ssl/demoCA/cacert.pem', __FILE__),
74
+ :post_connection_check => 'Sweet Brokerage'
75
+ })
76
+ lambda {
77
+ client.connect
78
+ }.should raise_error('hostname was not match with the server certificate')
79
+ end
80
+ end
81
+ end
82
+
83
+ end
@@ -5,9 +5,13 @@
5
5
  class TestBroker
6
6
  class StopThread < StandardError; end
7
7
 
8
- attr_reader :messages, :sessions
8
+ attr_reader :messages, :sessions, :mau_dib
9
+ attr_reader :frames_received, :frames_transmitted
10
+ attr_accessor :session_class
9
11
 
10
12
  def initialize(port=61613)
13
+ @frames_received = []
14
+ @frames_transmitted = []
11
15
  @sessions = []
12
16
  @messages = Hash.new { |h,k| h[k] = [] }
13
17
  @subscribes = Hash.new { |h,k| h[k] = [] }
@@ -21,14 +25,9 @@ class TestBroker
21
25
  end
22
26
  @session_class = Session10
23
27
  end
24
-
25
- def kill_sessions
26
- @session_mutex.synchronize do
27
- @sessions.each do |s|
28
- s.kill
29
- end
30
- @sessions.clear
31
- end
28
+
29
+ def kill_on_command command
30
+ @mau_dib = command
32
31
  end
33
32
 
34
33
  def enqueue_message s
@@ -88,14 +87,15 @@ class TestBroker
88
87
  @listener = Thread.new do
89
88
  begin
90
89
  loop do
91
- sess = @session_class.new(self, @socket.accept)
90
+ sock = @socket.accept
92
91
  @session_mutex.synchronize do
93
- @sessions << sess
92
+ @sessions << @session_class.new(self, sock)
94
93
  end
95
94
  end
96
95
  rescue StopThread
97
96
  rescue Exception
98
97
  $stdout.puts "Listener failed: #{$!}"
98
+ $stdout.puts $!.backtrace
99
99
  stop
100
100
  end
101
101
  end
@@ -123,17 +123,11 @@ class TestBroker
123
123
  @socket = sock
124
124
  init_events
125
125
  init_connection
126
- # CONNECT/CONNECTED handshake
127
- connect_frame = connected_frame = nil
126
+ connect_frame = nil
128
127
  @connection.io_process_read do |f|
129
128
  connect_frame ||= f
130
129
  end until connect_frame
131
-
132
- transmit OnStomp::Components::Frame.new('CONNECTED')
133
- @connection.io_process_write do |f|
134
- connected_frame ||= f
135
- end until connected_frame
136
- @processor.start
130
+ reply_to_connect connect_frame
137
131
  end
138
132
 
139
133
  def init_connection
@@ -141,6 +135,15 @@ class TestBroker
141
135
  @processor = OnStomp::Components::ThreadedProcessor.new self
142
136
  end
143
137
 
138
+ def reply_to_connect connect_frame
139
+ connected_frame = nil
140
+ transmit OnStomp::Components::Frame.new('CONNECTED')
141
+ @connection.io_process_write do |f|
142
+ connected_frame ||= f
143
+ end until connected_frame
144
+ @processor.start
145
+ end
146
+
144
147
  def connected?
145
148
  @connection.connected?
146
149
  end
@@ -165,7 +168,15 @@ class TestBroker
165
168
  @connection.close
166
169
  end
167
170
 
171
+ after_transmitting do |f,_|
172
+ @server.frames_transmitted << f
173
+ end
174
+
168
175
  before_receiving do |f,_|
176
+ @server.frames_received << f
177
+ if @server.mau_dib && f.command == @server.mau_dib
178
+ kill
179
+ end
169
180
  if f.header? :receipt
170
181
  transmit OnStomp::Components::Frame.new('RECEIPT',
171
182
  :'receipt-id' => f[:receipt])
@@ -213,10 +224,19 @@ class TestBroker
213
224
  def init_events
214
225
  super
215
226
  end
216
-
217
- def init_connection
218
- @connection = OnStomp::Connections::Stomp_1_1.new(socket, self)
219
- @processor = OnStomp::Components::ThreadedProcessor.new self
227
+
228
+ def heartbeats; [3000, 10000]; end
229
+
230
+ def reply_to_connect connect_frame
231
+ connected_frame = nil
232
+ transmit OnStomp::Components::Frame.new('CONNECTED',
233
+ :version => '1.1', :'heart-beat' => heartbeats)
234
+ @connection.io_process_write do |f|
235
+ connected_frame ||= f
236
+ end until connected_frame
237
+ @connection = OnStomp::Connections::Stomp_1_1.new(@connection.socket, self)
238
+ @connection.configure connect_frame, {}
239
+ @processor.start
220
240
  end
221
241
  end
222
242
 
@@ -233,8 +253,8 @@ class TestSSLBroker < TestBroker
233
253
  }
234
254
 
235
255
  def initialize(port=61612, certs=:default)
236
- @port = port
237
- @tcp_socket = TCPServer.new(@port)
256
+ super(port)
257
+ @tcp_socket = @socket
238
258
  @ssl_context = OpenSSL::SSL::SSLContext.new
239
259
  @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
240
260
  cert_files = SSL_CERT_FILES[certs]
@@ -243,9 +263,5 @@ class TestSSLBroker < TestBroker
243
263
  @socket = OpenSSL::SSL::SSLServer.new(@tcp_socket, @ssl_context)
244
264
  @socket.start_immediately = true
245
265
  @session = nil
246
- @version = '1.1'
247
- @session_class = StompSession
248
- @sent_frames = []
249
- @received_frames = []
250
266
  end
251
267
  end