ruote 2.3.0.1 → 2.3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/CHANGELOG.txt +23 -0
  2. data/CREDITS.txt +4 -0
  3. data/LICENSE.txt +1 -1
  4. data/lib/ruote.rb +2 -0
  5. data/lib/ruote/context.rb +2 -1
  6. data/lib/ruote/dashboard.rb +169 -13
  7. data/lib/ruote/dboard/mutation.rb +282 -0
  8. data/lib/ruote/dboard/process_error.rb +1 -1
  9. data/lib/ruote/dboard/process_status.rb +61 -48
  10. data/lib/ruote/engine.rb +1 -1
  11. data/lib/ruote/exp/command.rb +1 -1
  12. data/lib/ruote/exp/commanded.rb +1 -1
  13. data/lib/ruote/exp/condition.rb +2 -1
  14. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  15. data/lib/ruote/exp/fe_apply.rb +1 -1
  16. data/lib/ruote/exp/fe_await.rb +97 -48
  17. data/lib/ruote/exp/fe_cancel_process.rb +1 -1
  18. data/lib/ruote/exp/fe_command.rb +2 -3
  19. data/lib/ruote/exp/fe_concurrence.rb +162 -66
  20. data/lib/ruote/exp/fe_concurrent_iterator.rb +25 -7
  21. data/lib/ruote/exp/fe_cron.rb +1 -1
  22. data/lib/ruote/exp/fe_cursor.rb +10 -11
  23. data/lib/ruote/exp/fe_define.rb +1 -1
  24. data/lib/ruote/exp/fe_echo.rb +1 -1
  25. data/lib/ruote/exp/fe_equals.rb +1 -1
  26. data/lib/ruote/exp/fe_error.rb +1 -1
  27. data/lib/ruote/exp/fe_filter.rb +1 -1
  28. data/lib/ruote/exp/fe_forget.rb +1 -1
  29. data/lib/ruote/exp/fe_given.rb +1 -1
  30. data/lib/ruote/exp/fe_if.rb +87 -7
  31. data/lib/ruote/exp/fe_inc.rb +1 -1
  32. data/lib/ruote/exp/fe_iterator.rb +1 -1
  33. data/lib/ruote/exp/fe_listen.rb +1 -1
  34. data/lib/ruote/exp/fe_lose.rb +1 -1
  35. data/lib/ruote/exp/fe_noop.rb +1 -1
  36. data/lib/ruote/exp/fe_on_error.rb +1 -1
  37. data/lib/ruote/exp/fe_once.rb +1 -1
  38. data/lib/ruote/exp/fe_participant.rb +49 -16
  39. data/lib/ruote/exp/fe_read.rb +1 -1
  40. data/lib/ruote/exp/fe_redo.rb +1 -1
  41. data/lib/ruote/exp/fe_ref.rb +1 -1
  42. data/lib/ruote/exp/fe_registerp.rb +1 -1
  43. data/lib/ruote/exp/fe_reserve.rb +1 -1
  44. data/lib/ruote/exp/fe_restore.rb +1 -7
  45. data/lib/ruote/exp/fe_save.rb +1 -1
  46. data/lib/ruote/exp/fe_sequence.rb +1 -1
  47. data/lib/ruote/exp/fe_set.rb +1 -1
  48. data/lib/ruote/exp/fe_stall.rb +1 -1
  49. data/lib/ruote/exp/fe_subprocess.rb +1 -1
  50. data/lib/ruote/exp/fe_that.rb +1 -1
  51. data/lib/ruote/exp/fe_undo.rb +1 -1
  52. data/lib/ruote/exp/fe_unregisterp.rb +1 -1
  53. data/lib/ruote/exp/fe_wait.rb +1 -1
  54. data/lib/ruote/exp/flow_expression.rb +117 -8
  55. data/lib/ruote/exp/iterator.rb +1 -1
  56. data/lib/ruote/exp/ro_attributes.rb +1 -1
  57. data/lib/ruote/exp/ro_filters.rb +1 -1
  58. data/lib/ruote/exp/ro_on_x.rb +4 -2
  59. data/lib/ruote/exp/ro_persist.rb +1 -1
  60. data/lib/ruote/exp/ro_timers.rb +1 -1
  61. data/lib/ruote/exp/ro_variables.rb +1 -1
  62. data/lib/ruote/extract.rb +125 -0
  63. data/lib/ruote/fei.rb +10 -73
  64. data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
  65. data/lib/ruote/id/wfid_generator.rb +1 -1
  66. data/lib/ruote/log/default_history.rb +17 -3
  67. data/lib/ruote/log/fancy_printing.rb +12 -32
  68. data/lib/ruote/log/storage_history.rb +1 -1
  69. data/lib/ruote/log/wait_logger.rb +15 -7
  70. data/lib/ruote/merge.rb +123 -0
  71. data/lib/ruote/observer.rb +1 -1
  72. data/lib/ruote/part/block_participant.rb +1 -1
  73. data/lib/ruote/part/code_participant.rb +1 -1
  74. data/lib/ruote/part/engine_participant.rb +1 -1
  75. data/lib/ruote/part/local_participant.rb +9 -1
  76. data/lib/ruote/part/no_op_participant.rb +1 -1
  77. data/lib/ruote/part/null_participant.rb +1 -1
  78. data/lib/ruote/part/participant.rb +1 -1
  79. data/lib/ruote/part/rev_participant.rb +1 -1
  80. data/lib/ruote/part/smtp_participant.rb +1 -1
  81. data/lib/ruote/part/storage_participant.rb +18 -1
  82. data/lib/ruote/part/template.rb +1 -1
  83. data/lib/ruote/reader.rb +1 -1
  84. data/lib/ruote/reader/json.rb +1 -1
  85. data/lib/ruote/reader/radial.rb +4 -4
  86. data/lib/ruote/reader/ruby_dsl.rb +1 -1
  87. data/lib/ruote/reader/xml.rb +1 -1
  88. data/lib/ruote/receiver/base.rb +13 -1
  89. data/lib/ruote/storage/base.rb +8 -14
  90. data/lib/ruote/storage/composite_storage.rb +1 -1
  91. data/lib/ruote/storage/fs_storage.rb +1 -1
  92. data/lib/ruote/storage/hash_storage.rb +2 -1
  93. data/lib/ruote/svc/dispatch_pool.rb +29 -18
  94. data/lib/ruote/svc/dollar_sub.rb +5 -8
  95. data/lib/ruote/svc/error_handler.rb +1 -1
  96. data/lib/ruote/svc/expression_map.rb +1 -1
  97. data/lib/ruote/svc/participant_list.rb +8 -5
  98. data/lib/ruote/svc/tracker.rb +154 -56
  99. data/lib/ruote/svc/treechecker.rb +1 -1
  100. data/lib/ruote/tree_dot.rb +1 -1
  101. data/lib/ruote/util/deep.rb +4 -2
  102. data/lib/ruote/util/filter.rb +1 -1
  103. data/lib/ruote/util/hashdot.rb +1 -1
  104. data/lib/ruote/util/look.rb +1 -1
  105. data/lib/ruote/util/lookup.rb +1 -1
  106. data/lib/ruote/util/misc.rb +51 -1
  107. data/lib/ruote/util/mpatch.rb +1 -1
  108. data/lib/ruote/util/ometa.rb +1 -1
  109. data/lib/ruote/util/subprocess.rb +1 -1
  110. data/lib/ruote/util/time.rb +3 -3
  111. data/lib/ruote/util/tree.rb +43 -4
  112. data/lib/ruote/version.rb +2 -2
  113. data/lib/ruote/worker.rb +30 -18
  114. data/lib/ruote/workitem.rb +1 -1
  115. data/ruote.gemspec +6 -2
  116. data/test/functional/base.rb +0 -1
  117. data/test/functional/concurrent_base.rb +1 -1
  118. data/test/functional/eft_14_cursor.rb +42 -52
  119. data/test/functional/eft_16_if.rb +24 -16
  120. data/test/functional/eft_18_concurrent_iterator.rb +31 -1
  121. data/test/functional/eft_6_concurrence.rb +149 -34
  122. data/test/functional/ft_10_dollar.rb +14 -30
  123. data/test/functional/ft_12_launchitem.rb +15 -0
  124. data/test/functional/ft_1_process_status.rb +62 -13
  125. data/test/functional/ft_20_storage_participant.rb +25 -0
  126. data/test/functional/ft_38_participant_more.rb +1 -1
  127. data/test/functional/ft_42_storage_copy.rb +1 -3
  128. data/test/functional/ft_43_participant_on_reply.rb +63 -5
  129. data/test/functional/ft_66_flank.rb +41 -0
  130. data/test/functional/ft_6_on_cancel.rb +9 -18
  131. data/test/functional/ft_71_retries.rb +25 -12
  132. data/test/functional/ft_79_attach.rb +138 -0
  133. data/test/functional/ft_7_tags.rb +27 -0
  134. data/test/functional/ft_80_pause_on_apply.rb +64 -0
  135. data/test/functional/ft_81_mutation.rb +417 -0
  136. data/test/functional/ft_82_await_attribute.rb +84 -0
  137. data/test/functional/ft_83_trackers.rb +79 -0
  138. data/test/functional/storage.rb +3 -4
  139. data/test/unit/ut_12_wait_logger.rb +41 -3
  140. data/test/unit/ut_15_util.rb +30 -0
  141. data/test/unit/ut_17_merge.rb +54 -53
  142. data/test/unit/ut_1_fei.rb +2 -2
  143. data/test/unit/ut_24_radial_reader.rb +7 -0
  144. data/test/unit/ut_26_deep.rb +14 -0
  145. data/test/unit/ut_5_tree.rb +38 -28
  146. metadata +206 -169
  147. data/couch_url.txt +0 -1
  148. data/lib/ruote/exp/merge.rb +0 -134
