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.
Files changed (217) hide show
  1. data/CHANGELOG.txt +60 -0
  2. data/CREDITS.txt +22 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +6 -7
  5. data/Rakefile +58 -59
  6. data/TODO.txt +137 -65
  7. data/couch_url.txt +1 -0
  8. data/jruby_issue.txt +32 -0
  9. data/lib/ruote.rb +1 -1
  10. data/lib/ruote/context.rb +12 -10
  11. data/lib/ruote/engine.rb +280 -145
  12. data/lib/ruote/engine/process_error.rb +5 -5
  13. data/lib/ruote/engine/process_status.rb +47 -28
  14. data/lib/ruote/exp/command.rb +7 -10
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +130 -43
  17. data/lib/ruote/exp/fe_add_branches.rb +2 -2
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_cancel_process.rb +3 -3
  20. data/lib/ruote/exp/fe_command.rb +3 -3
  21. data/lib/ruote/exp/fe_concurrence.rb +4 -4
  22. data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
  23. data/lib/ruote/exp/fe_cron.rb +3 -3
  24. data/lib/ruote/exp/fe_cursor.rb +5 -5
  25. data/lib/ruote/exp/fe_define.rb +3 -3
  26. data/lib/ruote/exp/fe_echo.rb +3 -3
  27. data/lib/ruote/exp/fe_equals.rb +2 -2
  28. data/lib/ruote/exp/fe_error.rb +2 -2
  29. data/lib/ruote/exp/fe_filter.rb +519 -0
  30. data/lib/ruote/exp/fe_forget.rb +9 -2
  31. data/lib/ruote/exp/fe_given.rb +154 -0
  32. data/lib/ruote/exp/fe_if.rb +16 -13
  33. data/lib/ruote/exp/fe_inc.rb +3 -3
  34. data/lib/ruote/exp/fe_iterator.rb +4 -4
  35. data/lib/ruote/exp/fe_let.rb +75 -0
  36. data/lib/ruote/exp/fe_listen.rb +68 -12
  37. data/lib/ruote/exp/fe_lose.rb +110 -0
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
  40. data/lib/ruote/exp/fe_participant.rb +14 -17
  41. data/lib/ruote/exp/fe_redo.rb +10 -6
  42. data/lib/ruote/exp/fe_ref.rb +1 -1
  43. data/lib/ruote/exp/fe_registerp.rb +112 -0
  44. data/lib/ruote/exp/fe_reserve.rb +3 -3
  45. data/lib/ruote/exp/fe_restore.rb +2 -2
  46. data/lib/ruote/exp/fe_save.rb +2 -2
  47. data/lib/ruote/exp/fe_sequence.rb +3 -4
  48. data/lib/ruote/exp/fe_set.rb +16 -7
  49. data/lib/ruote/exp/fe_subprocess.rb +23 -1
  50. data/lib/ruote/exp/fe_that.rb +92 -0
  51. data/lib/ruote/exp/fe_undo.rb +3 -3
  52. data/lib/ruote/exp/fe_unregisterp.rb +71 -0
  53. data/lib/ruote/exp/fe_wait.rb +2 -2
  54. data/lib/ruote/exp/flowexpression.rb +153 -78
  55. data/lib/ruote/exp/iterator.rb +2 -2
  56. data/lib/ruote/exp/merge.rb +2 -2
  57. data/lib/ruote/exp/ro_attributes.rb +14 -12
  58. data/lib/ruote/exp/ro_filters.rb +136 -0
  59. data/lib/ruote/exp/ro_persist.rb +51 -35
  60. data/lib/ruote/exp/ro_variables.rb +18 -27
  61. data/lib/ruote/fei.rb +73 -33
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
  63. data/lib/ruote/id/wfid_generator.rb +11 -4
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +36 -8
  66. data/lib/ruote/log/storage_history.rb +37 -5
  67. data/lib/ruote/log/test_logger.rb +26 -24
  68. data/lib/ruote/log/wait_logger.rb +5 -3
  69. data/lib/ruote/part/block_participant.rb +22 -11
  70. data/lib/ruote/part/engine_participant.rb +6 -7
  71. data/lib/ruote/part/local_participant.rb +6 -12
  72. data/lib/ruote/part/no_op_participant.rb +4 -4
  73. data/lib/ruote/part/null_participant.rb +4 -4
  74. data/lib/ruote/part/smtp_participant.rb +4 -4
  75. data/lib/ruote/part/storage_participant.rb +40 -20
  76. data/lib/ruote/part/template.rb +4 -4
  77. data/lib/ruote/participant.rb +0 -1
  78. data/lib/ruote/{parser.rb → reader.rb} +30 -25
  79. data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
  80. data/lib/ruote/{parser → reader}/xml.rb +6 -5
  81. data/lib/ruote/receiver/base.rb +35 -13
  82. data/lib/ruote/storage/base.rb +20 -18
  83. data/lib/ruote/storage/composite_storage.rb +10 -10
  84. data/lib/ruote/storage/fs_storage.rb +17 -10
  85. data/lib/ruote/storage/hash_storage.rb +29 -18
  86. data/lib/ruote/svc/dispatch_pool.rb +41 -14
  87. data/lib/ruote/svc/dollar_sub.rb +50 -17
  88. data/lib/ruote/svc/error_handler.rb +19 -11
  89. data/lib/ruote/svc/expression_map.rb +4 -4
  90. data/lib/ruote/svc/participant_list.rb +105 -100
  91. data/lib/ruote/svc/tracker.rb +58 -18
  92. data/lib/ruote/svc/treechecker.rb +51 -24
  93. data/lib/ruote/tree_dot.rb +4 -4
  94. data/lib/ruote/util/filter.rb +440 -0
  95. data/lib/ruote/util/hashdot.rb +4 -4
  96. data/lib/ruote/util/look.rb +2 -6
  97. data/lib/ruote/util/lookup.rb +9 -7
  98. data/lib/ruote/util/misc.rb +40 -8
  99. data/lib/ruote/util/ometa.rb +1 -1
  100. data/lib/ruote/util/serializer.rb +4 -4
  101. data/lib/ruote/util/subprocess.rb +29 -9
  102. data/lib/ruote/util/time.rb +4 -4
  103. data/lib/ruote/util/tree.rb +3 -3
  104. data/lib/ruote/version.rb +2 -2
  105. data/lib/ruote/worker.rb +55 -32
  106. data/lib/ruote/workitem.rb +64 -11
  107. data/ruote.gemspec +31 -302
  108. data/test/bm/launch_bench.rb +37 -0
  109. data/test/functional/base.rb +60 -18
  110. data/test/functional/concurrent_base.rb +2 -2
  111. data/test/functional/ct_0_concurrence.rb +1 -1
  112. data/test/functional/ct_1_iterator.rb +1 -1
  113. data/test/functional/ct_2_cancel.rb +1 -1
  114. data/test/functional/eft_0_process_definition.rb +2 -2
  115. data/test/functional/eft_10_cancel_process.rb +1 -1
  116. data/test/functional/eft_11_wait.rb +19 -11
  117. data/test/functional/eft_12_listen.rb +79 -13
  118. data/test/functional/eft_13_iterator.rb +13 -10
  119. data/test/functional/eft_14_cursor.rb +98 -9
  120. data/test/functional/eft_15_loop.rb +6 -4
  121. data/test/functional/eft_16_if.rb +12 -0
  122. data/test/functional/eft_18_concurrent_iterator.rb +31 -32
  123. data/test/functional/eft_19_reserve.rb +4 -4
  124. data/test/functional/eft_1_echo.rb +9 -0
  125. data/test/functional/eft_20_save.rb +4 -4
  126. data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
  127. data/test/functional/eft_30_ref.rb +17 -2
  128. data/test/functional/eft_31_registerp.rb +130 -0
  129. data/test/functional/eft_32_lose.rb +93 -0
  130. data/test/functional/eft_33_let.rb +31 -0
  131. data/test/functional/eft_34_given.rb +123 -0
  132. data/test/functional/eft_35_filter.rb +269 -0
  133. data/test/functional/eft_3_participant.rb +4 -6
  134. data/test/functional/eft_4_set.rb +16 -2
  135. data/test/functional/eft_5_subprocess.rb +2 -4
  136. data/test/functional/eft_6_concurrence.rb +29 -29
  137. data/test/functional/eft_8_undo.rb +39 -3
  138. data/test/functional/eft_9_redo.rb +94 -2
  139. data/test/functional/ft_10_dollar.rb +81 -2
  140. data/test/functional/ft_11_recursion.rb +13 -17
  141. data/test/functional/ft_12_launchitem.rb +9 -5
  142. data/test/functional/ft_13_variables.rb +7 -9
  143. data/test/functional/ft_14_re_apply.rb +6 -9
  144. data/test/functional/ft_15_timeout.rb +18 -18
  145. data/test/functional/ft_16_participant_params.rb +1 -3
  146. data/test/functional/ft_17_conditional.rb +25 -2
  147. data/test/functional/ft_18_kill.rb +65 -12
  148. data/test/functional/ft_1_process_status.rb +147 -71
  149. data/test/functional/ft_20_storage_participant.rb +0 -1
  150. data/test/functional/ft_21_forget.rb +82 -1
  151. data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
  152. data/test/functional/ft_25_receiver.rb +47 -17
  153. data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
  154. data/test/functional/ft_29_part_template.rb +6 -5
  155. data/test/functional/ft_2_errors.rb +21 -37
  156. data/test/functional/ft_30_smtp_participant.rb +1 -1
  157. data/test/functional/ft_31_part_blocking.rb +8 -6
  158. data/test/functional/ft_34_cursor_rewind.rb +13 -10
  159. data/test/functional/ft_35_add_service.rb +1 -1
  160. data/test/functional/ft_36_storage_history.rb +24 -1
  161. data/test/functional/ft_37_default_history.rb +109 -0
  162. data/test/functional/ft_38_participant_more.rb +10 -10
  163. data/test/functional/ft_39_wait_for.rb +12 -9
  164. data/test/functional/ft_3_participant_registration.rb +111 -32
  165. data/test/functional/ft_40_wait_logger.rb +2 -1
  166. data/test/functional/ft_41_participants.rb +30 -4
  167. data/test/functional/ft_43_participant_on_reply.rb +6 -23
  168. data/test/functional/ft_45_participant_accept.rb +4 -4
  169. data/test/functional/ft_46_launch_single.rb +36 -2
  170. data/test/functional/ft_47_wfid_generator.rb +54 -0
  171. data/test/functional/ft_48_lose.rb +112 -0
  172. data/test/functional/ft_49_engine_on_error.rb +201 -0
  173. data/test/functional/ft_4_cancel.rb +66 -6
  174. data/test/functional/ft_50_engine_config.rb +22 -0
  175. data/test/functional/ft_51_misc.rb +67 -0
  176. data/test/functional/ft_52_case.rb +134 -0
  177. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  178. data/test/functional/ft_54_patterns.rb +104 -0
  179. data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
  180. data/test/functional/ft_56_filter_attribute.rb +259 -0
  181. data/test/functional/ft_5_on_error.rb +77 -30
  182. data/test/functional/ft_6_on_cancel.rb +66 -11
  183. data/test/functional/ft_7_tags.rb +94 -5
  184. data/test/functional/ft_8_participant_consumption.rb +36 -5
  185. data/test/functional/ft_9_subprocesses.rb +10 -10
  186. data/test/functional/rt_1_listen.rb +3 -3
  187. data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
  188. data/test/functional/storage_helper.rb +15 -13
  189. data/test/functional/test.rb +1 -3
  190. data/test/test_helper.rb +0 -8
  191. data/test/unit/storage.rb +154 -10
  192. data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
  193. data/test/unit/ut_11_lookup.rb +7 -0
  194. data/test/unit/ut_13_serializer.rb +1 -1
  195. data/test/unit/ut_15_util.rb +23 -0
  196. data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
  197. data/test/unit/ut_1_fei.rb +57 -10
  198. data/test/unit/ut_20_composite_storage.rb +25 -11
  199. data/test/unit/ut_21_participant_list.rb +47 -0
  200. data/test/unit/ut_22_filter.rb +903 -0
  201. data/test/unit/ut_3_wait_logger.rb +2 -6
  202. data/test/unit/ut_6_condition.rb +164 -17
  203. data/test/unit/ut_7_workitem.rb +28 -0
  204. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  205. data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
  206. metadata +108 -84
  207. data/.gitignore +0 -4
  208. data/examples/barley.rb +0 -391
  209. data/examples/flickr_report.rb +0 -107
  210. data/examples/pong.rb +0 -37
  211. data/examples/ruote_quickstart.rb +0 -43
  212. data/examples/web_first_page.rb +0 -68
  213. data/lib/ruote/part/hash_participant.rb +0 -91
  214. data/test/README.rdoc +0 -15
  215. data/test/functional/crunner.sh +0 -19
  216. data/test/pdef.xml +0 -7
  217. 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/part/storage_participant'
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
- t
68
+ Time.now
71
69
  end
