sinatra-websocketio 0.0.5 → 0.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/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in sinatra-websocketio.gemspec
4
4
  gemspec
5
+ gem 'minitest'
6
+ gem 'thin'
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.6 2013-03-10
2
+
3
+ * add tests
4
+
1
5
  === 0.0.5 2013-03-10
2
6
 
3
7
  * handle 10K clients
data/README.md CHANGED
@@ -159,6 +159,17 @@ chat app
159
159
  - https://github.com/shokai/sinatra-websocketio/tree/master/sample
160
160
 
161
161
 
162
+ Test
163
+ ----
164
+
165
+ % gem install bundler
166
+ % bundle install
167
+ % export PORT=5000
168
+ % export WS_PORT=8080
169
+ % export PID_FILE=/tmp/sinatra-websocketio-test.pid
170
+ % rake test
171
+
172
+
162
173
  Contributing
163
174
  ------------
164
175
  1. Fork it
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/test_*.rb"
6
+ end
7
+
8
+ task :default => :test
@@ -1,5 +1,5 @@
1
1
  module Sinatra
2
2
  module WebSocketIO
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
data/test/app.rb ADDED
@@ -0,0 +1,61 @@
1
+ class App
2
+
3
+ def self.running
4
+ @running ? true : false
5
+ end
6
+
7
+ def self.port
8
+ ENV['PORT'] || 5000
9
+ end
10
+
11
+ def self.ws_port
12
+ ENV['WS_PORT'] || 8080
13
+ end
14
+
15
+ def self.websocketio_url
16
+ "ws://localhost:#{ws_port}"
17
+ end
18
+
19
+ def self.pid_file
20
+ ENV['PID_FILE'] || "/tmp/sinatra-cometio-testapp.pid"
21
+ end
22
+
23
+ def self.app_dir
24
+ File.expand_path 'app', File.dirname(__FILE__)
25
+ end
26
+
27
+ def self.pid
28
+ return unless @running
29
+ File.open(pid_file) do |f|
30
+ pid = f.gets.strip.to_i
31
+ return pid if pid > 0
32
+ end
33
+ return
34
+ end
35
+
36
+ def self.start
37
+ return if @running
38
+ File.delete pid_file if File.exists? pid_file
39
+ Thread.new do
40
+ IO::popen "cd #{app_dir} && PID_FILE=#{pid_file} WS_PORT=#{ws_port} rackup config.ru -p #{port} > /dev/null 2>&1"
41
+ end
42
+ @running = true
43
+ 100.times do
44
+ if File.exists? pid_file
45
+ sleep 1
46
+ return true
47
+ end
48
+ sleep 0.1
49
+ end
50
+ @running = false
51
+ return false
52
+ end
53
+
54
+ def self.stop
55
+ return unless @running
56
+ system "kill #{pid}"
57
+ File.delete pid_file if File.exists? pid_file
58
+ @running = false
59
+ end
60
+
61
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.require
4
+ $stdout.sync = true
5
+ $:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
6
+ require 'sinatra'
7
+ require 'sinatra/websocketio'
8
+ require File.dirname(__FILE__)+'/main'
9
+
10
+ set :websocketio, :port => ENV['WS_PORT'].to_i
11
+
12
+ run TestApp
data/test/app/main.rb ADDED
@@ -0,0 +1,31 @@
1
+ pid_file = ENV['PID_FILE'] || "/tmp/sinatra-websocketio-test-pid"
2
+ File.open(pid_file, "w+") do |f|
3
+ f.write Process.pid.to_s
4
+ end
5
+
6
+ class TestApp < Sinatra::Application
7
+
8
+ get '/' do
9
+ "sinatra-websocketio v#{Sinatra::WebSocketIO::VERSION}"
10
+ end
11
+
12
+ WebSocketIO.on :connect do |session|
13
+ puts "new client <#{session}>"
14
+ end
15
+
16
+ WebSocketIO.on :disconnect do |session|
17
+ puts "disconnect client <#{session}>"
18
+ end
19
+
20
+ WebSocketIO.on :broadcast do |data, from|
21
+ puts from
22
+ puts "broadcast <#{from}> - #{data.to_json}"
23
+ push :broadcast, data
24
+ end
25
+
26
+ WebSocketIO.on :message do |data, from|
27
+ puts "message <#{from}> - #{data.to_json}"
28
+ push :message, data, :to => data['to']
29
+ end
30
+
31
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'minitest/autorun'
3
+ require 'em-websocketio-client'
4
+ require File.expand_path 'app', File.dirname(__FILE__)
5
+
6
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
7
+
8
+ ['SIGHUP', 'SIGINT', 'SIGKILL', 'SIGTERM'].each do |sig|
9
+ Kernel.trap sig do
10
+ App.stop
11
+ end
12
+ end
@@ -0,0 +1,132 @@
1
+ require File.expand_path 'test_helper', File.dirname(__FILE__)
2
+
3
+ class TestWebSocketIO < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ App.start
7
+ end
8
+
9
+ def teardown
10
+ App.stop
11
+ end
12
+
13
+ def test_simple
14
+ res = nil
15
+ post_data = {:time => Time.now.to_s, :msg => 'hello!!'}
16
+ EM::run do
17
+ client = EM::WebSocketIO::Client.new(App.websocketio_url).connect
18
+
19
+ client.on :broadcast do |data|
20
+ res = data
21
+ client.close
22
+ end
23
+
24
+ client.on :disconnect do
25
+ EM.stop_event_loop
26
+ end
27
+
28
+ client.on :connect do |session|
29
+ push :broadcast, post_data
30
+ end
31
+
32
+ EM::defer do
33
+ 50.times do
34
+ break if res != nil
35
+ sleep 0.1
36
+ end
37
+ client.close
38
+ end
39
+ end
40
+ assert res != nil, 'server not respond'
41
+ assert res["time"] == post_data[:time]
42
+ assert res["msg"] == post_data[:msg]
43
+ end
44
+
45
+ def test_client_to_client2
46
+ ## client --> server --> client2
47
+ post_data = {:time => Time.now.to_s, :msg => 'hello!!', :to => nil}
48
+ res = nil
49
+ res2 = nil
50
+ EM::run do
51
+ client = EM::WebSocketIO::Client.new(App.websocketio_url).connect
52
+ client.on :message do |data|
53
+ res = data
54
+ end
55
+
56
+ client.on :disconnect do
57
+ EM.stop_event_loop
58
+ end
59
+
60
+ client.on :connect do |session|
61
+ client2 = EM::WebSocketIO::Client.new(App.websocketio_url).connect
62
+ client2.on :connect do |session2|
63
+ post_data['to'] = session2
64
+ client.push :message, post_data
65
+ end
66
+ client2.on :message do |data|
67
+ res2 = data
68
+ client2.close
69
+ client.close
70
+ end
71
+ end
72
+
73
+ EM::defer do
74
+ 50.times do
75
+ break if res != nil
76
+ sleep 0.1
77
+ end
78
+ client.close
79
+ end
80
+ end
81
+ assert res2 != nil, 'server not respond'
82
+ assert res2["time"] == post_data[:time]
83
+ assert res2["msg"] == post_data[:msg]
84
+ assert res == nil
85
+ end
86
+
87
+
88
+ def test_broadcast
89
+ ## client --> server --> client&client2
90
+ post_data = {:time => Time.now.to_s, :msg => 'hello!!'}
91
+ res = nil
92
+ res2 = nil
93
+
94
+ EM::run do
95
+ client = EM::WebSocketIO::Client.new(App.websocketio_url).connect
96
+ client.on :broadcast do |data|
97
+ res = data
98
+ end
99
+
100
+ client.on :disconnect do
101
+ EM.stop_event_loop
102
+ end
103
+
104
+ client.on :connect do |session|
105
+ client2 = EM::WebSocketIO::Client.new(App.websocketio_url).connect
106
+ client2.on :connect do |session2|
107
+ client.push :broadcast, post_data
108
+ end
109
+ client2.on :broadcast do |data|
110
+ res2 = data
111
+ client2.close
112
+ end
113
+ end
114
+
115
+ EM::defer do
116
+ 50.times do
117
+ break if res != nil and res2 != nil
118
+ sleep 0.1
119
+ end
120
+ client.close
121
+ end
122
+ end
123
+
124
+ assert res != nil, 'server not respond'
125
+ assert res["time"] == post_data[:time]
126
+ assert res["msg"] == post_data[:msg]
127
+ assert res2 != nil
128
+ assert res2["time"] == post_data[:time]
129
+ assert res2["msg"] == post_data[:msg]
130
+ end
131
+
132
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-websocketio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-09 00:00:00.000000000 Z
12
+ date: 2013-03-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -173,6 +173,11 @@ files:
173
173
  - sample/views/index.haml
174
174
  - sample/views/main.scss
175
175
  - sinatra-websocketio.gemspec
176
+ - test/app.rb
177
+ - test/app/config.ru
178
+ - test/app/main.rb
179
+ - test/test_helper.rb
180
+ - test/test_websocketio.rb
176
181
  homepage: https://github.com/shokai/sinatra-websocketio
177
182
  licenses: []
178
183
  post_install_message:
@@ -197,4 +202,9 @@ rubygems_version: 1.8.24
197
202
  signing_key:
198
203
  specification_version: 3
199
204
  summary: Node.js like WebSocket I/O plugin for Sinatra.
200
- test_files: []
205
+ test_files:
206
+ - test/app.rb
207
+ - test/app/config.ru
208
+ - test/app/main.rb
209
+ - test/test_helper.rb
210
+ - test/test_websocketio.rb