ruote-stomp 2.2.0.a

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,192 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'spec_helper')
3
+
4
+
5
+ describe RuoteStomp::ParticipantProxy, :type => :ruote do
6
+
7
+ it "supports 'forget' as participant attribute" do
8
+
9
+ pdef = ::Ruote.process_definition :name => 'test' do
10
+ sequence do
11
+ stomp :queue => 'test1', :forget => true
12
+ echo 'done.'
13
+ end
14
+ end
15
+
16
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
17
+
18
+ run_definition(pdef)
19
+
20
+ @tracer.to_s.should == 'done.'
21
+
22
+ begin
23
+ Timeout::timeout(10) do
24
+ @msg = nil
25
+ MQ.queue('test1', :durable => true).subscribe { |msg| @msg = msg }
26
+
27
+ loop do
28
+ break unless @msg.nil?
29
+ sleep 0.1
30
+ end
31
+ end
32
+ rescue Timeout::Error
33
+ violated "Timeout waiting for message"
34
+ end
35
+
36
+ @msg.should match(/^\{.*\}$/) # JSON message by default
37
+ end
38
+
39
+ it "supports 'forget' as participant option" do
40
+
41
+ pdef = ::Ruote.process_definition :name => 'test' do
42
+ sequence do
43
+ stomp :queue => 'test4'
44
+ echo 'done.'
45
+ end
46
+ end
47
+
48
+ @engine.register_participant(
49
+ :stomp, RuoteStomp::ParticipantProxy, 'forget' => true)
50
+
51
+ run_definition(pdef)
52
+
53
+ @tracer.to_s.should == "done."
54
+
55
+ begin
56
+ Timeout::timeout(5) do
57
+ @msg = nil
58
+ MQ.queue('test4', :durable => true).subscribe { |msg| @msg = msg }
59
+
60
+ loop do
61
+ break unless @msg.nil?
62
+ sleep 0.1
63
+ end
64
+ end
65
+ rescue Timeout::Error
66
+ violated "Timeout waiting for message"
67
+ end
68
+
69
+ @msg.should match(/^\{.*\}$/) # JSON message by default
70
+ end
71
+
72
+ it "supports custom messages instead of workitems" do
73
+
74
+ pdef = ::Ruote.process_definition :name => 'test' do
75
+ sequence do
76
+ stomp :queue => 'test2', :message => 'foo', :forget => true
77
+ echo 'done.'
78
+ end
79
+ end
80
+
81
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
82
+
83
+ run_definition(pdef)
84
+
85
+ @tracer.to_s.should == "done."
86
+
87
+ begin
88
+ Timeout::timeout(5) do
89
+ @msg = nil
90
+ MQ.queue('test2', :durable => true).subscribe { |msg| @msg = msg }
91
+
92
+ loop do
93
+ break unless @msg.nil?
94
+ sleep 0.1
95
+ end
96
+ end
97
+ rescue Timeout::Error
98
+ violated "Timeout waiting for message"
99
+ end
100
+
101
+ @msg.should == 'foo'
102
+ end
103
+
104
+ it "supports 'queue' as a participant option" do
105
+
106
+ pdef = ::Ruote.process_definition :name => 'test' do
107
+ sequence do
108
+ stomp :forget => true
109
+ echo 'done.'
110
+ end
111
+ end
112
+
113
+ @engine.register_participant(
114
+ :stomp, RuoteStomp::ParticipantProxy, 'queue' => 'test5')
115
+
116
+ run_definition(pdef)
117
+
118
+ @tracer.to_s.should == 'done.'
119
+
120
+ begin
121
+ Timeout::timeout(5) do
122
+ @msg = nil
123
+ MQ.queue('test5', :durable => true).subscribe { |msg| @msg = msg }
124
+
125
+ loop do
126
+ break unless @msg.nil?
127
+ sleep 0.1
128
+ end
129
+ end
130
+ rescue Timeout::Error
131
+ violated "Timeout waiting for message"
132
+ end
133
+ end
134
+
135
+ it "passes 'participant_options' over stomp" do
136
+
137
+ pdef = ::Ruote.process_definition :name => 'test' do
138
+ stomp :queue => 'test6', :forget => true
139
+ end
140
+
141
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
142
+
143
+ run_definition(pdef)
144
+
145
+ msg = nil
146
+
147
+ begin
148
+ Timeout::timeout(10) do
149
+
150
+ MQ.queue('test6', :durable => true).subscribe { |m| msg = m }
151
+
152
+ loop do
153
+ break unless msg.nil?
154
+ sleep 0.1
155
+ end
156
+ end
157
+ rescue Timeout::Error
158
+ violated "Timeout waiting for message"
159
+ end
160
+
161
+ wi = Rufus::Json.decode(msg)
162
+ params = wi['fields']['params']
163
+
164
+ params['queue'].should == 'test6'
165
+ params['forget'].should == true
166
+ params['participant_options'].should == { 'forget' => false, 'queue' => nil }
167
+ end
168
+
169
+ it "doesn't create 1 queue instance per delivery" do
170
+
171
+ pdef = ::Ruote.process_definition do
172
+ stomp :queue => 'test7', :forget => true
173
+ end
174
+
175
+ mq_count = 0
176
+ ObjectSpace.each_object(MQ) { |o| mq_count += 1 }
177
+
178
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
179
+
180
+ 10.times do
181
+ run_definition(pdef)
182
+ end
183
+
184
+ sleep 1
185
+
186
+ count = 0
187
+ ObjectSpace.each_object(MQ) { |o| count += 1 }
188
+
189
+ count.should == mq_count + 1
190
+ end
191
+ end
192
+
@@ -0,0 +1,142 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'spec_helper')
3
+
4
+ require 'ruote/participant'
5
+
6
+
7
+ describe RuoteStomp::Receiver do
8
+
9
+ after(:each) do
10
+ purge_engine
11
+ end
12
+
13
+ it "handles replies" do
14
+
15
+ pdef = Ruote.process_definition :name => 'test' do
16
+ set :field => 'foo', :value => 'foo'
17
+ sequence do
18
+ echo '${f:foo}'
19
+ stomp :queue => '/queue/test3'
20
+ echo '${f:foo}'
21
+ end
22
+ end
23
+
24
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
25
+
26
+ RuoteStomp::Receiver.new(@engine)
27
+
28
+ wfid = @engine.launch(pdef)
29
+
30
+ workitem = nil
31
+
32
+ begin
33
+ Timeout::timeout(5) do
34
+
35
+ # MQ.queue('test3', :durable => true).subscribe { |msg|
36
+ # wi = Ruote::Workitem.new(Rufus::Json.decode(msg))
37
+ # workitem = wi if wi.wfid == wfid
38
+ # }
39
+
40
+ $stomp.subscribe("/queue/test3", {}) do |message|
41
+ wi = Ruote::Workitem.new(Rufus::Json.decode(message.body))
42
+ workitem = wi if wi.wfid == wfid
43
+ end
44
+
45
+ loop do
46
+ break unless workitem.nil?
47
+ sleep 0.1
48
+ end
49
+ end
50
+ rescue Timeout::Error
51
+ fail "Timeout waiting for message"
52
+ end
53
+
54
+ workitem.fields['foo'] = "bar"
55
+
56
+ #MQ.queue('ruote_workitems', :durable => true).publish(Rufus::Json.encode(workitem.to_h), :persistent => true)
57
+ $stomp.publish '/queue/ruote_workitems',
58
+ Rufus::Json.encode(workitem.to_h),
59
+ { :persistent => true }
60
+ @engine.wait_for(wfid)
61
+
62
+ @engine.should_not have_errors
63
+ @engine.should_not have_remaining_expressions
64
+
65
+ @tracer.to_s.should == "foo\nbar"
66
+ end
67
+
68
+ it "launches processes" do
69
+
70
+ json = {
71
+ 'definition' => %{
72
+ Ruote.process_definition :name => 'test' do
73
+ sequence do
74
+ echo '${f:foo}'
75
+ end
76
+ end
77
+ },
78
+ 'fields' => { 'foo' => 'bar' }
79
+ }.to_json
80
+
81
+ RuoteStomp::Receiver.new(@engine, :launchitems => true, :unsubscribe => true)
82
+
83
+ # MQ.queue(
84
+ # 'ruote_workitems', :durable => true
85
+ # ).publish(
86
+ # json, :persistent => true
87
+ # )
88
+
89
+ $stomp.publish '/queue/ruote_workitems', json, { :persistent => true }
90
+
91
+
92
+ sleep 0.5
93
+
94
+ @engine.should_not have_errors
95
+ @engine.should_not have_remaining_expressions
96
+
97
+ @tracer.to_s.should == 'bar'
98
+ end
99
+
100
+ it 'accepts a custom :queue' do
101
+
102
+ RuoteStomp::Receiver.new(
103
+ @engine, :queue => '/queue/mario', :launchitems => true, :unsubscribe => true)
104
+
105
+ @engine.register_participant 'alpha', Ruote::StorageParticipant
106
+
107
+ json = Rufus::Json.encode({
108
+ 'definition' => "Ruote.define { alpha }"
109
+ })
110
+
111
+ # MQ.queue(
112
+ # 'ruote_workitems', :durable => true
113
+ # ).publish(
114
+ # json, :persistent => true
115
+ # )
116
+
117
+ $stomp.publish '/queue/ruote_workitems',
118
+ json,
119
+ { :persistent => true }
120
+
121
+ sleep 1
122
+
123
+ @engine.processes.size.should == 0
124
+ # nothing happened
125
+
126
+ # MQ.queue(
127
+ # 'mario', :durable => true
128
+ # ).publish(
129
+ # json, :persistent => true
130
+ # )
131
+
132
+ $stomp.publish '/queue/mario',
133
+ json,
134
+ { :persistent => true }
135
+
136
+ sleep 1
137
+
138
+ @engine.processes.size.should == 1
139
+ # launch happened
140
+ end
141
+ end
142
+
@@ -0,0 +1,126 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'spec_helper')
3
+
4
+ require 'ruote/participant'
5
+
6
+
7
+ describe RuoteStomp::Receiver do
8
+
9
+ after(:each) do
10
+ purge_engine
11
+ end
12
+
13
+ it "handles replies" do
14
+
15
+ pdef = Ruote.process_definition :name => 'test' do
16
+ set :field => 'foo', :value => 'foo'
17
+ sequence do
18
+ echo '${f:foo}'
19
+ stomp :queue => 'test3'
20
+ echo '${f:foo}'
21
+ end
22
+ end
23
+
24
+ @engine.register_participant(:stomp, RuoteStomp::ParticipantProxy)
25
+
26
+ RuoteStomp::Receiver.new(@engine)
27
+
28
+ wfid = @engine.launch(pdef)
29
+
30
+ workitem = nil
31
+
32
+ begin
33
+ Timeout::timeout(5) do
34
+
35
+ MQ.queue('test3', :durable => true).subscribe { |msg|
36
+ wi = Ruote::Workitem.new(Rufus::Json.decode(msg))
37
+ workitem = wi if wi.wfid == wfid
38
+ }
39
+
40
+ loop do
41
+ break unless workitem.nil?
42
+ sleep 0.1
43
+ end
44
+ end
45
+ rescue Timeout::Error
46
+ violated "Timeout waiting for message"
47
+ end
48
+
49
+ workitem.fields['foo'] = "bar"
50
+
51
+ MQ.queue('ruote_workitems', :durable => true).publish(Rufus::Json.encode(workitem.to_h), :persistent => true)
52
+
53
+ @engine.wait_for(wfid)
54
+
55
+ @engine.should_not have_errors
56
+ @engine.should_not have_remaining_expressions
57
+
58
+ @tracer.to_s.should == "foo\nbar"
59
+ end
60
+
61
+ it "launches processes" do
62
+
63
+ json = {
64
+ 'definition' => %{
65
+ Ruote.process_definition :name => 'test' do
66
+ sequence do
67
+ echo '${f:foo}'
68
+ end
69
+ end
70
+ },
71
+ 'fields' => { 'foo' => 'bar' }
72
+ }.to_json
73
+
74
+ RuoteStomp::Receiver.new(@engine, :launchitems => true, :unsubscribe => true)
75
+
76
+ MQ.queue(
77
+ 'ruote_workitems', :durable => true
78
+ ).publish(
79
+ json, :persistent => true
80
+ )
81
+
82
+ sleep 0.5
83
+
84
+ @engine.should_not have_errors
85
+ @engine.should_not have_remaining_expressions
86
+
87
+ @tracer.to_s.should == 'bar'
88
+ end
89
+
90
+ it 'accepts a custom :queue' do
91
+
92
+ #@engine.noisy = true
93
+
94
+ RuoteStomp::Receiver.new(
95
+ @engine, :queue => 'mario', :launchitems => true, :unsubscribe => true)
96
+
97
+ @engine.register_participant 'alpha', Ruote::StorageParticipant
98
+
99
+ json = Rufus::Json.encode({
100
+ 'definition' => "Ruote.define { alpha }"
101
+ })
102
+
103
+ MQ.queue(
104
+ 'ruote_workitems', :durable => true
105
+ ).publish(
106
+ json, :persistent => true
107
+ )
108
+
109
+ sleep 1
110
+
111
+ @engine.processes.size.should == 0
112
+ # nothing happened
113
+
114
+ MQ.queue(
115
+ 'mario', :durable => true
116
+ ).publish(
117
+ json, :persistent => true
118
+ )
119
+
120
+ sleep 1
121
+
122
+ @engine.processes.size.should == 1
123
+ # launch happened
124
+ end
125
+ end
126
+