rjr 0.9.0 → 0.11.7

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/specs/node_spec.rb CHANGED
@@ -15,12 +15,11 @@ describe RJR::Node do
15
15
  node = RJR::Node.new :node_id => 'foobar',
16
16
  :headers => {:h => 123}
17
17
  node.em_run {
18
- node.instance_variable_get(:@thread_pool).running?.should be_true
19
-
20
- EventMachine.reactor_running?.should be_true
18
+ ThreadPool2Manager.running?.should be_true
19
+ EMAdapter.running?.should be_true
21
20
  block1_called = true
22
21
  node.em_run {
23
- EventMachine.reactor_running?.should be_true
22
+ EMAdapter.running?.should be_true
24
23
  block2_called = true
25
24
  node.halt
26
25
  }
@@ -30,4 +29,141 @@ describe RJR::Node do
30
29
  block1_called.should be_true
31
30
  block2_called.should be_true
32
31
  end
32
+
33
+ #it "should gracefully stop managed subsystems" do
34
+ # # TODO test w/ keep_alive
35
+ # node = RJR::Node.new :node_id => 'foobar',
36
+ # :headers => {:h => 123}
37
+ # node.em_run {}
38
+ # EMAdapter.running?.should be_true
39
+ # ThreadPool2Manager.running?.should be_true
40
+ # node.stop
41
+ # node.join
42
+ #end
43
+
44
+ it "should halt managed subsystems" do
45
+ node = RJR::Node.new :node_id => 'foobar',
46
+ :headers => {:h => 123}
47
+ node.em_run {}
48
+ EMAdapter.running?.should be_true
49
+ ThreadPool2Manager.running?.should be_true
50
+ node.halt
51
+ node.join
52
+ EMAdapter.running?.should be_false
53
+ ThreadPool2Manager.running?.should be_false
54
+ end
55
+
56
+ it "should run a block directly via eventmachine" do
57
+ block1_called = false
58
+ block1_thread = nil
59
+
60
+ node = RJR::Node.new :node_id => 'foobar',
61
+ :headers => {:h => 123}
62
+ node.em_run {
63
+ block1_called = true
64
+ block1_thread = Thread.current
65
+ node.halt
66
+ }
67
+ reactor_thread = EMAdapter.instance_variable_get(:@em_manager).instance_variable_get(:@reactor_thread)
68
+ node.join
69
+ block1_called.should be_true
70
+ block1_thread.should == reactor_thread
71
+ end
72
+
73
+ it "should run a block in a thread via eventmachine" do
74
+ block1_called = false
75
+ block1_thread = nil
76
+
77
+ node = RJR::Node.new :node_id => 'foobar',
78
+ :headers => {:h => 123}
79
+ node.em_run_async {
80
+ block1_called = true
81
+ block1_thread = Thread.current
82
+ node.halt
83
+ }
84
+ reactor_thread = EMAdapter.instance_variable_get(:@em_manager).instance_variable_get(:@reactor_thread)
85
+ worker_threads = ThreadPool2Manager.thread_pool.instance_variable_get(:@worker_threads)
86
+ node.join
87
+ block1_called.should be_true
88
+ block1_thread.should_not == reactor_thread
89
+ worker_threads.should include(block1_thread)
90
+ end
91
+
92
+ it "should schedule a job to be run in a thread via eventmachine after a specified interval" do
93
+ block1_called = false
94
+ block1_thread = nil
95
+
96
+ node = RJR::Node.new :node_id => 'foobar',
97
+ :headers => {:h => 123}
98
+ node.em_schedule_async(1) {
99
+ block1_called = true
100
+ block1_thread = Thread.current
101
+ node.halt
102
+ }
103
+ reactor_thread = EMAdapter.instance_variable_get(:@em_manager).instance_variable_get(:@reactor_thread)
104
+ worker_threads = ThreadPool2Manager.thread_pool.instance_variable_get(:@worker_threads)
105
+
106
+ sleep 0.5
107
+ block1_called.should be_false
108
+
109
+ node.join
110
+ block1_called.should be_true
111
+ block1_thread.should_not == reactor_thread
112
+ worker_threads.should include(block1_thread)
113
+ end
114
+
115
+ it "should schedule a job to be run directly via eventmachine repeatidly with specified interval" do
116
+ block1_threads = []
117
+
118
+ node = RJR::Node.new :node_id => 'foobar',
119
+ :headers => {:h => 123}
120
+ node.em_repeat(1) {
121
+ block1_threads << Thread.current
122
+ }
123
+ reactor_thread = EMAdapter.instance_variable_get(:@em_manager).instance_variable_get(:@reactor_thread)
124
+
125
+ sleep 0.5
126
+ block1_threads.size.should == 0
127
+
128
+ sleep 0.6
129
+ block1_threads.size.should == 1
130
+
131
+ sleep 1.1
132
+ block1_threads.size.should == 2
133
+ node.halt
134
+ node.join
135
+
136
+ block1_threads.each { |bt|
137
+ bt.should == reactor_thread
138
+ }
139
+ end
140
+
141
+ it "should schedule a job to be run in a thread via eventmachine repeatidly with specified interval" do
142
+ block1_threads = []
143
+
144
+ node = RJR::Node.new :node_id => 'foobar',
145
+ :headers => {:h => 123}
146
+ node.em_repeat_async(1) {
147
+ block1_threads << Thread.current
148
+ }
149
+ reactor_thread = EMAdapter.instance_variable_get(:@em_manager).instance_variable_get(:@reactor_thread)
150
+ worker_threads = ThreadPool2Manager.thread_pool.instance_variable_get(:@worker_threads)
151
+
152
+ sleep 0.5
153
+ block1_threads.size.should == 0
154
+
155
+ sleep 0.6
156
+ block1_threads.size.should == 1
157
+
158
+ sleep 1.1
159
+ block1_threads.size.should == 2
160
+ node.halt
161
+ node.join
162
+
163
+ block1_threads.each { |bt|
164
+ bt.should_not == reactor_thread
165
+ worker_threads.should include(bt)
166
+ }
167
+ end
168
+
33
169
  end
@@ -29,4 +29,5 @@ describe RJR::TCPNode do
29
29
  end
30
30
 
31
31
  # TODO ensure closed / error event handlers are invoked
32
+ # TODO ensure callbacks can be invoked over established connection w/ json-rpc notifications
32
33
  end
@@ -0,0 +1,41 @@
1
+ require 'rjr/dispatcher'
2
+ require 'rjr/thread_pool2'
3
+
4
+ # TODO ? test ThreadPoolJob being_executed?, completed?, exec, handle_timeout!
5
+
6
+ describe ThreadPool2 do
7
+ it "should start and stop successfully" do
8
+ tp = ThreadPool2.new 10, :timeout => 10
9
+ tp.running?.should be_false
10
+
11
+ tp.start
12
+ tp.running?.should be_true
13
+ tp.instance_variable_get(:@worker_threads).size.should == 10
14
+ tp.instance_variable_get(:@manager_thread).should_not be_nil
15
+ ['run', 'sleep'].should include(tp.instance_variable_get(:@manager_thread).status)
16
+ sleep 0.5
17
+
18
+ tp.stop
19
+ tp.running?.should be_false
20
+ tp.instance_variable_get(:@manager_thread).should be_nil
21
+ tp.instance_variable_get(:@worker_threads).size.should == 0
22
+ end
23
+
24
+ it "should accept and run work" do
25
+ tp = ThreadPool2.new 10, :timeout => 10
26
+ tp.start
27
+
28
+ tp.instance_variable_get(:@work_queue).size.should == 0
29
+ jobs_executed = []
30
+ tp << ThreadPool2Job.new { jobs_executed << 1 }
31
+ tp << ThreadPool2Job.new { jobs_executed << 2 }
32
+ tp.instance_variable_get(:@work_queue).size.should == 2
33
+
34
+ sleep 0.5
35
+ jobs_executed.should include(1)
36
+ jobs_executed.should include(2)
37
+ tp.instance_variable_get(:@work_queue).size.should == 0
38
+
39
+ tp.stop
40
+ end
41
+ end
@@ -0,0 +1,46 @@
1
+ require 'rjr/dispatcher'
2
+ require 'rjr/util'
3
+
4
+ describe RJR::Definitions do
5
+ include RJR::Definitions
6
+
7
+ before(:each) do
8
+ RJR::Dispatcher.init_handlers
9
+ RJR::Definitions.reset
10
+ end
11
+
12
+ it "should define methods" do
13
+ foobar = lambda {}
14
+ barfoo = lambda {}
15
+ rjr_method :foobar => foobar, :barfoo => barfoo
16
+ RJR::Dispatcher.handler_for('foobar').handler_proc.should == foobar
17
+ RJR::Dispatcher.handler_for('barfoo').handler_proc.should == barfoo
18
+ end
19
+
20
+ it "should track messages" do
21
+ rjr_message :foobar => { :foo => :bar }
22
+ rjr_message('foobar').should == {:foo => :bar}
23
+
24
+ rjr_message :foobar => { :bar => :foo }
25
+ rjr_message('foobar').should == {:bar => :foo}
26
+
27
+ rjr_message('money').should be_nil
28
+ end
29
+
30
+ it "should generate random message" do
31
+ rjr_message :foobar => { :foo => :bar, :transports => [:local, :amqp] }
32
+ rjr_message :barfoo => { :bar => :foo, :transports => [:local] }
33
+ rjr_message :forzzy => { :for => :zzy, :transports => [:amqp] }
34
+ rjr_message :moneyy => { :mon => :eyy }
35
+
36
+ [:foo, :bar, :for, :mon].should include(RJR::Definitions::rand_msg.first.first)
37
+ [:foo, :bar, :mon].should include(RJR::Definitions::rand_msg(:local).first.first)
38
+ [:foo, :for, :mon].should include(RJR::Definitions::rand_msg(:amqp).first.first)
39
+ RJR::Definitions::rand_msg(:tcp).first.first.should == :mon
40
+
41
+ RJR::Definitions.reset
42
+ rjr_message :foobar => { :foo => :bar, :transports => [:local, :amqp] }
43
+
44
+ RJR::Definitions::rand_msg(:tcp).should == nil
45
+ end
46
+ end
@@ -20,6 +20,7 @@ describe RJR::WebNode do
20
20
  }
