stompserver_ng 1.0.6

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 (72) hide show
  1. data/History.txt +159 -0
  2. data/Manifest.txt +71 -0
  3. data/README.txt +172 -0
  4. data/Rakefile +38 -0
  5. data/STATUS +5 -0
  6. data/bin/stompserver_ng +63 -0
  7. data/client/README.txt +1 -0
  8. data/client/both.rb +25 -0
  9. data/client/consume.rb +14 -0
  10. data/client/send.rb +17 -0
  11. data/config/stompserver_ng.conf +11 -0
  12. data/etc/19xcompat/notes.txt +223 -0
  13. data/etc/arutils/README-activerecord.txt +78 -0
  14. data/etc/arutils/cre_mysql.rb +34 -0
  15. data/etc/arutils/cre_postgres.rb +33 -0
  16. data/etc/arutils/cre_sqlite3.rb +28 -0
  17. data/etc/arutils/mysql_boot.sql +12 -0
  18. data/etc/arutils/postgres_boot.sql +14 -0
  19. data/etc/database.mysql.yml +9 -0
  20. data/etc/database.postgres.yml +9 -0
  21. data/etc/passwd.example +3 -0
  22. data/etc/ppqinfo.rb +15 -0
  23. data/etc/runserver.sh +17 -0
  24. data/etc/stompserver_ng +50 -0
  25. data/etc/stompserver_ng.conf +13 -0
  26. data/lib/stomp_server_ng.rb +471 -0
  27. data/lib/stomp_server_ng/protocols/http.rb +128 -0
  28. data/lib/stomp_server_ng/protocols/stomp.rb +407 -0
  29. data/lib/stomp_server_ng/qmonitor.rb +58 -0
  30. data/lib/stomp_server_ng/queue.rb +248 -0
  31. data/lib/stomp_server_ng/queue/activerecord_queue.rb +118 -0
  32. data/lib/stomp_server_ng/queue/ar_message.rb +21 -0
  33. data/lib/stomp_server_ng/queue/ar_reconnect.rb +18 -0
  34. data/lib/stomp_server_ng/queue/dbm_queue.rb +72 -0
  35. data/lib/stomp_server_ng/queue/file_queue.rb +56 -0
  36. data/lib/stomp_server_ng/queue/memory_queue.rb +64 -0
  37. data/lib/stomp_server_ng/queue_manager.rb +302 -0
  38. data/lib/stomp_server_ng/stomp_auth.rb +26 -0
  39. data/lib/stomp_server_ng/stomp_frame.rb +32 -0
  40. data/lib/stomp_server_ng/stomp_frame_recognizer.rb +77 -0
  41. data/lib/stomp_server_ng/stomp_id.rb +32 -0
  42. data/lib/stomp_server_ng/stomp_user.rb +17 -0
  43. data/lib/stomp_server_ng/test_server.rb +21 -0
  44. data/lib/stomp_server_ng/topic_manager.rb +46 -0
  45. data/setup.rb +1585 -0
  46. data/stompserver_ng.gemspec +136 -0
  47. data/test/devserver/props.yaml +5 -0
  48. data/test/devserver/runserver.sh +16 -0
  49. data/test/devserver/stompserver_ng.dbm.conf +12 -0
  50. data/test/devserver/stompserver_ng.file.conf +12 -0
  51. data/test/devserver/stompserver_ng.memory.conf +12 -0
  52. data/test/noserver/mocklogger.rb +12 -0
  53. data/test/noserver/test_queue_manager.rb +134 -0
  54. data/test/noserver/test_stomp_frame.rb +138 -0
  55. data/test/noserver/test_topic_manager.rb +79 -0
  56. data/test/noserver/ts_all_no_server.rb +12 -0
  57. data/test/props.yaml +5 -0
  58. data/test/runalltests.sh +14 -0
  59. data/test/runtest.sh +4 -0
  60. data/test/test_0000_base.rb +107 -0
  61. data/test/test_0001_conn.rb +47 -0
  62. data/test/test_0002_conn_sr.rb +94 -0
  63. data/test/test_0006_client.rb +41 -0
  64. data/test/test_0011_send_recv.rb +74 -0
  65. data/test/test_0015_ack_conn.rb +78 -0
  66. data/test/test_0017_ack_client.rb +78 -0
  67. data/test/test_0019_ack_no_ack.rb +145 -0
  68. data/test/test_0022_ack_noack_conn.rb +123 -0
  69. data/test/test_0030_subscr_id.rb +44 -0
  70. data/test/test_0040_receipt_conn.rb +87 -0
  71. data/test/ts_all_server.rb +10 -0
  72. metadata +196 -0
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'stomp'
3
+ #
4
+ require 'test/unit'
5
+ $:.unshift File.dirname(__FILE__)
6
+ require 'test_0000_base'
7
+ #
8
+ # Test "ack" and :ack on a subscribe to a Stomp Connection.
9
+ #
10
+ class Test_0015_Ack_Conn < Test_0000_Base
11
+
12
+ # Setup.
13
+ # * Open a Stomp Connection
14
+ # * Set the test queue name
15
+ # * Set the message to use.
16
+ # * Set counter for looping tests
17
+ def setup
18
+ super
19
+ open_conn()
20
+ @queuename = "/queue/connack/" + name
21
+ @test_message = "What's up doc?"
22
+ @times = 10
23
+ #
24
+ end
25
+
26
+ # Teardown.
27
+ # # Connection disconnect.
28
+ def teardown
29
+ disconnect_conn()
30
+ end
31
+
32
+ # Test ACK of a single message
33
+ def test_0010_ack_conn_one
34
+ ack_conn_test("ack")
35
+ end
36
+ =begin
37
+ # Test ACK of a single message using symbol header
38
+ def test_0020_ack_conn_one_sym
39
+ ack_conn_test(:ack)
40
+ end
41
+
42
+ # Test ACK of multiple messages
43
+ def test_0030_ack_conn_mult
44
+ ack_conn_test("ack", @times)
45
+ end
46
+
47
+ # Test ACK of multiple messages using symbol header
48
+ def test_0040_ack_conn_mult_sym
49
+ ack_conn_test(:ack, @times)
50
+ end
51
+ =end
52
+ private
53
+
54
+ def ack_conn_test(ackparm = nil, ntimes = 1)
55
+ #
56
+ received = nil
57
+ assert_nothing_raised() {
58
+ ntimes.times do |n|
59
+ @conn.publish(@queuename, "#{@test_message} #{n+1}")
60
+ end
61
+ }
62
+ #
63
+ connection_subscribe(@queuename, { ackparm => "client" })
64
+ #
65
+ count = 0
66
+ assert_nothing_raised() {
67
+ ntimes.times do |n|
68
+ received = @conn.receive
69
+ @conn.ack(received.headers["message-id"])
70
+ count += 1
71
+ end
72
+ }
73
+ #
74
+ assert_equal(ntimes,count,"count should be the same: #{@queuename}")
75
+ end
76
+
77
+ end # of class
78
+
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'stomp'
3
+ #
4
+ require 'test/unit'
5
+ $:.unshift File.dirname(__FILE__)
6
+ require 'test_0000_base'
7
+ #
8
+ # Test ack => client using a Stomp Client.
9
+ #
10
+ class Test_0017_Ack_Client < Test_0000_Base
11
+
12
+ # Setup.
13
+ # * Queue Name
14
+ # * Message body
15
+ # * Count for multiples
16
+ # * Open a Stomp Client
17
+ def setup
18
+ super
19
+ @queue_name = "/queue/ackclisgl/" + name()
20
+ @test_message = "The Answer is Blowin' in the Wind."
21
+ @times = 10
22
+ open_client()
23
+ end
24
+
25
+ # Teardown.
26
+ # * Close the Stomp Client
27
+ def teardown
28
+ close_client()
29
+ end
30
+
31
+ # Test ACK from client
32
+ def test_0010_ack_send_receive
33
+ ack_client_test(:ackparm => "ack", :times => 1, :mod => "0010")
34
+ end
35
+
36
+ # Test ACK from client with symbol
37
+ def test_0020_ack_send_receive_sym
38
+ ack_client_test(:ackparm => :ack, :times => 1, :mod => "0020")
39
+ end
40
+
41
+ # Test ACK from client with miltiple messages
42
+ def test_0030_ack_send_receive_mult
43
+ ack_client_test(:ackparm => "ack", :times => @times, :mod => "0030")
44
+ end
45
+
46
+ # Test ACK from client with symbol and multiple messages
47
+ def test_0040_ack_send_receive_mult_sym
48
+ ack_client_test(:ackparm => :ack, :times => @times, :mod => "0040")
49
+ end
50
+
51
+ private
52
+
53
+ def ack_client_test(params = {})
54
+ received = nil
55
+ count = 0
56
+ assert_nothing_raised() {
57
+ params[:times].times do |n|
58
+ @client.publish(@queue_name, "#{@test_message} #{n+1}",
59
+ {"persistent" => true,
60
+ "client-id" => "0017_putr_#{params[:mod]}",
61
+ "reply-to" => @queue_name} )
62
+ end
63
+ @client.subscribe(@queue_name,
64
+ {"persistent" => true,
65
+ "client-id" => "0017_getr_#{params[:mod]}",
66
+ params[:ackparm] => "client" }
67
+ ) do |message|
68
+ received = message
69
+ @client.acknowledge(received) # ACK the message
70
+ count += 1
71
+ end
72
+ sleep 2.0 until received
73
+ }
74
+ assert_equal(params[:times],count,"counts should match: #{@queue_name}")
75
+ end
76
+
77
+ end # of class
78
+
@@ -0,0 +1,145 @@
1
+ require 'rubygems'
2
+ require 'stomp'
3
+ #
4
+ require 'test/unit'
5
+ $:.unshift File.dirname(__FILE__)
6
+ require 'test_0000_base'
7
+ #
8
+ # Test situations with a Stomp Client where ack mode is specified on a
9
+ # subscribe, but the message is initially never actually ACK'd.
10
+ #
11
+ class Test_0019_Ack_No_Ack < Test_0000_Base
12
+
13
+ # Setup.
14
+ # * Queue name
15
+ # * Message body
16
+ # * Connect stagger/reconnect wait time
17
+ def setup
18
+ super
19
+ @queue_name = "/queue/acknoack/" + name()
20
+ @test_message = "Bad moon risin' ....."
21
+ @reconnect_stagger = 0.5
22
+ end
23
+
24
+ # Teardown.
25
+ def teardown
26
+ end
27
+
28
+ # Test Ack No Ack Reget:
29
+ # * Send a messsage
30
+ # * Subscribe with ack, and receive
31
+ # * Never send an ACK
32
+ # * Reconnect and subscribe with ack => auto
33
+ # * Re-receive the same message
34
+ # Expectation: no client errors, and no server crashes.
35
+ def test_0020_ack_no_ack_reget
36
+ #
37
+ open_client()
38
+ #
39
+ received = no_ack_get()
40
+ # But now, do _not_ ack the message, just close the client connection
41
+ close_client()
42
+ #
43
+ # The re-connect and re-get sequence
44
+ #
45
+ sleep @reconnect_stagger # Server needs to asynchronously complete disconnect
46
+ open_client()
47
+ #
48
+ received_02 = get_again("auto")
49
+ #
50
+ assert_equal(received.body, received_02.body, "message content should be the same")
51
+ # And so should the message ID.
52
+ assert_equal(received.headers["message-id"],received_02.headers["message-id"],
53
+ "message ID should be the same")
54
+ #
55
+ close_client()
56
+ end
57
+
58
+ # Test Ack No Ack Reget:
59
+ # * Send a messsage
60
+ # * Subscribe with ack, and receive
61
+ # * Never send an ACK
62
+ # * Reconnect and subscribe with ack => client
63
+ # * Re-receive the same message
64
+ # * Actually ACK the message
65
+ # Expectation: no client errors, and no server crashes.
66
+ def test_0030_ack_no_ack_reget
67
+ #
68
+ open_client()
69
+ #
70
+ received = no_ack_get()
71
+ # But now, do _not_ ack the message, just close the client connection
72
+ close_client()
73
+ #
74
+ # The re-connect and re-get sequence
75
+ #
76
+ sleep @reconnect_stagger # Server needs to asynchronously complete disconnect
77
+ open_client()
78
+ #
79
+ received_02 = get_again("client")
80
+ #
81
+ assert_equal(received.body, received_02.body, "message content should be the same")
82
+ # And so should the message ID.
83
+ assert_equal(received.headers["message-id"],received_02.headers["message-id"],
84
+ "message ID should be the same")
85
+ #
86
+ close_client()
87
+ end
88
+
89
+ private
90
+
91
+ # Send a message, subscribe with "ack" => "client", and receive it.
92
+ # Do *not* send ACK reply.
93
+ def no_ack_get()
94
+ sleep @sleep_time if @sleep_time > 0
95
+ #
96
+ received = nil
97
+ assert_nothing_raised() {
98
+ # Send a single message to a queue
99
+ @client.publish(@queue_name, @test_message,
100
+ {"persistent" => true,
101
+ "client-id" => "ana_client_put",
102
+ "reply-to" => @queue_name} )
103
+ sleep @sleep_time if @sleep_time > 0
104
+ # Subscribe with "ack" => "client", and receive the message
105
+ @client.subscribe(@queue_name,
106
+ {"persistent" => true, "client-id" => "ana_client_get",
107
+ "ack" => "client" } ) do |message|
108
+ received = message
109
+ end
110
+ sleep 0.5 until received
111
+ #
112
+ sleep @sleep_time if @sleep_time > 0
113
+ # Make sure what was received is the same is what was sent
114
+ assert_equal(@test_message, received.body, "get what ya' give .....")
115
+ }
116
+ received
117
+ end
118
+
119
+ # Subscribe and reget a message. The subscription may or may not be
120
+ # ack => client, depending on the caller. If ack => client is indicated,
121
+ # the message is actually ACK'd.
122
+ def get_again(ackmode)
123
+ sleep @sleep_time if @sleep_time > 0
124
+ #
125
+ received = nil
126
+ assert_nothing_raised() {
127
+ # Subscribe with ack as specified by caller
128
+ @client.subscribe(@queue_name,
129
+ {"persistent" => true, "client-id" => "anareg_client_reget",
130
+ "ack" => ackmode } ) do |message|
131
+ received = message
132
+ end
133
+ sleep 1.0 until received
134
+ #
135
+ sleep @sleep_time if @sleep_time > 0
136
+ # Make sure what was received is the same is what was sent
137
+ assert_equal(@test_message, received.body, "get again what ya' gave .....")
138
+ # Possible ACK, caller decides
139
+ @client.acknowledge(received) if ackmode == "client"
140
+ }
141
+ received
142
+ end
143
+
144
+ end # of class
145
+
@@ -0,0 +1,123 @@
1
+ require 'rubygems'
2
+ require 'stomp'
3
+ #
4
+ require 'test/unit'
5
+ $:.unshift File.dirname(__FILE__)
6
+ require 'test_0000_base'
7
+ #
8
+ # Test situations with a Stomp Connection where ack mode is specified on a
9
+ # connection_subscribe, but the message is initially never actually ACK'd.
10
+ #
11
+ #
12
+ class Test_0022_Ack_Noack_Conn < Test_0000_Base
13
+
14
+ # Setup.
15
+ # * Queue name
16
+ # * Message body
17
+ # * Connect stagger/reconnect wait time
18
+ def setup
19
+ super
20
+ open_conn()
21
+ @queuename = "/queue/connana1/" + name()
22
+ @test_message = "Blue Suede Shoes ..."
23
+ @reconnect_stagger = 0.5
24
+ #
25
+ end
26
+
27
+ # Teardown.
28
+ def teardown
29
+ disconnect_conn()
30
+ end
31
+
32
+ # Test Ack Conn No Ack Reget:
33
+ # * Send a messsage
34
+ # * Subscribe with ack, and receive
35
+ # * Never send an ACK
36
+ # * Reconnect and subscribe with ack => auto
37
+ # * Re-receive the same message
38
+ # Expectation: no client errors, and no server crashes.
39
+
40
+ def test_0020_ack_conn_no_ack_reget
41
+ received = no_ack_get()
42
+ #
43
+ disconnect_conn()
44
+ #
45
+ sleep @reconnect_stagger # Let server clean up
46
+ open_conn()
47
+ received_02 = get_again("auto")
48
+ #
49
+ assert_equal(received.body, received_02.body, "message content should be the same")
50
+ # And so should the message ID.
51
+ assert_equal(received.headers["message-id"],received_02.headers["message-id"],
52
+ "message ID should be the same")
53
+ #
54
+ end
55
+
56
+ # Test Ack No Ack Reget:
57
+ # * Send a messsage
58
+ # * Subscribe with ack, and receive
59
+ # * Never send an ACK
60
+ # * Reconnect and subscribe with ack => client
61
+ # * Re-receive the same message
62
+ # * Actually ACK the message
63
+ # Expectation: no client errors, and no server crashes.
64
+
65
+ def test_0030_ack_conn_no_ack
66
+ received = no_ack_get()
67
+ #
68
+ disconnect_conn()
69
+ #
70
+ sleep @reconnect_stagger # Let server clean up
71
+ open_conn()
72
+ received_02 = get_again("client")
73
+ #
74
+ assert_equal(received.body, received_02.body, "message content should be the same")
75
+ # And so should the message ID.
76
+ assert_equal(received.headers["message-id"],received_02.headers["message-id"],
77
+ "message ID should be the same")
78
+ #
79
+ end
80
+
81
+ private
82
+
83
+ # Send a message, subscribe with "ack" => "client", and receive it.
84
+ # Do *not* send ACK reply.
85
+ def no_ack_get()
86
+ received = nil
87
+ assert_nothing_raised() {
88
+ @conn.publish(@queuename, @test_message)
89
+ #
90
+ connection_subscribe(@queuename, { "ack" => "client" })
91
+ received = @conn.receive
92
+ }
93
+ #
94
+ assert_not_nil(received, "something should be received")
95
+ assert_equal(@test_message, received.body, "received should match sent")
96
+ #
97
+ assert_not_nil(received.headers["message-id"], "message ID should be present")
98
+ #
99
+ received
100
+ end
101
+
102
+ # Subscribe and reget a message. The subscription may or may not be
103
+ # ack => client, depending on the caller. If ack => client is indicated,
104
+ # the message is actually ACK'd.
105
+ def get_again(ackmode)
106
+ received = nil
107
+ assert_nothing_raised() {
108
+ connection_subscribe(@queuename, { "ack" => ackmode })
109
+ received = @conn.receive
110
+ }
111
+ #
112
+ assert_not_nil(received, "something should be received")
113
+ assert_equal(@test_message, received.body, "received should again match sent")
114
+ assert_not_nil(received.headers["message-id"], "message ID should be present")
115
+ #
116
+ assert_nothing_raised() {
117
+ @conn.ack(received.headers["message-id"]) if ackmode == "client"
118
+ }
119
+ received
120
+ end
121
+
122
+ end # of class
123
+
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'stomp'
3
+ #
4
+ require 'test/unit'
5
+ $:.unshift File.dirname(__FILE__)
6
+ require 'test_0000_base'
7
+ #
8
+ # Basic connection tests.
9
+ #
10
+ class Test_0030_Subscr_Id < Test_0000_Base
11
+
12
+ # Setup
13
+ def setup
14
+ super
15
+ open_conn()
16
+ end
17
+
18
+ # Teardown
19
+ def teardown
20
+ disconnect_conn()
21
+ end
22
+
23
+ # Sanity check parameters
24
+ def test_0000_params
25
+ check_parms()
26
+ end
27
+
28
+
29
+ # Make sure we get 'subscription' header back from the server
30
+ def test_0010_subscribe_with_id
31
+ qname = "/queue/subscr/id/a.b"
32
+ send_message = "Subscribe with ID check message"
33
+ sub_id = "id-0010"
34
+ @conn.publish(qname,send_message)
35
+ @conn.subscribe(qname, {'id' => 'id-0010'})
36
+ #
37
+ rec_message = @conn.receive
38
+ assert_not_nil rec_message
39
+ assert_not_nil rec_message.headers['subscription']
40
+ assert_equal sub_id, rec_message.headers['subscription']
41
+ end
42
+
43
+ end # of class
44
+