@@ -5,6 +5,7 @@
5
5
  # Tue Jun 23 10:55:16 JST 2009
6
6
  #
7
7
 
8
+ #require 'rufus-json/automatic'
8
9
  require File.expand_path('../base', __FILE__)
9
10
 
10
11
 
@@ -37,5 +38,19 @@ class FtLaunchitemTest < Test::Unit::TestCase
37
38
  {"a"=>0, "b"=>1, "params"=>{"ref"=>"alpha"}},
38
39
  @dashboard.context.stash[:fields])
39
40
  end
41
+
42
+ # Warning: this test requires rufus-json to have a backend ready.
43
+ #
44
+ def test_launch_and_variables_with_symbol_keys
45
+
46
+ pdef = Ruote.define do
47
+ echo '${f} / ${v:v}'
48
+ end
49
+
50
+ wfid = @dashboard.launch(pdef, { :f => 'x' }, { :v => 'y' })
51
+ wait_for(wfid)
52
+
53
+ assert_equal 'x / y', @tracer.to_s
54
+ end
40
55
  end
41
56
 
@@ -82,7 +82,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
82
82
  assert_equal 1, @dashboard.errors(:count => true)
83
83
  end
84
84
 
85
- def test_tree
85
+ def test_current_tree
86
86
 
87
87
  pdef = Ruote.process_definition 'my process' do
