ruote 2.1.11 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +60 -0
- data/CREDITS.txt +22 -4
- data/LICENSE.txt +1 -1
- data/README.rdoc +6 -7
- data/Rakefile +58 -59
- data/TODO.txt +137 -65
- data/couch_url.txt +1 -0
- data/jruby_issue.txt +32 -0
- data/lib/ruote.rb +1 -1
- data/lib/ruote/context.rb +12 -10
- data/lib/ruote/engine.rb +280 -145
- data/lib/ruote/engine/process_error.rb +5 -5
- data/lib/ruote/engine/process_status.rb +47 -28
- data/lib/ruote/exp/command.rb +7 -10
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +130 -43
- data/lib/ruote/exp/fe_add_branches.rb +2 -2
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_cancel_process.rb +3 -3
- data/lib/ruote/exp/fe_command.rb +3 -3
- data/lib/ruote/exp/fe_concurrence.rb +4 -4
- data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
- data/lib/ruote/exp/fe_cron.rb +3 -3
- data/lib/ruote/exp/fe_cursor.rb +5 -5
- data/lib/ruote/exp/fe_define.rb +3 -3
- data/lib/ruote/exp/fe_echo.rb +3 -3
- data/lib/ruote/exp/fe_equals.rb +2 -2
- data/lib/ruote/exp/fe_error.rb +2 -2
- data/lib/ruote/exp/fe_filter.rb +519 -0
- data/lib/ruote/exp/fe_forget.rb +9 -2
- data/lib/ruote/exp/fe_given.rb +154 -0
- data/lib/ruote/exp/fe_if.rb +16 -13
- data/lib/ruote/exp/fe_inc.rb +3 -3
- data/lib/ruote/exp/fe_iterator.rb +4 -4
- data/lib/ruote/exp/fe_let.rb +75 -0
- data/lib/ruote/exp/fe_listen.rb +68 -12
- data/lib/ruote/exp/fe_lose.rb +110 -0
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
- data/lib/ruote/exp/fe_participant.rb +14 -17
- data/lib/ruote/exp/fe_redo.rb +10 -6
- data/lib/ruote/exp/fe_ref.rb +1 -1
- data/lib/ruote/exp/fe_registerp.rb +112 -0
- data/lib/ruote/exp/fe_reserve.rb +3 -3
- data/lib/ruote/exp/fe_restore.rb +2 -2
- data/lib/ruote/exp/fe_save.rb +2 -2
- data/lib/ruote/exp/fe_sequence.rb +3 -4
- data/lib/ruote/exp/fe_set.rb +16 -7
- data/lib/ruote/exp/fe_subprocess.rb +23 -1
- data/lib/ruote/exp/fe_that.rb +92 -0
- data/lib/ruote/exp/fe_undo.rb +3 -3
- data/lib/ruote/exp/fe_unregisterp.rb +71 -0
- data/lib/ruote/exp/fe_wait.rb +2 -2
- data/lib/ruote/exp/flowexpression.rb +153 -78
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +2 -2
- data/lib/ruote/exp/ro_attributes.rb +14 -12
- data/lib/ruote/exp/ro_filters.rb +136 -0
- data/lib/ruote/exp/ro_persist.rb +51 -35
- data/lib/ruote/exp/ro_variables.rb +18 -27
- data/lib/ruote/fei.rb +73 -33
- data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
- data/lib/ruote/id/wfid_generator.rb +11 -4
- data/lib/ruote/log/default_history.rb +122 -0
- data/lib/ruote/log/pretty.rb +36 -8
- data/lib/ruote/log/storage_history.rb +37 -5
- data/lib/ruote/log/test_logger.rb +26 -24
- data/lib/ruote/log/wait_logger.rb +5 -3
- data/lib/ruote/part/block_participant.rb +22 -11
- data/lib/ruote/part/engine_participant.rb +6 -7
- data/lib/ruote/part/local_participant.rb +6 -12
- data/lib/ruote/part/no_op_participant.rb +4 -4
- data/lib/ruote/part/null_participant.rb +4 -4
- data/lib/ruote/part/smtp_participant.rb +4 -4
- data/lib/ruote/part/storage_participant.rb +40 -20
- data/lib/ruote/part/template.rb +4 -4
- data/lib/ruote/participant.rb +0 -1
- data/lib/ruote/{parser.rb → reader.rb} +30 -25
- data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
- data/lib/ruote/{parser → reader}/xml.rb +6 -5
- data/lib/ruote/receiver/base.rb +35 -13
- data/lib/ruote/storage/base.rb +20 -18
- data/lib/ruote/storage/composite_storage.rb +10 -10
- data/lib/ruote/storage/fs_storage.rb +17 -10
- data/lib/ruote/storage/hash_storage.rb +29 -18
- data/lib/ruote/svc/dispatch_pool.rb +41 -14
- data/lib/ruote/svc/dollar_sub.rb +50 -17
- data/lib/ruote/svc/error_handler.rb +19 -11
- data/lib/ruote/svc/expression_map.rb +4 -4
- data/lib/ruote/svc/participant_list.rb +105 -100
- data/lib/ruote/svc/tracker.rb +58 -18
- data/lib/ruote/svc/treechecker.rb +51 -24
- data/lib/ruote/tree_dot.rb +4 -4
- data/lib/ruote/util/filter.rb +440 -0
- data/lib/ruote/util/hashdot.rb +4 -4
- data/lib/ruote/util/look.rb +2 -6
- data/lib/ruote/util/lookup.rb +9 -7
- data/lib/ruote/util/misc.rb +40 -8
- data/lib/ruote/util/ometa.rb +1 -1
- data/lib/ruote/util/serializer.rb +4 -4
- data/lib/ruote/util/subprocess.rb +29 -9
- data/lib/ruote/util/time.rb +4 -4
- data/lib/ruote/util/tree.rb +3 -3
- data/lib/ruote/version.rb +2 -2
- data/lib/ruote/worker.rb +55 -32
- data/lib/ruote/workitem.rb +64 -11
- data/ruote.gemspec +31 -302
- data/test/bm/launch_bench.rb +37 -0
- data/test/functional/base.rb +60 -18
- data/test/functional/concurrent_base.rb +2 -2
- data/test/functional/ct_0_concurrence.rb +1 -1
- data/test/functional/ct_1_iterator.rb +1 -1
- data/test/functional/ct_2_cancel.rb +1 -1
- data/test/functional/eft_0_process_definition.rb +2 -2
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +19 -11
- data/test/functional/eft_12_listen.rb +79 -13
- data/test/functional/eft_13_iterator.rb +13 -10
- data/test/functional/eft_14_cursor.rb +98 -9
- data/test/functional/eft_15_loop.rb +6 -4
- data/test/functional/eft_16_if.rb +12 -0
- data/test/functional/eft_18_concurrent_iterator.rb +31 -32
- data/test/functional/eft_19_reserve.rb +4 -4
- data/test/functional/eft_1_echo.rb +9 -0
- data/test/functional/eft_20_save.rb +4 -4
- data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
- data/test/functional/eft_30_ref.rb +17 -2
- data/test/functional/eft_31_registerp.rb +130 -0
- data/test/functional/eft_32_lose.rb +93 -0
- data/test/functional/eft_33_let.rb +31 -0
- data/test/functional/eft_34_given.rb +123 -0
- data/test/functional/eft_35_filter.rb +269 -0
- data/test/functional/eft_3_participant.rb +4 -6
- data/test/functional/eft_4_set.rb +16 -2
- data/test/functional/eft_5_subprocess.rb +2 -4
- data/test/functional/eft_6_concurrence.rb +29 -29
- data/test/functional/eft_8_undo.rb +39 -3
- data/test/functional/eft_9_redo.rb +94 -2
- data/test/functional/ft_10_dollar.rb +81 -2
- data/test/functional/ft_11_recursion.rb +13 -17
- data/test/functional/ft_12_launchitem.rb +9 -5
- data/test/functional/ft_13_variables.rb +7 -9
- data/test/functional/ft_14_re_apply.rb +6 -9
- data/test/functional/ft_15_timeout.rb +18 -18
- data/test/functional/ft_16_participant_params.rb +1 -3
- data/test/functional/ft_17_conditional.rb +25 -2
- data/test/functional/ft_18_kill.rb +65 -12
- data/test/functional/ft_1_process_status.rb +147 -71
- data/test/functional/ft_20_storage_participant.rb +0 -1
- data/test/functional/ft_21_forget.rb +82 -1
- data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
- data/test/functional/ft_25_receiver.rb +47 -17
- data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
- data/test/functional/ft_29_part_template.rb +6 -5
- data/test/functional/ft_2_errors.rb +21 -37
- data/test/functional/ft_30_smtp_participant.rb +1 -1
- data/test/functional/ft_31_part_blocking.rb +8 -6
- data/test/functional/ft_34_cursor_rewind.rb +13 -10
- data/test/functional/ft_35_add_service.rb +1 -1
- data/test/functional/ft_36_storage_history.rb +24 -1
- data/test/functional/ft_37_default_history.rb +109 -0
- data/test/functional/ft_38_participant_more.rb +10 -10
- data/test/functional/ft_39_wait_for.rb +12 -9
- data/test/functional/ft_3_participant_registration.rb +111 -32
- data/test/functional/ft_40_wait_logger.rb +2 -1
- data/test/functional/ft_41_participants.rb +30 -4
- data/test/functional/ft_43_participant_on_reply.rb +6 -23
- data/test/functional/ft_45_participant_accept.rb +4 -4
- data/test/functional/ft_46_launch_single.rb +36 -2
- data/test/functional/ft_47_wfid_generator.rb +54 -0
- data/test/functional/ft_48_lose.rb +112 -0
- data/test/functional/ft_49_engine_on_error.rb +201 -0
- data/test/functional/ft_4_cancel.rb +66 -6
- data/test/functional/ft_50_engine_config.rb +22 -0
- data/test/functional/ft_51_misc.rb +67 -0
- data/test/functional/ft_52_case.rb +134 -0
- data/test/functional/ft_53_engine_on_terminate.rb +95 -0
- data/test/functional/ft_54_patterns.rb +104 -0
- data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
- data/test/functional/ft_56_filter_attribute.rb +259 -0
- data/test/functional/ft_5_on_error.rb +77 -30
- data/test/functional/ft_6_on_cancel.rb +66 -11
- data/test/functional/ft_7_tags.rb +94 -5
- data/test/functional/ft_8_participant_consumption.rb +36 -5
- data/test/functional/ft_9_subprocesses.rb +10 -10
- data/test/functional/rt_1_listen.rb +3 -3
- data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
- data/test/functional/storage_helper.rb +15 -13
- data/test/functional/test.rb +1 -3
- data/test/test_helper.rb +0 -8
- data/test/unit/storage.rb +154 -10
- data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
- data/test/unit/ut_11_lookup.rb +7 -0
- data/test/unit/ut_13_serializer.rb +1 -1
- data/test/unit/ut_15_util.rb +23 -0
- data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
- data/test/unit/ut_1_fei.rb +57 -10
- data/test/unit/ut_20_composite_storage.rb +25 -11
- data/test/unit/ut_21_participant_list.rb +47 -0
- data/test/unit/ut_22_filter.rb +903 -0
- data/test/unit/ut_3_wait_logger.rb +2 -6
- data/test/unit/ut_6_condition.rb +164 -17
- data/test/unit/ut_7_workitem.rb +28 -0
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
- metadata +108 -84
- data/.gitignore +0 -4
- data/examples/barley.rb +0 -391
- data/examples/flickr_report.rb +0 -107
- data/examples/pong.rb +0 -37
- data/examples/ruote_quickstart.rb +0 -43
- data/examples/web_first_page.rb +0 -68
- data/lib/ruote/part/hash_participant.rb +0 -91
- data/test/README.rdoc +0 -15
- data/test/functional/crunner.sh +0 -19
- data/test/pdef.xml +0 -7
- data/test/unit/ut_2_wfidgen.rb +0 -21
@@ -7,8 +7,6 @@
|
|
7
7
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
9
9
|
|
10
|
-
require 'ruote/part/hash_participant'
|
11
|
-
|
12
10
|
|
13
11
|
class FtTimeoutTest < Test::Unit::TestCase
|
14
12
|
include FunctionalBase
|
@@ -22,20 +20,21 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
|
-
|
26
|
-
|
23
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
24
|
+
sto = @engine.register_participant :bravo, Ruote::StorageParticipant
|
27
25
|
|
28
26
|
#noisy
|
29
27
|
|
30
28
|
wfid = @engine.launch(pdef)
|
31
29
|
wait_for(:bravo)
|
32
30
|
|
33
|
-
assert_equal
|
34
|
-
assert_equal
|
31
|
+
assert_equal 1, sto.size
|
32
|
+
assert_equal 'bravo', sto.first.participant_name
|
33
|
+
|
35
34
|
assert_equal 2, logger.log.select { |e| e['flavour'] == 'timeout' }.size
|
36
35
|
assert_equal 0, @engine.storage.get_many('schedules').size
|
37
36
|
|
38
|
-
assert_not_nil
|
37
|
+
assert_not_nil sto.first.fields['__timed_out__']
|
39
38
|
end
|
40
39
|
|
41
40
|
def test_cancel_timeout
|
@@ -47,22 +46,23 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
|
-
|
51
|
-
|
49
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
50
|
+
sto = @engine.register_participant :bravo, Ruote::StorageParticipant
|
52
51
|
|
53
52
|
#noisy
|
54
53
|
|
55
54
|
wfid = @engine.launch(pdef)
|
56
55
|
wait_for(6)
|
57
56
|
|
58
|
-
assert_equal 1,
|
57
|
+
assert_equal 1, sto.size
|
58
|
+
assert_equal 'alpha', sto.first.participant_name
|
59
59
|
|
60
|
-
@engine.cancel_expression(
|
60
|
+
@engine.cancel_expression(sto.first.fei)
|
61
61
|
|
62
62
|
wait_for(:bravo)
|
63
63
|
|
64
|
-
assert_equal
|
65
|
-
assert_equal
|
64
|
+
assert_equal 1, sto.size
|
65
|
+
assert_equal 'bravo', sto.first.participant_name
|
66
66
|
assert_equal 0, @engine.storage.get_many('schedules').size
|
67
67
|
end
|
68
68
|
|
@@ -82,7 +82,7 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
82
82
|
alpha :timeout => '1.1', :on_timeout => 'redo'
|
83
83
|
end
|
84
84
|
|
85
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
85
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
86
86
|
|
87
87
|
#noisy
|
88
88
|
|
@@ -113,7 +113,7 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
116
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
117
117
|
|
118
118
|
#noisy
|
119
119
|
|
@@ -132,7 +132,7 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
132
132
|
alpha :timeout => '1.1', :on_timeout => 'error'
|
133
133
|
end
|
134
134
|
|
135
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
135
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
136
136
|
|
137
137
|
#noisy
|
138
138
|
|
@@ -161,7 +161,7 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
164
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
165
165
|
|
166
166
|
wfid = @engine.launch(pdef)
|
167
167
|
wait_for(wfid)
|
@@ -203,7 +203,7 @@ class FtTimeoutTest < Test::Unit::TestCase
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
206
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
207
207
|
|
208
208
|
#noisy
|
209
209
|
|
@@ -7,8 +7,6 @@
|
|
7
7
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
9
9
|
|
10
|
-
require 'ruote/part/hash_participant'
|
11
|
-
|
12
10
|
|
13
11
|
class FtParticipantParamsTest < Test::Unit::TestCase
|
14
12
|
include FunctionalBase
|
@@ -23,7 +21,7 @@ class FtParticipantParamsTest < Test::Unit::TestCase
|
|
23
21
|
end
|
24
22
|
end
|
25
23
|
|
26
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
24
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
27
25
|
|
28
26
|
#noisy
|
29
27
|
|
@@ -45,11 +45,12 @@ class FtConditionalTest < Test::Unit::TestCase
|
|
45
45
|
echo 'a', :if => '${f:d}'
|
46
46
|
echo 'b', :if => '${f:d} == some dude'
|
47
47
|
echo 'c', :if => "${f:d} == 'some dude'"
|
48
|
-
echo 'd', :if =>
|
48
|
+
echo 'd', :if => "${f:d} == ${'f:d}"
|
49
|
+
echo 'e', :if => '${f:d} is set'
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
52
|
-
assert_trace("some dude\na\
|
53
|
+
assert_trace("some dude\na\nc\nd\ne", pdef)
|
53
54
|
end
|
54
55
|
|
55
56
|
def test_unless
|
@@ -72,5 +73,27 @@ class FtConditionalTest < Test::Unit::TestCase
|
|
72
73
|
|
73
74
|
assert_trace(%w[ other u . ], { 'f' => 'other' }, pdef)
|
74
75
|
end
|
76
|
+
|
77
|
+
def test_and_or
|
78
|
+
|
79
|
+
pdef = Ruote.process_definition do
|
80
|
+
|
81
|
+
set 'f:t' => true
|
82
|
+
set 'f:f' => false
|
83
|
+
|
84
|
+
sequence do
|
85
|
+
|
86
|
+
echo '${f:t}/${f:f}'
|
87
|
+
|
88
|
+
echo 'a', :if => '${f:t}'
|
89
|
+
echo 'b', :if => '${f:t} or ${f:f}'
|
90
|
+
echo 'c', :if => '${f:t} and ${f:f}'
|
91
|
+
echo 'd', :if => '${f:t} and (${f:t} or ${f:f})'
|
92
|
+
echo 'e', :if => '${f:t} and (${f:t} and ${f:f})'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
assert_trace(%w[ true/false a b d ], pdef)
|
97
|
+
end
|
75
98
|
end
|
76
99
|
|
@@ -7,8 +7,6 @@
|
|
7
7
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
9
9
|
|
10
|
-
require 'ruote/part/hash_participant'
|
11
|
-
|
12
10
|
|
13
11
|
class FtKillTest < Test::Unit::TestCase
|
14
12
|
include FunctionalBase
|
@@ -19,7 +17,7 @@ class FtKillTest < Test::Unit::TestCase
|
|
19
17
|
alpha
|
20
18
|
end
|
21
19
|
|
22
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
20
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
23
21
|
|
24
22
|
#noisy
|
25
23
|
|
@@ -46,8 +44,8 @@ class FtKillTest < Test::Unit::TestCase
|
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
49
|
-
|
50
|
-
|
47
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
48
|
+
sto = @engine.register_participant :catcher, Ruote::StorageParticipant
|
51
49
|
|
52
50
|
wfid = @engine.launch(pdef)
|
53
51
|
wait_for(:alpha)
|
@@ -56,8 +54,7 @@ class FtKillTest < Test::Unit::TestCase
|
|
56
54
|
|
57
55
|
wait_for(wfid)
|
58
56
|
|
59
|
-
assert_equal 0,
|
60
|
-
assert_equal 0, catcher.size
|
57
|
+
assert_equal 0, sto.size
|
61
58
|
end
|
62
59
|
|
63
60
|
def test_kill_expression_does_not_trigger_on_cancel
|
@@ -68,18 +65,74 @@ class FtKillTest < Test::Unit::TestCase
|
|
68
65
|
end
|
69
66
|
end
|
70
67
|
|
71
|
-
|
72
|
-
|
68
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
69
|
+
sto = @engine.register_participant :catcher, Ruote::StorageParticipant
|
73
70
|
|
74
71
|
wfid = @engine.launch(pdef)
|
75
72
|
wait_for(:alpha)
|
76
73
|
|
77
|
-
@engine.kill_expression(
|
74
|
+
@engine.kill_expression(sto.first.fei)
|
78
75
|
|
79
76
|
wait_for(wfid)
|
80
77
|
|
81
|
-
assert_equal 0,
|
82
|
-
|
78
|
+
assert_equal 0, sto.size
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_kill__expression
|
82
|
+
|
83
|
+
pdef = Ruote.process_definition do
|
84
|
+
alpha
|
85
|
+
end
|
86
|
+
|
87
|
+
@engine.register_participant :alpha, Ruote::NullParticipant
|
88
|
+
|
89
|
+
#noisy
|
90
|
+
|
91
|
+
wfid = @engine.launch(pdef)
|
92
|
+
|
93
|
+
@engine.wait_for(:alpha)
|
94
|
+
|
95
|
+
@engine.kill(wfid)
|
96
|
+
|
97
|
+
@engine.wait_for(wfid)
|
98
|
+
|
99
|
+
assert_nil @engine.process(wfid)
|
100
|
+
|
101
|
+
assert_equal 1, logger.log.select { |e| e['action'] == 'kill_process' }.size
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_kill__process
|
105
|
+
|
106
|
+
pdef = Ruote.process_definition do
|
107
|
+
alpha
|
108
|
+
echo '0'
|
109
|
+
alpha
|
110
|
+
echo '1'
|
111
|
+
alpha
|
112
|
+
echo '2'
|
113
|
+
end
|
114
|
+
|
115
|
+
@engine.register_participant :alpha, Ruote::NullParticipant
|
116
|
+
|
117
|
+
wfid = @engine.launch(pdef)
|
118
|
+
|
119
|
+
r = @engine.wait_for(:alpha)
|
120
|
+
|
121
|
+
@engine.kill(r['fei']) # fei as a Hash
|
122
|
+
|
123
|
+
r = @engine.wait_for(:alpha)
|
124
|
+
|
125
|
+
@engine.kill(Ruote.sid(r['fei'])) # fei as a String
|
126
|
+
|
127
|
+
r = @engine.wait_for(:alpha)
|
128
|
+
|
129
|
+
@engine.kill(Ruote::Workitem.new(r['workitem'])) # fei as workitem
|
130
|
+
|
131
|
+
@engine.wait_for(wfid)
|
132
|
+
|
133
|
+
assert_equal %w[ 0 1 2 ], @tracer.to_a
|
134
|
+
|
135
|
+
assert_equal 6, logger.log.select { |e| e['flavour'] == 'kill' }.size
|
83
136
|
end
|
84
137
|
end
|
85
138
|
|
@@ -13,7 +13,7 @@ require 'ruote/participant'
|
|
13
13
|
class FtProcessStatusTest < Test::Unit::TestCase
|
14
14
|
include FunctionalBase
|
15
15
|
|
16
|
-
def
|
16
|
+
def test_process
|
17
17
|
|
18
18
|
pdef = Ruote.process_definition :name => 'my process' do
|
19
19
|
participant :ref => 'alpha'
|
@@ -21,7 +21,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
21
21
|
|
22
22
|
#noisy
|
23
23
|
|
24
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
24
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
25
25
|
|
26
26
|
wfid = @engine.launch(pdef, :workitem => { 'kilroy' => 'was here' })
|
27
27
|
|
@@ -47,7 +47,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
50
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
51
51
|
wfid = @engine.launch(pdef, :workitem => { 'kilroy' => 'was here' })
|
52
52
|
|
53
53
|
wait_for(:alpha)
|
@@ -93,7 +93,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
96
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
97
97
|
wfid = @engine.launch(pdef)
|
98
98
|
|
99
99
|
wait_for(:alpha)
|
@@ -145,7 +145,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
148
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
149
149
|
wfid = @engine.launch(pdef)
|
150
150
|
|
151
151
|
wait_for(:alpha)
|
@@ -169,41 +169,6 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
169
169
|
ps.original_tree)
|
170
170
|
end
|
171
171
|
|
172
|
-
def test_sub_processes
|
173
|
-
|
174
|
-
pdef = Ruote.process_definition do
|
175
|
-
define 'sub0' do
|
176
|
-
alpha
|
177
|
-
end
|
178
|
-
sequence do
|
179
|
-
sub0
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
alpha = @engine.register_participant :alpha, Ruote::HashParticipant.new
|
184
|
-
|
185
|
-
#noisy
|
186
|
-
|
187
|
-
wfid = @engine.launch(pdef)
|
188
|
-
|
189
|
-
wait_for(:alpha)
|
190
|
-
|
191
|
-
assert_equal wfid, alpha.first.fei.wfid
|
192
|
-
assert_not_nil alpha.first.fei.sub_wfid
|
193
|
-
|
194
|
-
ps = @engine.process(wfid)
|
195
|
-
|
196
|
-
#ps.expressions.each { |e| puts e.fei.to_s }
|
197
|
-
|
198
|
-
assert_equal 5, ps.expressions.size
|
199
|
-
|
200
|
-
wfids = ps.expressions.collect { |e|
|
201
|
-
[ e.fei.wfid, e.fei.sub_wfid ].join('|')
|
202
|
-
}.sort.uniq
|
203
|
-
|
204
|
-
assert_equal 2, wfids.size
|
205
|
-
end
|
206
|
-
|
207
172
|
def test_all_variables
|
208
173
|
|
209
174
|
pdef = Ruote.process_definition do
|
@@ -219,7 +184,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
219
184
|
end
|
220
185
|
end
|
221
186
|
|
222
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
187
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
223
188
|
|
224
189
|
#noisy
|
225
190
|
|
@@ -249,7 +214,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
249
214
|
end
|
250
215
|
end
|
251
216
|
|
252
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
217
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
253
218
|
|
254
219
|
#noisy
|
255
220
|
|
@@ -258,7 +223,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
258
223
|
|
259
224
|
ps = @engine.process(wfid)
|
260
225
|
|
261
|
-
assert_equal
|
226
|
+
assert_equal %w[ main part ], ps.tags.keys.sort
|
262
227
|
|
263
228
|
assert_equal 2, ps.all_tags.size
|
264
229
|
assert_kind_of Array, ps.all_tags['main']
|
@@ -278,7 +243,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
278
243
|
end
|
279
244
|
end
|
280
245
|
|
281
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
246
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
282
247
|
|
283
248
|
#noisy
|
284
249
|
|
@@ -299,7 +264,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
299
264
|
|
300
265
|
#noisy
|
301
266
|
|
302
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
267
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
303
268
|
|
304
269
|
wfid0 = @engine.launch(pdef)
|
305
270
|
wfid1 = @engine.launch(pdef)
|
@@ -315,6 +280,50 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
315
280
|
assert_equal 2, alpha.size
|
316
281
|
end
|
317
282
|
|
283
|
+
def test_processes_and_leftovers
|
284
|
+
|
285
|
+
n = 3
|
286
|
+
|
287
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
288
|
+
|
289
|
+
n.times.collect { @engine.launch(Ruote.define { alpha }) }
|
290
|
+
|
291
|
+
while @engine.storage_participant.size < n; sleep 0.100; end
|
292
|
+
sleep 0.100
|
293
|
+
|
294
|
+
@engine.ps(@engine.storage_participant.first.wfid).expressions.each do |exp|
|
295
|
+
@engine.storage.delete(exp.h)
|
296
|
+
end
|
297
|
+
# nuking all the expressions of a process instance
|
298
|
+
|
299
|
+
assert_equal n - 1, @engine.processes.size
|
300
|
+
assert_equal n, @engine.storage_participant.size
|
301
|
+
# orphan workitem left in storage
|
302
|
+
|
303
|
+
assert_equal 1, @engine.leftovers.size
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_left_overs
|
307
|
+
|
308
|
+
[
|
309
|
+
{ '_id' => '0!f!x', 'type' => 'workitems', 'fei' => { 'wfid' => 'x' } },
|
310
|
+
{ '_id' => '0!f!y', 'type' => 'errors', 'fei' => { 'wfid' => 'y' } },
|
311
|
+
{ '_id' => '0!f!a', 'type' => 'workitems', 'fei' => { 'wfid' => 'a' } },
|
312
|
+
{ '_id' => '0!f!a', 'type' => 'expressions', 'fei' => { 'wfid' => 'a' } },
|
313
|
+
{ '_id' => '0!f!z', 'type' => 'schedules', 'fei' => { 'wfid' => 'z' },
|
314
|
+
'at' => Ruote.time_to_utc_s(Time.now + 24 * 3600) }
|
315
|
+
].each do |doc|
|
316
|
+
@engine.storage.put(doc)
|
317
|
+
end
|
318
|
+
|
319
|
+
assert_equal(
|
320
|
+
3,
|
321
|
+
@engine.leftovers.size)
|
322
|
+
assert_equal(
|
323
|
+
%w[ workitems errors schedules ],
|
324
|
+
@engine.leftovers.collect { |lo| lo['type'] })
|
325
|
+
end
|
326
|
+
|
318
327
|
def test_tree_rewrite
|
319
328
|
|
320
329
|
pdef = Ruote.process_definition :name => 'test' do
|
@@ -326,9 +335,6 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
326
335
|
delta
|
327
336
|
end
|
328
337
|
|
329
|
-
tree0 = nil
|
330
|
-
tree1 = nil
|
331
|
-
|
332
338
|
@engine.register_participant :alpha do |wi, fexp|
|
333
339
|
|
334
340
|
@tracer << "a\n"
|
@@ -344,11 +350,11 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
344
350
|
end
|
345
351
|
@engine.register_participant :charly do |wi, fexp|
|
346
352
|
@tracer << "c\n"
|
347
|
-
tree0 = fexp.context.engine.process(fexp.fei.wfid).current_tree
|
353
|
+
stash[:tree0] = fexp.context.engine.process(fexp.fei.wfid).current_tree
|
348
354
|
end
|
349
355
|
@engine.register_participant :delta do |wi, fexp|
|
350
356
|
@tracer << "d\n"
|
351
|
-
tree1 = fexp.context.engine.process(fexp.fei.wfid).current_tree
|
357
|
+
stash[:tree1] = fexp.context.engine.process(fexp.fei.wfid).current_tree
|
352
358
|
end
|
353
359
|
|
354
360
|
#noisy
|
@@ -357,11 +363,11 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
357
363
|
|
358
364
|
assert_equal(
|
359
365
|
["define", {"name"=>"test"}, [["sequence", {}, [["alpha", {}, []], ["charly", {}, []], ["participant", {"ref"=>"charly"}, []]]], ["delta", {}, []]]],
|
360
|
-
tree0)
|
366
|
+
@engine.context.stash[:tree0])
|
361
367
|
|
362
368
|
assert_equal(
|
363
369
|
["define", {"name"=>"test"}, [["sequence", {}, [["alpha", {}, []], ["charly", {}, []], ["charly", {}, []]]], ["participant", {"ref"=>"delta"}, []]]],
|
364
|
-
tree1)
|
370
|
+
@engine.context.stash[:tree1])
|
365
371
|
end
|
366
372
|
|
367
373
|
def test_when_on_cancel_subprocess
|
@@ -375,7 +381,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
375
381
|
end
|
376
382
|
end
|
377
383
|
|
378
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
384
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
379
385
|
|
380
386
|
#noisy
|
381
387
|
|
@@ -386,9 +392,10 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
386
392
|
@engine.cancel_process(wfid)
|
387
393
|
|
388
394
|
wait_for(:alpha)
|
395
|
+
wait_for(1)
|
389
396
|
|
390
397
|
assert_match wfid, alpha.first.fei.wfid
|
391
|
-
assert_not_nil alpha.first.fei.
|
398
|
+
assert_not_nil alpha.first.fei.subid
|
392
399
|
|
393
400
|
assert_equal 0, @engine.process(wfid).errors.size
|
394
401
|
assert_equal 4, @engine.process(wfid).expressions.size
|
@@ -416,7 +423,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
416
423
|
|
417
424
|
#noisy
|
418
425
|
|
419
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
426
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
420
427
|
|
421
428
|
wfid = @engine.launch(pdef)
|
422
429
|
|
@@ -442,7 +449,7 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
442
449
|
end
|
443
450
|
end
|
444
451
|
|
445
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
452
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
446
453
|
|
447
454
|
wfid = @engine.launch(pdef)
|
448
455
|
|
@@ -454,20 +461,24 @@ class FtProcessStatusTest < Test::Unit::TestCase
|
|
454
461
|
#puts ps.to_dot
|
455
462
|
|
456
463
|
dot = ps.to_dot
|
457
|
-
|
464
|
+
|
465
|
+
dot = dot.gsub(wfid, 'wfid')
|
466
|
+
dot = dot.gsub(/![^!]+!/, '!!')
|
467
|
+
dot = dot.gsub(/wfid [^ ]+ /, 'wfid ')
|
468
|
+
dot = dot.strip
|
458
469
|
|
459
470
|
assert_equal(
|
460
471
|
%{
|
461
|
-
digraph "process wfid
|
462
|
-
"0!!wfid" [ label="wfid
|
472
|
+
digraph "process wfid {
|
473
|
+
"0!!wfid" [ label="wfid 0 define" ];
|
463
474
|
"0!!wfid" -> "0_0!!wfid";
|
464
|
-
"0_0!!wfid" [ label="wfid
|
475
|
+
"0_0!!wfid" [ label="wfid 0_0 concurrence" ];
|
465
476
|
"0_0!!wfid" -> "0!!wfid";
|
466
477
|
"0_0!!wfid" -> "0_0_0!!wfid";
|
467
478
|
"0_0!!wfid" -> "0_0_1!!wfid";
|
468
|
-
"0_0_0!!wfid" [ label="wfid
|
479
|
+
"0_0_0!!wfid" [ label="wfid 0_0_0 participant" ];
|
469
480
|
"0_0_0!!wfid" -> "0_0!!wfid";
|
470
|
-
"0_0_1!!wfid" [ label="wfid
|
481
|
+
"0_0_1!!wfid" [ label="wfid 0_0_1 participant" ];
|
471
482
|
"0_0_1!!wfid" -> "0_0!!wfid";
|
472
483
|
"err_0_0_1!!wfid" [ label = "error : #<ArgumentError: no participant named 'bravo'>" ];
|
473
484
|
"err_0_0_1!!wfid" -> "0_0_1!!wfid" [ style = "dotted" ];
|
@@ -513,14 +524,33 @@ digraph "process wfid wfid" {
|
|
513
524
|
@engine.wait_for(:alpha)
|
514
525
|
|
515
526
|
assert_equal(
|
516
|
-
[ [
|
517
|
-
@engine.process(wfid).position)
|
527
|
+
[ [ 'alpha', { 'task' => 'clean car' } ] ],
|
528
|
+
@engine.process(wfid).position.collect { |pos| pos[1..-1] })
|
518
529
|
|
519
530
|
# #position leverages #workitems
|
520
531
|
|
521
532
|
assert_equal(
|
522
|
-
[ 'alpha' ],
|
523
|
-
@engine.process(wfid).workitems.collect { |wi|
|
533
|
+
[ [ wfid, 'alpha' ] ],
|
534
|
+
@engine.process(wfid).workitems.collect { |wi|
|
535
|
+
[ wi.fei.wfid, wi.participant_name ]
|
536
|
+
})
|
537
|
+
end
|
538
|
+
|
539
|
+
def test_position_when_error
|
540
|
+
|
541
|
+
pdef = Ruote.define do
|
542
|
+
participant
|
543
|
+
end
|
544
|
+
|
545
|
+
wfid = @engine.launch(pdef)
|
546
|
+
@engine.wait_for(wfid)
|
547
|
+
|
548
|
+
assert_equal 1, @engine.process(wfid).errors.size
|
549
|
+
|
550
|
+
assert_equal(
|
551
|
+
[ [ nil,
|
552
|
+
{ 'error' => '#<ArgumentError: no participant name specified>' } ] ],
|
553
|
+
@engine.process(wfid).position.collect { |pos| pos[1..-1] })
|
524
554
|
end
|
525
555
|
|
526
556
|
def test_ps_with_stored_workitems
|
@@ -559,7 +589,7 @@ digraph "process wfid wfid" {
|
|
559
589
|
assert_equal 1, @engine.schedules(:count => true)
|
560
590
|
end
|
561
591
|
|
562
|
-
def
|
592
|
+
def test_processes_and_schedules
|
563
593
|
|
564
594
|
@engine.register_participant '.+', Ruote::NullParticipant
|
565
595
|
|
@@ -571,7 +601,7 @@ digraph "process wfid wfid" {
|
|
571
601
|
ps = @engine.process(wfid)
|
572
602
|
|
573
603
|
assert_equal 1, ps.schedules.size
|
574
|
-
|
604
|
+
assert_match /^0_0![a-f0-9]+!#{wfid}$/, ps.schedules.first['target'].sid
|
575
605
|
end
|
576
606
|
|
577
607
|
def test_ps_pagination
|
@@ -592,6 +622,12 @@ digraph "process wfid wfid" {
|
|
592
622
|
wfids,
|
593
623
|
@engine.processes.collect { |ps| ps.wfid })
|
594
624
|
|
625
|
+
assert_equal(
|
626
|
+
wfids,
|
627
|
+
@engine.processes(:test => :garbage).collect { |ps| ps.wfid })
|
628
|
+
# prompted by
|
629
|
+
# http://groups.google.com/group/openwferu-users/browse_thread/thread/ee493bdf8d8cdb37
|
630
|
+
|
595
631
|
assert_equal(
|
596
632
|
wfids[0, 3],
|
597
633
|
@engine.processes(:limit => 3).collect { |ps| ps.wfid })
|
@@ -631,11 +667,51 @@ digraph "process wfid wfid" {
|
|
631
667
|
end
|
632
668
|
end
|
633
669
|
|
634
|
-
|
670
|
+
#noisy
|
671
|
+
|
672
|
+
wfid = @engine.launch(pdef)
|
673
|
+
|
674
|
+
@engine.wait_for(4)
|
675
|
+
|
676
|
+
#assert_equal 1, @engine.processes.size
|
677
|
+
assert_equal [ wfid ], @engine.processes.collect { |ps| ps.wfid }
|
678
|
+
end
|
679
|
+
|
680
|
+
def test_ps
|
681
|
+
|
682
|
+
@engine.register 'alpha', Ruote::NullParticipant
|
683
|
+
|
684
|
+
wfid = nil
|
685
|
+
|
686
|
+
2.times { wfid = @engine.launch(Ruote.define { alpha }) }
|
687
|
+
|
688
|
+
@engine.wait_for(4)
|
689
|
+
|
690
|
+
assert_equal 2, @engine.ps.size
|
691
|
+
assert_equal wfid, @engine.ps(wfid).wfid
|
692
|
+
end
|
693
|
+
|
694
|
+
def test_definition_name
|
695
|
+
|
696
|
+
pdef = Ruote.process_definition :name => 'invictus' do
|
697
|
+
alpha
|
698
|
+
end
|
699
|
+
|
700
|
+
#noisy
|
701
|
+
|
702
|
+
alpha = @engine.register_participant :alpha, Ruote::NullParticipant
|
703
|
+
|
704
|
+
wfid = @engine.launch(pdef)
|
705
|
+
|
706
|
+
wait_for(:alpha)
|
707
|
+
|
708
|
+
assert_equal 'invictus', @engine.process(wfid).definition_name
|
635
709
|
|
636
|
-
|
710
|
+
exp = @engine.process(wfid).expressions.first
|
711
|
+
@engine.storage.delete(exp.h)
|
637
712
|
|
638
|
-
|
713
|
+
assert_nil @engine.process(wfid).definition_name
|
714
|
+
assert_nil @engine.process(wfid).definition_revision
|
639
715
|
end
|
640
716
|
end
|
641
717
|
|