stompserver_ng 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
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
+