88
88
  sequence do
@@ -91,10 +91,10 @@ class FtProcessStatusTest < Test::Unit::TestCase
91
91
  end
92
92
  end
93
93
 
94
- alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
94
+ alpha = @dashboard.register :alpha, Ruote::NullParticipant
95
95
  wfid = @dashboard.launch(pdef)
96
96
 
97
- wait_for(:alpha)
97
+ wait_for('dispatched')
98
98
 
99
99
  ps = @dashboard.process(wfid)
100
100
 
@@ -119,19 +119,55 @@ class FtProcessStatusTest < Test::Unit::TestCase
119
119
 
120
120
  e.update_tree([ 'participant', { 'ref' => 'bravo' }, [] ])
121
121
 
122
+ assert_equal(
123
+ ["define", {"my process"=>nil}, [
124
+ ["sequence", {}, [
125
+ ["echo", {"ok"=>nil}, []],
126
+ ["participant", {"ref"=>"alpha"}, []]]]]],
127
+ ps.original_tree)
128
+
122
129
  assert_equal(
123
130
  ["define", {"my process"=>nil}, [
124
131
  ["sequence", {}, [
125
132
  ["echo", {"ok"=>nil}, []],
126
133
  ["participant", {"ref"=>"bravo"}, []]]]]],
127
134
  ps.current_tree)
135
+ end
136
+
137
+ def test_current_tree_and_re_apply
138
+
139
+ pdef = Ruote.process_definition 'my process' do
140
+ sequence do
141
+ echo 'ok'
142
+ participant :ref => :alpha
143
+ end
144
+ end
145
+
146
+ alpha = @dashboard.register :alpha, Ruote::NullParticipant
147
+ wfid = @dashboard.launch(pdef)
148
+
149
+ wait_for('dispatched')
150
+
151
+ ps = @dashboard.process(wfid)
152
+ exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_1' }
153
+
154
+ @dashboard.re_apply(
155
+ exp,
156
+ :tree =>
157
+ [ 'sequence', {}, [ [ 'alpha', {}, [] ], [ 'alpha', {}, [] ] ] ])
158
+
159
+ wait_for('dispatched')
160
+
161
+ ps = @dashboard.process(wfid)
128
162
 
129
163
  assert_equal(
130
164
  ["define", {"my process"=>nil}, [
131
165
  ["sequence", {}, [
132
166
  ["echo", {"ok"=>nil}, []],
133
- ["participant", {"ref"=>"alpha"}, []]]]]],
134
- ps.original_tree)
167
+ ["sequence", {"_triggered"=>"on_re_apply"}, [
168
+ ["participant", {"ref"=>"alpha"}, []],
169
+ ["alpha", {}, []]]]]]]],
170
+ ps.current_tree)
135
171
  end
136
172
 
137
173
  def test_tree_when_define_rewrites_it
@@ -156,13 +192,15 @@ class FtProcessStatusTest < Test::Unit::TestCase
156
192
 
157
193
  assert_equal(
158
194
  ["define", {"my process"=>nil}, [
159
- ["define", {"sub0"=>nil}, [["echo", {"meh"=>nil}, []]]],
195
+ ["define", {"sub0"=>nil}, [
196
+ ["echo", {"meh"=>nil}, []]]],
160
197
  ["participant", {"ref"=>"alpha"}, []]]],
161
198
  ps.current_tree)
162
199
 
163
200
  assert_equal(
164
201
  ["define", {"my process"=>nil}, [
165
- ["define", {"sub0"=>nil}, [["echo", {"meh"=>nil}, []]]],
202
+ ["define", {"sub0"=>nil}, [
203
+ ["echo", {"meh"=>nil}, []]]],
166
204
  ["participant", {"ref"=>"alpha"}, []]]],
167
205
  ps.original_tree)
168
206
  end
@@ -351,11 +389,21 @@ class FtProcessStatusTest < Test::Unit::TestCase
351
389
  assert_trace %w[ a c c d ], pdef
352
390
 
353
391
  assert_equal(
354
- ["define", {"name"=>"test"}, [["sequence", {}, [["alpha", {}, []], ["charly", {}, []], ["participant", {"ref"=>"charly"}, []]]], ["delta", {}, []]]],
392
+ ["define", {"name"=>"test"}, [
393
+ ["sequence", {}, [
394
+ ["alpha", {}, []],
395
+ ["charly", {}, []],
396
+ ["participant", {"ref"=>"charly"}, []]]],
397
+ ["delta", {}, []]]],
355
398
  @dashboard.context.stash[:tree0])
356
399
 
357
400
  assert_equal(
358
- ["define", {"name"=>"test"}, [["sequence", {}, [["alpha", {}, []], ["charly", {}, []], ["charly", {}, []]]], ["participant", {"ref"=>"delta"}, []]]],
401
+ ["define", {"name"=>"test"}, [
402
+ ["sequence", {}, [
403
+ ["alpha", {}, []],
404
+ ["charly", {}, []],
405
+ ["charly", {}, []]]],
406
+ ["participant", {"ref"=>"delta"}, []]]],
359
407
  @dashboard.context.stash[:tree1])
360
408
  end
361
409
 
@@ -370,7 +418,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
370
418
  end
371
419
  end
372
420
 
373
- alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
421
+ alpha = @dashboard.register :alpha, Ruote::StorageParticipant
374
422
 
375
423
  wfid = @dashboard.launch(pdef)
376
424
 
@@ -396,9 +444,10 @@ class FtProcessStatusTest < Test::Unit::TestCase
396
444
  assert_equal(
397
445
  ["define", {"name"=>"test"}, [
398
446
  ["define", {"sub0"=>nil}, [
399
- ["participant", {"ref"=>"alpha"}, []]]],
400
- ["sequence", {"on_cancel"=>"sub0", "_triggered"=>"on_cancel"}, [
401
- ["alpha", {}, []]]]]],
447
+ ["alpha", {}, []]]],
448
+ ["subprocess", {"_triggered"=>"on_cancel", "ref"=>"sub0"}, [
449
+ ["define", {"sub0"=>nil}, [
450
+ ["participant", {"ref"=>"alpha"}, []]]]]]]],
402
451
  @dashboard.process(wfid).current_tree)
403
452
  end
404
453
 
@@ -723,5 +723,30 @@ class FtStorageParticipantTest < Test::Unit::TestCase
723
723
 
724
724
  assert_equal 0, @dashboard.storage_participant.size
725
725
  end
726
+
727
+ class IuriParticipant < Ruote::StorageParticipant
728
+ def on_workitem
729
+ super
730
+ workitem.fields['count'] = 777
731
+ do_update
732
+ end
733
+ end
734
+
735
+ def test_do_update
736
+
737
+ @dashboard.register :alpha, IuriParticipant
738
+
739
+ wfid = @dashboard.launch(
740
+ Ruote.define do
741
+ alpha
742
+ end)
743
+
744
+ @dashboard.wait_for('dispatched')
745
+ sleep 0.350
746
+
747
+ wi = @dashboard.storage_participant.first
748
+
749
+ assert_equal(777, wi.fields['count'])
750
+ end
726
751
  end
727
752
 
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # Mon Apr 19 14:38:54 JST 2010
6
6
  #
7
- # Qcon Tokyo, special day
7
+ # Qcon Tokyo, special day (12/19 plus tard)
8
8
  #
9
9
 
10
10
  require File.expand_path('../base', __FILE__)
@@ -17,8 +17,6 @@ class FtStorageCopyTest < Test::Unit::TestCase
17
17
 
18
18
  @dashboard.register_participant '.+', Ruote::StorageParticipant
19
19
 
