rocket-server 0.0.1
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/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.md +0 -0
- data/Rakefile +60 -0
- data/bin/rocket-server +13 -0
- data/etc/testing.yml +38 -0
- data/lib/rocket-server.rb +2 -0
- data/lib/rocket/server.rb +87 -0
- data/lib/rocket/server/app.rb +44 -0
- data/lib/rocket/server/channel.rb +22 -0
- data/lib/rocket/server/cli.rb +52 -0
- data/lib/rocket/server/connection.rb +137 -0
- data/lib/rocket/server/helpers.rb +22 -0
- data/lib/rocket/server/misc.rb +17 -0
- data/lib/rocket/server/runner.rb +78 -0
- data/lib/rocket/server/session.rb +58 -0
- data/lib/rocket/server/templates/config.yml.tpl +40 -0
- data/lib/rocket/server/version.rb +14 -0
- data/rocket-server.gemspec +96 -0
- data/spec/apps_spec.rb +54 -0
- data/spec/channel_spec.rb +31 -0
- data/spec/cli_spec.rb +85 -0
- data/spec/connection_spec.rb +257 -0
- data/spec/helpers_spec.rb +23 -0
- data/spec/misc_spec.rb +31 -0
- data/spec/runner_spec.rb +138 -0
- data/spec/server_spec.rb +146 -0
- data/spec/session_spec.rb +110 -0
- data/spec/spec_helper.rb +22 -0
- metadata +237 -0
data/spec/server_spec.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Rocket::Server do
|
4
|
+
subject do
|
5
|
+
Rocket::Server
|
6
|
+
end
|
7
|
+
|
8
|
+
it ".version should be valid" do
|
9
|
+
subject.version.should =~ /\d+(.\d+){1,2}.*/
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".logger=" do
|
13
|
+
it "should set given logger" do
|
14
|
+
subject.logger = :testing
|
15
|
+
subject.instance_variable_get("@logger").should == :testing
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".logger" do
|
20
|
+
before do
|
21
|
+
subject.instance_variable_set("@logger", nil)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return default logger when other is not specified" do
|
25
|
+
subject.expects(:default_logger).returns(:test)
|
26
|
+
subject.logger.should == :test
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return specified logger" do
|
30
|
+
subject.logger = :testing
|
31
|
+
subject.logger.should == :testing
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".default_logger" do
|
36
|
+
before do
|
37
|
+
@logger = subject.default_logger
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return logger with default configuration" do
|
41
|
+
@logger.should be_kind_of(Logging::Logger)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should set it verbosity level to :info" do
|
45
|
+
@logger.level.should == 1
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should add stdout appender" do
|
49
|
+
@logger.instance_variable_get("@appenders").should include(Logging.appenders.stdout)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ".configure_logger" do
|
54
|
+
before :each do
|
55
|
+
subject.logger = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
after :each do
|
59
|
+
subject.logger.appenders = nil
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when logfile specified" do
|
63
|
+
it "should set appender for it" do
|
64
|
+
begin
|
65
|
+
subject.set :log, "test.log"
|
66
|
+
subject.configure_logger
|
67
|
+
subject.logger.instance_variable_get("@appenders").last.name.should == "test.log"
|
68
|
+
ensure
|
69
|
+
FileUtils.rm("test.log")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when no logfile specified" do
|
75
|
+
it "shouldn't modify appenders" do
|
76
|
+
subject.set :log, nil
|
77
|
+
subject.configure_logger
|
78
|
+
subject.logger.instance_variable_get("@appenders").should have(1).item
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when verbose mode" do
|
83
|
+
it "should set log level to :debug" do
|
84
|
+
subject.enable :verbose
|
85
|
+
subject.configure_logger
|
86
|
+
subject.logger.level.should == 0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when no verbose mode" do
|
91
|
+
context "and quiet mode" do
|
92
|
+
it "should set log level to :error" do
|
93
|
+
subject.disable :verbose
|
94
|
+
subject.enable :quiet
|
95
|
+
subject.configure_logger
|
96
|
+
subject.logger.level.should == 3
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe ".load_settings" do
|
103
|
+
context "when error raised" do
|
104
|
+
it "should rescue it and display, and exit program" do
|
105
|
+
out, err = capture_output {
|
106
|
+
subject.expects(:load_settings_without_setup).raises(Errno::EACCES)
|
107
|
+
expect { subject.load_settings("test.yml") }.to raise_error(SystemExit)
|
108
|
+
}
|
109
|
+
out.should == "Permission denied\n"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context "when everything's ok" do
|
114
|
+
before do
|
115
|
+
subject.expects(:load_settings_without_setup).returns(true)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should merge settings with given locals" do
|
119
|
+
subject.settings.expects(:merge!).with(:test => true)
|
120
|
+
subject.load_settings("test.yml", :test => true)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should configure logger" do
|
124
|
+
subject.expects(:configure_logger).returns(true)
|
125
|
+
subject.load_settings("test.yml")
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should require specified plugins" do
|
129
|
+
subject.expects(:require_plugins).returns(true)
|
130
|
+
subject.load_settings("test.yml")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe ".require_plugins" do
|
136
|
+
it "should require all specified extensions" do
|
137
|
+
begin
|
138
|
+
subject.set :plugins, %w[test/plugin]
|
139
|
+
subject.expects(:require).with("test/plugin").returns(true)
|
140
|
+
subject.require_plugins
|
141
|
+
ensure
|
142
|
+
subject.set :plugins, []
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Rocket::Server::Session do
|
4
|
+
let(:mock_app) do
|
5
|
+
stub(:id => "test")
|
6
|
+
end
|
7
|
+
|
8
|
+
subject do
|
9
|
+
Rocket::Server::App.expects(:find).with("test").returns(mock_app)
|
10
|
+
Rocket::Server::Session.new('test')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#initialize" do
|
14
|
+
context "when given app exists" do
|
15
|
+
it "should initialize subscriptions hash" do
|
16
|
+
subject.subscriptions.should == {}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should find given app" do
|
20
|
+
mock_app.expects(:id).returns("test")
|
21
|
+
subject.app_id.should == "test"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when given app doesn't exist" do
|
26
|
+
it "should raise error" do
|
27
|
+
Rocket::Server::App.expects(:find).with("this-app-does-not-exist").raises(Rocket::Server::App::NotFoundError)
|
28
|
+
expect { Rocket::Server::Session.new("this-app-does-not-exist") }.to raise_error(Rocket::Server::App::NotFoundError)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "in authentication flow" do
|
34
|
+
describe "#authenticated?" do
|
35
|
+
it "should be false by default" do
|
36
|
+
subject.should_not be_authenticated
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#authenticate!" do
|
41
|
+
describe "when invalid secret given" do
|
42
|
+
it "shouldn't authenticate current session" do
|
43
|
+
mock_app.expects(:secret).returns("test")
|
44
|
+
@session = subject
|
45
|
+
@session.authenticate!("not-test").should be_false
|
46
|
+
@session.should_not be_authenticated
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "when valid secret given" do
|
51
|
+
it "should authenticate current session" do
|
52
|
+
mock_app.expects(:secret).returns("test")
|
53
|
+
@session = subject
|
54
|
+
@session.authenticate!("test").should be_true
|
55
|
+
@session.should be_authenticated
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#subscribe" do
|
62
|
+
before do
|
63
|
+
@conn = stub(:signature => 123)
|
64
|
+
Rocket::Server::Channel["test" => "test-channel"].expects(:subscribe).returns(234)
|
65
|
+
@session = subject
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should subscribe given channel" do
|
69
|
+
@session.subscribe("test-channel", @conn).should == 234
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should store subscription on list" do
|
73
|
+
@session.subscribe("test-channel", @conn)
|
74
|
+
@session.subscriptions.should have(1).item
|
75
|
+
@session.subscriptions["test-channel" => 123].should == 234
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#unsubscribe" do
|
80
|
+
before do
|
81
|
+
@conn = stub(:signature => 123)
|
82
|
+
Rocket::Server::Channel["test" => "test-channel"].expects(:unsubscribe).with(234)
|
83
|
+
@session = subject
|
84
|
+
@session.stubs(:subscriptions).returns({{"test-channel" => 123} => 234})
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should unsubscribe given channel" do
|
88
|
+
@session.unsubscribe("test-channel", @conn)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should remove subscription from list" do
|
92
|
+
@session.unsubscribe("test-channel", @conn)
|
93
|
+
@session.subscriptions.should_not have_key("test-channel" => 123)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#close" do
|
98
|
+
before do
|
99
|
+
@conn = stub(:signature => 123)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should unsubscibe all active subscriptions" do
|
103
|
+
@session = subject
|
104
|
+
@session.stubs(:subscriptions).returns({{"test-channel" => 123} => 234})
|
105
|
+
Rocket::Server::Channel["test" => "test-channel"].expects(:unsubscribe).with(234)
|
106
|
+
@session.close
|
107
|
+
@session.subscriptions.should be_empty
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mocha'
|
3
|
+
require 'rspec'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'rocket-server'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.mock_with :mocha
|
9
|
+
end
|
10
|
+
|
11
|
+
Rocket::Server.logger.appenders = nil
|
12
|
+
|
13
|
+
def capture_output
|
14
|
+
out, err = StringIO.new, StringIO.new
|
15
|
+
begin
|
16
|
+
$stdout, $stderr = out, err
|
17
|
+
yield
|
18
|
+
ensure
|
19
|
+
$stdout, $stderr = STDOUT, STDERR
|
20
|
+
end
|
21
|
+
[out.string, err.string]
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rocket-server
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Araneo
|
14
|
+
- Chris Kowalik
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-11-03 00:00:00 +01:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: optitron
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 15
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
- 2
|
34
|
+
version: "0.2"
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: json
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 4
|
49
|
+
version: "1.4"
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: eventmachine
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 19
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
- 12
|
64
|
+
version: "0.12"
|
65
|
+
type: :runtime
|
66
|
+
version_requirements: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: em-websocket
|
69
|
+
prerelease: false
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 19
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
- 1
|
79
|
+
- 4
|
80
|
+
version: 0.1.4
|
81
|
+
type: :runtime
|
82
|
+
version_requirements: *id004
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: logging
|
85
|
+
prerelease: false
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 7
|
92
|
+
segments:
|
93
|
+
- 1
|
94
|
+
- 4
|
95
|
+
version: "1.4"
|
96
|
+
type: :runtime
|
97
|
+
version_requirements: *id005
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: daemons
|
100
|
+
prerelease: false
|
101
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ~>
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
hash: 13
|
107
|
+
segments:
|
108
|
+
- 1
|
109
|
+
- 1
|
110
|
+
version: "1.1"
|
111
|
+
type: :runtime
|
112
|
+
version_requirements: *id006
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: konfigurator
|
115
|
+
prerelease: false
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 25
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
- 1
|
125
|
+
- 1
|
126
|
+
version: 0.1.1
|
127
|
+
type: :runtime
|
128
|
+
version_requirements: *id007
|
129
|
+
- !ruby/object:Gem::Dependency
|
130
|
+
name: rspec
|
131
|
+
prerelease: false
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ~>
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 3
|
138
|
+
segments:
|
139
|
+
- 2
|
140
|
+
- 0
|
141
|
+
version: "2.0"
|
142
|
+
type: :development
|
143
|
+
version_requirements: *id008
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: mocha
|
146
|
+
prerelease: false
|
147
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
149
|
+
requirements:
|
150
|
+
- - ~>
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
hash: 25
|
153
|
+
segments:
|
154
|
+
- 0
|
155
|
+
- 9
|
156
|
+
version: "0.9"
|
157
|
+
type: :development
|
158
|
+
version_requirements: *id009
|
159
|
+
description: |
|
160
|
+
|
161
|
+
This is a fast web socket server built on awesome EventMachine with em-websockets help.
|
162
|
+
It provides easy to use, event-oriented middleware for your web-socket powered applications.
|
163
|
+
|
164
|
+
email: chris@nu7hat.ch
|
165
|
+
executables: []
|
166
|
+
|
167
|
+
extensions: []
|
168
|
+
|
169
|
+
extra_rdoc_files:
|
170
|
+
- LICENSE
|
171
|
+
- README.md
|
172
|
+
files:
|
173
|
+
- .gitignore
|
174
|
+
- LICENSE
|
175
|
+
- README.md
|
176
|
+
- Rakefile
|
177
|
+
- bin/rocket-server
|
178
|
+
- etc/testing.yml
|
179
|
+
- lib/rocket-server.rb
|
180
|
+
- lib/rocket/server.rb
|
181
|
+
- lib/rocket/server/app.rb
|
182
|
+
- lib/rocket/server/channel.rb
|
183
|
+
- lib/rocket/server/cli.rb
|
184
|
+
- lib/rocket/server/connection.rb
|
185
|
+
- lib/rocket/server/helpers.rb
|
186
|
+
- lib/rocket/server/misc.rb
|
187
|
+
- lib/rocket/server/runner.rb
|
188
|
+
- lib/rocket/server/session.rb
|
189
|
+
- lib/rocket/server/templates/config.yml.tpl
|
190
|
+
- lib/rocket/server/version.rb
|
191
|
+
- rocket-server.gemspec
|
192
|
+
- spec/apps_spec.rb
|
193
|
+
- spec/channel_spec.rb
|
194
|
+
- spec/cli_spec.rb
|
195
|
+
- spec/connection_spec.rb
|
196
|
+
- spec/helpers_spec.rb
|
197
|
+
- spec/misc_spec.rb
|
198
|
+
- spec/runner_spec.rb
|
199
|
+
- spec/server_spec.rb
|
200
|
+
- spec/session_spec.rb
|
201
|
+
- spec/spec_helper.rb
|
202
|
+
has_rdoc: true
|
203
|
+
homepage: http://github.com/araneo/rocket
|
204
|
+
licenses: []
|
205
|
+
|
206
|
+
post_install_message:
|
207
|
+
rdoc_options:
|
208
|
+
- --charset=UTF-8
|
209
|
+
require_paths:
|
210
|
+
- lib
|
211
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
212
|
+
none: false
|
213
|
+
requirements:
|
214
|
+
- - ">="
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
hash: 3
|
217
|
+
segments:
|
218
|
+
- 0
|
219
|
+
version: "0"
|
220
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
|
+
none: false
|
222
|
+
requirements:
|
223
|
+
- - ">="
|
224
|
+
- !ruby/object:Gem::Version
|
225
|
+
hash: 3
|
226
|
+
segments:
|
227
|
+
- 0
|
228
|
+
version: "0"
|
229
|
+
requirements: []
|
230
|
+
|
231
|
+
rubyforge_project:
|
232
|
+
rubygems_version: 1.3.7
|
233
|
+
signing_key:
|
234
|
+
specification_version: 3
|
235
|
+
summary: Fast and extensible web socket server built upon em-websockets.
|
236
|
+
test_files: []
|
237
|
+
|