21
21
 
22
22
  server.listen
23
+ sleep 1
23
24
 
24
25
  res = client.invoke_request 'http://localhost:9678', 'foobar', 'myparam'
25
26
  res.should == 'retval'
@@ -13,7 +13,7 @@ describe RJR::WSNode do
13
13
  #@client_port.should == 9678
14
14
  @rjr_node.should == server
15
15
  @rjr_node_id.should == 'ws'
16
- @rjr_node_type.should == :websockets
16
+ @rjr_node_type.should == :ws
17
17
  param.should == 'myparam'
18
18
  foobar_invoked = true
19
19
  'retval'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.11.7
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: 2012-08-30 00:00:00.000000000 Z
12
+ date: 2013-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -32,17 +32,17 @@ dependencies:
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ~>
35
+ - - '='
36
36
  - !ruby/object:Gem::Version
37
- version: 0.12.10
37
+ version: 1.0.1
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ~>
43
+ - - '='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.12.10
45
+ version: 1.0.1
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: json
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -63,23 +63,30 @@ description: Ruby Json Rpc library
63
63
  email: mo@morsi.org
64
64
  executables:
65
65
  - rjr-server
66
+ - rjr-client
67
+ - rjr-client-launcher
66
68
  extensions: []
67
69
  extra_rdoc_files: []
