stomper 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/.gitignore +5 -0
  2. data/{spec/spec.opts → .rspec} +0 -2
  3. data/Gemfile +4 -0
  4. data/LICENSE +201 -201
  5. data/README.md +130 -0
  6. data/Rakefile +5 -0
  7. data/examples/basic.rb +38 -0
  8. data/examples/events.rb +54 -0
  9. data/features/acking_messages.feature +147 -0
  10. data/features/disconnecting.feature +12 -0
  11. data/features/establish_connection.feature +44 -0
  12. data/features/protocol_version_negotiation.feature +61 -0
  13. data/features/receipts.feature +72 -0
  14. data/features/scopes.feature +32 -0
  15. data/features/secure_connections.feature +38 -0
  16. data/features/send_and_message.feature +28 -0
  17. data/features/steps/acking_messages_steps.rb +39 -0
  18. data/features/steps/disconnecting_steps.rb +8 -0
  19. data/features/steps/establish_connection_steps.rb +74 -0
  20. data/features/steps/frame_transmission_steps.rb +35 -0
  21. data/features/steps/protocol_version_negotiation_steps.rb +15 -0
  22. data/features/steps/receipts_steps.rb +79 -0
  23. data/features/steps/scopes_steps.rb +52 -0
  24. data/features/steps/secure_connections_steps.rb +41 -0
  25. data/features/steps/send_and_message_steps.rb +35 -0
  26. data/features/steps/subscribing_steps.rb +36 -0
  27. data/features/steps/threaded_receiver_steps.rb +8 -0
  28. data/features/steps/transactions_steps.rb +0 -0
  29. data/features/subscribing.feature +151 -0
  30. data/features/support/env.rb +11 -0
  31. data/features/support/header_helpers.rb +12 -0
  32. data/features/support/ssl/README +6 -0
  33. data/features/support/ssl/broker_cert.csr +17 -0
  34. data/features/support/ssl/broker_cert.pem +72 -0
  35. data/features/support/ssl/broker_key.pem +27 -0
  36. data/features/support/ssl/client_cert.csr +17 -0
  37. data/features/support/ssl/client_cert.pem +72 -0
  38. data/features/support/ssl/client_key.pem +27 -0
  39. data/features/support/ssl/demoCA/cacert.pem +17 -0
  40. data/features/support/ssl/demoCA/index.txt +2 -0
  41. data/features/support/ssl/demoCA/index.txt.attr +1 -0
  42. data/features/support/ssl/demoCA/index.txt.attr.old +1 -0
  43. data/features/support/ssl/demoCA/index.txt.old +1 -0
  44. data/features/support/ssl/demoCA/newcerts/01.pem +72 -0
  45. data/features/support/ssl/demoCA/newcerts/02.pem +72 -0
  46. data/features/support/ssl/demoCA/private/cakey.pem +17 -0
  47. data/features/support/ssl/demoCA/serial +1 -0
  48. data/features/support/ssl/demoCA/serial.old +1 -0
  49. data/features/support/test_stomp_server.rb +150 -0
  50. data/features/threaded_receiver.feature +11 -0
  51. data/features/transactions.feature +66 -0
  52. data/lib/stomper.rb +30 -20
  53. data/lib/stomper/connection.rb +442 -102
  54. data/lib/stomper/errors.rb +59 -0
  55. data/lib/stomper/extensions.rb +10 -0
  56. data/lib/stomper/extensions/common.rb +258 -0
  57. data/lib/stomper/extensions/events.rb +213 -0
  58. data/lib/stomper/extensions/heartbeat.rb +101 -0
  59. data/lib/stomper/extensions/scoping.rb +56 -0
  60. data/lib/stomper/frame.rb +54 -0
  61. data/lib/stomper/frame_serializer.rb +217 -0
  62. data/lib/stomper/headers.rb +15 -0
  63. data/lib/stomper/receipt_manager.rb +36 -0
  64. data/lib/stomper/receivers.rb +7 -0
  65. data/lib/stomper/receivers/threaded.rb +71 -0
  66. data/lib/stomper/scopes.rb +9 -0
  67. data/lib/stomper/scopes/header_scope.rb +49 -0
  68. data/lib/stomper/scopes/receipt_scope.rb +44 -0
  69. data/lib/stomper/scopes/transaction_scope.rb +109 -0
  70. data/lib/stomper/sockets.rb +66 -28
  71. data/lib/stomper/subscription_manager.rb +79 -0
  72. data/lib/stomper/support.rb +68 -0
  73. data/lib/stomper/support/1.8/frame_serializer.rb +53 -0
  74. data/lib/stomper/support/1.8/headers.rb +183 -0
  75. data/lib/stomper/support/1.9/frame_serializer.rb +64 -0
  76. data/lib/stomper/support/1.9/headers.rb +172 -0
  77. data/lib/stomper/support/ruby.rb +13 -0
  78. data/lib/stomper/uris.rb +49 -0
  79. data/lib/stomper/version.rb +7 -0
  80. data/spec/spec_helper.rb +13 -9
  81. data/spec/stomper/connection_spec.rb +712 -0
  82. data/spec/stomper/extensions/common_spec.rb +187 -0
  83. data/spec/stomper/extensions/events_spec.rb +78 -0
  84. data/spec/stomper/extensions/heartbeat_spec.rb +103 -0
  85. data/spec/stomper/extensions/scoping_spec.rb +21 -0
  86. data/spec/stomper/frame_serializer_1.8_spec.rb +318 -0
  87. data/spec/stomper/frame_serializer_spec.rb +316 -0
  88. data/spec/stomper/frame_spec.rb +36 -0
  89. data/spec/stomper/headers_spec.rb +224 -0
  90. data/spec/stomper/receipt_manager_spec.rb +91 -0
  91. data/spec/stomper/receivers/threaded_spec.rb +116 -0
  92. data/spec/stomper/scopes/header_scope_spec.rb +42 -0
  93. data/spec/stomper/scopes/receipt_scope_spec.rb +51 -0
  94. data/spec/stomper/scopes/transaction_scope_spec.rb +183 -0
  95. data/spec/stomper/sockets_spec.rb +113 -0
  96. data/spec/stomper/subscription_manager_spec.rb +107 -0
  97. data/spec/stomper/support_spec.rb +69 -0
  98. data/spec/stomper/uris_spec.rb +54 -0
  99. data/spec/stomper_spec.rb +9 -0
  100. data/spec/support/custom_argument_matchers.rb +57 -0
  101. data/spec/support/existential_frame_matchers.rb +19 -0
  102. data/spec/support/frame_header_matchers.rb +10 -0
  103. data/stomper.gemspec +30 -0
  104. metadata +272 -97
  105. data/AUTHORS +0 -21
  106. data/CHANGELOG +0 -20
  107. data/README.rdoc +0 -120
  108. data/lib/stomper/client.rb +0 -34
  109. data/lib/stomper/frame_reader.rb +0 -73
  110. data/lib/stomper/frame_writer.rb +0 -21
  111. data/lib/stomper/frames.rb +0 -39
  112. data/lib/stomper/frames/abort.rb +0 -10
  113. data/lib/stomper/frames/ack.rb +0 -25
  114. data/lib/stomper/frames/begin.rb +0 -11
  115. data/lib/stomper/frames/client_frame.rb +0 -89
  116. data/lib/stomper/frames/commit.rb +0 -10
  117. data/lib/stomper/frames/connect.rb +0 -10
  118. data/lib/stomper/frames/connected.rb +0 -30
  119. data/lib/stomper/frames/disconnect.rb +0 -10
  120. data/lib/stomper/frames/error.rb +0 -21
  121. data/lib/stomper/frames/message.rb +0 -48
  122. data/lib/stomper/frames/receipt.rb +0 -19
  123. data/lib/stomper/frames/send.rb +0 -10
  124. data/lib/stomper/frames/server_frame.rb +0 -38
  125. data/lib/stomper/frames/subscribe.rb +0 -42
  126. data/lib/stomper/frames/unsubscribe.rb +0 -19
  127. data/lib/stomper/open_uri_interface.rb +0 -41
  128. data/lib/stomper/receipt_handlers.rb +0 -23
  129. data/lib/stomper/receiptor.rb +0 -38
  130. data/lib/stomper/subscriber.rb +0 -76
  131. data/lib/stomper/subscription.rb +0 -128
  132. data/lib/stomper/subscriptions.rb +0 -95
  133. data/lib/stomper/threaded_receiver.rb +0 -59
  134. data/lib/stomper/transaction.rb +0 -185
  135. data/lib/stomper/transactor.rb +0 -50
  136. data/lib/stomper/uri.rb +0 -55
  137. data/spec/client_spec.rb +0 -29
  138. data/spec/connection_spec.rb +0 -22
  139. data/spec/frame_reader_spec.rb +0 -37
  140. data/spec/frame_writer_spec.rb +0 -27
  141. data/spec/frames/client_frame_spec.rb +0 -66
  142. data/spec/frames/indirect_frame_spec.rb +0 -45
  143. data/spec/frames/server_frame_spec.rb +0 -85
  144. data/spec/open_uri_interface_spec.rb +0 -132
  145. data/spec/receiptor_spec.rb +0 -35
  146. data/spec/shared_connection_examples.rb +0 -79
  147. data/spec/subscriber_spec.rb +0 -77
  148. data/spec/subscription_spec.rb +0 -157
  149. data/spec/subscriptions_spec.rb +0 -145
  150. data/spec/threaded_receiver_spec.rb +0 -33
  151. data/spec/transaction_spec.rb +0 -139
  152. data/spec/transactor_spec.rb +0 -46
