stomper 1.0.0 → 2.0.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.
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
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'yard'
5
+ YARD::Rake::YardocTask.new
data/examples/basic.rb ADDED
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift(File.expand_path('../../lib', __FILE__))
3
+ require 'stomper'
4
+
5
+ $stdout.puts "Starting demo"
6
+ $stdout.puts "----------------------------"
7
+
8
+ client = Stomper::Connection.new("stomp://localhost")
9
+ client.start
10
+
11
+ $stdout.puts "Connected to broker using protocol #{client.version}"
12
+
13
+ client.subscribe("/queue/stomper/test") do |message|
14
+ $stdout.puts "Received: #{message.body}"
15
+ if message.body == 'finished'
16
+ client.stop
17
+ end
18
+ end
19
+
20
+ client.send("/queue/stomper/test", "hello world")
21
+ client.send("/queue/stomper/test", "this is a simple demo of stomper")
22
+ client.send("/queue/stomper/test", "finished")
23
+
24
+ Thread.pass while client.running?
25
+ $stdout.puts "----------------------------"
26
+ $stdout.puts "End of demo"
27
+
28
+ # Example output:
29
+ #
30
+ #
31
+ # Starting demo
32
+ # ----------------------------
33
+ # Connected to broker using protocol 1.0
34
+ # Received: hello world
35
+ # Received: this is a simple demo of stomper
36
+ # Received: finished
37
+ # ----------------------------
38
+ # End of demo
@@ -0,0 +1,54 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift(File.expand_path('../../lib', __FILE__))
3
+ require 'stomper'
4
+
5
+ $stdout.puts "Starting demo"
6
+ $stdout.puts "----------------------------"
7
+
8
+ client = Stomper::Connection.open("stomp://localhost")
9
+
10
+ $stdout.puts "Connected to broker using protocol #{client.version}"
11
+
12
+ client.before_transmitting do |frame|
13
+ $stdout.puts "Frame headers [#{frame.command}] before modification: #{frame.headers.to_a.inspect}"
14
+ frame[:'x-alt-header'] = 'another value'
15
+ end
16
+
17
+ client.before_send do |frame|
18
+ $stdout.puts "SEND headers before modification: #{frame.headers.to_a.inspect}"
19
+ frame[:'x-misc-header'] = 'this is a test'
20
+ end
21
+
22
+ client.after_transmitting do |frame|
23
+ $stdout.puts "Final frame headers [#{frame.command}]: #{frame.headers.to_a.inspect}"
24
+ end
25
+
26
+ client.before_disconnect do |frame|
27
+ $stdout.puts "Disconnecting from broker"
28
+ end
29
+
30
+ client.on_connection_closed do |con|
31
+ $stdout.puts "Connection has been closed"
32
+ end
33
+
34
+ client.send("/queue/stomper/test", "hello world")
35
+ client.disconnect
36
+
37
+ $stdout.puts "----------------------------"
38
+ $stdout.puts "End of demo"
39
+
40
+ # Example output:
41
+ #
42
+ #
43
+ # Starting demo
44
+ # ----------------------------
45
+ # Connected to broker using protocol 1.0
46
+ # Frame headers [SEND] before modification: [["destination", "/queue/stomper/test"]]
47
+ # SEND headers before modification: [["destination", "/queue/stomper/test"], ["x-alt-header", "another value"]]
48
+ # Final frame headers [SEND]: [["destination", "/queue/stomper/test"], ["x-alt-header", "another value"], ["x-misc-header", "this is a test"]]
49
+ # Frame headers [DISCONNECT] before modification: []
50
+ # Disconnecting from broker
51
+ # Final frame headers [DISCONNECT]: [["x-alt-header", "another value"]]
52
+ # Connection has been closed
53
+ # ----------------------------
54
+ # End of demo
@@ -0,0 +1,147 @@
1
+ Feature: Acking messages
2
+ In order inform the broker that we have received and processed a MESSAGE
3
+ As a client
4
+ I want ensure ACK frames are properly sent
5
+
6
+ Scenario: Stomp 1.0 Acking a MESSAGE
7
+ Given a 1.0 connection between client and broker
8
+ And the broker sends a "MESSAGE" frame with headers
9
+ | header-name | header-value |
10
+ | message-id | m-1234 |
11
+ | subscription | s-5678 |
12
+ | destination | /queue/testing |
13
+ When the client acks the last MESSAGE
14
+ And the frame exchange is completed
15
+ Then the broker should have received an "ACK" frame with headers
16
+ | header-name | header-value |
17
+ | message-id | m-1234 |
18
+
19
+ Scenario: Stomp 1.0 Acking a MESSAGE by ID
20
+ Given a 1.0 connection between client and broker
21
+ And the broker sends a "MESSAGE" frame with headers
22
+ | header-name | header-value |
23
+ | message-id | m-1234 |
24
+ | subscription | s-5678 |
25
+ | destination | /queue/testing |
26
+ When the client acks a message by ID "m-1234"
27
+ And the frame exchange is completed
28
+ Then the broker should have received an "ACK" frame with headers
29
+ | header-name | header-value |
30
+ | message-id | m-1234 |
31
+
32
+ Scenario: Stomp 1.0 Nacking a MESSAGE
33
+ Given a 1.0 connection between client and broker
34
+ When the broker sends a "MESSAGE" frame with headers
35
+ | header-name | header-value |
36
+ | message-id | m-1234 |
37
+ | subscription | s-5678 |
38
+ | destination | /queue/testing |
39
+ Then the client nacking the last MESSAGE should raise an unsupported command error
40
+
41
+
42
+ Scenario: Stomp 1.1 Acking a MESSAGE
43
+ Given a 1.1 connection between client and broker
44
+ And the broker sends a "MESSAGE" frame with headers
45
+ | header-name | header-value |
46
+ | message-id | m-1234 |
47
+ | subscription | s-5678 |
48
+ | destination | /queue/testing |
49
+ When the client acks the last MESSAGE
50
+ And the frame exchange is completed
51
+ Then the broker should have received an "ACK" frame with headers
52
+ | header-name | header-value |
53
+ | message-id | m-1234 |
54
+ | subscription | s-5678 |
55
+
56
+ Scenario: Stomp 1.1 Acking a MESSAGE by ID and subscription
57
+ Given a 1.1 connection between client and broker
58
+ And the broker sends a "MESSAGE" frame with headers
59
+ | header-name | header-value |
60
+ | message-id | m-1234 |
61
+ | subscription | s-5678 |
62
+ | destination | /queue/testing |
63
+ When the client acks a message by ID "m-1234" and subscription "s-5678"
64
+ And the frame exchange is completed
65
+ Then the broker should have received an "ACK" frame with headers
66
+ | header-name | header-value |
67
+ | message-id | m-1234 |
68
+ | subscription | s-5678 |
69
+
70
+ Scenario: Stomp 1.1 Nacking a MESSAGE
71
+ Given a 1.1 connection between client and broker
72
+ And the broker sends a "MESSAGE" frame with headers
73
+ | header-name | header-value |
74
+ | message-id | m-1234 |
75
+ | subscription | s-5678 |
76
+ | destination | /queue/testing |
77
+ When the client nacks the last MESSAGE
78
+ And the frame exchange is completed
79
+ Then the broker should have received a "NACK" frame with headers
80
+ | header-name | header-value |
81
+ | message-id | m-1234 |
82
+ | subscription | s-5678 |
83
+
84
+ Scenario: Stomp 1.1 Nacking a MESSAGE by ID and subscription
85
+ Given a 1.1 connection between client and broker
86
+ And the broker sends a "MESSAGE" frame with headers
87
+ | header-name | header-value |
88
+ | message-id | m-1234 |
89
+ | subscription | s-5678 |
90
+ | destination | /queue/testing |
91
+ When the client nacks a message by ID "m-1234" and subscription "s-5678"
92
+ And the frame exchange is completed
93
+ Then the broker should have received an "NACK" frame with headers
94
+ | header-name | header-value |
95
+ | message-id | m-1234 |
96
+ | subscription | s-5678 |
97
+
98
+ Scenario: Stomp 1.1 Acking a MESAGE by ID should raise an error
99
+ Given a 1.1 connection between client and broker
100
+ When the broker sends a "MESSAGE" frame with headers
101
+ | header-name | header-value |
102
+ | message-id | m-1234 |
103
+ | subscription | s-5678 |
104
+ | destination | /queue/testing |
105
+ Then the client acking a message by ID "m-1234" should raise an argument error
106
+
107
+ Scenario: Stomp 1.1 Nacking a MESAGE by ID should raise an error
108
+ Given a 1.1 connection between client and broker
109
+ When the broker sends a "MESSAGE" frame with headers
110
+ | header-name | header-value |
111
+ | message-id | m-1234 |
112
+ | subscription | s-5678 |
113
+ | destination | /queue/testing |
114
+ Then the client nacking a message by ID "m-1234" should raise an argument error
115
+
116
+ Scenario: Stomp 1.1 Acking a MESAGE without a subscription should raise an error
117
+ Given a 1.1 connection between client and broker
118
+ When the broker sends a "MESSAGE" frame with headers
119
+ | header-name | header-value |
120
+ | message-id | m-1234 |
121
+ | destination | /queue/testing |
122
+ Then the client acking the last MESSAGE should raise an argument error
123
+
124
+ Scenario: Stomp 1.1 Nacking a MESAGE without a subscription should raise an error
125
+ Given a 1.1 connection between client and broker
126
+ When the broker sends a "MESSAGE" frame with headers
127
+ | header-name | header-value |
128
+ | message-id | m-1234 |
129
+ | destination | /queue/testing |
130
+ Then the client nacking the last MESSAGE should raise an argument error
131
+
132
+ Scenario: Stomp 1.1 Acking a MESAGE without a message-id should raise an error
133
+ Given a 1.1 connection between client and broker
134
+ When the broker sends a "MESSAGE" frame with headers
135
+ | header-name | header-value |
136
+ | subscription | s-5678 |
137
+ | destination | /queue/testing |
138
+ Then the client acking the last MESSAGE should raise an argument error
139
+
140
+ Scenario: Stomp 1.1 Nacking a MESAGE without a message-id should raise an error
141
+ Given a 1.1 connection between client and broker
142
+ When the broker sends a "MESSAGE" frame with headers
143
+ | header-name | header-value |
144
+ | subscription | s-5678 |
145
+ | destination | /queue/testing |
146
+ Then the client nacking the last MESSAGE should raise an argument error
147
+
@@ -0,0 +1,12 @@
1
+ Feature: Disconnecting
2
+ In order to shut down a connection
3
+ As a client
4
+ I want to be able to disconnect
5
+
6
+
7
+ Scenario: A standard disconnect
8
+ Given a Stomp broker
9
+ And an established connection
10
+ When the client disconnects
11
+ Then the client should not be connected
12
+ And the broker should have received a "DISCONNECT" frame
@@ -0,0 +1,44 @@
1
+ Feature: Establish connection
2
+ In order to actually do something useful with a Stomp broker
3
+ As a client
4
+ I want to be able to connect
5
+
6
+ Scenario: Connecting to a Stomp 1.0 Broker
7
+ Given a Stomp 1.0 broker
8
+ When a connection is created from the broker's URI
9
+ And the connection is told to connect
10
+ Then the connection should be connected
11
+ And the connection should be using the 1.0 protocol
12
+
13
+ Scenario: Connecting to a Stomp 1.0 Broker by string
14
+ Given a Stomp 1.0 broker
15
+ When a connection is created from the broker's URI string
16
+ And the connection is told to connect
17
+ Then the connection should be connected
18
+ And the connection should be using the 1.0 protocol
19
+
20
+ Scenario: Connecting to a Stomp 1.1 Broker
21
+ Given a Stomp 1.1 broker
22
+ When a connection is created from the broker's URI
23
+ And the connection is told to connect
24
+ Then the connection should be connected
25
+ And the connection should be using the 1.1 protocol
26
+
27
+ Scenario: Connecting to a Stomp 1.1 Broker by string
28
+ Given a Stomp 1.1 broker
29
+ When a connection is created from the broker's URI string
30
+ And the connection is told to connect
31
+ Then the connection should be connected
32
+ And the connection should be using the 1.1 protocol
33
+
34
+ Scenario: Connecting to a Broker using an unsupported version
35
+ Given a Stomp 3.2 broker
36
+ When a connection is created from the broker's URI
37
+ Then connecting should raise an unsupported protocol version error
38
+ And the connection should not be connected
39
+
40
+ Scenario: Connecting to a Broker whose first frame is not CONNECTED
41
+ Given an erroring Stomp broker
42
+ When a connection is created from the broker's URI
43
+ Then connecting should raise an connect failed error
44
+ And the connection should not be connected
@@ -0,0 +1,61 @@
1
+ Feature: Protocol version negotiation
2
+ In order to handle connecting to different Stomp protocol implementations
3
+ As a client
4
+ I want to be able to negotiate the Stomp protocol to use
5
+
6
+ Scenario: By default, allow 1.1 from broker
7
+ Given a Stomp 1.1 broker
8
+ When a connection is established
9
+ Then the connection should be using the 1.1 protocol
10
+
11
+ Scenario: By default, allow 1.0 from broker
12
+ Given a Stomp 1.0 broker
13
+ When a connection is established
14
+ Then the connection should be using the 1.0 protocol
15
+
16
+ Scenario: By default, assume 1.0 from version-less broker
17
+ Given an unversioned Stomp broker
18
+ When a connection is established
19
+ Then the connection should be using the 1.0 protocol
20
+
21
+ Scenario: By default, raise error if the broker's version isn't supported
22
+ Given a Stomp 2.1 broker
23
+ When a connection is created from the broker's URI
24
+ Then connecting should raise an unsupported protocol version error
25
+
26
+ Scenario: A 1.0 client should accept a 1.0 broker
27
+ Given a Stomp 1.0 broker
28
+ When the client protocol version is "1.0"
29
+ And a connection is established
30
+ Then the connection should be using the 1.0 protocol
31
+
32
+ Scenario: A 1.0 client should accept a version-less broker
33
+ Given an unversioned Stomp broker
34
+ When the client protocol version is "1.0"
35
+ And a connection is established
36
+ Then the connection should be using the 1.0 protocol
37
+
38
+ Scenario: A 1.0 client should not accept a 1.1 broker
39
+ Given a Stomp 1.1 broker
40
+ When the client protocol version is "1.0"
41
+ And a connection is created from the broker's URI
42
+ Then connecting should raise an unsupported protocol version error
43
+
44
+ Scenario: A 1.1 client should accept a 1.1 broker
45
+ Given a Stomp 1.1 broker
46
+ When the client protocol version is "1.1"
47
+ And a connection is established
48
+ Then the connection should be using the 1.1 protocol
49
+
50
+ Scenario: A 1.1 client should not accept a 1.0 broker
51
+ Given a Stomp 1.0 broker
52
+ When the client protocol version is "1.1"
53
+ And a connection is created from the broker's URI
54
+ Then connecting should raise an unsupported protocol version error
55
+
56
+ Scenario: A 1.1 client should not accept a version-less broker
57
+ Given an unversioned Stomp broker
58
+ When the client protocol version is "1.1"
59
+ And a connection is created from the broker's URI
60
+ Then connecting should raise an unsupported protocol version error
61
+
@@ -0,0 +1,72 @@
1
+ Feature: Receipts
2
+ In order to ensure frame delivery
3
+ As a client
4
+ I want to request and monitor RECEIPT frames
5
+
6
+ Scenario: RECEIPT on SEND
7
+ Given a 1.1 connection between client and broker
8
+ When the client sends a receipted message "test message" to "/queue/test"
9
+ And the frame exchange is completed
10
+ Then the client should have received a receipt for the last "SEND"
11
+
12
+ Scenario: RECEIPT on SUBSCRIBE
13
+ Given a 1.1 connection between client and broker
14
+ When the client subscribes to "/queue/test" with a receipt
15
+ And the frame exchange is completed
16
+ Then the client should have received a receipt for the last "SUBSCRIBE"
17
+
18
+ Scenario: RECEIPT on UNSUBSCRIBE
19
+ Given a 1.1 connection between client and broker
20
+ And the client subscribes to "/queue/testing" with headers
21
+ | header-name | header-value |
22
+ | id | s-1234 |
23
+ When the client unsubscribes from "s-1234" with a receipt
24
+ And the frame exchange is completed
25
+ Then the client should have received a receipt for the last "UNSUBSCRIBE"
26
+
27
+ Scenario: RECEIPT on BEGIN
28
+ Given a 1.1 connection between client and broker
29
+ When the client begins transaction "t-1234" with a receipt
30
+ And the frame exchange is completed
31
+ Then the client should have received a receipt for the last "BEGIN"
32
+
33
+ Scenario: RECEIPT on COMMIT
34
+ Given a 1.1 connection between client and broker
35
+ When the client commits transaction "t-1234" with a receipt
36
+ And the frame exchange is completed
37
+ Then the client should have received a receipt for the last "COMMIT"
38
+
39
+ Scenario: RECEIPT on ABORT
40
+ Given a 1.1 connection between client and broker
41
+ When the client aborts transaction "t-1234" with a receipt
42
+ And the frame exchange is completed
43
+ Then the client should have received a receipt for the last "ABORT"
44
+
45
+ Scenario: RECEIPT on ACK
46
+ Given a 1.1 connection between client and broker
47
+ When the client acks message "m-1234" from "s-5678" with a receipt
48
+ And the frame exchange is completed
49
+ Then the client should have received a receipt for the last "ACK"
50
+
51
+ Scenario: RECEIPT on NACK
52
+ Given a 1.1 connection between client and broker
53
+ When the client nacks message "m-1234" from "s-5678" with a receipt
54
+ And the frame exchange is completed
55
+ Then the client should have received a receipt for the last "NACK"
56
+
57
+ Scenario: RECEIPT on DISCONNECT
58
+ Given a 1.1 connection between client and broker
59
+ When the client disconnects with a receipt
60
+ And the frame exchange is completed without client disconnect
61
+ Then the client should have received a receipt for the last "DISCONNECT"
62
+
63
+ Scenario: No RECEIPT header on CONNECT
64
+ Given a 1.1 connection between client and broker
65
+ When the client connects with a receipt
66
+ And the frame exchange is completed
67
+ Then the client should not have added a receipt header to the last "CONNECT"
68
+
69
+
70
+
71
+
72
+
@@ -0,0 +1,32 @@
1
+ Feature: Scopes
2
+ In order to apply similar behavior to a series of frames
3
+ As a client
4
+ I want to have frame scopes
5
+
6
+ Scenario: Applying a set of headers to a series of frames
7
+ Given a 1.1 connection between client and broker
8
+ And a header scope with headers
9
+ | header-name | header-value |
10
+ | x-my-header | some value |
11
+ | canon:unisono | violini |
12
+ | x-machine | a\b\c |
13
+ When the client acks a message by ID "m-1234" and subscription "s-5678" within the scope
14
+ And the client subscribes to "/topic/test" with headers within the scope
15
+ | header-name | header-value |
16
+ | id | s-9012 |
17
+ | ack | client-individual |
18
+ Then the broker should have received an "ACK" frame with headers
19
+ | header-name | header-value |
20
+ | x-my-header | some value |
21
+ | canon:unisono | violini |
22
+ | x-machine | a\b\c |
23
+ | message-id | m-1234 |
24
+ | subscription | s-5678 |
25
+ And the broker should have received a "SUBSCRIBE" frame with headers
26
+ | header-name | header-value |
27
+ | x-my-header | some value |
28
+ | canon:unisono | violini |
29
+ | x-machine | a\b\c |
30
+ | id | s-9012 |
31
+ | destination | /topic/test |
32
+ | ack | client-individual |