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,136 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{stompserver_ng}
8
+ s.version = "1.0.6"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Patrick Hurley", "Lionel Bouton", "snacktime", "gyver", "Mike Mangino", "robl", "gmallard"]
12
+ s.date = %q{2011-04-21}
13
+ s.default_executable = %q{stompserver_ng}
14
+ s.description = %q{STOMP Next Generation Ruby server.}
15
+ s.email = ["phurley-blocked@rubyforge.org", "lionel-dev@bouton.name", "snacktime@somewhere.com", "gyver@somewhere.com", "mmangino-blocked@rubyforge.org", "robl@monkeyhelper.com", "allard.guy.m@gmail.com"]
16
+ s.executables = ["stompserver_ng"]
17
+ s.extra_rdoc_files = [
18
+ "README.txt"
19
+ ]
20
+ s.files = [
21
+ "History.txt",
22
+ "Manifest.txt",
23
+ "README.txt",
24
+ "Rakefile",
25
+ "STATUS",
26
+ "bin/stompserver_ng",
27
+ "client/README.txt",
28
+ "client/both.rb",
29
+ "client/consume.rb",
30
+ "client/send.rb",
31
+ "config/stompserver_ng.conf",
32
+ "etc/19xcompat/notes.txt",
33
+ "etc/arutils/README-activerecord.txt",
34
+ "etc/arutils/cre_mysql.rb",
35
+ "etc/arutils/cre_postgres.rb",
36
+ "etc/arutils/cre_sqlite3.rb",
37
+ "etc/arutils/mysql_boot.sql",
38
+ "etc/arutils/postgres_boot.sql",
39
+ "etc/database.mysql.yml",
40
+ "etc/database.postgres.yml",
41
+ "etc/passwd.example",
42
+ "etc/ppqinfo.rb",
43
+ "etc/runserver.sh",
44
+ "etc/stompserver_ng",
45
+ "etc/stompserver_ng.conf",
46
+ "lib/stomp_server_ng.rb",
47
+ "lib/stomp_server_ng/protocols/http.rb",
48
+ "lib/stomp_server_ng/protocols/stomp.rb",
49
+ "lib/stomp_server_ng/qmonitor.rb",
50
+ "lib/stomp_server_ng/queue.rb",
51
+ "lib/stomp_server_ng/queue/activerecord_queue.rb",
52
+ "lib/stomp_server_ng/queue/ar_message.rb",
53
+ "lib/stomp_server_ng/queue/ar_reconnect.rb",
54
+ "lib/stomp_server_ng/queue/dbm_queue.rb",
55
+ "lib/stomp_server_ng/queue/file_queue.rb",
56
+ "lib/stomp_server_ng/queue/memory_queue.rb",
57
+ "lib/stomp_server_ng/queue_manager.rb",
58
+ "lib/stomp_server_ng/stomp_auth.rb",
59
+ "lib/stomp_server_ng/stomp_frame.rb",
60
+ "lib/stomp_server_ng/stomp_frame_recognizer.rb",
61
+ "lib/stomp_server_ng/stomp_id.rb",
62
+ "lib/stomp_server_ng/stomp_user.rb",
63
+ "lib/stomp_server_ng/test_server.rb",
64
+ "lib/stomp_server_ng/topic_manager.rb",
65
+ "setup.rb",
66
+ "stompserver_ng.gemspec",
67
+ "test/devserver/props.yaml",
68
+ "test/devserver/runserver.sh",
69
+ "test/devserver/stompserver_ng.dbm.conf",
70
+ "test/devserver/stompserver_ng.file.conf",
71
+ "test/devserver/stompserver_ng.memory.conf",
72
+ "test/noserver/mocklogger.rb",
73
+ "test/noserver/test_queue_manager.rb",
74
+ "test/noserver/test_stomp_frame.rb",
75
+ "test/noserver/test_topic_manager.rb",
76
+ "test/noserver/ts_all_no_server.rb",
77
+ "test/props.yaml",
78
+ "test/runalltests.sh",
79
+ "test/runtest.sh",
80
+ "test/test_0000_base.rb",
81
+ "test/test_0001_conn.rb",
82
+ "test/test_0002_conn_sr.rb",
83
+ "test/test_0006_client.rb",
84
+ "test/test_0011_send_recv.rb",
85
+ "test/test_0015_ack_conn.rb",
86
+ "test/test_0017_ack_client.rb",
87
+ "test/test_0019_ack_no_ack.rb",
88
+ "test/test_0022_ack_noack_conn.rb",
89
+ "test/test_0030_subscr_id.rb",
90
+ "test/test_0040_receipt_conn.rb",
91
+ "test/ts_all_server.rb"
92
+ ]
93
+ s.homepage = %q{http://github.com/gmallard/stompserver_ng}
94
+ s.require_paths = ["lib"]
95
+ s.rubygems_version = %q{1.3.7}
96
+ s.summary = %q{A very light messaging server, next generation}
97
+ s.test_files = [
98
+ "test/noserver/mocklogger.rb",
99
+ "test/noserver/test_queue_manager.rb",
100
+ "test/noserver/test_stomp_frame.rb",
101
+ "test/noserver/test_topic_manager.rb",
102
+ "test/noserver/ts_all_no_server.rb",
103
+ "test/test_0000_base.rb",
104
+ "test/test_0001_conn.rb",
105
+ "test/test_0002_conn_sr.rb",
106
+ "test/test_0006_client.rb",
107
+ "test/test_0011_send_recv.rb",
108
+ "test/test_0015_ack_conn.rb",
109
+ "test/test_0017_ack_client.rb",
110
+ "test/test_0019_ack_no_ack.rb",
111
+ "test/test_0022_ack_noack_conn.rb",
112
+ "test/test_0030_subscr_id.rb",
113
+ "test/test_0040_receipt_conn.rb",
114
+ "test/ts_all_server.rb"
115
+ ]
116
+
117
+ if s.respond_to? :specification_version then
118
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
119
+ s.specification_version = 3
120
+
121
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
122
+ s.add_runtime_dependency(%q<daemons>, [">= 1.0.10"])
123
+ s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.10"])
124
+ s.add_runtime_dependency(%q<uuid>, [">= 2.1.0"])
125
+ else
126
+ s.add_dependency(%q<daemons>, [">= 1.0.10"])
127
+ s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
128
+ s.add_dependency(%q<uuid>, [">= 2.1.0"])
129
+ end
130
+ else
131
+ s.add_dependency(%q<daemons>, [">= 1.0.10"])
132
+ s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
133
+ s.add_dependency(%q<uuid>, [">= 2.1.0"])
134
+ end
135
+ end
136
+
@@ -0,0 +1,5 @@
1
+ ---
2
+ :userid: login
3
+ :password: passcode
4
+ :host: localhost
5
+ :port: 51613
@@ -0,0 +1,16 @@
1
+ #!/bin/bash
2
+ #
3
+ set -x
4
+ #
5
+ PH=$(pwd)
6
+ echo "Project Home: $PH"
7
+ mtype=${QMEM:-.file}
8
+ CONFIG=$PH/test/devserver/stompserver_ng${mtype}.conf
9
+ echo "Using Config: $CONFIG"
10
+ #
11
+ FLAGS="--log_level=debug --config=$CONFIG $*"
12
+ #
13
+ ruby -I $(pwd)/lib bin/stompserver_ng $FLAGS
14
+ #
15
+ set +x
16
+
@@ -0,0 +1,12 @@
1
+ ---
2
+ :daemon: false
3
+ :working_dir: /tmp/stompserver
4
+ :storage: .queue
5
+ :queue: dbm
6
+ :auth: false
7
+ :debug: false
8
+ :group:
9
+ :user:
10
+ :host: localhost
11
+ :port: 51613
12
+
@@ -0,0 +1,12 @@
1
+ ---
2
+ :daemon: false
3
+ :working_dir: /tmp/stompserver
4
+ :storage: .queue
5
+ :queue: file
6
+ :auth: false
7
+ :debug: false
8
+ :group:
9
+ :user:
10
+ :host: localhost
11
+ :port: 51613
12
+
@@ -0,0 +1,12 @@
1
+ ---
2
+ :daemon: false
3
+ :working_dir: /tmp/stompserver
4
+ :storage: .queue
5
+ :queue: memory
6
+ :auth: false
7
+ :debug: false
8
+ :group:
9
+ :user:
10
+ :host: localhost
11
+ :port: 51613
12
+
@@ -0,0 +1,12 @@
1
+ #
2
+ require 'logger'
3
+ #
4
+ module StompServer
5
+ class LogHelper
6
+ # Mock LogHelper Imlementation -> previous tests
7
+ def self.get_loglevel
8
+ Logger::DEBUG
9
+ end # of self.get_loglevel
10
+ end # of class LogHelper
11
+ end # of module
12
+
@@ -0,0 +1,134 @@
1
+ require 'logger'
2
+ $:.unshift File.dirname(__FILE__)
3
+ require 'mocklogger'
4
+ #
5
+ require 'stomp_server/stomp_id'
6
+ require 'stomp_server/stomp_frame'
7
+ require 'stomp_server/queue_manager'
8
+ require 'stomp_server/queue'
9
+ require 'stomp_server/queue/file_queue'
10
+ require 'stomp_server/queue/memory_queue'
11
+ require 'stomp_server/queue/dbm_queue'
12
+ require 'test/unit'
13
+ require 'fileutils'
14
+
15
+ class TestQueues < Test::Unit::TestCase
16
+
17
+ class MockQueueManager < StompServer::QueueManager
18
+ def initialize(qstore)
19
+ super(qstore)
20
+ @qstore = qstore
21
+ @queue_stats = Hash.new
22
+ @queues = Hash.new { Array.new }
23
+ @pending = Hash.new { Array.new }
24
+ end
25
+ end
26
+
27
+ class UserMock
28
+ attr_accessor :data
29
+ def initialize ; @data = '' ; end
30
+ def stomp_send_data(data); @data += data.to_s ; end
31
+ def connected?;true;end
32
+ end
33
+
34
+ class MessageMock
35
+ attr_accessor :headers, :data, :command, :body
36
+ def initialize(dest, msg, id=1)
37
+ @body = msg
38
+ @headers = {
39
+ 'message-id' => id,
40
+ 'destination' => dest,
41
+ 'content-length' => msg.size.to_s
42
+ }
43
+
44
+ @frame = StompServer::StompFrame.new('MESSAGE', headers, body)
45
+ @data = @frame.to_s
46
+ end
47
+ def to_s ; @data.to_s ; end
48
+ end
49
+
50
+ def teardown
51
+ FileUtils.rm_rf(".queue_test")
52
+ end
53
+
54
+ def setup
55
+ FileUtils.rm_rf(".queue_test") if File.directory?('.queue_test')
56
+ @@qstore = StompServer::FileQueue.new(".queue_test")
57
+ @@qstore.checkpoint_interval=0
58
+ @t = MockQueueManager.new(@@qstore)
59
+ @log = Logger.new(STDOUT)
60
+ @log.level = Logger::DEBUG
61
+ end
62
+
63
+ # def test_subscribe
64
+ # u = UserMock.new
65
+ # t = 'foo'
66
+ # @t.subscribe(t, u)
67
+ #
68
+ # m1 = MessageMock.new('foo', 'foomsg')
69
+ # m2 = MessageMock.new('bar', 'barmsg')
70
+ # @t.sendmsg(m1)
71
+ # assert_equal(m1.data, u.data)
72
+ #
73
+ # u.data = ''
74
+ # @t.sendmsg(m2)
75
+ # assert_equal('', u.data)
76
+ # end
77
+
78
+ def test_subscribe2
79
+ @log.debug("test_subscribe2 starts")
80
+ t = 'sub2'
81
+ m1 = MessageMock.new(t, 'sub2msg')
82
+ @t.sendmsg(m1)
83
+
84
+ u = UserMock.new
85
+ @t.subscribe(t, u)
86
+
87
+ assert_equal(m1.data, u.data)
88
+ @log.debug("test_subscribe2 ends")
89
+ end
90
+
91
+ # def test_unsubscribe
92
+ # u = UserMock.new
93
+ # t = 'foo'
94
+ # @t.subscribe(t, u)
95
+ #
96
+ # m1 = MessageMock.new('foo', 'foomsg')
97
+ # @t.sendmsg(m1)
98
+ # assert_equal(m1.data, u.data)
99
+ #
100
+ # @t.unsubscribe(t,u)
101
+ # u.data = ''
102
+ # @t.sendmsg(m1)
103
+ # assert_equal('', u.data)
104
+ # end
105
+
106
+ # def test_sendmsg
107
+ # u = UserMock.new
108
+ # t = 'foo'
109
+ # @t.subscribe(t, u)
110
+ #
111
+ # m1 = MessageMock.new('foo', 'foomsg')
112
+ # @t.sendmsg(m1)
113
+ # assert_equal(m1.data, u.data)
114
+ # assert_equal('MESSAGE', m1.command)
115
+ # end
116
+
117
+ def test_queued_sendmsg
118
+ @log.debug("test_queued_sendmsg starts")
119
+ t = 'foo'
120
+ m1 = MessageMock.new('foo', 'foomsg')
121
+ @t.sendmsg(m1)
122
+
123
+ u = UserMock.new
124
+ @t.subscribe(t, u)
125
+
126
+ assert_equal(m1.data, u.data)
127
+ assert_equal('MESSAGE', m1.command)
128
+
129
+ u2 = UserMock.new
130
+ @t.subscribe(t, u2)
131
+ assert_equal('', u2.data)
132
+ @log.debug("test_queued_sendmsg ends")
133
+ end
134
+ end
@@ -0,0 +1,138 @@
1
+ require 'logger'
2
+ $:.unshift File.dirname(__FILE__)
3
+ require 'mocklogger'
4
+ require 'stomp_server/stomp_frame'
5
+ require 'test/unit' unless defined? $ZENTEST and $ZENTEST
6
+
7
+ class TestStompFrame < Test::Unit::TestCase
8
+ def setup
9
+ @sfr = StompServer::StompFrameRecognizer.new
10
+ @log = Logger.new(STDOUT)
11
+ @log.level = Logger::DEBUG
12
+ end
13
+
14
+ def test_simpleframe
15
+ @log.debug("test_simpleframe starts")
16
+ @sfr << <<FRAME
17
+ COMMAND
18
+ name:value
19
+ foo:bar
20
+
21
+ message body
22
+ \000
23
+ FRAME
24
+ assert_equal(1, @sfr.frames.size)
25
+ f = @sfr.frames.shift
26
+ assert_equal(0, @sfr.frames.size)
27
+ assert_equal("COMMAND", f.command)
28
+ assert_equal("value", f.headers["name"])
29
+ assert_equal("bar", f.headers["foo"])
30
+ assert_equal("message body\n", f.body)
31
+ @log.debug("test_simpleframe ends")
32
+ end
33
+
34
+ def test_doubleframe
35
+ @log.debug("test_doubleframe starts")
36
+ @sfr << <<FRAME
37
+ COMMAND
38
+ name:value
39
+ foo:bar
40
+
41
+ message body
42
+ \000
43
+
44
+ COMMAND2
45
+ name2:value2
46
+ foo2:bar2
47
+
48
+ message body 2
49
+ \000
50
+ FRAME
51
+ assert_equal(2, @sfr.frames.size)
52
+ f = @sfr.frames.shift
53
+ assert_equal(1, @sfr.frames.size)
54
+ assert_equal("COMMAND", f.command)
55
+ assert_equal("value", f.headers["name"])
56
+ assert_equal("bar", f.headers["foo"])
57
+ assert_equal("message body\n", f.body)
58
+
59
+ # check second frame
60
+ f = @sfr.frames.shift
61
+ assert_equal(0, @sfr.frames.size)
62
+ assert_equal("COMMAND2", f.command)
63
+ assert_equal("value2", f.headers["name2"])
64
+ assert_equal("bar2", f.headers["foo2"])
65
+ assert_equal("message body 2\n", f.body)
66
+ @log.debug("test_doubleframe ends")
67
+ end
68
+
69
+ def test_partialframe
70
+ @log.debug("test_partialframe starts")
71
+ @sfr << <<FRAME
72
+ COMMAND
73
+ name:value
74
+ foo:bar
75
+
76
+ message body
77
+ \000
78
+
79
+ COMMAND2
80
+ name2:value2
81
+ foo2:bar2
82
+
83
+ message body 2
84
+ FRAME
85
+ assert_equal(1, @sfr.frames.size)
86
+ f = @sfr.frames.shift
87
+ assert_equal(0, @sfr.frames.size)
88
+ assert_equal("COMMAND", f.command)
89
+ assert_equal("value", f.headers["name"])
90
+ assert_equal("bar", f.headers["foo"])
91
+ assert_equal("message body\n", f.body)
92
+ @log.debug("test_partialframe ends")
93
+ end
94
+
95
+ def test_partialframe2
96
+ @log.debug("test_partialframe2 starts")
97
+ @sfr << <<FRAME
98
+ COMMAND
99
+ name:value
100
+ foo:bar
101
+ FRAME
102
+ assert_equal(0, @sfr.frames.size)
103
+ @log.debug("test_partialframe2 ends")
104
+ end
105
+
106
+ def test_headless_frame
107
+ @log.debug("test_headless_frame starts")
108
+ @sfr << <<FRAME
109
+ COMMAND
110
+
111
+ message body\000
112
+ FRAME
113
+ assert_equal(1, @sfr.frames.size)
114
+ f = @sfr.frames.shift
115
+ assert_equal(0, @sfr.frames.size)
116
+ assert_equal("COMMAND", f.command)
117
+ assert_equal("message body", f.body)
118
+ @log.debug("test_headless_frame ends")
119
+ end
120
+
121
+ def test_destination_cache
122
+ @log.debug("test_destination_cache starts")
123
+ @sfr << <<FRAME
124
+ MESSAGE
125
+ destination: /queue/foo
126
+
127
+ message body\000
128
+ FRAME
129
+ assert_equal(1, @sfr.frames.size)
130
+ f = @sfr.frames.shift
131
+ assert_equal(0, @sfr.frames.size)
132
+ assert_equal("MESSAGE", f.command)
133
+ assert_equal("message body", f.body)
134
+ assert_equal('/queue/foo', f.dest)
135
+ @log.debug("test_destination_cache ends")
136
+ end
137
+ end
138
+