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
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 |