20
- #noisy
21
-
22
20
  wfid = @dashboard.launch(Ruote.process_definition do
23
21
  sequence do
24
22
  alpha :timeout => '2d'
@@ -43,7 +41,7 @@ class FtStorageCopyTest < Test::Unit::TestCase
43
41
 
44
42
  dash = Ruote::Dashboard.new(Ruote::Worker.new(Ruote::HashStorage.new()))
45
43
 
46
- #dash.noisy = true
44
+ dash.noisy = ENV['NOISY'] == 'true'
47
45
 
48
46
  dash.register_participant '.+', Ruote::StorageParticipant
49
47
 
@@ -128,11 +128,9 @@ class FtParticipantOnReplyTest < Test::Unit::TestCase
128
128
 
129
129
  @dashboard.register :alpha, MyOtherAwkwardParticipant
130
130
 
131
- pdef = Ruote.process_definition do
132
- sequence do
133
- alpha
134
- echo 'over.'
135
- end
131
+ pdef = Ruote.define do
132
+ alpha
133
+ echo 'over.'
136
134
  end
137
135
 
138
136
  wfid = @dashboard.launch(pdef)
@@ -157,5 +155,65 @@ class FtParticipantOnReplyTest < Test::Unit::TestCase
157
155
 
158
156
  assert_equal 'over.', @tracer.to_s
159
157
  end
158
+
159
+ class MyFailingParticipant < Ruote::Participant
160
+ def on_workitem
161
+ raise 'flunk!'
162
+ end
163
+ def on_error
164
+ @context.tracer <<
165
+ "on_error: #{error.class}: #{error.message}: #{msg['action']}\n"
166
+ workitem.fields['hello'] = 'world'
167
+ true # returning true to signify we're dealing with the error
168
+ end
169
+ end
170
+
171
+ def test_participant_on_error
172
+
173
+ @dashboard.register :alpha, MyFailingParticipant
174
+
175
+ pdef = Ruote.define do
176
+ alpha
177
+ echo 'over.'
178
+ end
179
+
180
+ wfid = @dashboard.launch(pdef)
181
+ r = @dashboard.wait_for(wfid)
182
+
183
+ assert_equal 'terminated', r['action']
184
+ assert_equal 'world', r['workitem']['fields']['hello']
185
+ assert_equal "on_error: RuntimeError: flunk!: dispatch\nover.", @tracer.to_s
186
+ end
187
+
188
+ class MyVeryFailingParticipant < Ruote::Participant
189
+ def on_workitem
190
+ raise 'flunkito!'
191
+ end
192
+ def on_error
193
+ @context.tracer << "on_error...\n"
194
+ workitem.fields['hello'] = 'world'
195
+ false # returning false to signify we're NOT dealing with the error
196
+ end
197
+ end
198
+
199
+ def test_participant_on_error_return_false
200
+
201
+ @dashboard.register :alpha, MyVeryFailingParticipant
202
+
203
+ pdef = Ruote.define do
204
+ alpha
205
+ echo 'over.'
206
+ end
207
+
208
+ wfid = @dashboard.launch(pdef)
209
+ r = @dashboard.wait_for(wfid)
210
+
211
+ assert_equal 'error_intercepted', r['action']
212
+ assert_equal 'world', r['msg']['workitem']['fields']['hello']
213
+ assert_equal 'on_error...', @tracer.to_s
214
+
215
+ # Error has not been dealt with within the participant implementation,
216
+ # it went straight to the common error handler
217
+ end
160
218
  end
161
219
 
@@ -129,5 +129,46 @@ class FtFlankTest < Test::Unit::TestCase
129
129
  assert_equal 0, @dashboard.storage.get_many('expressions').size
130
130
  assert_equal 0, @dashboard.storage.get_many('workitems').size
131
131
  end
132
+
133
+ # for https://groups.google.com/forum/?fromgroups=#!topic/openwferu-users/dZ--leQgEns
134
+ #
135
+ def test_ceasing_flank
136
+
137
+ @dashboard.register { catchall }
138
+
139
+ pdef =
140
+ Ruote.define do
141
+ sequence :tag => 'x' do
142
+ alice :flank => true
143
+ bob
144
+ end
145
+ end
146
+
147
+ wfid = @dashboard.launch(pdef)
148
+
149
+ 2.times { @dashboard.wait_for('dispatched') }
150
+
151
+ alice =
152
+ @dashboard.storage_participant.find { |wi|
153
+ wi.participant_name == 'alice'
154
+ }
155
+
156
+ @dashboard.storage_participant.proceed(alice)
157
+ @dashboard.wait_for('receive')
158
+
159
+ ps = @dashboard.ps(wfid)
160
+
161
+ assert_equal %w[ 0 0_0 0_0_1 ], ps.expressions.collect { |e| e.fei.expid }
162
+ assert_equal 0, ps.errors.size
163
+
164
+ bob = @dashboard.storage_participant.first
165
+
166
+ @dashboard.storage_participant.proceed(bob)
167
+ @dashboard.wait_for('terminated')
168
+
169
+ sleep 0.350
170
+
171
+ assert_equal nil, @dashboard.ps(wfid)
172
+ end
132
173
  end
133
174
 
@@ -27,8 +27,6 @@ class FtOnCancelTest < Test::Unit::TestCase
27
27
  tracer << "caught\n"
28
28
  end
29
29
 
30
- #noisy
31
-
32
30
  wfid = @dashboard.launch(pdef)
33
31
  wait_for(:nemo)
34
32
 
@@ -48,8 +46,6 @@ class FtOnCancelTest < Test::Unit::TestCase
48
46
 
49
47
  nemo = @dashboard.register_participant :nemo, Ruote::StorageParticipant
50
48
 
51
- #noisy
52
-
53
49
  wfid = @dashboard.launch(pdef)
54
50
  wait_for(:nemo)
55
51
 
@@ -80,8 +76,6 @@ class FtOnCancelTest < Test::Unit::TestCase
80
76
 
81
77
  alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
82
78
 
83
- #noisy
84
-
85
79
  wfid = @dashboard.launch(pdef)
86
80
 
87
81
  wait_for(:alpha)
@@ -111,8 +105,6 @@ class FtOnCancelTest < Test::Unit::TestCase
111
105
  @dashboard.register_participant :alpha, Ruote::StorageParticipant
112
106
  sto = @dashboard.register_participant :bravo, Ruote::StorageParticipant
113
107
 
114
- #noisy
115
-
116
108
  wfid = @dashboard.launch(pdef)
117
109
 
118
110
  wait_for(:alpha)
@@ -142,8 +134,6 @@ class FtOnCancelTest < Test::Unit::TestCase
142
134
  @dashboard.register_participant :alpha, Ruote::StorageParticipant
143
135
  @dashboard.register_participant :bravo, Ruote::StorageParticipant
144
136
 
145
- #noisy
146
-
147
137
  wfid = @dashboard.launch(pdef)
148
138
 
149
139
  wait_for(:alpha)
@@ -154,13 +144,18 @@ class FtOnCancelTest < Test::Unit::TestCase
154
144
 
155
145
  assert_equal(
156
146
  ["define", {"name"=>"test"}, [
157
- ["define", {"sub0"=>nil}, [["bravo", {}, []]]],
158
- ["sequence", {"on_cancel"=>"sub0"}, [["alpha", {}, []]]]]],
147
+ ["define", {"sub0"=>nil}, [
148
+ ["bravo", {}, []]]],
149
+ ["sequence", {"on_cancel"=>"sub0"}, [
150
+ ["alpha", {}, []]]]]],
159
151
  @dashboard.process(wfid).original_tree)