68
70
  files:
69
71
  - lib/rjr/semaphore.rb
70
72
  - lib/rjr/udp_node.rb
73
+ - lib/rjr/em_adapter.rb
71
74
  - lib/rjr/errors.rb
75
+ - lib/rjr/missing_node.rb
76
+ - lib/rjr/inspect.rb
72
77
  - lib/rjr/ws_node.rb
73
78
  - lib/rjr/tcp_node.rb
74
79
  - lib/rjr/web_node.rb
75
80
  - lib/rjr/node.rb
81
+ - lib/rjr/thread_pool2.rb
76
82
  - lib/rjr/common.rb
77
83
  - lib/rjr/thread_pool.rb
78
84
  - lib/rjr/message.rb
79
- - lib/rjr/web_socket.rb
85
+ - lib/rjr/tcp_node2.rb
80
86
  - lib/rjr/multi_node.rb
81
87
  - lib/rjr/local_node.rb
82
88
  - lib/rjr/dispatcher.rb
89
+ - lib/rjr/util.rb
83
90
  - lib/rjr/amqp_node.rb
84
91
  - lib/rjr.rb
85
92
  - specs/dispatcher_spec.rb
@@ -87,14 +94,20 @@ files:
87
94
  - specs/amqp_node_spec.rb
88
95
  - specs/tcp_node_spec.rb
89
96
  - specs/multi_node_spec.rb
97
+ - specs/util_spec.rb
90
98
  - specs/local_node_spec.rb
91
99
  - specs/web_node_spec.rb
92
100
  - specs/ws_node_spec.rb
101
+ - specs/inspect_spec.rb
102
+ - specs/thread_pool_spec.rb
93
103
  - specs/message_spec.rb
104
+ - specs/em_adapter_spec.rb
94
105
  - LICENSE
95
106
  - Rakefile
96
107
  - README.md
97
108
  - bin/rjr-server
109
+ - bin/rjr-client
110
+ - bin/rjr-client-launcher
98
111
  homepage: http://github.com/movitto/rjr
99
112
  licenses: []
100
113
  post_install_message:
@@ -113,7 +126,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
126
  - - ! '>='
114
127
  - !ruby/object:Gem::Version
115
128
  version: 1.3.3
116
- requirements: []
129
+ requirements:
130
+ - amqp gem is needed to use the amqp node
131
+ - eventmachine_httpserver and em-http-request gems are needed to use the web node
132
+ - em-websocket and em-websocket-client gems are needed to use the web socket node
117
133
  rubyforge_project:
118
134
  rubygems_version: 1.8.24
119
135
  signing_key: