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
|
# Mon Jan 24 11:11:43 JST 2011
|
|
6
6
|
#
|
|
7
7
|
|
|
8
|
-
require File.
|
|
8
|
+
require File.expand_path('../base', __FILE__)
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class FtDefaultHistoryTest < Test::Unit::TestCase
|
|
@@ -13,25 +13,30 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
|
|
|
13
13
|
|
|
14
14
|
def test_engine_has_history
|
|
15
15
|
|
|
16
|
-
assert_not_nil @
|
|
17
|
-
assert_not_nil @
|
|
16
|
+
assert_not_nil @dashboard.context.history
|
|
17
|
+
assert_not_nil @dashboard.history
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def launch_processes(clear=true)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
if clear
|
|
23
|
+
@dashboard.history.clear!
|
|
24
|
+
sleep 0.050
|
|
25
|
+
@dashboard.history.clear!
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@dashboard.register_participant 'alpha', Ruote::NullParticipant
|
|
23
29
|
|
|
24
|
-
@
|
|
30
|
+
#puts; @dashboard.noisy = true
|
|
25
31
|
|
|
26
32
|
pdef = Ruote.define do
|
|
27
33
|
alpha
|
|
28
34
|
end
|
|
29
35
|
|
|
30
|
-
wfids = 2.times.collect { @
|
|
36
|
+
wfids = 2.times.collect { @dashboard.launch(pdef) }
|
|
31
37
|
|
|
32
|
-
@
|
|
33
|
-
@
|
|
34
|
-
sleep 0.700
|
|
38
|
+
@dashboard.wait_for('dispatched')
|
|
39
|
+
@dashboard.wait_for('dispatched')
|
|
35
40
|
|
|
36
41
|
wfids
|
|
37
42
|
end
|
|
@@ -42,33 +47,33 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
|
|
|
42
47
|
|
|
43
48
|
wfids = launch_processes
|
|
44
49
|
|
|
45
|
-
assert_equal 9, @
|
|
50
|
+
assert_equal 9, @dashboard.history.reject { |m| m['action'] == 'noop' }.size
|
|
46
51
|
end
|
|
47
52
|
|
|
48
53
|
def test_by_wfid
|
|
49
54
|
|
|
50
55
|
wfids = launch_processes
|
|
51
56
|
|
|
52
|
-
assert_equal 4, @
|
|
53
|
-
assert_not_nil @
|
|
57
|
+
assert_equal 4, @dashboard.history.by_wfid(wfids[0]).size
|
|
58
|
+
assert_not_nil @dashboard.history.by_wfid(wfids[0]).first['seen_at']
|
|
54
59
|
|
|
55
|
-
assert_equal 4, @
|
|
60
|
+
assert_equal 4, @dashboard.history.by_wfid(wfids[1]).size
|
|
56
61
|
end
|
|
57
62
|
|
|
58
63
|
def test_clear!
|
|
59
64
|
|
|
60
65
|
launch_processes
|
|
61
66
|
|
|
62
|
-
assert_equal 9, @
|
|
67
|
+
assert_equal 9, @dashboard.history.reject { |m| m['action'] == 'noop' }.size
|
|
63
68
|
|
|
64
|
-
@
|
|
69
|
+
@dashboard.history.clear!
|
|
65
70
|
|
|
66
|
-
assert_equal 0, @
|
|
71
|
+
assert_equal 0, @dashboard.history.all.size
|
|
67
72
|
end
|
|
68
73
|
|
|
69
74
|
def test_default_range
|
|
70
75
|
|
|
71
|
-
range = @
|
|
76
|
+
range = @dashboard.history.range
|
|
72
77
|
|
|
73
78
|
assert_equal Time, range[0].class
|
|
74
79
|
assert_equal range[0], range[1]
|
|
@@ -80,7 +85,7 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
|
|
|
80
85
|
sleep 1
|
|
81
86
|
launch_processes(false)
|
|
82
87
|
|
|
83
|
-
range = @
|
|
88
|
+
range = @dashboard.history.range
|
|
84
89
|
|
|
85
90
|
assert_not_equal range[0], range[1]
|
|
86
91
|
assert range[0] < range[1]
|
|
@@ -90,20 +95,27 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
|
|
|
90
95
|
|
|
91
96
|
launch_processes
|
|
92
97
|
|
|
93
|
-
@
|
|
98
|
+
@dashboard.history.all.each { |msg| msg['seen_at'] = '1970-12-25' }
|
|
94
99
|
|
|
95
100
|
launch_processes(false)
|
|
96
101
|
|
|
97
|
-
assert_equal
|
|
98
|
-
|
|
99
|
-
|
|
102
|
+
assert_equal(
|
|
103
|
+
18,
|
|
104
|
+
@dashboard.history.reject { |m|
|
|
105
|
+
m['action'] == 'noop'
|
|
106
|
+
}.size)
|
|
107
|
+
assert_equal(
|
|
108
|
+
9,
|
|
109
|
+
@dashboard.history.by_date(Time.now.utc).reject { |m|
|
|
110
|
+
m['action'] == 'noop'
|
|
111
|
+
}.size)
|
|
100
112
|
end
|
|
101
113
|
|
|
102
114
|
def test_wfids
|
|
103
115
|
|
|
104
116
|
wfids = launch_processes
|
|
105
117
|
|
|
106
|
-
assert_equal wfids.sort, @
|
|
118
|
+
assert_equal wfids.sort, @dashboard.history.wfids
|
|
107
119
|
end
|
|
108
120
|
end
|
|
109
121
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Qcon Tokyo, special day
|
|
8
8
|
#
|
|
9
9
|
|
|
10
|
-
require File.
|
|
10
|
+
require File.expand_path('../base', __FILE__)
|
|
11
11
|
|
|
12
12
|
require 'ruote/part/local_participant'
|
|
13
13
|
|
|
@@ -15,6 +15,42 @@ require 'ruote/part/local_participant'
|
|
|
15
15
|
class FtParticipantMoreTest < Test::Unit::TestCase
|
|
16
16
|
include FunctionalBase
|
|
17
17
|
|
|
18
|
+
#
|
|
19
|
+
# tests about reject / re_dispatch
|
|
20
|
+
|
|
21
|
+
def test_re_dispatch_count_is_initially_zero
|
|
22
|
+
|
|
23
|
+
@dashboard.register { catchall }
|
|
24
|
+
|
|
25
|
+
wfid = @dashboard.launch(Ruote.define { alpha })
|
|
26
|
+
r = @dashboard.wait_for(:alpha)
|
|
27
|
+
|
|
28
|
+
assert_equal 0, r['workitem']['re_dispatch_count']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class CountingParticipant
|
|
32
|
+
include Ruote::LocalParticipant
|
|
33
|
+
def on_workitem
|
|
34
|
+
context.tracer << "#{workitem.re_dispatch_count}\n"
|
|
35
|
+
if workitem.re_dispatch_count < 5
|
|
36
|
+
re_dispatch
|
|
37
|
+
else
|
|
38
|
+
reply
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_re_dispatch_count_is_incremented_at_each_re_dispatch
|
|
44
|
+
|
|
45
|
+
@dashboard.register { counter CountingParticipant }
|
|
46
|
+
|
|
47
|
+
wfid = @dashboard.launch(Ruote.define { counter })
|
|
48
|
+
|
|
49
|
+
@dashboard.wait_for(wfid)
|
|
50
|
+
|
|
51
|
+
assert_equal %w[ 0 1 2 3 4 5 ], @tracer.to_a
|
|
52
|
+
end
|
|
53
|
+
|
|
18
54
|
class DifficultParticipant
|
|
19
55
|
include Ruote::LocalParticipant
|
|
20
56
|
def initialize(opts)
|
|
@@ -38,13 +74,55 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
38
74
|
alpha
|
|
39
75
|
end
|
|
40
76
|
|
|
41
|
-
@
|
|
42
|
-
|
|
43
|
-
#noisy
|
|
77
|
+
@dashboard.register_participant :alpha, DifficultParticipant
|
|
44
78
|
|
|
45
79
|
assert_trace(%w[ diff diff ], pdef)
|
|
46
80
|
end
|
|
47
81
|
|
|
82
|
+
# https://groups.google.com/d/topic/openwferu-users/_k-VIQwMvXw/discussion
|
|
83
|
+
#
|
|
84
|
+
def test_re_dispatch_outside_of_participant
|
|
85
|
+
|
|
86
|
+
@dashboard.register :alpha, Ruote::StorageParticipant
|
|
87
|
+
|
|
88
|
+
pdef = Ruote.process_definition do
|
|
89
|
+
alpha
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
wfid = @dashboard.launch(pdef)
|
|
93
|
+
r = @dashboard.wait_for('dispatched')
|
|
94
|
+
|
|
95
|
+
wi = @dashboard.storage_participant.first
|
|
96
|
+
|
|
97
|
+
@dashboard.storage_participant.re_dispatch(wi, :in => '100')
|
|
98
|
+
|
|
99
|
+
sleep 10
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
class ReluctantParticipant
|
|
103
|
+
include Ruote::LocalParticipant
|
|
104
|
+
def initialize(opts)
|
|
105
|
+
end
|
|
106
|
+
def consume(workitem)
|
|
107
|
+
context.tracer << "x\n"
|
|
108
|
+
if workitem.fields['re_dispatched'].nil?
|
|
109
|
+
workitem.fields['re_dispatched'] = true
|
|
110
|
+
re_dispatch
|
|
111
|
+
else
|
|
112
|
+
reply_to_engine(workitem)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Reject and re_dispatch are aliases.
|
|
118
|
+
#
|
|
119
|
+
def test_participant_re_dispatch_no_params
|
|
120
|
+
|
|
121
|
+
@dashboard.register_participant :alpha, ReluctantParticipant
|
|
122
|
+
|
|
123
|
+
assert_trace(%w[ x x ], Ruote.define { alpha })
|
|
124
|
+
end
|
|
125
|
+
|
|
48
126
|
class FightingParticipant
|
|
49
127
|
include Ruote::LocalParticipant
|
|
50
128
|
def initialize(opts)
|
|
@@ -61,15 +139,13 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
61
139
|
end
|
|
62
140
|
end
|
|
63
141
|
|
|
64
|
-
# Reject and re_dispatch are aliases.
|
|
65
|
-
#
|
|
66
142
|
def test_participant_re_dispatch
|
|
67
143
|
|
|
68
144
|
pdef = Ruote.process_definition do
|
|
69
145
|
alpha
|
|
70
146
|
end
|
|
71
147
|
|
|
72
|
-
@
|
|
148
|
+
@dashboard.register_participant :alpha, FightingParticipant
|
|
73
149
|
|
|
74
150
|
#noisy
|
|
75
151
|
|
|
@@ -96,8 +172,6 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
96
172
|
end
|
|
97
173
|
end
|
|
98
174
|
|
|
99
|
-
# Reject and re_dispatch are aliases.
|
|
100
|
-
#
|
|
101
175
|
# re_dispatch with an :in or an :at parameter makes sure the dispatch is
|
|
102
176
|
# performed once more, but a bit later (:in / :at timepoint).
|
|
103
177
|
#
|
|
@@ -107,18 +181,16 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
107
181
|
alpha
|
|
108
182
|
end
|
|
109
183
|
|
|
110
|
-
@
|
|
111
|
-
|
|
112
|
-
#noisy
|
|
184
|
+
@dashboard.register_participant :alpha, RetryParticipant
|
|
113
185
|
|
|
114
|
-
wfid = @
|
|
186
|
+
wfid = @dashboard.launch(pdef)
|
|
115
187
|
wait_for(wfid)
|
|
116
188
|
|
|
117
189
|
times = @tracer.to_s.split("\n").collect { |t| Float(t) }
|
|
118
190
|
t = times.last - times.first
|
|
119
191
|
|
|
120
192
|
assert t >= 1.0, "took less that 1 second"
|
|
121
|
-
assert t < 2.
|
|
193
|
+
assert t < 2.8, "took more than 2.8 second"
|
|
122
194
|
end
|
|
123
195
|
|
|
124
196
|
# Making sure that when a process gets cancelled, its 'later' re-dispatches
|
|
@@ -130,19 +202,22 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
130
202
|
alpha
|
|
131
203
|
end
|
|
132
204
|
|
|
133
|
-
@
|
|
205
|
+
@dashboard.register_participant :alpha, RetryParticipant, 'delay' => '1m'
|
|
134
206
|
|
|
135
207
|
#noisy
|
|
136
208
|
|
|
137
|
-
wfid = @
|
|
209
|
+
wfid = @dashboard.launch(pdef)
|
|
138
210
|
sleep 0.7
|
|
139
211
|
|
|
140
|
-
@
|
|
212
|
+
@dashboard.cancel_process(wfid)
|
|
141
213
|
wait_for(wfid)
|
|
142
214
|
|
|
143
|
-
assert_equal 0, @
|
|
215
|
+
assert_equal 0, @dashboard.storage.get_many('schedules').size
|
|
144
216
|
end
|
|
145
217
|
|
|
218
|
+
#
|
|
219
|
+
# tests about stash_put and stash_get
|
|
220
|
+
|
|
146
221
|
BLACKBOARD = {}
|
|
147
222
|
|
|
148
223
|
class StashingParticipant
|
|
@@ -150,11 +225,12 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
150
225
|
def initialize(opts)
|
|
151
226
|
end
|
|
152
227
|
def consume(workitem)
|
|
153
|
-
put(
|
|
228
|
+
put('token0' => workitem.params['token0'])
|
|
229
|
+
put('token1', workitem.params['token1'])
|
|
154
230
|
end
|
|
155
231
|
def cancel(fei, flavour)
|
|
156
|
-
BLACKBOARD['
|
|
157
|
-
BLACKBOARD['all'] = get
|
|
232
|
+
BLACKBOARD['token0'] = get('token0')
|
|
233
|
+
BLACKBOARD['all'] = get
|
|
158
234
|
end
|
|
159
235
|
end
|
|
160
236
|
|
|
@@ -166,28 +242,109 @@ class FtParticipantMoreTest < Test::Unit::TestCase
|
|
|
166
242
|
BLACKBOARD.clear
|
|
167
243
|
|
|
168
244
|
pdef = Ruote.process_definition do
|
|
169
|
-
alpha :
|
|
245
|
+
alpha :token0 => 'of esteem', :token1 => 'of whatever'
|
|
170
246
|
end
|
|
171
247
|
|
|
172
|
-
@
|
|
248
|
+
@dashboard.register_participant :alpha, StashingParticipant
|
|
173
249
|
|
|
174
|
-
|
|
250
|
+
#@dashboard.noisy = true
|
|
175
251
|
|
|
176
|
-
wfid = @
|
|
252
|
+
wfid = @dashboard.launch(pdef)
|
|
177
253
|
wait_for(:alpha)
|
|
254
|
+
wait_for(1)
|
|
178
255
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
ps = @engine.process(wfid)
|
|
256
|
+
ps = @dashboard.process(wfid)
|
|
182
257
|
fexp = ps.expressions.find { |e| e.fei.expid == '0_0' }
|
|
183
258
|
|
|
184
|
-
assert_equal(
|
|
259
|
+
assert_equal(
|
|
260
|
+
{ 'token0' => 'of esteem', 'token1' => 'of whatever' },
|
|
261
|
+
fexp.h.stash)
|
|
185
262
|
|
|
186
|
-
@
|
|
263
|
+
@dashboard.cancel_process(wfid)
|
|
187
264
|
wait_for(wfid)
|
|
188
265
|
|
|
189
|
-
assert_equal(
|
|
190
|
-
|
|
266
|
+
assert_equal(
|
|
267
|
+
'of esteem',
|
|
268
|
+
BLACKBOARD['token0'])
|
|
269
|
+
assert_equal(
|
|
270
|
+
{ 'token0' => 'of esteem', 'token1' => 'of whatever' },
|
|
271
|
+
BLACKBOARD['all'])
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
class Doubtful
|
|
275
|
+
include Ruote::LocalParticipant
|
|
276
|
+
|
|
277
|
+
def on_workitem
|
|
278
|
+
context.tracer << "canceled:#{is_canceled?}\n"
|
|
279
|
+
context.tracer << "gone:#{is_gone?}\n"
|
|
280
|
+
sleep 5
|
|
281
|
+
context.tracer << "cancelled:#{is_cancelled?}\n"
|
|
282
|
+
context.tracer << "gone:#{is_gone?}\n"
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def on_cancel
|
|
286
|
+
# nothing
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def test_is_cancelled
|
|
291
|
+
|
|
292
|
+
@dashboard.register :alpha, Doubtful
|
|
293
|
+
|
|
294
|
+
pdef = Ruote.define do
|
|
295
|
+
alpha
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
#@dashboard.noisy = true
|
|
299
|
+
|
|
300
|
+
wfid = @dashboard.launch(pdef)
|
|
301
|
+
|
|
302
|
+
@dashboard.wait_for(:alpha)
|
|
303
|
+
sleep 1.0 # making sure on_workitem reaches its sleep
|
|
304
|
+
|
|
305
|
+
@dashboard.cancel(@dashboard.ps(wfid).expressions.last)
|
|
306
|
+
|
|
307
|
+
@dashboard.wait_for(wfid)
|
|
308
|
+
|
|
309
|
+
sleep 10
|
|
310
|
+
|
|
311
|
+
assert_equal(
|
|
312
|
+
%w[ canceled:false gone:false cancelled:true gone:true ],
|
|
313
|
+
@tracer.to_a)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
class Robust
|
|
317
|
+
include Ruote::LocalParticipant
|
|
318
|
+
|
|
319
|
+
def on_workitem
|
|
320
|
+
context.tracer << "on_workitem\n"
|
|
321
|
+
sleep 5
|
|
322
|
+
workitem.fields['toto'] = 'seen'
|
|
323
|
+
reply
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def on_cancel
|
|
327
|
+
context.tracer << "on_cancel\n"
|
|
328
|
+
false
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
def test_on_cancel_returning_false
|
|
333
|
+
|
|
334
|
+
@dashboard.register :rob, Robust
|
|
335
|
+
|
|
336
|
+
#@dashboard.noisy = true
|
|
337
|
+
|
|
338
|
+
wfid = @dashboard.launch(Ruote.define { rob })
|
|
339
|
+
|
|
340
|
+
@dashboard.wait_for(:rob)
|
|
341
|
+
|
|
342
|
+
@dashboard.cancel(@dashboard.ps(wfid).expressions.last)
|
|
343
|
+
|
|
344
|
+
r = @dashboard.wait_for(wfid)
|
|
345
|
+
|
|
346
|
+
assert_equal 'seen', r['workitem']['fields']['toto']
|
|
347
|
+
assert_equal %w[ on_cancel on_workitem ], @tracer.to_a.sort
|
|
191
348
|
end
|
|
192
349
|
end
|
|
193
350
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Tue Apr 20 12:32:44 JST 2010
|
|
6
6
|
#
|
|
7
7
|
|
|
8
|
-
require File.
|
|
8
|
+
require File.expand_path('../base', __FILE__)
|
|
9
9
|
|
|
10
10
|
require 'ruote/part/storage_participant'
|
|
11
11
|
|
|
@@ -19,17 +19,17 @@ class FtWaitForTest < Test::Unit::TestCase
|
|
|
19
19
|
alpha
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
sp = @
|
|
22
|
+
sp = @dashboard.register_participant :alpha, Ruote::StorageParticipant
|
|
23
23
|
|
|
24
24
|
#noisy
|
|
25
25
|
|
|
26
|
-
wfid = @
|
|
26
|
+
wfid = @dashboard.launch(pdef)
|
|
27
27
|
|
|
28
28
|
r = wait_for(:alpha)
|
|
29
29
|
|
|
30
30
|
assert_equal(
|
|
31
31
|
Ruote::Workitem,
|
|
32
|
-
@
|
|
32
|
+
@dashboard.workitem(Ruote.sid(r['fei'])).class)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
class MyParticipant
|
|
@@ -48,17 +48,17 @@ class FtWaitForTest < Test::Unit::TestCase
|
|
|
48
48
|
alpha
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
@
|
|
51
|
+
@dashboard.register_participant :alpha, MyParticipant
|
|
52
52
|
|
|
53
53
|
4.times do
|
|
54
|
-
@
|
|
54
|
+
@dashboard.launch(pdef)
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
#noisy
|
|
58
58
|
|
|
59
|
-
@
|
|
59
|
+
@dashboard.wait_for(:empty)
|
|
60
60
|
|
|
61
|
-
assert_equal [], @
|
|
61
|
+
assert_equal [], @dashboard.processes
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def test_wait_for_multiple
|
|
@@ -66,18 +66,18 @@ class FtWaitForTest < Test::Unit::TestCase
|
|
|
66
66
|
pdef0 = Ruote.process_definition { alpha }
|
|
67
67
|
pdef1 = Ruote.process_definition { bravo }
|
|
68
68
|
|
|
69
|
-
@
|
|
69
|
+
@dashboard.register_participant :alpha, MyParticipant
|
|
70
70
|
|
|
71
71
|
#noisy
|
|
72
72
|
|
|
73
73
|
wfids = []
|
|
74
74
|
|
|
75
|
-
2.times { wfids << @
|
|
76
|
-
2.times { wfids << @
|
|
75
|
+
2.times { wfids << @dashboard.launch(pdef0) }
|
|
76
|
+
2.times { wfids << @dashboard.launch(pdef1) }
|
|
77
77
|
|
|
78
|
-
@
|
|
78
|
+
@dashboard.wait_for(*wfids)
|
|
79
79
|
|
|
80
|
-
assert_equal 2, @
|
|
80
|
+
assert_equal 2, @dashboard.processes.size
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
def test_wait_for_inactive
|
|
@@ -85,52 +85,52 @@ class FtWaitForTest < Test::Unit::TestCase
|
|
|
85
85
|
pdef0 = Ruote.process_definition { alpha }
|
|
86
86
|
pdef1 = Ruote.process_definition { bravo }
|
|
87
87
|
|
|
88
|
-
@
|
|
88
|
+
@dashboard.register_participant :alpha, MyParticipant
|
|
89
89
|
|
|
90
90
|
#noisy
|
|
91
91
|
|
|
92
92
|
wfids = []
|
|
93
93
|
|
|
94
|
-
2.times { @
|
|
95
|
-
2.times { wfids << @
|
|
94
|
+
2.times { @dashboard.launch(pdef0) }
|
|
95
|
+
2.times { wfids << @dashboard.launch(pdef1) }
|
|
96
96
|
|
|
97
|
-
@
|
|
97
|
+
@dashboard.wait_for(:inactive)
|
|
98
98
|
|
|
99
|
-
assert_equal wfids.sort, @
|
|
99
|
+
assert_equal wfids.sort, @dashboard.processes.collect { |ps| ps.wfid }.sort
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
def test_wait_for_multithreaded
|
|
103
103
|
|
|
104
104
|
pdef = Ruote.process_definition { alpha }
|
|
105
105
|
|
|
106
|
-
sp = @
|
|
106
|
+
sp = @dashboard.register_participant :alpha, Ruote::StorageParticipant
|
|
107
107
|
|
|
108
108
|
#noisy
|
|
109
109
|
|
|
110
|
-
wfid = @
|
|
110
|
+
wfid = @dashboard.launch(pdef)
|
|
111
111
|
|
|
112
112
|
seen = []
|
|
113
113
|
threads = []
|
|
114
114
|
|
|
115
115
|
threads << Thread.new do
|
|
116
|
-
@
|
|
116
|
+
@dashboard.wait_for(wfid)
|
|
117
117
|
seen << 'this'
|
|
118
118
|
end
|
|
119
119
|
threads << Thread.new do
|
|
120
|
-
@
|
|
120
|
+
@dashboard.wait_for(wfid)
|
|
121
121
|
seen << 'that'
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
-
@
|
|
124
|
+
@dashboard.wait_for(:alpha)
|
|
125
125
|
|
|
126
|
-
sp.
|
|
126
|
+
sp.proceed(sp.first)
|
|
127
127
|
|
|
128
128
|
threads.each do |t|
|
|
129
129
|
t.join
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
assert_equal %w[ that this ], seen.sort
|
|
133
|
-
assert_equal [], @
|
|
133
|
+
assert_equal [], @dashboard.context.logger.instance_variable_get(:@waiting)
|
|
134
134
|
end
|
|
135
135
|
end
|
|
136
136
|
|