160
152
  assert_equal(
161
153
  ["define", {"name"=>"test"}, [
162
- ["define", {"sub0"=>nil}, [["participant", {"ref"=>"bravo"}, []]]],
163
- ["sequence", {"on_cancel"=>"sub0", "_triggered"=>"on_cancel"}, [["alpha", {}, []]]]]],
154
+ ["define", {"sub0"=>nil}, [
155
+ ["bravo", {}, []]]],
156
+ ["subprocess", {"_triggered"=>"on_cancel", "ref"=>"sub0"}, [
157
+ ["define", {"sub0"=>nil}, [
158
+ ["participant", {"ref"=>"bravo"}, []]]]]]]],
164
159
  @dashboard.process(wfid).current_tree)
165
160
  end
166
161
 
@@ -178,8 +173,6 @@ class FtOnCancelTest < Test::Unit::TestCase
178
173
 
179
174
  @dashboard.register_participant :alpha, Ruote::StorageParticipant
180
175
 
181
- #@dashboard.noisy = true
182
-
183
176
  wfid = @dashboard.launch(pdef)
184
177
 
185
178
  wait_for(:alpha)
@@ -205,8 +198,6 @@ class FtOnCancelTest < Test::Unit::TestCase
205
198
 
206
199
  @dashboard.register :alpha, Ruote::StorageParticipant