@@ -0,0 +1,38 @@
1
+ Feature: Secure connections
2
+ In order connect to an SSL protected broker
3
+ As a client
4
+ I want secure connections
5
+
6
+ Scenario: SSL connection without verifying broker
7
+ Given a Stomp 1.1 SSL broker
8
+ When a connection is created for the SSL broker
9
+ And no SSL verification is performed
10
+ And an SSL post connection check is not performed
11
+ And the connection is told to connect
12
+ Then the connection should be connected
13
+
14
+ Scenario: SSL connection verifying hostname
15
+ Given a Stomp 1.1 SSL broker
16
+ When a connection is created for the SSL broker
17
+ And no SSL verification is performed
18
+ And an SSL post connection check is performed on "My Broker"
19
+ And the connection is told to connect
20
+ Then the connection should be connected
21
+
22
+ Scenario: SSL connection verifying hostname failure
23
+ Given a Stomp 1.1 SSL broker
24
+ When a connection is created for the SSL broker
25
+ And the broker's host is "My Broker"
26
+ And no SSL verification is performed
27
+ And an SSL post connection check is performed on "Some Other Common Name"
28
+ Then connecting should raise an openssl error
29
+
30
+ Scenario: SSL broker certificate verification
31
+ Given a Stomp 1.1 SSL broker
32
+ When a connection is created for the SSL broker
33
+ And the broker's host is "My Broker"
34
+ And an SSL post connection check is performed on "My Broker"
35
+ And the broker's certificate is verified by CA
36
+ And SSL verification is performed
37
+ And the connection is told to connect
38
+ Then the connection should be connected
@@ -0,0 +1,28 @@
1
+ Feature: Send and message
2
+ In order exchange information
3
+ As a client
4
+ I want to be able to transmit SEND and receive MESSAGE frames
5
+
6
+ Scenario Outline: sending and receiving messages with content-types
7
+ Given a 1.1 connection between client and broker
8
+ And the client subscribes to <destination>
9
+ When the client sends a <content-type> <body> to <destination>
10
+ And the frame exchange is completed
11
+ Then the client should have received a <content-type> message of <body>
12
+
13
+ Examples:
14
+ | destination | content-type | body |
15
+ | /queue/test1 | "text/plain" | "hello world" |
16
+ | /queue/test2 | "application/xml" | "<xml></xml>" |
17
+
18
+ Scenario Outline: sending and receiving messages with encodings
19
+ Given a 1.1 connection between client and broker
20
+ And the client subscribes to <destination>
21
+ When the client sends a <body> encoded as <encoding> to <destination>
22
+ And the frame exchange is completed
23
+ Then the client should have received a <content-type> message of <body> encoded as <final encoding>
24
+
25
+ Examples:
26
+ | destination | content-type | body | encoding | final encoding |
27
+ | /queue/test1 | "text/plain" | "hello world" | "UTF-8" | "UTF-8" |
28
+ | /queue/test2 | "" | "hello world" | "ASCII-8BIT" | "ASCII-8BIT" |
@@ -0,0 +1,39 @@
1
+ When /^the client acks a message by ID "([^"]*)"$/ do |message_id|
2
+ @connection.ack message_id
3
+ end
4
+
5
+ When /^the client acks the last MESSAGE$/ do
6
+ @connection.ack @received_frames.select { |f| f.command == "MESSAGE" }.last
7
+ end
8
+
9
+ Then /^the client nacking the last MESSAGE should raise an unsupported command error$/ do
10
+ lambda { @connection.nack @received_frames.select { |f| f.command == "MESSAGE" }.last }.should raise_error(Stomper::Errors::UnsupportedCommandError)
11
+ end
12
+
13
+ When /^the client acks a message by ID "([^"]*)" and subscription "([^"]*)"$/ do |message_id, subscription|
14
+ @connection.ack message_id, subscription
15
+ end
16
+
17
+ When /^the client nacks the last MESSAGE$/ do
18
+ @connection.nack @received_frames.select { |f| f.command == "MESSAGE" }.last
19
+ end
20
+
21
+ When /^the client nacks a message by ID "([^"]*)" and subscription "([^"]*)"$/ do |message_id, subscription|
22
+ @connection.nack message_id, subscription
23
+ end
24
+
25
+ Then /^the client acking a message by ID "([^"]*)" should raise an argument error$/ do |message_id|
26
+ lambda { @connection.ack message_id }.should raise_error(ArgumentError)
27
+ end
28
+
29
+ Then /^the client nacking a message by ID "([^"]*)" should raise an argument error$/ do |message_id|
30
+ lambda { @connection.nack message_id }.should raise_error(ArgumentError)
31
+ end
32
+
33
+ Then /^the client acking the last MESSAGE should raise an argument error$/ do
34
+ lambda { @connection.ack @received_frames.select { |f| f.command == "MESSAGE" }.last }.should raise_error(ArgumentError)
35
+ end
36
+
37
+ Then /^the client nacking the last MESSAGE should raise an argument error$/ do
38
+ lambda { @connection.nack @received_frames.select { |f| f.command == "MESSAGE" }.last }.should raise_error(ArgumentError)
39
+ end
@@ -0,0 +1,8 @@
1
+ Given /^an established connection$/ do
2
+ @connection.connect
3
+ end
4
+
5
+ When /^the client disconnects$/ do
6
+ @connection.disconnect
7
+ @broker.stop
8
+ end
@@ -0,0 +1,74 @@
1
+ After do |s|
2
+ @connection && @connection.stop rescue nil
3
+ @broker && @broker.force_stop
4
+ end
5
+
6
+ Given /^a (\d+\.\d+)?\s*connection between client and broker$/ do |version|
7
+ version ||= '1.0'
8
+ @broker_uri_string = "stomp:///"
9
+ @broker_uri = URI.parse(@broker_uri_string)
10
+ @broker = TestStompServer.new(version)
11
+ @broker.start
12
+ @connection = Stomper::Connection.new(@broker_uri)
13
+ @received_frames = []
14
+ @sent_frames = []
15
+ @connection.before_transmitting do |c, f|
16
+ @sent_frames << f
17
+ end
18
+ @connection.after_receiving do |c, f|
19
+ @received_frames << f
20
+ end
21
+ @connection.start
22
+ end
23
+
24
+
25
+ Given /^a Stomp (\d+\.\d+)?\s*broker$/ do |version|
26
+ version ||= '1.0'
27
+ @broker_uri_string = "stomp:///"
28
+ @broker_uri = URI.parse(@broker_uri_string)
29
+ @broker = TestStompServer.new(version)
30
+ @broker.start
31
+ @connection = Stomper::Connection.new(@broker_uri)
32
+ end
33
+
34
+ Given /^an erroring Stomp broker$/ do
35
+ @broker_uri_string = "stomp:///"
36
+ @broker_uri = URI.parse(@broker_uri_string)
37
+ @broker = TestStompServer.new('1.0')
38
+ @broker.session_class = TestStompServer::StompErrorOnConnectSession
39
+ @broker.start
40
+ @connection = Stomper::Connection.new(@broker_uri)
41
+ end
42
+
43
+
44
+ When /^a connection is created from the broker's URI$/ do
45
+ #@connection = Stomper::Connection.new(@broker_uri)
46
+ end
47
+
48
+ When /^a connection is created from the broker's URI string$/ do
49
+ @connection = Stomper::Connection.new(@broker_uri_string)
50
+ end
51
+
52
+ When /^the connection is told to connect$/ do
53
+ @connection.connect
54
+ end
55
+
56
+ Then /^the connection should be connected$/ do
57
+ @connection.connected?.should be_true
58
+ end
59
+
60
+ Then /^the connection should be using the (\d+\.\d+) protocol$/ do |version|
61
+ @connection.version.should == version
62
+ end
63
+
64
+ Then /^connecting should raise an unsupported protocol version error$/ do
65
+ lambda { @connection.connect }.should raise_error(Stomper::Errors::UnsupportedProtocolVersionError)
66
+ end
67
+
68
+ Then /^the (connection|client) should not be connected$/ do |arbitrary_name|
69
+ @connection.connected?.should be_false
70
+ end
71
+
72
+ Then /^connecting should raise an connect failed error$/ do
73
+ lambda { @connection.connect }.should raise_error(Stomper::Errors::ConnectFailedError)
74
+ end
@@ -0,0 +1,35 @@
1
+ Then /^the broker should have received an? "([^"]*)" frame$/ do |command|
2
+ Then "the broker should have received a \"#{command}\" frame with headers", table(%{
3
+ | header-name | header-value |
4
+ })
5
+ end
6
+
7
+ Then /^the broker should have received an? "([^"]*)" frame with headers$/ do |command, table|
8
+ headers = table_to_headers table
9
+ @broker.session.received_frames.any? do |f|
10
+ f.command == command && headers.all? { |(k,v)| headers[k] == f[k] }
11
+ end.should be_true
12
+ end
13
+
14
+ Then /^the client should have received an? "([^"]*)" frame with headers$/ do |command, table|
15
+ headers = table_to_headers table
16
+ @received_frames.any? do |f|
17
+ f.command == command && headers.all? { |(k,v)| headers[k] == f[k] }
18
+ end.should be_true
19
+ end
20
+
21
+ When /^the broker sends a "([^"]*)" frame with headers$/ do |command, table|
22
+ headers = table_to_headers table
23
+ @broker.session.send_frame command, headers
24
+ end
25
+
26
+ When /^the frame exchange is completed$/ do
27
+ @connection.disconnect(:receipt => 'TERMINATE_POLITELY_12345')
28
+ @connection.stop
29
+ @broker.stop
30
+ end
31
+
32
+ When /^the frame exchange is completed without client disconnect$/ do
33
+ @connection.stop
34
+ @broker.stop
35
+ end
@@ -0,0 +1,15 @@
1
+ When /^a connection is established$/ do
2
+ @connection.connect
3
+ end
4
+
5
+ Given /^an unversioned Stomp broker$/ do
6
+ @broker_uri_string = "stomp:///"
7
+ @broker_uri = URI.parse(@broker_uri_string)
8
+ @broker = TestStompServer.new(nil)
9
+ @broker.start
10
+ @connection = Stomper::Connection.new(@broker_uri)
11
+ end
12
+
13
+ When /^the client protocol version is "([^"]*)"$/ do |arg1|
14
+ @connection.versions = arg1.split(",")
15
+ end
@@ -0,0 +1,79 @@
1
+ When /^the client sends a receipted message "([^"]*)" to "([^"]*)"$/ do |body, destination|
2
+ @receipts_received ||= {}
3
+ @connection.send(destination, body) do |r|
4
+ @receipts_received[r[:'receipt-id']] = r
5
+ end
6
+ end
7
+
8
+ Then /^the client should have received a receipt for the last "([^"]*)"$/ do |command|
9
+ fr = @sent_frames.select { |f| f.command == command }.last
10
+ (@receipts_received && @receipts_received[fr[:'receipt']]).should_not be_nil
11
+ end
12
+
13
+ When /^the client subscribes to "([^"]*)" with a receipt$/ do |destination|
14
+ @receipts_received ||= {}
15
+ @connection.with_receipt do |r|
16
+ @receipts_received[r[:'receipt-id']] = r
17
+ end.subscribe(destination)
18
+ end
19
+
20
+ When /^the client unsubscribes from "([^"]*)" with a receipt$/ do |subscription|
21
+ @receipts_received ||= {}
22
+ @connection.with_receipt do |r|
23
+ @receipts_received[r[:'receipt-id']] = r
24
+ end.unsubscribe(subscription)
25
+ end
26
+
27
+ When /^the client begins transaction "([^"]*)" with a receipt$/ do |tx|
28
+ @receipts_received ||= {}
29
+ @connection.with_receipt do |r|
30
+ @receipts_received[r[:'receipt-id']] = r
31
+ end.begin(tx)
32
+ end
33
+
34
+ When /^the client aborts transaction "([^"]*)" with a receipt$/ do |tx|
35
+ @receipts_received ||= {}
36
+ @connection.with_receipt do |r|
37
+ @receipts_received[r[:'receipt-id']] = r
38
+ end.abort(tx)
39
+ end
40
+
41
+ When /^the client commits transaction "([^"]*)" with a receipt$/ do |tx|
42
+ @receipts_received ||= {}
43
+ @connection.with_receipt do |r|
44
+ @receipts_received[r[:'receipt-id']] = r
45
+ end.commit(tx)
46
+ end
47
+
48
+ When /^the client acks message "([^"]*)" from "([^"]*)" with a receipt$/ do |m_id, sub_id|
49
+ @receipts_received ||= {}
50
+ @connection.with_receipt do |r|
51
+ @receipts_received[r[:'receipt-id']] = r
52
+ end.ack(m_id, sub_id)
53
+ end
54
+
55
+ When /^the client nacks message "([^"]*)" from "([^"]*)" with a receipt$/ do |m_id, sub_id|
56
+ @receipts_received ||= {}
57
+ @connection.with_receipt do |r|
58
+ @receipts_received[r[:'receipt-id']] = r
59
+ end.nack(m_id, sub_id)
60
+ end
61
+
62
+ When /^the client disconnects with a receipt$/ do
63
+ @receipts_received ||= {}
64
+ @connection.with_receipt do |r|
65
+ @receipts_received[r[:'receipt-id']] = r
66
+ end.disconnect
67
+ end
68
+
69
+ When /^the client connects with a receipt$/ do
70
+ @receipts_received ||= {}
71
+ @connection.with_receipt do |r|
72
+ @receipts_received[r[:'receipt-id']] = r
73
+ end.transmit(Stomper::Frame.new('CONNECT'))
74
+ end
75
+
76
+ Then /^the client should not have added a receipt header to the last "([^"]*)"$/ do |command|
77
+ fr = @sent_frames.select { |f| f.command == command }.last
78
+ fr[:receipt].should be_nil
79
+ end
@@ -0,0 +1,52 @@
1
+ Given /^a header scope with headers$/ do |table|
2
+ headers = table_to_headers table
3
+ @scope = @connection.with_headers(headers)
4
+ end
5
+
6
+ When /^the client acks a message by ID "([^"]*)" and subscription "([^"]*)" within the scope$/ do |message_id, subscription|
7
+ @scope.ack message_id, subscription
8
+ end
9
+
10
+ When /^the client subscribes to "([^"]*)" with headers within the scope$/ do |dest, table|
11
+ @subscribe_frames ||= []
12
+ headers = table_to_headers table
13
+ @default_subscription_triggered = 0
14
+ @subscribe_frames << @scope.subscribe(dest, headers) do |m|
15
+ @default_subscription_triggered += 1
16
+ end
17
+ end
18
+
19
+ Given /^a transaction scope named "([^"]*)"$/ do |tx|
20
+ @scope = @connection.with_transaction(:transaction => tx)
21
+ end
22
+
23
+ When /^the client begins the transaction scope$/ do
24
+ @scope.begin
25
+ end
26
+
27
+ When /^the client nacks a message by ID "([^"]*)" and subscription "([^"]*)" within the scope$/ do |message_id, subscription|
28
+ @scope.nack message_id, subscription
29
+ end
30
+
31
+ When /^the client aborts the transaction scope$/ do
32
+ @scope.abort
33
+ end
34
+
35
+ When /^the client executes a successful transaction block named "([^"]*)"$/ do |tx|
36
+ @connection.with_transaction(:transaction => tx) do |t|
37
+ t.ack "message-id", "subscription-id"
38
+ t.send "/queue/transaction/test", "message"
39
+ t.nack "message-id-2", "subscription-id-2"
40
+ end
41
+ end
42
+
43
+ When /^the client executes an unsuccessful transaction block named "([^"]*)"$/ do |tx|
44
+ lambda do
45
+ @connection.with_transaction(:transaction => tx) do |t|
46
+ t.ack "message-id", "subscription-id"
47
+ t.send "/queue/transaction/test", "message"
48
+ t.nack "message-id-2", "subscription-id-2"
49
+ raise "transaction will now fail"
50
+ end
51
+ end.should raise_error("transaction will now fail")
52
+ end
@@ -0,0 +1,41 @@
1
+ Given /^a Stomp (\d+\.\d+)?\s*SSL broker$/ do |version|
2
+ @broker = TestSSLStompServer.new(version)
3
+ @broker.start
4
+ end
5
+
6
+ When /^a connection is created for the SSL broker$/ do
7
+ @connection = Stomper::Connection.new("stomp+ssl:///")
8
+ end
9
+
10
+ When /^the broker's host is "([^"]*)"$/ do |hostname|
11
+ @connection.host = hostname
12
+ end
13
+
14
+ When /^no SSL verification is performed$/ do
15
+ @connection.ssl[:verify_mode] = OpenSSL::SSL::VERIFY_NONE
16
+ end
17
+
18
+ When /^SSL verification is performed$/ do
19
+ @connection.ssl[:verify_mode] = ::OpenSSL::SSL::VERIFY_PEER | ::OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
20
+ end
21
+
22
+ When /^an SSL post connection check is performed on "([^"]*)"$/ do |host|
23
+ @connection.ssl[:post_connection_check] = host
24
+ end
25
+
26
+ Then /^connecting should raise an openssl error$/ do
27
+ lambda { @connection.connect }.should raise_error(OpenSSL::SSL::SSLError)
28
+ end
29
+
30
+ When /^an SSL post connection check is not performed$/ do
31
+ @connection.ssl[:post_connection_check] = false
32
+ end
33
+
34
+ When /^the broker's certificate is verified by CA$/ do
35
+ @connection.ssl[:ca_file] = File.expand_path('../../support/ssl/demoCA/cacert.pem', __FILE__)
36
+ end
37
+
38
+ When /^the client's certificate and key are specified$/ do
39
+ @connection.ssl[:cert] = OpenSSL::X509::Certificate.new(File.read(File.expand_path('../../support/ssl/client_cert.pem', __FILE__)))
40
+ @connection.ssl[:key] = OpenSSL::PKey::RSA.new(File.read(File.expand_path('../../support/ssl/client_key.pem', __FILE__)))
41
+ end
@@ -0,0 +1,35 @@
1
+ Given /^the client subscribes to (\/.*)$/ do |dest|
2
+ @messages_for_subscription ||= []
3
+ @connection.subscribe(dest) do |m|
4
+ sub = m[:subscription]
5
+ @messages_for_subscription << m
6
+ end
7
+ end
8
+
9
+ When /^the client sends a "([^"]*)" "([^"]*)" to (\/.*)$/ do |ct, body, dest|
10
+ @connection.send(dest, body, :'content-type' => ct)
11
+ end
12
+
13
+ Then /^the client should have received a "([^"]*)" message of "([^"]*)"$/ do |ct, body|
14
+ @messages_for_subscription.any? do |m|
15
+ m.content_type == ct && m.body == body
16
+ end.should be_true
17
+ end
18
+
19
+ When /^the client sends a "([^"]*)" encoded as "([^"]*)" to (\/.*)$/ do |body, enc, dest|
20
+ body.force_encoding(enc) if body.respond_to?(:force_encoding)
21
+ @connection.send(dest, body)
22
+ end
23
+
24
+ Then /^the client should have received a "([^"]*)" message of "([^"]*)" encoded as "([^"]*)"$/ do |ct, body, enc|
25
+ @messages_for_subscription.any? do |m|
26
+ ct_check = (m.content_type == ct || m.content_type.nil? && ct.empty?)
27
+ b_check = body == m.body
28
+ if body.respond_to?(:encoding)
29
+ ct_check && b_check && m.body.encoding.name == enc
30
+ else
31
+ ct_check && b_check
32
+ end
33
+ end.should be_true
34
+ end
35
+