rjr 0.9.0 → 0.11.7

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