207
200
 
208
- #noisy
209
-
210
201
  wfid = @dashboard.launch(pdef)
211
202
 
212
203
  @dashboard.wait_for(:alpha)
@@ -11,13 +11,10 @@ require File.expand_path('../base', __FILE__)
11
11
  class FtRetriesTest < Test::Unit::TestCase
12
12
  include FunctionalBase
13
13
 
14
- class BadParticipant
15
- include Ruote::LocalParticipant
14
+ class BadParticipant < Ruote::Participant
16
15
  def on_workitem
17
16
  fail 'badly'
18
17
  end
19
- def on_cancel
20
- end
21
18
  end
22
19
 
23
20
  #
@@ -31,8 +28,6 @@ class FtRetriesTest < Test::Unit::TestCase
31
28
  alpha :on_error => '4s: retry'
32
29
  end
33
30
 
34
- #@dashboard.noisy = true
35
-
36
31
  wfid = @dashboard.launch(pdef)
37
32
 
38
33
  @dashboard.wait_for('fail')
@@ -60,8 +55,6 @@ class FtRetriesTest < Test::Unit::TestCase
60
55
  alpha :on_error => '4x: retry'
61
56
  end
62
57
 
63
- #@dashboard.noisy = true
64
-
65
58
  wfid = @dashboard.launch(pdef)
66
59
 
67
60
  @dashboard.wait_for('error_intercepted')
@@ -83,8 +76,6 @@ class FtRetriesTest < Test::Unit::TestCase
83
76
  echo 'over.'
84
77
  end
85
78
 
86
- #@dashboard.noisy = true
87
-
88
79
  wfid = @dashboard.launch(pdef)
89
80
 
90
81
  @dashboard.wait_for('terminated')
@@ -112,8 +103,6 @@ class FtRetriesTest < Test::Unit::TestCase
112
103
  alpha :on_error => '1s: retry * 3'
113
104
  end
114
105
 
115
- #@dashboard.noisy = true
116
-
117
106
  wfid = @dashboard.launch(pdef)
118
107
 
119
108
  @dashboard.wait_for('fail')
@@ -139,6 +128,30 @@ class FtRetriesTest < Test::Unit::TestCase
139
128
  assert_equal(
140
129
  '#<RuntimeError: badly>',
141
130
  @dashboard.ps(wfid).errors.first.message)
131
+
132
+ fails = @dashboard.logger.log.select { |m| m['action'] == 'fail' }
133
+ assert_equal 3, fails.size
134
+ end
135
+
136
+ #
137
+ # :on_error => 'retry * 2'
138
+ #
139
+ # retry twice, immediately
140
+
141
+ def test_retry_star_two
142
+
143
+ @dashboard.register_participant :alpha, BadParticipant
144
+
145
+ pdef = Ruote.process_definition do
146
+ alpha :on_error => 'retry * 2'
147
+ end
148
+
149
+ wfid = @dashboard.launch(pdef)
150
+
151
+ @dashboard.wait_for('error_intercepted')
152
+
153
+ fails = @dashboard.logger.log.select { |m| m['action'] == 'fail' }
154
+ assert_equal 2, fails.size
142
155
  end
143
156
  end
144
157