ruote 2.1.11 → 2.2.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 +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
|
@@ -189,7 +189,6 @@ class FtStorageParticipantTest < Test::Unit::TestCase
|
|
|
189
189
|
@part.query('place' => 'heiankyou', :offset => 2, :limit => 2).collect { |wi|
|
|
190
190
|
"#{wi.fei.wfid}-#{wi.participant_name}" }
|
|
191
191
|
|
|
192
|
-
#p page0, page1
|
|
193
192
|
assert_equal 4, (page0 + page1).sort.uniq.size
|
|
194
193
|
|
|
195
194
|
assert_equal(
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
|
9
9
|
|
|
10
|
-
require 'ruote/
|
|
10
|
+
require 'ruote/participant'
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class FtForgetTest < Test::Unit::TestCase
|
|
@@ -68,5 +68,86 @@ class FtForgetTest < Test::Unit::TestCase
|
|
|
68
68
|
#p ps.original_tree
|
|
69
69
|
#p ps.current_tree
|
|
70
70
|
end
|
|
71
|
+
|
|
72
|
+
def test_forget_true_string
|
|
73
|
+
|
|
74
|
+
pdef = Ruote.process_definition do
|
|
75
|
+
concurrence :count => 1 do
|
|
76
|
+
alpha :forget => 'true'
|
|
77
|
+
bravo
|
|
78
|
+
end
|
|
79
|
+
charly
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
@engine.register_participant '.+' do |wi|
|
|
83
|
+
@tracer << wi.participant_name + "\n"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
wfid = @engine.launch(pdef)
|
|
87
|
+
|
|
88
|
+
wait_for(wfid)
|
|
89
|
+
wait_for(wfid)
|
|
90
|
+
|
|
91
|
+
#assert_equal "alpha\nbravo\ncharly", @tracer.to_s
|
|
92
|
+
assert_equal %w[ alpha bravo charly ], @tracer.to_a.sort
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_forget_and_cursor
|
|
96
|
+
|
|
97
|
+
pdef = Ruote.define do
|
|
98
|
+
cursor do
|
|
99
|
+
alpha :forget => true
|
|
100
|
+
bravo
|
|
101
|
+
rewind
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
@engine.register_participant 'alpha', Ruote::NullParticipant
|
|
106
|
+
# this participant never replies
|
|
107
|
+
|
|
108
|
+
@engine.register_participant 'bravo', Ruote::NoOpParticipant
|
|
109
|
+
# this one simply replies
|
|
110
|
+
|
|
111
|
+
#@engine.noisy = true
|
|
112
|
+
|
|
113
|
+
wfid = @engine.launch(pdef)
|
|
114
|
+
|
|
115
|
+
@engine.wait_for(:bravo)
|
|
116
|
+
@engine.wait_for(:bravo)
|
|
117
|
+
|
|
118
|
+
assert_not_nil @engine.process(wfid)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# As reported by Nando Sola
|
|
122
|
+
#
|
|
123
|
+
# http://groups.google.com/group/openwferu-users/browse_thread/thread/50308e9dce8359e6
|
|
124
|
+
#
|
|
125
|
+
def test_forget_on_forget
|
|
126
|
+
|
|
127
|
+
pdef = Ruote.define do
|
|
128
|
+
concurrence do
|
|
129
|
+
listen :to => 'bravo', :upon =>'reply', :wfid => true do
|
|
130
|
+
sequence :forget => true do
|
|
131
|
+
alpha
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
bravo
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
@engine.register do
|
|
139
|
+
catchall Ruote::NoOpParticipant
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#noisy
|
|
143
|
+
|
|
144
|
+
wfid = @engine.launch(pdef)
|
|
145
|
+
|
|
146
|
+
@engine.wait_for(wfid)
|
|
147
|
+
|
|
148
|
+
assert_equal(
|
|
149
|
+
[],
|
|
150
|
+
@engine.history.all.select { |e| e['action'] == 'error_intercepted' })
|
|
151
|
+
end
|
|
71
152
|
end
|
|
72
153
|
|
|
@@ -64,25 +64,56 @@ class FtBlockParticipantTest < Test::Unit::TestCase
|
|
|
64
64
|
return if Ruote::WIN
|
|
65
65
|
# defective 'json' lib on windows renders this test useless
|
|
66
66
|
|
|
67
|
-
t = Time.now
|
|
68
|
-
|
|
69
67
|
@engine.register_participant :alpha do |workitem|
|
|
70
|
-
|
|
68
|
+
Time.now
|
|
71
69
|
end
|
|
72
70
|
|
|
73
71
|
#noisy
|
|
74
72
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
expected = if defined?(DataMapper)
|
|
78
|
-
DataMapper::VERSION >= '1.0.0' ? t.to_s : ''
|
|
79
|
-
elsif Ruote::JAVA
|
|
80
|
-
''
|
|
73
|
+
match = if defined?(DataMapper) && DataMapper::VERSION < '1.0.0'
|
|
74
|
+
/^$/
|
|
81
75
|
else
|
|
82
|
-
|
|
76
|
+
/\b#{Time.now.year}\b/
|
|
83
77
|
end
|
|
84
78
|
|
|
85
|
-
|
|
79
|
+
wfid = @engine.launch(TEST_BLOCK)
|
|
80
|
+
|
|
81
|
+
@engine.wait_for(wfid)
|
|
82
|
+
|
|
83
|
+
assert_match match, @tracer.to_s
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_raise_security_error_before_evaluating_rogue_code
|
|
87
|
+
|
|
88
|
+
fn = "test/bad.#{Time.now.to_f}.txt"
|
|
89
|
+
|
|
90
|
+
@engine.participant_list = [
|
|
91
|
+
#[ 'alpha', [ 'Ruote::BlockParticipant', { 'block' => 'exit(3)' } ] ]
|
|
92
|
+
[ 'alpha', [ 'Ruote::BlockParticipant', { 'block' => "proc { File.open(\"#{fn}\", \"wb\") { |f| f.puts(\"bad\") } }" } ] ]
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
#noisy
|
|
96
|
+
|
|
97
|
+
wfid = @engine.launch(Ruote.define { alpha })
|
|
98
|
+
|
|
99
|
+
@engine.wait_for(wfid)
|
|
100
|
+
|
|
101
|
+
assert_equal false, File.exist?(fn), 'security check not enforced'
|
|
102
|
+
|
|
103
|
+
assert_equal 1, @engine.errors(wfid).size
|
|
104
|
+
assert_match /SecurityError/, @engine.errors(wfid).first.message
|
|
105
|
+
|
|
106
|
+
FileUtils.rm(fn) rescue nil
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_raise_security_error_upon_registering_rogue_block_participant
|
|
110
|
+
|
|
111
|
+
assert_raise Rufus::SecurityError do
|
|
112
|
+
|
|
113
|
+
@engine.register 'rogue' do |workitem|
|
|
114
|
+
workitem.content = File.read('test/nada.txt')
|
|
115
|
+
end
|
|
116
|
+
end
|
|
86
117
|
end
|
|
87
118
|
end
|
|
88
119
|
|
|
@@ -24,17 +24,15 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
@
|
|
27
|
+
@engine.register_participant 'alpha', MyParticipant
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
class MyParticipant
|
|
31
31
|
include Ruote::LocalParticipant
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
def consume(workitem)
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@wi = workitem
|
|
35
|
+
@context.stash[:wi] = workitem
|
|
38
36
|
|
|
39
37
|
# no reply to the engine
|
|
40
38
|
end
|
|
@@ -87,13 +85,13 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
87
85
|
wfid = @engine.launch(@pdef)
|
|
88
86
|
|
|
89
87
|
wait_for(:alpha)
|
|
90
|
-
while @
|
|
88
|
+
while @engine.context.stash[:wi].nil? do
|
|
91
89
|
Thread.pass
|
|
92
90
|
end
|
|
93
91
|
|
|
94
92
|
assert_equal 3, @engine.process(wfid).expressions.size
|
|
95
93
|
|
|
96
|
-
receiver.receive(@
|
|
94
|
+
receiver.receive(@engine.context.stash[:wi])
|
|
97
95
|
|
|
98
96
|
wait_for(wfid)
|
|
99
97
|
|
|
@@ -109,7 +107,7 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
109
107
|
|
|
110
108
|
wait_for(:alpha)
|
|
111
109
|
|
|
112
|
-
@engine.receive(@
|
|
110
|
+
@engine.receive(@engine.context.stash[:wi])
|
|
113
111
|
|
|
114
112
|
wait_for(wfid)
|
|
115
113
|
|
|
@@ -120,19 +118,17 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
120
118
|
end
|
|
121
119
|
|
|
122
120
|
class MyOtherParticipant
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def consume (workitem)
|
|
127
|
-
@receiver.pass(workitem.to_h)
|
|
121
|
+
include Ruote::LocalParticipant
|
|
122
|
+
def consume(workitem)
|
|
123
|
+
@context.receiver.pass(workitem.to_h)
|
|
128
124
|
end
|
|
129
125
|
end
|
|
130
126
|
class MyOtherReceiver < Ruote::Receiver
|
|
131
|
-
def initialize
|
|
127
|
+
def initialize(context, opts={})
|
|
132
128
|
super(context, opts)
|
|
133
129
|
@count = 0
|
|
134
130
|
end
|
|
135
|
-
def pass
|
|
131
|
+
def pass(workitem)
|
|
136
132
|
if @count < 1
|
|
137
133
|
@context.error_handler.action_handle(
|
|
138
134
|
'dispatch', workitem['fei'], RuntimeError.new('something went wrong'))
|
|
@@ -145,9 +141,13 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
145
141
|
|
|
146
142
|
def test_receiver_triggered_dispatch_error
|
|
147
143
|
|
|
148
|
-
|
|
144
|
+
class << @engine.context
|
|
145
|
+
def receiver
|
|
146
|
+
@rcv ||= MyOtherReceiver.new(engine)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
149
|
|
|
150
|
-
@engine.register_participant :alpha, MyOtherParticipant
|
|
150
|
+
@engine.register_participant :alpha, MyOtherParticipant
|
|
151
151
|
|
|
152
152
|
pdef = Ruote.process_definition do
|
|
153
153
|
alpha
|
|
@@ -173,5 +173,35 @@ class FtReceiverTest < Test::Unit::TestCase
|
|
|
173
173
|
|
|
174
174
|
assert_nil ps
|
|
175
175
|
end
|
|
176
|
+
|
|
177
|
+
def test_receiver_fexp_and_wi
|
|
178
|
+
|
|
179
|
+
#@engine.register do
|
|
180
|
+
# catchall Ruote::StorageParticipant
|
|
181
|
+
#end
|
|
182
|
+
@engine.register_participant :alpha, Ruote::StorageParticipant
|
|
183
|
+
|
|
184
|
+
#noisy
|
|
185
|
+
|
|
186
|
+
wfid = @engine.launch(Ruote.define do
|
|
187
|
+
alpha
|
|
188
|
+
end)
|
|
189
|
+
|
|
190
|
+
@engine.wait_for(:alpha)
|
|
191
|
+
@engine.wait_for(1)
|
|
192
|
+
|
|
193
|
+
wi = @engine.storage_participant.first
|
|
194
|
+
|
|
195
|
+
assert_equal wfid, wi.fei.wfid
|
|
196
|
+
|
|
197
|
+
assert_equal wfid, @engine.fexp(wi).fei.wfid
|
|
198
|
+
assert_equal wfid, @engine.fexp(wi.fei).fei.wfid
|
|
199
|
+
assert_equal wfid, @engine.fexp(wi.fei.sid).fei.wfid
|
|
200
|
+
assert_equal wfid, @engine.fexp(wi.fei.sid).h.applied_workitem['fei']['wfid']
|
|
201
|
+
|
|
202
|
+
assert_equal wfid, @engine.workitem(wi).wfid
|
|
203
|
+
assert_equal wfid, @engine.workitem(wi.fei).wfid
|
|
204
|
+
assert_equal wfid, @engine.workitem(wi.fei.sid).wfid
|
|
205
|
+
end
|
|
176
206
|
end
|
|
177
207
|
|
|
@@ -7,12 +7,18 @@
|
|
|
7
7
|
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
|
9
9
|
|
|
10
|
-
require 'ruote/
|
|
10
|
+
require 'ruote/participant'
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class FtParticipantTimeoutTest < Test::Unit::TestCase
|
|
14
14
|
include FunctionalBase
|
|
15
15
|
|
|
16
|
+
class AlphaParticipant < Ruote::StorageParticipant
|
|
17
|
+
def rtimeout(workitem)
|
|
18
|
+
'1s'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
16
22
|
def test_participant_defined_timeout
|
|
17
23
|
|
|
18
24
|
pdef = Ruote.process_definition do
|
|
@@ -22,39 +28,33 @@ class FtParticipantTimeoutTest < Test::Unit::TestCase
|
|
|
22
28
|
end
|
|
23
29
|
end
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class << alpha
|
|
29
|
-
def timeout
|
|
30
|
-
'1s'
|
|
31
|
-
end
|
|
32
|
-
end
|
|
31
|
+
@engine.register_participant :alpha, AlphaParticipant
|
|
32
|
+
sto = @engine.register_participant :bravo, Ruote::StorageParticipant
|
|
33
33
|
|
|
34
34
|
#noisy
|
|
35
35
|
|
|
36
36
|
wfid = @engine.launch(pdef)
|
|
37
37
|
wait_for(13)
|
|
38
38
|
|
|
39
|
-
assert_equal
|
|
40
|
-
assert_equal
|
|
39
|
+
assert_equal 1, sto.size
|
|
40
|
+
assert_equal 'bravo', sto.first.participant_name
|
|
41
41
|
|
|
42
42
|
#logger.log.each { |l| p l }
|
|
43
43
|
assert_equal 2, logger.log.select { |e| e['flavour'] == 'timeout' }.size
|
|
44
44
|
assert_equal 0, @engine.storage.get_many('schedules').size
|
|
45
45
|
|
|
46
|
-
assert_not_nil
|
|
46
|
+
assert_not_nil sto.first.fields['__timed_out__']
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
class MyParticipant
|
|
50
50
|
include Ruote::LocalParticipant
|
|
51
|
-
def consume
|
|
51
|
+
def consume(workitem)
|
|
52
52
|
# do nothing
|
|
53
53
|
end
|
|
54
|
-
def cancel
|
|
54
|
+
def cancel(fei, flavour)
|
|
55
55
|
# do nothing
|
|
56
56
|
end
|
|
57
|
-
def
|
|
57
|
+
def rtimeout
|
|
58
58
|
'1s'
|
|
59
59
|
end
|
|
60
60
|
def do_not_thread
|
|
@@ -104,16 +104,16 @@ class FtParticipantTimeoutTest < Test::Unit::TestCase
|
|
|
104
104
|
|
|
105
105
|
class MyOtherParticipant
|
|
106
106
|
include Ruote::LocalParticipant
|
|
107
|
-
def initialize
|
|
107
|
+
def initialize(opts)
|
|
108
108
|
@opts = opts
|
|
109
109
|
end
|
|
110
|
-
def consume
|
|
110
|
+
def consume(workitem)
|
|
111
111
|
# do nothing
|
|
112
112
|
end
|
|
113
|
-
def cancel
|
|
113
|
+
def cancel(fei, flavour)
|
|
114
114
|
# do nothing
|
|
115
115
|
end
|
|
116
|
-
def
|
|
116
|
+
def rtimeout(workitem)
|
|
117
117
|
@opts['timeout']
|
|
118
118
|
end
|
|
119
119
|
end
|
|
@@ -138,5 +138,42 @@ class FtParticipantTimeoutTest < Test::Unit::TestCase
|
|
|
138
138
|
assert_equal 0, @engine.storage.get_many('schedules').size
|
|
139
139
|
# no timeout for participant :bravo
|
|
140
140
|
end
|
|
141
|
+
|
|
142
|
+
class YetAnotherParticipant
|
|
143
|
+
include Ruote::LocalParticipant
|
|
144
|
+
def initialize(opts)
|
|
145
|
+
@opts = opts
|
|
146
|
+
end
|
|
147
|
+
def consume(workitem)
|
|
148
|
+
# do nothing
|
|
149
|
+
end
|
|
150
|
+
def cancel(fei, flavour)
|
|
151
|
+
# do nothing
|
|
152
|
+
end
|
|
153
|
+
def rtimeout(workitem)
|
|
154
|
+
"#{workitem.fields['timeout'] * 2}s"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_participant_rtimeout_workitem
|
|
159
|
+
|
|
160
|
+
pdef = Ruote.process_definition do
|
|
161
|
+
alpha
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
@engine.register_participant :alpha, YetAnotherParticipant
|
|
165
|
+
|
|
166
|
+
#noisy
|
|
167
|
+
|
|
168
|
+
wfid = @engine.launch(pdef, 'timeout' => 60)
|
|
169
|
+
|
|
170
|
+
@engine.wait_for(:alpha)
|
|
171
|
+
@engine.wait_for(1)
|
|
172
|
+
|
|
173
|
+
schedules = @engine.storage.get_many('schedules')
|
|
174
|
+
|
|
175
|
+
assert_equal 1, schedules.size
|
|
176
|
+
assert_equal '120s', schedules.first['original']
|
|
177
|
+
end
|
|
141
178
|
end
|
|
142
179
|
|
|
@@ -18,12 +18,12 @@ class FtPartTemplateTest < Test::Unit::TestCase
|
|
|
18
18
|
include Ruote::LocalParticipant
|
|
19
19
|
include Ruote::TemplateMixin
|
|
20
20
|
|
|
21
|
-
def initialize
|
|
21
|
+
def initialize(opts)
|
|
22
22
|
|
|
23
|
-
@template = opts[
|
|
23
|
+
@template = opts['template']
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def consume
|
|
26
|
+
def consume(workitem)
|
|
27
27
|
|
|
28
28
|
@context['s_tracer'] << render_template(
|
|
29
29
|
@template,
|
|
@@ -34,7 +34,7 @@ class FtPartTemplateTest < Test::Unit::TestCase
|
|
|
34
34
|
reply_to_engine(workitem)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
def cancel
|
|
37
|
+
def cancel(fei, flavour)
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
@@ -51,7 +51,8 @@ class FtPartTemplateTest < Test::Unit::TestCase
|
|
|
51
51
|
|
|
52
52
|
@engine.register_participant(
|
|
53
53
|
:alpha,
|
|
54
|
-
MyParticipant
|
|
54
|
+
MyParticipant,
|
|
55
|
+
:template => "0:${v:var0}\n1:${f:field0}")
|
|
55
56
|
|
|
56
57
|
assert_trace %w[ 0:v_value 1:f_value done. ], pdef
|
|
57
58
|
end
|