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