72
70
 
73
71
  #noisy
74
72
 
75
- #assert_trace TEST_BLOCK, Ruote.time_to_utc_s(t)
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
- t.to_s
76
+ /\b#{Time.now.year}\b/
83
77
  end
84
78
 
85
- assert_trace expected, TEST_BLOCK
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
- @alpha = @engine.register_participant 'alpha', MyParticipant.new
27
+ @engine.register_participant 'alpha', MyParticipant
28
28
  end
29
29
 
30
30
  class MyParticipant
31
31
  include Ruote::LocalParticipant
32
32
 
33
- attr_accessor :wi
33
+ def consume(workitem)
34
34
 
35
- def consume (workitem)
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 @alpha.wi.nil? do
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(@alpha.wi)
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(@alpha.wi)
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
- def initialize (receiver)
124
- @receiver = receiver
125
- end
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 (context, opts={})
127
+ def initialize(context, opts={})
132
128
  super(context, opts)
133
129
  @count = 0
134
130
  end
135
- def pass (workitem)
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
- receiver = MyOtherReceiver.new(@engine)
144
+ class << @engine.context
145
+ def receiver
146
+ @rcv ||= MyOtherReceiver.new(engine)
147
+ end
148
+ end
149
149
 
150
- @engine.register_participant :alpha, MyOtherParticipant.new(receiver)
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/part/hash_participant'
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
- alpha = @engine.register_participant :alpha, Ruote::HashParticipant.new
26
- bravo = @engine.register_participant :bravo, Ruote::HashParticipant.new
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 0, alpha.size
40
- assert_equal 1, bravo.size
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 bravo.first.fields['__timed_out__']
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 (workitem)
51
+ def consume(workitem)
52
52
  # do nothing
53
53
  end
54
- def cancel (fei, flavour)
54
+ def cancel(fei, flavour)
55
55
  # do nothing
56
56
  end
57
- def timeout
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 (opts)
107
+ def initialize(opts)
108
108
  @opts = opts
109
109
  end
110
- def consume (workitem)
110
+ def consume(workitem)
111
111
  # do nothing
112
112
  end
113
- def cancel (fei, flavour)
113
+ def cancel(fei, flavour)
114
114
  # do nothing
115
115
  end
116
- def timeout
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 (opts={}, &block)
21
+ def initialize(opts)
22
22
 
23
- @template = opts[:template]
23
+ @template = opts['template']
24
24
  end
25
25
 
26
- def consume (workitem)
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 (fei, flavour)
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.new(:template => "0:${v:var0}\n1:${f:field0}"))
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