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.
- data/History.txt +159 -0
- data/Manifest.txt +71 -0
- data/README.txt +172 -0
- data/Rakefile +38 -0
- data/STATUS +5 -0
- data/bin/stompserver_ng +63 -0
- data/client/README.txt +1 -0
- data/client/both.rb +25 -0
- data/client/consume.rb +14 -0
- data/client/send.rb +17 -0
- data/config/stompserver_ng.conf +11 -0
- data/etc/19xcompat/notes.txt +223 -0
- data/etc/arutils/README-activerecord.txt +78 -0
- data/etc/arutils/cre_mysql.rb +34 -0
- data/etc/arutils/cre_postgres.rb +33 -0
- data/etc/arutils/cre_sqlite3.rb +28 -0
- data/etc/arutils/mysql_boot.sql +12 -0
- data/etc/arutils/postgres_boot.sql +14 -0
- data/etc/database.mysql.yml +9 -0
- data/etc/database.postgres.yml +9 -0
- data/etc/passwd.example +3 -0
- data/etc/ppqinfo.rb +15 -0
- data/etc/runserver.sh +17 -0
- data/etc/stompserver_ng +50 -0
- data/etc/stompserver_ng.conf +13 -0
- data/lib/stomp_server_ng.rb +471 -0
- data/lib/stomp_server_ng/protocols/http.rb +128 -0
- data/lib/stomp_server_ng/protocols/stomp.rb +407 -0
- data/lib/stomp_server_ng/qmonitor.rb +58 -0
- data/lib/stomp_server_ng/queue.rb +248 -0
- data/lib/stomp_server_ng/queue/activerecord_queue.rb +118 -0
- data/lib/stomp_server_ng/queue/ar_message.rb +21 -0
- data/lib/stomp_server_ng/queue/ar_reconnect.rb +18 -0
- data/lib/stomp_server_ng/queue/dbm_queue.rb +72 -0
- data/lib/stomp_server_ng/queue/file_queue.rb +56 -0
- data/lib/stomp_server_ng/queue/memory_queue.rb +64 -0
- data/lib/stomp_server_ng/queue_manager.rb +302 -0
- data/lib/stomp_server_ng/stomp_auth.rb +26 -0
- data/lib/stomp_server_ng/stomp_frame.rb +32 -0
- data/lib/stomp_server_ng/stomp_frame_recognizer.rb +77 -0
- data/lib/stomp_server_ng/stomp_id.rb +32 -0
- data/lib/stomp_server_ng/stomp_user.rb +17 -0
- data/lib/stomp_server_ng/test_server.rb +21 -0
- data/lib/stomp_server_ng/topic_manager.rb +46 -0
- data/setup.rb +1585 -0
- data/stompserver_ng.gemspec +136 -0
- data/test/devserver/props.yaml +5 -0
- data/test/devserver/runserver.sh +16 -0
- data/test/devserver/stompserver_ng.dbm.conf +12 -0
- data/test/devserver/stompserver_ng.file.conf +12 -0
- data/test/devserver/stompserver_ng.memory.conf +12 -0
- data/test/noserver/mocklogger.rb +12 -0
- data/test/noserver/test_queue_manager.rb +134 -0
- data/test/noserver/test_stomp_frame.rb +138 -0
- data/test/noserver/test_topic_manager.rb +79 -0
- data/test/noserver/ts_all_no_server.rb +12 -0
- data/test/props.yaml +5 -0
- data/test/runalltests.sh +14 -0
- data/test/runtest.sh +4 -0
- data/test/test_0000_base.rb +107 -0
- data/test/test_0001_conn.rb +47 -0
- data/test/test_0002_conn_sr.rb +94 -0
- data/test/test_0006_client.rb +41 -0
- data/test/test_0011_send_recv.rb +74 -0
- data/test/test_0015_ack_conn.rb +78 -0
- data/test/test_0017_ack_client.rb +78 -0
- data/test/test_0019_ack_no_ack.rb +145 -0
- data/test/test_0022_ack_noack_conn.rb +123 -0
- data/test/test_0030_subscr_id.rb +44 -0
- data/test/test_0040_receipt_conn.rb +87 -0
- data/test/ts_all_server.rb +10 -0
- metadata +196 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'logger'
|
2
|
+
$:.unshift File.dirname(__FILE__)
|
3
|
+
require 'mocklogger'
|
4
|
+
#
|
5
|
+
require 'stomp_server/topic_manager'
|
6
|
+
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
7
|
+
|
8
|
+
class TestTopics < Test::Unit::TestCase
|
9
|
+
|
10
|
+
class UserMock
|
11
|
+
attr_accessor :data
|
12
|
+
def initialize ; @data = '' ; end
|
13
|
+
def stomp_send_data(data); @data += data.to_s ; end
|
14
|
+
end
|
15
|
+
|
16
|
+
class MessageMock
|
17
|
+
attr_accessor :headers, :data, :command
|
18
|
+
def initialize(dest, msg)
|
19
|
+
@headers = { 'destination' => dest }
|
20
|
+
@data = msg
|
21
|
+
end
|
22
|
+
def to_s ; @data ; end
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@t = StompServer::TopicManager.new
|
27
|
+
@log = Logger.new(STDOUT)
|
28
|
+
@log.level = Logger::DEBUG
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_subscribe
|
32
|
+
@log.debug("test_subscribe starts")
|
33
|
+
u = UserMock.new
|
34
|
+
t = 'foo'
|
35
|
+
@t.subscribe(t, u)
|
36
|
+
|
37
|
+
m1 = MessageMock.new('foo', 'foomsg')
|
38
|
+
m2 = MessageMock.new('bar', 'barmsg')
|
39
|
+
@t.sendmsg(m1)
|
40
|
+
assert_equal(m1.data, u.data)
|
41
|
+
|
42
|
+
u.data = ''
|
43
|
+
@t.sendmsg(m2)
|
44
|
+
assert_equal('', u.data)
|
45
|
+
@log.debug("test_subscribe ends")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_unsubscribe
|
49
|
+
@log.debug("test_unsubscribe starts")
|
50
|
+
u = UserMock.new
|
51
|
+
t = 'foo'
|
52
|
+
@t.subscribe(t, u)
|
53
|
+
|
54
|
+
m1 = MessageMock.new('foo', 'foomsg')
|
55
|
+
@t.sendmsg(m1)
|
56
|
+
assert_equal(m1.data, u.data)
|
57
|
+
|
58
|
+
@t.unsubscribe(t,u)
|
59
|
+
u.data = ''
|
60
|
+
@t.sendmsg(m1)
|
61
|
+
assert_equal('', u.data)
|
62
|
+
@log.debug("test_unsubscribe ends")
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_sendmsg
|
66
|
+
@log.debug("test_sendmsg starts")
|
67
|
+
u = UserMock.new
|
68
|
+
t = 'foo'
|
69
|
+
@t.subscribe(t, u)
|
70
|
+
|
71
|
+
m1 = MessageMock.new('foo', 'foomsg')
|
72
|
+
@t.sendmsg(m1)
|
73
|
+
assert_equal(m1.data, u.data)
|
74
|
+
assert_equal('MESSAGE', m1.command)
|
75
|
+
@log.debug("test_sendmsg ends")
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#
|
2
|
+
# Run all tests which do not require a server instance to be up.
|
3
|
+
#
|
4
|
+
here=File.dirname(__FILE__)
|
5
|
+
$:.unshift File.join(here,"..","..", "lib")
|
6
|
+
$:.unshift File.join(here)
|
7
|
+
Dir.glob("#{here}/test_*.rb").each do |file|
|
8
|
+
# next if file =~ /test_0/
|
9
|
+
puts "Will require unit test file: #{file}"
|
10
|
+
require file
|
11
|
+
end
|
12
|
+
|
data/test/props.yaml
ADDED
data/test/runalltests.sh
ADDED
data/test/runtest.sh
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stomp'
|
3
|
+
require 'test/unit'
|
4
|
+
require 'yaml'
|
5
|
+
require 'timeout'
|
6
|
+
require 'digest/sha1'
|
7
|
+
#
|
8
|
+
class Test_0000_Base < Test::Unit::TestCase
|
9
|
+
|
10
|
+
# Base setup.
|
11
|
+
# * Load configuration parameters
|
12
|
+
# * Initialize connection and client instances.
|
13
|
+
# * Override sleep time from environment
|
14
|
+
def setup
|
15
|
+
@runparms = load_config()
|
16
|
+
@conn = nil
|
17
|
+
@client = nil
|
18
|
+
@sleep_time = ENV['TEST_SLEEP'] ? ENV['TEST_SLEEP'].to_f : 0.0
|
19
|
+
end # of setup
|
20
|
+
|
21
|
+
# Default test for the base class. Will always pass.
|
22
|
+
# Required by the test framework.
|
23
|
+
def test_0000_default
|
24
|
+
assert(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Load yaml configuration file
|
30
|
+
def load_config()
|
31
|
+
yfname = File.join(File.dirname(__FILE__), "props.yaml")
|
32
|
+
parms = YAML.load(File.open(yfname))
|
33
|
+
# Allow override of:
|
34
|
+
# * host
|
35
|
+
# * port
|
36
|
+
# * user name
|
37
|
+
# * user password
|
38
|
+
# from the environment.
|
39
|
+
parms[:host] = ENV['STOMP_HOST'] if ENV['STOMP_HOST']
|
40
|
+
parms[:port] = ENV['STOMP_PORT'] if ENV['STOMP_PORT']
|
41
|
+
parms[:userid] = ENV['STOMP_USER'] if ENV['STOMP_USER']
|
42
|
+
parms[:password] = ENV['STOMP_PASS'] if ENV['STOMP_PASS']
|
43
|
+
parms
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
# Sanity check that required parms are present
|
49
|
+
def check_parms()
|
50
|
+
assert_not_nil(@runparms[:userid],"userid must be present")
|
51
|
+
assert_not_nil(@runparms[:password],"password must be present")
|
52
|
+
assert_not_nil(@runparms[:host],"host must be present")
|
53
|
+
assert_not_nil(@runparms[:port],"port must be present")
|
54
|
+
end
|
55
|
+
|
56
|
+
# Open a Stomp Connection
|
57
|
+
def open_conn()
|
58
|
+
assert_nothing_raised() {
|
59
|
+
@conn = Stomp::Connection.open(@runparms[:userid],
|
60
|
+
@runparms[:password],
|
61
|
+
@runparms[:host],
|
62
|
+
@runparms[:port])
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
# Disconnect a Stomp Connection
|
67
|
+
def disconnect_conn()
|
68
|
+
if @conn
|
69
|
+
assert_nothing_raised() {
|
70
|
+
@conn.disconnect
|
71
|
+
}
|
72
|
+
end
|
73
|
+
@conn = nil
|
74
|
+
end
|
75
|
+
|
76
|
+
# Open a Stomp Client
|
77
|
+
def open_client()
|
78
|
+
assert_nothing_raised() {
|
79
|
+
@client = Stomp::Client.open(@runparms[:userid],
|
80
|
+
@runparms[:password],
|
81
|
+
@runparms[:host],
|
82
|
+
@runparms[:port])
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
# Close a Stomp Client
|
87
|
+
def close_client()
|
88
|
+
assert_nothing_raised() {
|
89
|
+
@client.close if @client
|
90
|
+
}
|
91
|
+
@client = nil
|
92
|
+
end
|
93
|
+
|
94
|
+
# Convenience method for subscribing to a destination given a
|
95
|
+
# Stomp Connection.
|
96
|
+
def connection_subscribe(qname, headers = {}, subId = nil)
|
97
|
+
@conn.subscribe(qname, headers, subId)
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
def name
|
102
|
+
tstr = Time.now.to_f.to_s
|
103
|
+
"19x_name_" + Digest::SHA1.hexdigest(tstr)
|
104
|
+
end if RUBY_VERSION =~ /1\.9/
|
105
|
+
|
106
|
+
end # of class
|
107
|
+
|
@@ -0,0 +1,47 @@
|
|
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_0001_Conn < Test_0000_Base
|
11
|
+
|
12
|
+
#
|
13
|
+
def setup
|
14
|
+
super
|
15
|
+
@times = 10
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sanity check parameters
|
19
|
+
def test_0000_params
|
20
|
+
check_parms()
|
21
|
+
end
|
22
|
+
|
23
|
+
# Single connect
|
24
|
+
def test_0010_connect
|
25
|
+
open_conn()
|
26
|
+
assert_not_nil(@conn, "connection should not be nil")
|
27
|
+
sleep @sleep_time if @sleep_time > 0
|
28
|
+
end
|
29
|
+
|
30
|
+
# Single disconnect
|
31
|
+
def test_0015_disconnect
|
32
|
+
disconnect_conn()
|
33
|
+
assert_nil(@conn, "connection should be nil after disconnect")
|
34
|
+
end
|
35
|
+
|
36
|
+
# Show that multiple connect/disconnect sequences in a row can be issued.
|
37
|
+
def test_0020_connect_disc_mult
|
38
|
+
@times.times do |n|
|
39
|
+
open_conn()
|
40
|
+
assert_not_nil(@conn, "connection should not be nil, try #{n}")
|
41
|
+
disconnect_conn()
|
42
|
+
assert_nil(@conn, "connection should be nil after disconnect, try #{n}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end # of class
|
47
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stomp'
|
3
|
+
#
|
4
|
+
require 'test/unit'
|
5
|
+
$:.unshift File.dirname(__FILE__)
|
6
|
+
require 'test_0000_base'
|
7
|
+
#
|
8
|
+
# Test a basic send and receive over a Stomp Connection.
|
9
|
+
#
|
10
|
+
class Test_0002_Conn_SR < Test_0000_Base
|
11
|
+
|
12
|
+
# Setup.
|
13
|
+
# * Open the connection
|
14
|
+
# * Generate queue name for this test
|
15
|
+
# * Specify the message
|
16
|
+
def setup
|
17
|
+
super
|
18
|
+
open_conn()
|
19
|
+
@queuename = "/queue/connsr/" + name()
|
20
|
+
@test_message = "Abracadabra!"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Teardown.
|
24
|
+
# * Disconnect
|
25
|
+
def teardown
|
26
|
+
disconnect_conn()
|
27
|
+
end
|
28
|
+
|
29
|
+
# Test a single send and receive over the same connection.
|
30
|
+
def test_0010_send_receive
|
31
|
+
received = nil
|
32
|
+
mtosend = @test_message + "-0010"
|
33
|
+
assert_nothing_raised() {
|
34
|
+
@conn.publish(@queuename, mtosend)
|
35
|
+
connection_subscribe(@queuename)
|
36
|
+
received = @conn.receive
|
37
|
+
}
|
38
|
+
assert_not_nil(received, "something should be received")
|
39
|
+
assert_equal(mtosend, received.body, "received should match sent")
|
40
|
+
end
|
41
|
+
|
42
|
+
# Test a single send and receive over different connections.
|
43
|
+
def test_0020_send_receive
|
44
|
+
received = nil
|
45
|
+
queuename = "/queue/connsr_0020/" + name()
|
46
|
+
mtosend = @test_message + "-0020"
|
47
|
+
assert_nothing_raised() {
|
48
|
+
@conn.publish(queuename, mtosend)
|
49
|
+
sleep 3
|
50
|
+
}
|
51
|
+
teardown
|
52
|
+
setup
|
53
|
+
assert_nothing_raised() {
|
54
|
+
connection_subscribe(queuename)
|
55
|
+
Timeout::timeout(4) do
|
56
|
+
received = @conn.receive
|
57
|
+
end
|
58
|
+
}
|
59
|
+
assert_not_nil(received, "something should be received 20")
|
60
|
+
assert_equal(mtosend, received.body, "received should match sent 20")
|
61
|
+
end
|
62
|
+
|
63
|
+
# Test a single send and receive over different connections,
|
64
|
+
# issue subscribe before send:
|
65
|
+
# stompserver - fail
|
66
|
+
# AMQ - fail
|
67
|
+
# Note: 'fail' means that the second connection will issue 'receive', and
|
68
|
+
# no message will ever be received.
|
69
|
+
def test_0030_send_receive
|
70
|
+
received = nil
|
71
|
+
queuename = "/queue/connsr_0030/" + name()
|
72
|
+
mtosend = @test_message + "-0030"
|
73
|
+
assert_nothing_raised() {
|
74
|
+
connection_subscribe(queuename) # This
|
75
|
+
@conn.publish(queuename, mtosend)
|
76
|
+
sleep 4 # plus this cause fail
|
77
|
+
# NOTE!!! - without the above 'sleep':
|
78
|
+
# AMQ will sometimes fail, and sometimes succeed. It seems to
|
79
|
+
# depend on timing, current system load, .....
|
80
|
+
}
|
81
|
+
teardown
|
82
|
+
setup
|
83
|
+
assert_nothing_raised() {
|
84
|
+
connection_subscribe(queuename)
|
85
|
+
}
|
86
|
+
assert_raise(Timeout::Error) {
|
87
|
+
Timeout::timeout(4) do
|
88
|
+
received = @conn.receive
|
89
|
+
end
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
end # of class
|
94
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stomp'
|
3
|
+
#
|
4
|
+
require 'test/unit'
|
5
|
+
$:.unshift File.dirname(__FILE__)
|
6
|
+
require 'test_0000_base'
|
7
|
+
#
|
8
|
+
# Test client open and close sequences.
|
9
|
+
#
|
10
|
+
class Test_0006_Client < Test_0000_Base
|
11
|
+
|
12
|
+
# Setup
|
13
|
+
# * Define number of loops for multiple tests.
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
@times = 10
|
17
|
+
end
|
18
|
+
|
19
|
+
# Teardown.
|
20
|
+
def teardown
|
21
|
+
end
|
22
|
+
|
23
|
+
# Single client open then close.
|
24
|
+
def test_0010_open_then_close
|
25
|
+
open_client()
|
26
|
+
assert_not_nil(@client, "client should not be nil")
|
27
|
+
close_client()
|
28
|
+
assert_nil(@client, "client should be nil after close")
|
29
|
+
end
|
30
|
+
|
31
|
+
# Multiple client open/close sequences.
|
32
|
+
def test_0020_open_then_close_mult
|
33
|
+
@times.times do |n|
|
34
|
+
open_client()
|
35
|
+
assert_not_nil(@client, "client should not be nil, try #{n}")
|
36
|
+
close_client()
|
37
|
+
assert_nil(@client, "client should be nil after close, try #{n}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end # of class
|
41
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stomp'
|
3
|
+
#
|
4
|
+
require 'test/unit'
|
5
|
+
$:.unshift File.dirname(__FILE__)
|
6
|
+
require 'test_0000_base'
|
7
|
+
#
|
8
|
+
# Test send and receive using a Stomp Client.
|
9
|
+
#
|
10
|
+
class Test_0011_Send_Recv < Test_0000_Base
|
11
|
+
|
12
|
+
# Setup
|
13
|
+
# * Specify test queue name
|
14
|
+
# * Specify message content
|
15
|
+
# * Loop count for multiple times tests
|
16
|
+
# * Open a Stomp Client
|
17
|
+
def setup
|
18
|
+
super
|
19
|
+
@queue_name = "/queue/sendrecv/" + name()
|
20
|
+
@test_message = "This is a test message."
|
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 single message send and receive.
|
32
|
+
def test_0010_send_receive
|
33
|
+
assert_nothing_raised() {
|
34
|
+
received = nil
|
35
|
+
#
|
36
|
+
@client.publish(@queue_name, @test_message,
|
37
|
+
{"persistent" => true,
|
38
|
+
"client-id" => "0011_sr1send",
|
39
|
+
"reply-to" => @queue_name} )
|
40
|
+
#
|
41
|
+
@client.subscribe(@queue_name,
|
42
|
+
{"persistent" => true, "client-id" => "0011_sr1recv"} ) do |message|
|
43
|
+
received = message
|
44
|
+
end
|
45
|
+
sleep 0.1 until received
|
46
|
+
assert_equal(@test_message, received.body, "what is sent should be received")
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
# Test send and receive of multiple messages.
|
51
|
+
def test_0020_send_mult_receive
|
52
|
+
assert_nothing_raised() {
|
53
|
+
received = nil
|
54
|
+
#
|
55
|
+
@times.times do |n|
|
56
|
+
@client.publish(@queue_name, @test_message + " #{n}",
|
57
|
+
{"persistent" => true,
|
58
|
+
"client-id" => "0011_srXsend",
|
59
|
+
"reply-to" => @queue_name} )
|
60
|
+
end
|
61
|
+
#
|
62
|
+
count = 0
|
63
|
+
@client.subscribe(@queue_name,
|
64
|
+
{"persistent" => true, "client-id" => "0011_srXrecv"} ) do |message|
|
65
|
+
count += 1
|
66
|
+
received = message
|
67
|
+
end
|
68
|
+
sleep 0.25 until received
|
69
|
+
assert_equal(@times,count,"0011 counts should match")
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
end # of class
|
74
|
+
|