ruote 2.2.0 → 2.3.0
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/CHANGELOG.txt +166 -1
- data/CREDITS.txt +36 -17
- data/LICENSE.txt +1 -1
- data/README.rdoc +1 -7
- data/Rakefile +38 -29
- data/TODO.txt +93 -52
- data/lib/ruote-fs.rb +3 -0
- data/lib/ruote.rb +5 -1
- data/lib/ruote/context.rb +140 -35
- data/lib/ruote/dashboard.rb +1247 -0
- data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
- data/lib/ruote/dboard/process_status.rb +587 -0
- data/lib/ruote/engine.rb +6 -871
- data/lib/ruote/exp/command.rb +7 -2
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +38 -13
- data/lib/ruote/exp/fe_add_branches.rb +1 -1
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_await.rb +357 -0
- data/lib/ruote/exp/fe_cancel_process.rb +17 -3
- data/lib/ruote/exp/fe_command.rb +8 -4
- data/lib/ruote/exp/fe_concurrence.rb +218 -18
- data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
- data/lib/ruote/exp/fe_cron.rb +3 -10
- data/lib/ruote/exp/fe_cursor.rb +14 -4
- data/lib/ruote/exp/fe_define.rb +3 -1
- data/lib/ruote/exp/fe_echo.rb +1 -1
- data/lib/ruote/exp/fe_equals.rb +1 -1
- data/lib/ruote/exp/fe_error.rb +1 -1
- data/lib/ruote/exp/fe_filter.rb +163 -4
- data/lib/ruote/exp/fe_forget.rb +21 -4
- data/lib/ruote/exp/fe_given.rb +1 -1
- data/lib/ruote/exp/fe_if.rb +1 -1
- data/lib/ruote/exp/fe_inc.rb +102 -35
- data/lib/ruote/exp/fe_iterator.rb +47 -12
- data/lib/ruote/exp/fe_listen.rb +96 -11
- data/lib/ruote/exp/fe_lose.rb +31 -4
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/fe_on_error.rb +109 -0
- data/lib/ruote/exp/fe_once.rb +10 -19
- data/lib/ruote/exp/fe_participant.rb +90 -28
- data/lib/ruote/exp/fe_read.rb +69 -0
- data/lib/ruote/exp/fe_redo.rb +3 -2
- data/lib/ruote/exp/fe_ref.rb +57 -27
- data/lib/ruote/exp/fe_registerp.rb +1 -3
- data/lib/ruote/exp/fe_reserve.rb +1 -1
- data/lib/ruote/exp/fe_restore.rb +6 -6
- data/lib/ruote/exp/fe_save.rb +12 -19
- data/lib/ruote/exp/fe_sequence.rb +38 -2
- data/lib/ruote/exp/fe_set.rb +143 -40
- data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
- data/lib/ruote/exp/fe_subprocess.rb +8 -2
- data/lib/ruote/exp/fe_that.rb +1 -1
- data/lib/ruote/exp/fe_undo.rb +40 -4
- data/lib/ruote/exp/fe_unregisterp.rb +1 -3
- data/lib/ruote/exp/fe_wait.rb +12 -25
- data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +78 -17
- data/lib/ruote/exp/ro_attributes.rb +46 -36
- data/lib/ruote/exp/ro_filters.rb +34 -8
- data/lib/ruote/exp/ro_on_x.rb +431 -0
- data/lib/ruote/exp/ro_persist.rb +19 -7
- data/lib/ruote/exp/ro_timers.rb +123 -0
- data/lib/ruote/exp/ro_variables.rb +90 -29
- data/lib/ruote/fei.rb +57 -3
- data/lib/ruote/fs.rb +3 -0
- data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
- data/lib/ruote/id/wfid_generator.rb +17 -38
- data/lib/ruote/log/default_history.rb +23 -9
- data/lib/ruote/log/fancy_printing.rb +265 -0
- data/lib/ruote/log/storage_history.rb +23 -13
- data/lib/ruote/log/wait_logger.rb +224 -17
- data/lib/ruote/observer.rb +82 -0
- data/lib/ruote/part/block_participant.rb +65 -28
- data/lib/ruote/part/code_participant.rb +81 -0
- data/lib/ruote/part/engine_participant.rb +7 -2
- data/lib/ruote/part/local_participant.rb +221 -21
- data/lib/ruote/part/no_op_participant.rb +1 -1
- data/lib/ruote/part/null_participant.rb +1 -1
- data/lib/ruote/part/participant.rb +50 -0
- data/lib/ruote/part/rev_participant.rb +178 -0
- data/lib/ruote/part/smtp_participant.rb +2 -2
- data/lib/ruote/part/storage_participant.rb +228 -60
- data/lib/ruote/part/template.rb +1 -1
- data/lib/ruote/participant.rb +2 -0
- data/lib/ruote/reader.rb +205 -68
- data/lib/ruote/reader/json.rb +49 -0
- data/lib/ruote/reader/radial.rb +303 -0
- data/lib/ruote/reader/ruby_dsl.rb +44 -9
- data/lib/ruote/reader/xml.rb +11 -8
- data/lib/ruote/receiver/base.rb +98 -45
- data/lib/ruote/storage/base.rb +104 -35
- data/lib/ruote/storage/composite_storage.rb +50 -60
- data/lib/ruote/storage/fs_storage.rb +25 -34
- data/lib/ruote/storage/hash_storage.rb +38 -36
- data/lib/ruote/svc/dispatch_pool.rb +104 -35
- data/lib/ruote/svc/dollar_sub.rb +10 -8
- data/lib/ruote/svc/error_handler.rb +108 -52
- data/lib/ruote/svc/expression_map.rb +3 -3
- data/lib/ruote/svc/participant_list.rb +160 -55
- data/lib/ruote/svc/tracker.rb +31 -31
- data/lib/ruote/svc/treechecker.rb +28 -16
- data/lib/ruote/tree_dot.rb +1 -1
- data/lib/ruote/util/deep.rb +143 -0
- data/lib/ruote/util/filter.rb +125 -18
- data/lib/ruote/util/hashdot.rb +15 -13
- data/lib/ruote/util/look.rb +1 -1
- data/lib/ruote/util/lookup.rb +60 -22
- data/lib/ruote/util/misc.rb +63 -18
- data/lib/ruote/util/mpatch.rb +53 -0
- data/lib/ruote/util/ometa.rb +1 -2
- data/lib/ruote/util/process_observer.rb +177 -0
- data/lib/ruote/util/subprocess.rb +1 -1
- data/lib/ruote/util/time.rb +2 -2
- data/lib/ruote/util/tree.rb +64 -2
- data/lib/ruote/version.rb +3 -2
- data/lib/ruote/worker.rb +421 -92
- data/lib/ruote/workitem.rb +157 -22
- data/ruote.gemspec +15 -9
- data/test/bm/ci.rb +0 -2
- data/test/bm/ici.rb +0 -2
- data/test/bm/load_26c.rb +0 -3
- data/test/bm/mega.rb +0 -2
- data/test/functional/base.rb +57 -43
- data/test/functional/concurrent_base.rb +16 -13
- data/test/functional/ct_0_concurrence.rb +7 -11
- data/test/functional/ct_1_iterator.rb +9 -11
- data/test/functional/ct_2_cancel.rb +28 -17
- data/test/functional/eft_0_flow_expression.rb +35 -0
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +13 -13
- data/test/functional/eft_12_listen.rb +199 -66
- data/test/functional/eft_13_iterator.rb +95 -29
- data/test/functional/eft_14_cursor.rb +74 -24
- data/test/functional/eft_15_loop.rb +7 -7
- data/test/functional/eft_16_if.rb +1 -1
- data/test/functional/eft_17_equals.rb +1 -1
- data/test/functional/eft_18_concurrent_iterator.rb +156 -68
- data/test/functional/eft_19_reserve.rb +15 -15
- data/test/functional/eft_1_echo.rb +1 -1
- data/test/functional/eft_20_save.rb +51 -9
- data/test/functional/eft_21_restore.rb +1 -1
- data/test/functional/eft_22_noop.rb +1 -1
- data/test/functional/eft_23_apply.rb +1 -1
- data/test/functional/eft_24_add_branches.rb +7 -8
- data/test/functional/eft_25_command.rb +1 -1
- data/test/functional/eft_26_error.rb +11 -11
- data/test/functional/eft_27_inc.rb +111 -67
- data/test/functional/eft_28_once.rb +16 -16
- data/test/functional/eft_29_cron.rb +9 -9
- data/test/functional/eft_2_sequence.rb +23 -4
- data/test/functional/eft_30_ref.rb +36 -24
- data/test/functional/eft_31_registerp.rb +24 -24
- data/test/functional/eft_32_lose.rb +46 -20
- data/test/functional/eft_34_given.rb +1 -1
- data/test/functional/eft_35_filter.rb +161 -7
- data/test/functional/eft_36_read.rb +97 -0
- data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
- data/test/functional/eft_38_on_error.rb +195 -0
- data/test/functional/eft_39_stall.rb +35 -0
- data/test/functional/eft_3_participant.rb +77 -22
- data/test/functional/eft_40_await.rb +297 -0
- data/test/functional/eft_4_set.rb +110 -11
- data/test/functional/eft_5_subprocess.rb +27 -5
- data/test/functional/eft_6_concurrence.rb +299 -60
- data/test/functional/eft_7_forget.rb +24 -22
- data/test/functional/eft_8_undo.rb +52 -15
- data/test/functional/eft_9_redo.rb +18 -20
- data/test/functional/ft_0_worker.rb +122 -13
- data/test/functional/ft_10_dollar.rb +77 -16
- data/test/functional/ft_11_recursion.rb +9 -9
- data/test/functional/ft_12_launchitem.rb +7 -9
- data/test/functional/ft_13_variables.rb +125 -22
- data/test/functional/ft_14_re_apply.rb +112 -56
- data/test/functional/ft_15_timeout.rb +64 -33
- data/test/functional/ft_16_participant_params.rb +59 -6
- data/test/functional/ft_17_conditional.rb +68 -2
- data/test/functional/ft_18_kill.rb +48 -30
- data/test/functional/ft_19_participant_code.rb +67 -0
- data/test/functional/ft_1_process_status.rb +222 -150
- data/test/functional/ft_20_storage_participant.rb +445 -44
- data/test/functional/ft_21_forget.rb +21 -26
- data/test/functional/ft_22_process_definitions.rb +8 -6
- data/test/functional/ft_23_load_defs.rb +29 -5
- data/test/functional/ft_24_block_participant.rb +199 -20
- data/test/functional/ft_25_receiver.rb +98 -46
- data/test/functional/ft_26_participant_rtimeout.rb +34 -26
- data/test/functional/ft_27_var_indirection.rb +40 -5
- data/test/functional/ft_28_null_noop_participants.rb +5 -5
- data/test/functional/ft_29_part_template.rb +2 -2
- data/test/functional/ft_2_errors.rb +106 -74
- data/test/functional/ft_30_smtp_participant.rb +7 -7
- data/test/functional/ft_31_part_blocking.rb +11 -11
- data/test/functional/ft_32_scope.rb +50 -0
- data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
- data/test/functional/ft_34_cursor_rewind.rb +14 -14
- data/test/functional/ft_35_add_service.rb +67 -9
- data/test/functional/ft_36_storage_history.rb +92 -24
- data/test/functional/ft_37_default_history.rb +35 -23
- data/test/functional/ft_38_participant_more.rb +189 -32
- data/test/functional/ft_39_wait_for.rb +25 -25
- data/test/functional/ft_3_participant_registration.rb +235 -107
- data/test/functional/ft_40_wait_logger.rb +105 -18
- data/test/functional/ft_41_participants.rb +13 -12
- data/test/functional/ft_42_storage_copy.rb +12 -12
- data/test/functional/ft_43_participant_on_reply.rb +85 -11
- data/test/functional/ft_44_var_participant.rb +5 -5
- data/test/functional/ft_45_participant_accept.rb +3 -3
- data/test/functional/ft_46_launch_single.rb +17 -17
- data/test/functional/ft_47_wfids.rb +41 -0
- data/test/functional/ft_48_lose.rb +19 -25
- data/test/functional/ft_49_engine_on_error.rb +54 -70
- data/test/functional/ft_4_cancel.rb +84 -26
- data/test/functional/ft_50_engine_config.rb +4 -4
- data/test/functional/ft_51_misc.rb +12 -12
- data/test/functional/ft_52_case.rb +17 -17
- data/test/functional/ft_53_engine_on_terminate.rb +18 -21
- data/test/functional/ft_54_patterns.rb +18 -16
- data/test/functional/ft_55_engine_participant.rb +55 -55
- data/test/functional/ft_56_filter_attribute.rb +90 -52
- data/test/functional/ft_57_rev_participant.rb +252 -0
- data/test/functional/ft_58_workitem.rb +150 -0
- data/test/functional/ft_59_pause.rb +329 -0
- data/test/functional/ft_5_on_error.rb +430 -77
- data/test/functional/ft_60_code_participant.rb +65 -0
- data/test/functional/ft_61_trailing_fields.rb +34 -0
- data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
- data/test/functional/ft_63_participants_221.rb +458 -0
- data/test/functional/ft_64_stash.rb +41 -0
- data/test/functional/ft_65_timers.rb +313 -0
- data/test/functional/ft_66_flank.rb +133 -0
- data/test/functional/ft_67_radial_misc.rb +34 -0
- data/test/functional/ft_68_reput.rb +72 -0
- data/test/functional/ft_69_worker_info.rb +56 -0
- data/test/functional/ft_6_on_cancel.rb +189 -36
- data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
- data/test/functional/ft_71_retries.rb +144 -0
- data/test/functional/ft_72_on_terminate.rb +60 -0
- data/test/functional/ft_73_raise_msg.rb +107 -0
- data/test/functional/ft_74_respark.rb +106 -0
- data/test/functional/ft_75_context.rb +66 -0
- data/test/functional/ft_76_observer.rb +53 -0
- data/test/functional/ft_77_process_observer.rb +157 -0
- data/test/functional/ft_78_part_participant.rb +37 -0
- data/test/functional/ft_7_tags.rb +238 -50
- data/test/functional/ft_8_participant_consumption.rb +27 -21
- data/test/functional/ft_9_subprocesses.rb +48 -18
- data/test/functional/restart_base.rb +4 -6
- data/test/functional/rt_0_wait.rb +10 -10
- data/test/functional/rt_1_listen.rb +6 -6
- data/test/functional/rt_2_errors.rb +12 -12
- data/test/functional/rt_3_once.rb +17 -12
- data/test/functional/rt_4_cron.rb +17 -17
- data/test/functional/rt_5_timeout.rb +13 -13
- data/test/functional/signals.rb +103 -0
- data/test/functional/storage.rb +730 -0
- data/test/functional/storage_helper.rb +48 -35
- data/test/functional/test.rb +6 -2
- data/test/misc/idle.rb +21 -0
- data/test/misc/light.rb +29 -0
- data/test/path_helper.rb +1 -1
- data/test/test.rb +2 -5
- data/test/test_helper.rb +13 -0
- data/test/unit/test.rb +1 -4
- data/test/unit/ut_0_ruby_reader.rb +25 -9
- data/test/unit/ut_10_participants.rb +47 -0
- data/test/unit/ut_11_lookup.rb +59 -2
- data/test/unit/ut_12_wait_logger.rb +123 -0
- data/test/unit/ut_14_is_uri.rb +1 -1
- data/test/unit/ut_15_util.rb +1 -1
- data/test/unit/ut_16_reader.rb +136 -14
- data/test/unit/ut_17_merge.rb +155 -0
- data/test/unit/ut_19_part_template.rb +1 -1
- data/test/unit/ut_1_fei.rb +11 -2
- data/test/unit/ut_20_composite_storage.rb +27 -1
- data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
- data/test/unit/ut_22_filter.rb +231 -10
- data/test/unit/ut_23_svc_tracker.rb +48 -0
- data/test/unit/ut_24_radial_reader.rb +458 -0
- data/test/unit/ut_25_process_status.rb +143 -0
- data/test/unit/ut_26_deep.rb +131 -0
- data/test/unit/ut_2_dashboard.rb +114 -0
- data/test/unit/ut_3_worker.rb +54 -0
- data/test/unit/ut_4_expmap.rb +1 -1
- data/test/unit/ut_5_tree.rb +23 -23
- data/test/unit/ut_6_condition.rb +71 -29
- data/test/unit/ut_7_workitem.rb +18 -4
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/ut_9_xml_reader.rb +1 -1
- metadata +142 -63
- data/jruby_issue.txt +0 -32
- data/lib/ruote/engine/process_status.rb +0 -403
- data/lib/ruote/log/pretty.rb +0 -165
- data/lib/ruote/log/test_logger.rb +0 -204
- data/lib/ruote/util/serializer.rb +0 -103
- data/phil.txt +0 -14
- data/test/functional/eft_33_let.rb +0 -31
- data/test/functional/ft_19_alias.rb +0 -33
- data/test/functional/ft_47_wfid_generator.rb +0 -54
- data/test/unit/storage.rb +0 -403
- data/test/unit/storages.rb +0 -37
- data/test/unit/ut_13_serializer.rb +0 -65
- data/test/unit/ut_18_engine.rb +0 -47
- data/test/unit/ut_3_wait_logger.rb +0 -39
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Wed May 20 09:23:01 JST 2009
|
|
6
6
|
#
|
|
7
7
|
|
|
8
|
-
require File.
|
|
8
|
+
require File.expand_path('../base', __FILE__)
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class EftSetTest < Test::Unit::TestCase
|
|
@@ -129,10 +129,10 @@ class EftSetTest < Test::Unit::TestCase
|
|
|
129
129
|
alpha
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
-
@
|
|
132
|
+
@dashboard.register_participant :alpha do |workitem|
|
|
133
133
|
workitem.fields.delete('params')
|
|
134
134
|
workitem.fields.delete('dispatched_at')
|
|
135
|
-
|
|
135
|
+
tracer << workitem.fields.inspect
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
assert_trace '{"f"=>nil}', pdef
|
|
@@ -164,9 +164,8 @@ class EftSetTest < Test::Unit::TestCase
|
|
|
164
164
|
end
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
@
|
|
168
|
-
|
|
169
|
-
@tracer << "\n"
|
|
167
|
+
@dashboard.register_participant :alpha do |workitem|
|
|
168
|
+
tracer << workitem.fields['f'] + "\n"
|
|
170
169
|
end
|
|
171
170
|
|
|
172
171
|
#noisy
|
|
@@ -219,12 +218,12 @@ class EftSetTest < Test::Unit::TestCase
|
|
|
219
218
|
|
|
220
219
|
#noisy
|
|
221
220
|
|
|
222
|
-
wfid = @
|
|
221
|
+
wfid = @dashboard.launch(pdef)
|
|
223
222
|
|
|
224
223
|
wait_for(wfid)
|
|
225
224
|
|
|
226
|
-
assert_nil @
|
|
227
|
-
assert_nil @
|
|
225
|
+
assert_nil @dashboard.process(wfid)
|
|
226
|
+
assert_nil @dashboard.variables['v']
|
|
228
227
|
end
|
|
229
228
|
|
|
230
229
|
# 'rset' is an alias for 'set'.
|
|
@@ -233,13 +232,113 @@ class EftSetTest < Test::Unit::TestCase
|
|
|
233
232
|
#
|
|
234
233
|
def test_rset
|
|
235
234
|
|
|
236
|
-
wfid = @
|
|
235
|
+
wfid = @dashboard.launch(Ruote.define do
|
|
237
236
|
rset 'developer' => 'Rebo'
|
|
238
237
|
end)
|
|
239
238
|
|
|
240
|
-
r = @
|
|
239
|
+
r = @dashboard.wait_for(wfid)
|
|
241
240
|
|
|
242
241
|
assert_equal 'Rebo', r['workitem']['fields']['developer']
|
|
243
242
|
end
|
|
243
|
+
|
|
244
|
+
def test_unset_field
|
|
245
|
+
|
|
246
|
+
pdef = Ruote.define do
|
|
247
|
+
|
|
248
|
+
set 'f:alpha' => 'alice'
|
|
249
|
+
set 'f:bravo' => 'bob'
|
|
250
|
+
set 'f:charly' => 'charles'
|
|
251
|
+
set 'f:__timed_out__' => %w[ seriously ]
|
|
252
|
+
set 'f:delta' => { 'echo' => 'e', 'foxtrott' => 'f' }
|
|
253
|
+
|
|
254
|
+
unset 'f:alpha'
|
|
255
|
+
unset :f => 'bravo'
|
|
256
|
+
unset :field => 'charly'
|
|
257
|
+
unset :field => '__timed_out__'
|
|
258
|
+
unset 'f:delta.echo'
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
wfid = @dashboard.launch(pdef)
|
|
262
|
+
|
|
263
|
+
r = @dashboard.wait_for(wfid)
|
|
264
|
+
|
|
265
|
+
assert_equal(
|
|
266
|
+
{ '__result__' => 'e', 'delta' => { 'foxtrott' => 'f' } },
|
|
267
|
+
r['workitem']['fields'])
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
class VarPeek
|
|
271
|
+
include Ruote::LocalParticipant
|
|
272
|
+
def consume
|
|
273
|
+
context.tracer << fexp.compile_variables.inspect
|
|
274
|
+
reply
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def test_unset_var
|
|
279
|
+
|
|
280
|
+
pdef = Ruote.define do
|
|
281
|
+
set 'v:v0' => 'nada'
|
|
282
|
+
set 'v:v1' => 'nada'
|
|
283
|
+
unset 'v:v0'
|
|
284
|
+
unset :v => 'v1'
|
|
285
|
+
peek
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
@dashboard.register :peek, VarPeek
|
|
289
|
+
|
|
290
|
+
#@dashboard.noisy = true
|
|
291
|
+
|
|
292
|
+
wfid = @dashboard.launch(pdef)
|
|
293
|
+
|
|
294
|
+
r = @dashboard.wait_for(wfid)
|
|
295
|
+
|
|
296
|
+
assert_equal '{}', @tracer.to_s
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def test_set_sets_return_field
|
|
300
|
+
|
|
301
|
+
pdef = Ruote.define do
|
|
302
|
+
set 'v:v0' => 'nada'
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
wfid = @dashboard.launch(pdef)
|
|
306
|
+
r = @dashboard.wait_for(wfid)
|
|
307
|
+
|
|
308
|
+
assert_equal 'nada', r['workitem']['fields']['__result__']
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def test_set_picks_latest
|
|
312
|
+
|
|
313
|
+
pdef = Ruote.define do
|
|
314
|
+
set 'f0' do
|
|
315
|
+
set 'v:v0' => '1'
|
|
316
|
+
set 'v:v1' => '2'
|
|
317
|
+
set 'f1' => '${v:v0}${v:v1}'
|
|
318
|
+
end
|
|
319
|
+
echo '${f0}/${v:v0}'
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
#@dashboard.noisy = true
|
|
323
|
+
|
|
324
|
+
wfid = @dashboard.launch(pdef)
|
|
325
|
+
r = @dashboard.wait_for(wfid)
|
|
326
|
+
|
|
327
|
+
assert_equal '12', r['workitem']['fields']['f0']
|
|
328
|
+
assert_equal '12/', @tracer.to_s
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def test_set_if
|
|
332
|
+
|
|
333
|
+
pdef = Ruote.define do
|
|
334
|
+
set 'f:x' => '${v:v_r}', :if => '${v:v_r}'
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
wfid = @dashboard.launch(pdef)
|
|
338
|
+
r = @dashboard.wait_for(wfid)
|
|
339
|
+
|
|
340
|
+
assert_equal('terminated', r['action'])
|
|
341
|
+
assert_equal({}, r['workitem']['fields'])
|
|
342
|
+
end
|
|
244
343
|
end
|
|
245
344
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Wed May 20 17:08:17 JST 2009
|
|
6
6
|
#
|
|
7
7
|
|
|
8
|
-
require File.
|
|
8
|
+
require File.expand_path('../base', __FILE__)
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class EftSubprocessTest < Test::Unit::TestCase
|
|
@@ -96,7 +96,7 @@ class EftSubprocessTest < Test::Unit::TestCase
|
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
@
|
|
99
|
+
@dashboard.register_participant :alpha do |workitem, fexp|
|
|
100
100
|
stash[:tree] = fexp.lookup_variable('tree')
|
|
101
101
|
end
|
|
102
102
|
|
|
@@ -134,13 +134,14 @@ class EftSubprocessTest < Test::Unit::TestCase
|
|
|
134
134
|
|
|
135
135
|
#noisy
|
|
136
136
|
|
|
137
|
-
wfid = @
|
|
137
|
+
wfid = @dashboard.launch(pdef)
|
|
138
138
|
|
|
139
139
|
wait_for(wfid)
|
|
140
140
|
|
|
141
141
|
assert_equal(
|
|
142
142
|
"#<RuntimeError: no subprocess named 'nada' found>",
|
|
143
|
-
|
|
143
|
+
#"#<RuntimeError: unknown participant or subprocess 'nada'>",
|
|
144
|
+
@dashboard.process(wfid).errors.first.message)
|
|
144
145
|
end
|
|
145
146
|
|
|
146
147
|
def test_subprocess_in_engine_variable
|
|
@@ -152,11 +153,32 @@ class EftSubprocessTest < Test::Unit::TestCase
|
|
|
152
153
|
end
|
|
153
154
|
end
|
|
154
155
|
|
|
155
|
-
@
|
|
156
|
+
@dashboard.variables['sub0'] = Ruote.process_definition do
|
|
156
157
|
echo 'in sub0'
|
|
157
158
|
end
|
|
158
159
|
|
|
159
160
|
assert_trace "in sub0\ndone.", pdef
|
|
160
161
|
end
|
|
162
|
+
|
|
163
|
+
def test_atts_to_fields
|
|
164
|
+
|
|
165
|
+
pdef = Ruote.define do
|
|
166
|
+
set 'address' => { 'city' => 'boston' }
|
|
167
|
+
subprocess(
|
|
168
|
+
'sub0',
|
|
169
|
+
'f:a' => 'fa',
|
|
170
|
+
'field:b' => 'mi',
|
|
171
|
+
'var:c' => 'sol',
|
|
172
|
+
'f:address.city' => 'nyc')
|
|
173
|
+
define 'sub0' do
|
|
174
|
+
echo '${a} ${b} ${v:c} ${address.city}'
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
wfid = @dashboard.launch(pdef)
|
|
179
|
+
@dashboard.wait_for(wfid)
|
|
180
|
+
|
|
181
|
+
assert_equal 'fa mi sol nyc', @tracer.to_s
|
|
182
|
+
end
|
|
161
183
|
end
|
|
162
184
|
|
|
@@ -5,9 +5,7 @@
|
|
|
5
5
|
# Thu Jun 11 15:24:47 JST 2009
|
|
6
6
|
#
|
|
7
7
|
|
|
8
|
-
require File.
|
|
9
|
-
|
|
10
|
-
#require 'ruote/part/hash_participant'
|
|
8
|
+
require File.expand_path('../base', __FILE__)
|
|
11
9
|
|
|
12
10
|
|
|
13
11
|
class EftConcurrenceTest < Test::Unit::TestCase
|
|
@@ -22,15 +20,40 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
22
20
|
end
|
|
23
21
|
end
|
|
24
22
|
|
|
25
|
-
@
|
|
26
|
-
|
|
23
|
+
@dashboard.register_participant :alpha do
|
|
24
|
+
tracer << "alpha\n"
|
|
27
25
|
end
|
|
28
26
|
|
|
29
|
-
#noisy
|
|
30
|
-
|
|
31
27
|
assert_trace %w[ alpha alpha ], pdef
|
|
32
28
|
end
|
|
33
29
|
|
|
30
|
+
def test_empty
|
|
31
|
+
|
|
32
|
+
pdef = Ruote.process_definition do
|
|
33
|
+
concurrence do
|
|
34
|
+
end
|
|
35
|
+
echo 'done.'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
assert_trace %w[ done. ], pdef
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_accidental_empty
|
|
42
|
+
|
|
43
|
+
@dashboard.register_participant :nada do
|
|
44
|
+
tracer << "nada\n"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
pdef = Ruote.process_definition do
|
|
48
|
+
concurrence do
|
|
49
|
+
nada :if => false
|
|
50
|
+
end
|
|
51
|
+
echo 'done.'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
assert_trace %w[ done. ], pdef
|
|
55
|
+
end
|
|
56
|
+
|
|
34
57
|
def test_over_if
|
|
35
58
|
|
|
36
59
|
pdef = Ruote.process_definition do
|
|
@@ -42,35 +65,88 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
42
65
|
bravo
|
|
43
66
|
end
|
|
44
67
|
|
|
45
|
-
|
|
46
|
-
@count = 0
|
|
47
|
-
end
|
|
48
|
-
# since block participants are evaluated in the context context
|
|
68
|
+
stash[:count] = 0
|
|
49
69
|
|
|
50
|
-
alpha = @
|
|
51
|
-
wi.fields['seen'] = 'indeed' if
|
|
52
|
-
|
|
53
|
-
|
|
70
|
+
alpha = @dashboard.register :alpha, 'do_not_thread' => true do |wi|
|
|
71
|
+
wi.fields['seen'] = 'indeed' if stash[:count] == 1
|
|
72
|
+
tracer << "alpha\n"
|
|
73
|
+
stash[:count] += 1
|
|
54
74
|
nil
|
|
55
75
|
end
|
|
56
76
|
|
|
57
|
-
@
|
|
77
|
+
@dashboard.register_participant :bravo do |workitem|
|
|
58
78
|
stash[:fields] = workitem.fields
|
|
59
79
|
nil
|
|
60
80
|
end
|
|
61
81
|
|
|
62
|
-
#noisy
|
|
63
|
-
|
|
64
82
|
assert_trace(%w[ alpha ] * 3, pdef)
|
|
65
83
|
|
|
66
84
|
#assert_equal(
|
|
67
85
|
# {'1'=>{"seen"=>"indeed"}, '0'=>{}, "params"=>{"ref"=>"bravo"}},
|
|
68
86
|
# fields)
|
|
69
87
|
|
|
70
|
-
params = @
|
|
88
|
+
params = @dashboard.context.stash[:fields].delete('params')
|
|
71
89
|
|
|
72
90
|
assert_equal({ 'ref' => 'bravo' }, params)
|
|
73
|
-
assert_match /seen/, @
|
|
91
|
+
assert_match /seen/, @dashboard.context.stash[:fields].inspect
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_over_if__remaining_cancel
|
|
95
|
+
|
|
96
|
+
@dashboard.register 'alpha', Ruote::StorageParticipant
|
|
97
|
+
|
|
98
|
+
pdef = Ruote.define do
|
|
99
|
+
concurrence :over_if => '${seen}' do
|
|
100
|
+
alpha
|
|
101
|
+
alpha
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
wfid = @dashboard.launch(pdef)
|
|
106
|
+
|
|
107
|
+
@dashboard.wait_for('dispatched')
|
|
108
|
+
|
|
109
|
+
wi = @dashboard.storage_participant.first
|
|
110
|
+
|
|
111
|
+
wi.fields['seen'] = true
|
|
112
|
+
@dashboard.storage_participant.proceed(wi)
|
|
113
|
+
|
|
114
|
+
@dashboard.wait_for('dispatch_cancel')
|
|
115
|
+
sleep 0.350
|
|
116
|
+
|
|
117
|
+
assert_equal 0, @dashboard.storage_participant.size
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_over_if__post
|
|
121
|
+
|
|
122
|
+
@dashboard.register :alpha do |workitem|
|
|
123
|
+
tracer << "alpha\n"
|
|
124
|
+
workitem.fields['ok'] = 'yes'
|
|
125
|
+
end
|
|
126
|
+
@dashboard.register :bravo do |workitem|
|
|
127
|
+
sleep 0.5
|
|
128
|
+
tracer << "bravo\n"
|
|
129
|
+
end
|
|
130
|
+
@dashboard.register :zulu do |workitem|
|
|
131
|
+
tracer << "zulu\n"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
pdef = Ruote.define do
|
|
135
|
+
set 'f:ok' => 'no'
|
|
136
|
+
concurrence :over_if => '${f:ok} == yes' do
|
|
137
|
+
#concurrence :over_if => '${f:ok} == yes', :merge_type => 'mix' do
|
|
138
|
+
alpha
|
|
139
|
+
bravo :if => 'false'
|
|
140
|
+
end
|
|
141
|
+
zulu :if => '${f:ok} == yes'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
wfid = @dashboard.launch(pdef)
|
|
145
|
+
r = @dashboard.wait_for(wfid)
|
|
146
|
+
|
|
147
|
+
assert_equal 'terminated', r['action']
|
|
148
|
+
assert_equal 'yes', r['workitem']['fields']['ok']
|
|
149
|
+
assert_equal %w[ alpha zulu ], @tracer.to_a
|
|
74
150
|
end
|
|
75
151
|
|
|
76
152
|
def test_over_unless
|
|
@@ -85,28 +161,23 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
85
161
|
echo 'done.'
|
|
86
162
|
end
|
|
87
163
|
|
|
88
|
-
|
|
89
|
-
@count = 0
|
|
90
|
-
end
|
|
91
|
-
# since block participants are evaluated in the context context
|
|
164
|
+
stash[:count] = 0
|
|
92
165
|
|
|
93
|
-
alpha = @
|
|
94
|
-
if
|
|
166
|
+
alpha = @dashboard.register :alpha, 'do_not_thread' => true do |wi|
|
|
167
|
+
if stash[:count] > 1
|
|
95
168
|
wi.fields['ok'] = false
|
|
96
169
|
else
|
|
97
|
-
|
|
98
|
-
|
|
170
|
+
tracer << "a\n"
|
|
171
|
+
stash[:count] += 1
|
|
99
172
|
end
|
|
100
173
|
end
|
|
101
174
|
|
|
102
175
|
fields = nil
|
|
103
176
|
|
|
104
|
-
@
|
|
177
|
+
@dashboard.register_participant :bravo do |workitem|
|
|
105
178
|
fields = workitem.fields
|
|
106
179
|
end
|
|
107
180
|
|
|
108
|
-
#noisy
|
|
109
|
-
|
|
110
181
|
assert_trace(%w[ a a done. ], pdef)
|
|
111
182
|
end
|
|
112
183
|
|
|
@@ -120,8 +191,6 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
120
191
|
echo 'done.'
|
|
121
192
|
end
|
|
122
193
|
|
|
123
|
-
#noisy
|
|
124
|
-
|
|
125
194
|
assert_trace %w[ a b done. ], %w[ b a done. ], pdef
|
|
126
195
|
end
|
|
127
196
|
|
|
@@ -139,11 +208,11 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
139
208
|
alpha
|
|
140
209
|
end
|
|
141
210
|
|
|
142
|
-
alpha = @
|
|
211
|
+
alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
|
|
143
212
|
|
|
144
213
|
noisy if noise
|
|
145
214
|
|
|
146
|
-
wfid = @
|
|
215
|
+
wfid = @dashboard.launch(pdef)
|
|
147
216
|
|
|
148
217
|
wait_for(:alpha)
|
|
149
218
|
wait_for(:alpha)
|
|
@@ -151,14 +220,14 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
151
220
|
2.times do
|
|
152
221
|
wi = alpha.first
|
|
153
222
|
wi.fields['seen'] = wi.fei.expid
|
|
154
|
-
alpha.
|
|
223
|
+
alpha.proceed(wi)
|
|
155
224
|
end
|
|
156
225
|
|
|
157
226
|
wait_for(:alpha)
|
|
158
227
|
|
|
159
228
|
wi = alpha.first
|
|
160
229
|
|
|
161
|
-
ps = @
|
|
230
|
+
ps = @dashboard.process(wi.fei.wfid)
|
|
162
231
|
assert_equal %w[ 0 0_1 ], ps.expressions.collect { |e| e.fei.expid }.sort
|
|
163
232
|
|
|
164
233
|
wi
|
|
@@ -217,15 +286,15 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
217
286
|
end
|
|
218
287
|
end
|
|
219
288
|
|
|
220
|
-
@
|
|
289
|
+
@dashboard.register_participant '.+', Ruote::StorageParticipant
|
|
221
290
|
|
|
222
291
|
noisy if noise
|
|
223
292
|
|
|
224
|
-
wfid = @
|
|
293
|
+
wfid = @dashboard.launch(pdef)
|
|
225
294
|
|
|
226
295
|
wait_for(:alpha)
|
|
227
296
|
|
|
228
|
-
@
|
|
297
|
+
@dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
|
|
229
298
|
|
|
230
299
|
wait_for(wfid)
|
|
231
300
|
|
|
@@ -234,8 +303,6 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
234
303
|
|
|
235
304
|
def test_count
|
|
236
305
|
|
|
237
|
-
#noisy
|
|
238
|
-
|
|
239
306
|
wfid = run_test_count('cancel', false)
|
|
240
307
|
|
|
241
308
|
#puts
|
|
@@ -245,31 +312,47 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
245
312
|
|
|
246
313
|
sleep 0.350 # since now dispatch_cancel occurs asynchronously...
|
|
247
314
|
|
|
248
|
-
assert_equal 0, @
|
|
315
|
+
assert_equal 0, @dashboard.storage_participant.size
|
|
249
316
|
end
|
|
250
317
|
|
|
251
318
|
def test_count_remaining_forget
|
|
252
319
|
|
|
253
|
-
#noisy
|
|
254
|
-
|
|
255
320
|
wfid = run_test_count('forget', false)
|
|
256
321
|
|
|
257
322
|
#assert_equal 1, logger.log.select { |e| e['action'] == 'forget' }.size
|
|
258
323
|
|
|
259
|
-
assert_equal 1, @
|
|
260
|
-
assert_equal 'bravo', @
|
|
324
|
+
assert_equal 1, @dashboard.storage_participant.size
|
|
325
|
+
assert_equal 'bravo', @dashboard.storage_participant.first.participant_name
|
|
261
326
|
|
|
262
|
-
#@
|
|
263
|
-
#puts @
|
|
264
|
-
assert_equal 2, @
|
|
265
|
-
assert_not_nil @
|
|
327
|
+
#@dashboard.context.storage.get_many('expressions').each { |e| p e['fei'] }
|
|
328
|
+
#puts @dashboard.context.storage.dump('expressions')
|
|
329
|
+
assert_equal 2, @dashboard.context.storage.get_many('expressions').size
|
|
330
|
+
assert_not_nil @dashboard.process(wfid)
|
|
266
331
|
|
|
267
|
-
@
|
|
332
|
+
@dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
|
|
268
333
|
|
|
269
334
|
wait_for(wfid)
|
|
270
335
|
|
|
271
|
-
@
|
|
272
|
-
assert_equal 0, @
|
|
336
|
+
@dashboard.context.storage.get_many('expressions').each { |e| p e['fei'] }
|
|
337
|
+
assert_equal 0, @dashboard.context.storage.get_many('expressions').size
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def test_count_negative
|
|
341
|
+
|
|
342
|
+
pdef = Ruote.define do
|
|
343
|
+
concurrence :mt => 'mix', :c => -1 do # all but 1
|
|
344
|
+
set 'a' => 1
|
|
345
|
+
set 'b' => 2
|
|
346
|
+
set 'c' => 3
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
wfid = @dashboard.launch(pdef)
|
|
351
|
+
r = @dashboard.wait_for(wfid)
|
|
352
|
+
|
|
353
|
+
assert_equal 1, r['workitem']['fields']['a']
|
|
354
|
+
assert_equal 2, r['workitem']['fields']['b']
|
|
355
|
+
assert_equal nil, r['workitem']['fields']['c']
|
|
273
356
|
end
|
|
274
357
|
|
|
275
358
|
def test_cancel
|
|
@@ -281,24 +364,180 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
281
364
|
end
|
|
282
365
|
end
|
|
283
366
|
|
|
284
|
-
alpha = @
|
|
367
|
+
alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
|
|
285
368
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
wfid = @engine.launch(pdef)
|
|
369
|
+
wfid = @dashboard.launch(pdef)
|
|
289
370
|
|
|
290
371
|
wait_for(:alpha)
|
|
291
372
|
wait_for(:alpha)
|
|
292
373
|
|
|
293
374
|
assert_equal 2, alpha.size
|
|
294
375
|
|
|
295
|
-
@
|
|
376
|
+
@dashboard.cancel_process(wfid)
|
|
296
377
|
|
|
297
378
|
wait_for(wfid)
|
|
298
379
|
|
|
299
|
-
ps = @
|
|
380
|
+
ps = @dashboard.process(wfid)
|
|
300
381
|
|
|
301
382
|
assert_nil ps
|
|
302
383
|
end
|
|
384
|
+
|
|
385
|
+
#
|
|
386
|
+
# 'wait_for' tests
|
|
387
|
+
|
|
388
|
+
# 'wait_for => 1' is equivalent to 'count => 1'
|
|
389
|
+
#
|
|
390
|
+
def test_wait_for_int
|
|
391
|
+
|
|
392
|
+
pdef = Ruote.define do
|
|
393
|
+
concurrence :wait_for => 1 do
|
|
394
|
+
sequence do
|
|
395
|
+
stall
|
|
396
|
+
echo 'alpha'
|
|
397
|
+
end
|
|
398
|
+
echo 'bravo'
|
|
399
|
+
end
|
|
400
|
+
echo 'over.'
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
wfid = @dashboard.launch(pdef)
|
|
404
|
+
|
|
405
|
+
@dashboard.wait_for(wfid)
|
|
406
|
+
|
|
407
|
+
assert_equal %w[ bravo over. ], @tracer.to_a
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def test_wait_for_zero
|
|
411
|
+
|
|
412
|
+
pdef = Ruote.define do
|
|
413
|
+
concurrence :wait_for => 0, :remaining => :forget do
|
|
414
|
+
sequence do
|
|
415
|
+
wait '5s'
|
|
416
|
+
echo 'alpha'
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
echo 'over.'
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
wfid = @dashboard.launch(pdef)
|
|
423
|
+
|
|
424
|
+
@dashboard.wait_for(wfid)
|
|
425
|
+
|
|
426
|
+
assert_equal %w[ over. ], @tracer.to_a
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
def test_wait_for_tags
|
|
430
|
+
|
|
431
|
+
pdef = Ruote.define do
|
|
432
|
+
concurrence :wait_for => 'azuma, bashamichi', :merge_type => 'concat' do
|
|
433
|
+
sequence :tag => 'azuma' do
|
|
434
|
+
set 'seen' => [ 'azuma' ]
|
|
435
|
+
end
|
|
436
|
+
sequence :tag => 'bashamichi' do
|
|
437
|
+
set 'seen' => [ 'bashamichi' ]
|
|
438
|
+
end
|
|
439
|
+
sequence :tag => 'katou' do
|
|
440
|
+
set 'seen' => [ 'katou' ]
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
wfid = @dashboard.launch(pdef)
|
|
446
|
+
|
|
447
|
+
r = @dashboard.wait_for(wfid)
|
|
448
|
+
|
|
449
|
+
assert_equal %w[ azuma bashamichi ], r['workitem']['fields']['seen'].sort
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def test_wait_for_tags_array
|
|
453
|
+
|
|
454
|
+
pdef = Ruote.define do
|
|
455
|
+
concurrence :wait_for => %w[ azuma bashamichi ], :mt => 'concat' do
|
|
456
|
+
sequence :tag => 'azuma' do
|
|
457
|
+
set 'seen' => [ 'azuma' ]
|
|
458
|
+
end
|
|
459
|
+
sequence :tag => 'bashamichi' do
|
|
460
|
+
set 'seen' => [ 'bashamichi' ]
|
|
461
|
+
end
|
|
462
|
+
sequence :tag => 'katou' do
|
|
463
|
+
set 'seen' => [ 'katou' ]
|
|
464
|
+
wait '5s'
|
|
465
|
+
end
|
|
466
|
+
end
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
wfid = @dashboard.launch(pdef)
|
|
470
|
+
|
|
471
|
+
r = @dashboard.wait_for(wfid)
|
|
472
|
+
|
|
473
|
+
assert_equal %w[ azuma bashamichi ], r['workitem']['fields']['seen'].sort
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
def test_wait_for_one_tag
|
|
477
|
+
|
|
478
|
+
@dashboard.register do
|
|
479
|
+
administrator do |workitem|
|
|
480
|
+
tracer << "administrator\n"
|
|
481
|
+
sleep 0.7
|
|
482
|
+
end
|
|
483
|
+
evaluator Ruote::NullParticipant
|
|
484
|
+
#evaluator Ruote::NoOpParticipant
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
pdef = Ruote.process_definition do
|
|
488
|
+
concurrence :wait_for => 'first' do
|
|
489
|
+
sequence :tag => 'first' do
|
|
490
|
+
administrator
|
|
491
|
+
end
|
|
492
|
+
sequence :tag => 'second' do
|
|
493
|
+
evaluator
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
echo 'done.'
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
wfid = @dashboard.launch(pdef)
|
|
500
|
+
|
|
501
|
+
r = @dashboard.wait_for(wfid)
|
|
502
|
+
|
|
503
|
+
assert_equal 'terminated', r['action']
|
|
504
|
+
assert_equal "administrator\ndone.", @tracer.to_s
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
def test_wait_for_unknown_tag
|
|
508
|
+
|
|
509
|
+
pdef = Ruote.define do
|
|
510
|
+
concurrence :wait_for => 'nada' do
|
|
511
|
+
echo 'a'
|
|
512
|
+
echo 'b'
|
|
513
|
+
end
|
|
514
|
+
echo 'c'
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
wfid = @dashboard.launch(pdef)
|
|
518
|
+
r = @dashboard.wait_for(wfid)
|
|
519
|
+
|
|
520
|
+
assert_equal 'ceased', r['action']
|
|
521
|
+
assert_equal %w[ a b ], @tracer.to_a.sort
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
def test_remaining_wait
|
|
525
|
+
|
|
526
|
+
pdef = Ruote.define do
|
|
527
|
+
concurrence :count => 1, :rem => 'wait', :mt => 'mix' do
|
|
528
|
+
set 'a' => true
|
|
529
|
+
sequence do
|
|
530
|
+
set 'b' => true
|
|
531
|
+
stall
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
wfid = @dashboard.launch(pdef); r = @dashboard.wait_for(wfid)
|
|
537
|
+
|
|
538
|
+
assert_equal(
|
|
539
|
+
{ 'a' => true, 'b' => true, '__result__' => true },
|
|
540
|
+
r['workitem']['fields'])
|
|
541
|
+
end
|
|
303
542
|
end
|
|
304
543
|
|