pomelo-citrus-admin 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.
@@ -0,0 +1,63 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 8 July 2014
4
+
5
+ module CitrusAdmin
6
+ # Utils
7
+ #
8
+ #
9
+ module Utils
10
+ #
11
+ #
12
+ #
13
+ def df_auth_user msg, env, &block
14
+ block_given? and yield nil
15
+ end
16
+
17
+ #
18
+ #
19
+ #
20
+ def df_auth_server_master msg, env, &block
21
+ block_given? and yield 'ok'
22
+ end
23
+
24
+ #
25
+ #
26
+ #
27
+ def df_auth_server_monitor msg, env, &block
28
+ block_given? and yield nil
29
+ end
30
+
31
+ # EventEmitter
32
+ #
33
+ #
34
+ module EventEmitter
35
+ # Register event
36
+ #
37
+ # @param [String] event
38
+ def on event, &block
39
+ @on_blocks ||= {}
40
+ @on_blocks[event] = block
41
+ end
42
+
43
+ # Register event once
44
+ #
45
+ # @param [String] event
46
+ def once event, &block
47
+ @once_blocks ||= {}
48
+ @once_blocks[event] = block
49
+ end
50
+
51
+ # Emit event
52
+ def emit *args
53
+ event = args.shift
54
+ if @once_blocks && block = @once_blocks[event]
55
+ @once_blocks.delete event
56
+ elsif !@on_blocks || !block = @on_blocks[event]
57
+ return
58
+ end
59
+ block.call *args
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 16 July 2014
4
+
5
+ module CitrusAdmin
6
+ VERSION = '0.0.1'
7
+ end
@@ -0,0 +1,424 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 13 July 2014
4
+
5
+ require File.expand_path('../spec_helper', __FILE__)
6
+
7
+ describe 'agent' do
8
+
9
+ master_host = '127.0.0.1'
10
+ master_port = 3333
11
+
12
+ MockConsoleService = Class.new {
13
+ include RSpec::Matchers
14
+
15
+ attr_reader :env, :auth_server
16
+
17
+ def initialize
18
+ @env = nil
19
+ @auth_server = Proc.new { |msg, env, &block|
20
+ block.call 'ok'
21
+ }
22
+ end
23
+ }
24
+
25
+ it 'should emit an error when listening on a port in use' do
26
+ error_count = 0
27
+ port = 80
28
+
29
+ master = MasterAgent.new
30
+ master.on('error') { |err|
31
+ expect(err).to be
32
+ error_count += 1
33
+ }
34
+
35
+ EM.run {
36
+ master.listen port
37
+ expect(error_count).to eql 1
38
+
39
+ EM.add_timer(0.1) {
40
+ EM.stop_event_loop
41
+ }
42
+ }
43
+ end
44
+
45
+ it 'should emit an error when connecting to an invalid address' do
46
+ error_count = 0
47
+ host = 'localhost'
48
+ port = -80
49
+
50
+ monitor = MonitorAgent.new
51
+
52
+ EM.run {
53
+ monitor.connect(port, host) { |err|
54
+ expect(err).to be
55
+ error_count += 1
56
+ }
57
+
58
+ EM.add_timer(0.1) {
59
+ expect(error_count).to eql 1
60
+ EM.stop_event_loop
61
+ }
62
+ }
63
+ end
64
+
65
+ it 'should send the request from master to the right monitor and get the response from callback by request' do
66
+ monitor_id1 = 'connector-server-1'
67
+ monitor_id2 = 'area-server-1'
68
+ monitor_type1 = 'connector'
69
+ monitor_type2 = 'area'
70
+ module_id1 = 'module-1'
71
+ module_id2 = 'module-2'
72
+ msg1 = { :msg => 'message to monitor1' }
73
+ msg2 = { :msg => 'message to monitor2' }
74
+
75
+ req1_count = 0
76
+ req2_count = 0
77
+ resp1_count = 0
78
+ resp2_count = 0
79
+
80
+ master = MasterAgent.new :console_service => MockConsoleService.new
81
+
82
+ monitor_console1 = MockConsoleService.new
83
+ monitor_console2 = MockConsoleService.new
84
+
85
+ monitor_console1.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
86
+ req1_count += 1
87
+ expect(module_id).to eql module_id1
88
+ block.call nil, msg
89
+ }
90
+ monitor_console2.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
91
+ req2_count += 1
92
+ expect(module_id).to eql module_id2
93
+ block.call nil, msg
94
+ }
95
+
96
+ monitor1 = MonitorAgent.new({
97
+ :console_service => monitor_console1,
98
+ :server_id => monitor_id1,
99
+ :server_type => monitor_type1
100
+ })
101
+ monitor2 = MonitorAgent.new({
102
+ :console_service => monitor_console2,
103
+ :server_id => monitor_id2,
104
+ :server_type => monitor_type2
105
+ })
106
+
107
+ EM.run {
108
+ master.listen master_port
109
+
110
+ monitor1.connect(master_port, master_host) { |err|
111
+ expect(err).to be_nil
112
+ master.request monitor_id1, module_id1, msg1, proc{ |err, resp|
113
+ resp1_count += 1
114
+ expect(err).to be_nil
115
+ expect(resp).to eql msg1
116
+ }
117
+ }
118
+ monitor2.connect(master_port, master_host) { |err|
119
+ expect(err).to be_nil
120
+ master.request monitor_id2, module_id2, msg2, proc{ |err, resp|
121
+ resp2_count += 1
122
+ expect(err).to be_nil
123
+ expect(resp).to eql msg2
124
+ }
125
+ }
126
+
127
+ EM.add_timer(0.1) {
128
+ expect(req1_count).to eql 1
129
+ expect(req2_count).to eql 1
130
+ expect(resp1_count).to eql 1
131
+ expect(resp2_count).to eql 1
132
+ EM.stop_event_loop
133
+ }
134
+ }
135
+ end
136
+
137
+ it 'should send back an error to master if monitor callback with an error' do
138
+ monitor_id = 'connector-server-1'
139
+ monitor_type = 'connector'
140
+ module_id = 'module-1'
141
+ msg = { msg => 'message to monitor' }
142
+ err_msg = 'some error message from monitor'
143
+
144
+ req_count = 0
145
+ resp_count = 0
146
+
147
+ master = MasterAgent.new :console_service => MockConsoleService.new
148
+
149
+ monitor_console = MockConsoleService.new
150
+ monitor_console.define_singleton_method :execute, proc{ |inner_module_id, method, msg, &block|
151
+ req_count += 1
152
+ expect(inner_module_id).to eql module_id
153
+ block.call Exception.new err_msg
154
+ }
155
+
156
+ monitor = MonitorAgent.new({
157
+ :console_service => monitor_console,
158
+ :server_id => monitor_id,
159
+ :server_type => monitor_type
160
+ })
161
+
162
+ EM.run {
163
+ master.listen master_port
164
+
165
+ monitor.connect(master_port, master_host) { |err|
166
+ expect(err).to be_nil
167
+ master.request monitor_id, module_id, msg, proc{ |err, resp|
168
+ resp_count += 1
169
+ expect(err).to be
170
+ expect(err[:msg]).to eql err_msg
171
+ expect(resp).to be_nil
172
+ }
173
+ }
174
+
175
+ EM.add_timer(0.1) {
176
+ expect(req_count).to eql 1
177
+ expect(resp_count).to eql 1
178
+ EM.stop_event_loop
179
+ }
180
+ }
181
+ end
182
+
183
+ it 'should send the message from master to the right monitor by notify' do
184
+ monitor_id1 = 'connector-server-1'
185
+ monitor_id2 = 'area-server-1'
186
+ monitor_type1 = 'connector'
187
+ monitor_type2 = 'area'
188
+ module_id1 = 'module-1'
189
+ module_id2 = 'module-2'
190
+ msg1 = { :msg => 'message to monitor1' }
191
+ msg2 = { :msg => 'message to server1' }
192
+
193
+ req1_count = 0
194
+ req2_count = 0
195
+
196
+ master = MasterAgent.new :console_service => MockConsoleService.new
197
+
198
+ monitor_console1 = MockConsoleService.new
199
+ monitor_console2 = MockConsoleService.new
200
+
201
+ monitor_console1.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
202
+ req1_count += 1
203
+ expect(module_id).to eql module_id1
204
+ }
205
+ monitor_console2.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
206
+ req2_count += 1
207
+ expect(module_id).to eql module_id2
208
+ }
209
+
210
+ monitor1 = MonitorAgent.new({
211
+ :console_service => monitor_console1,
212
+ :server_id => monitor_id1,
213
+ :server_type => monitor_type1
214
+ })
215
+ monitor2 = MonitorAgent.new({
216
+ :console_service => monitor_console2,
217
+ :server_id => monitor_id2,
218
+ :server_type => monitor_type2
219
+ })
220
+
221
+ EM.run {
222
+ master.listen master_port
223
+
224
+ monitor1.connect(master_port, master_host) { |err|
225
+ expect(err).to be_nil
226
+ master.notify monitor_id1, module_id1, msg1
227
+ }
228
+ monitor2.connect(master_port, master_host) { |err|
229
+ expect(err).to be_nil
230
+ master.notify monitor_id2, module_id2, msg2
231
+ }
232
+
233
+ EM.add_timer(0.1) {
234
+ expect(req1_count).to eql 1
235
+ expect(req2_count).to eql 1
236
+ EM.stop_event_loop
237
+ }
238
+ }
239
+ end
240
+
241
+ it 'should send the message from master to the right monitor by notify_by_server_type' do
242
+ monitor_id1 = 'connector-server-1'
243
+ monitor_id2 = 'connector-server-2'
244
+ monitor_id3 = 'area-server-1'
245
+ monitor_type1 = 'connector'
246
+ monitor_type2 = 'area'
247
+ module_id1 = 'module-1'
248
+ module_id2 = 'module-2'
249
+ msg1 = { :msg => 'message to monitor_type1' }
250
+ msg2 = { :msg => 'message to monitor_type2' }
251
+
252
+ req1_count = 0
253
+ req2_count = 0
254
+ req3_count = 0
255
+ req_type1_count = 0
256
+ req_type2_count = 0
257
+
258
+ master = MasterAgent.new :console_service => MockConsoleService.new
259
+
260
+ monitor_console1 = MockConsoleService.new
261
+ monitor_console2 = MockConsoleService.new
262
+ monitor_console3 = MockConsoleService.new
263
+
264
+ monitor_console1.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
265
+ req1_count += 1
266
+ req_type1_count += 1
267
+ expect(module_id).to eql module_id1
268
+ expect(msg).to eql msg1
269
+ }
270
+ monitor_console2.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
271
+ req2_count += 1
272
+ req_type1_count += 1
273
+ expect(module_id).to eql module_id1
274
+ expect(msg).to eql msg1
275
+ }
276
+ monitor_console3.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
277
+ req3_count += 1
278
+ req_type2_count += 1
279
+ expect(module_id).to eql module_id2
280
+ expect(msg).to eql msg2
281
+ }
282
+
283
+ monitor1 = MonitorAgent.new({
284
+ :console_service => monitor_console1,
285
+ :server_id => monitor_id1,
286
+ :server_type => monitor_type1
287
+ })
288
+ monitor2 = MonitorAgent.new({
289
+ :console_service => monitor_console2,
290
+ :server_id => monitor_id2,
291
+ :server_type => monitor_type1
292
+ })
293
+ monitor3 = MonitorAgent.new({
294
+ :console_service => monitor_console3,
295
+ :server_id => monitor_id3,
296
+ :server_type => monitor_type2
297
+ })
298
+
299
+ EM.run {
300
+ master.listen master_port
301
+
302
+ monitor1.connect(master_port, master_host) { |err|
303
+ expect(err).to be_nil
304
+ }
305
+ monitor2.connect(master_port, master_host) { |err|
306
+ expect(err).to be_nil
307
+ }
308
+ monitor3.connect(master_port, master_host) { |err|
309
+ expect(err).to be_nil
310
+ }
311
+
312
+ EM.add_timer(0.1) {
313
+ master.notify_by_server_type monitor_type1, module_id1, msg1
314
+ master.notify_by_server_type monitor_type2, module_id2, msg2
315
+ }
316
+
317
+ EM.add_timer(0.2) {
318
+ expect(req1_count).to eql 1
319
+ expect(req2_count).to eql 1
320
+ expect(req3_count).to eql 1
321
+ expect(req_type1_count).to eql 2
322
+ expect(req_type2_count).to eql 1
323
+ EM.stop_event_loop
324
+ }
325
+ }
326
+ end
327
+
328
+ it 'should send the message from master to all the monitors by broadcast_notify' do
329
+ monitor_id1 = 'connector-server-1'
330
+ monitor_id2 = 'area-server-1'
331
+ monitor_type1 = 'connector'
332
+ monitor_type2 = 'area'
333
+ org_module_id = 'module-1'
334
+ org_msg = { :msg => 'message to all' }
335
+
336
+ req1_count = 0
337
+ req2_count = 0
338
+
339
+ master = MasterAgent.new :console_service => MockConsoleService.new
340
+
341
+ monitor_console1 = MockConsoleService.new
342
+ monitor_console2 = MockConsoleService.new
343
+
344
+ monitor_console1.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
345
+ req1_count += 1
346
+ expect(module_id).to eql org_module_id
347
+ expect(msg).to eql org_msg
348
+ }
349
+ monitor_console2.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
350
+ req2_count += 1
351
+ expect(module_id).to eql org_module_id
352
+ expect(msg).to eql org_msg
353
+ }
354
+
355
+ monitor1 = MonitorAgent.new({
356
+ :console_service => monitor_console1,
357
+ :server_id => monitor_id1,
358
+ :server_type => monitor_type1
359
+ })
360
+ monitor2 = MonitorAgent.new({
361
+ :console_service => monitor_console2,
362
+ :server_id => monitor_id2,
363
+ :server_type => monitor_type1
364
+ })
365
+
366
+ EM.run {
367
+ master.listen master_port
368
+
369
+ monitor1.connect(master_port, master_host) { |err|
370
+ expect(err).to be_nil
371
+ }
372
+ monitor2.connect(master_port, master_host) { |err|
373
+ expect(err).to be_nil
374
+ }
375
+
376
+ EM.add_timer(0.1) {
377
+ master.broadcast_notify org_module_id, org_msg
378
+ }
379
+
380
+ EM.add_timer(0.2) {
381
+ expect(req1_count).to eql 1
382
+ expect(req2_count).to eql 1
383
+ EM.stop_event_loop
384
+ }
385
+ }
386
+ end
387
+
388
+ it 'should push the message from monitor to master by notify' do
389
+ monitor_id = 'connector-server-1'
390
+ monitor_type = 'connector'
391
+ org_module_id = 'module-1'
392
+ org_msg = 'message to master'
393
+
394
+ req_count = 0
395
+
396
+ master_console = MockConsoleService.new
397
+ master_console.define_singleton_method :execute, proc{ |module_id, method, msg, &block|
398
+ req_count += 1
399
+ expect(module_id).to eql org_module_id
400
+ expect(msg).to eql org_msg
401
+ }
402
+
403
+ master = MasterAgent.new :console_service => master_console
404
+ monitor = MonitorAgent.new({
405
+ :console_service => MockConsoleService.new,
406
+ :server_id => monitor_id,
407
+ :server_type => monitor_type
408
+ })
409
+
410
+ EM.run {
411
+ master.listen master_port
412
+
413
+ monitor.connect(master_port, master_host) { |err|
414
+ expect(err).to be_nil
415
+ monitor.notify org_module_id, org_msg
416
+ }
417
+
418
+ EM.add_timer(0.1) {
419
+ expect(req_count).to eql 1
420
+ EM.stop_event_loop
421
+ }
422
+ }
423
+ end
424
+ end