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.
Files changed (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -5,7 +5,7 @@
5
5
  # Tue Jun 2 18:48:02 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
  require 'ruote/participant'
11
11
 
@@ -13,6 +13,23 @@ require 'ruote/participant'
13
13
  class FtOnErrorTest < Test::Unit::TestCase
14
14
  include FunctionalBase
15
15
 
16
+ class TroubleMaker
17
+ include Ruote::LocalParticipant
18
+
19
+ def consume(workitem)
20
+ hits = (workitem.fields['hits'] || 0) + 1
21
+ workitem.fields['hits'] = hits
22
+ workitem.trace << "#{hits.to_s}\n"
23
+ raise 'Houston, we have a problem !' if hits == 1
24
+ workitem.trace << 'done.'
25
+ reply(workitem)
26
+ end
27
+
28
+ def cancel(fei, flavour)
29
+ # nothing to do
30
+ end
31
+ end
32
+
16
33
  def test_on_error
17
34
 
18
35
  pdef = Ruote.process_definition do
@@ -21,12 +38,10 @@ class FtOnErrorTest < Test::Unit::TestCase
21
38
  end
22
39
  end
23
40
 
24
- @engine.register_participant :catcher do
25
- @tracer << "caught\n"
41
+ @dashboard.register_participant :catcher do
42
+ tracer << "caught\n"
26
43
  end
27
44
 
28
- #noisy
29
-
30
45
  assert_trace('caught', pdef)
31
46
 
32
47
  assert_equal 1, logger.log.select { |e| e['action'] == 'fail' }.size
@@ -42,21 +57,19 @@ class FtOnErrorTest < Test::Unit::TestCase
42
57
  participant :mark_finished
43
58
  end
44
59
 
45
- @engine.context.stash[:marks] = []
60
+ @dashboard.context.stash[:marks] = []
46
61
 
47
- @engine.register_participant 'mark\_.+' do |workitem|
62
+ @dashboard.register_participant 'mark\_.+' do |workitem|
48
63
  stash[:marks] << workitem.participant_name
49
64
  end
50
65
 
51
- #noisy
52
-
53
- wfid = @engine.launch(pdef)
66
+ wfid = @dashboard.launch(pdef)
54
67
 
55
68
  wait_for(wfid)
56
69
 
57
70
  assert_equal(
58
71
  %w[ mark_started mark_failed mark_finished ],
59
- @engine.context.stash[:marks])
72
+ @dashboard.context.stash[:marks])
60
73
  end
61
74
 
62
75
  def test_on_error_unknown_participant_name_2
@@ -67,21 +80,19 @@ class FtOnErrorTest < Test::Unit::TestCase
67
80
  participant :mark_finished
68
81
  end
69
82
 
70
- @engine.context.stash[:marks] = []
83
+ @dashboard.context.stash[:marks] = []
71
84
 
72
- @engine.register_participant 'mark\_.+' do |workitem|
85
+ @dashboard.register_participant 'mark\_.+' do |workitem|
73
86
  stash[:marks] << workitem.participant_name
74
87
  end
75
88
 
76
- #noisy
77
-
78
- wfid = @engine.launch(pdef)
89
+ wfid = @dashboard.launch(pdef)
79
90
 
80
91
  wait_for(wfid)
81
92
 
82
93
  assert_equal(
83
94
  %w[ mark_started mark_failed mark_finished ],
84
- @engine.context.stash[:marks])
95
+ @dashboard.context.stash[:marks])
85
96
  end
86
97
 
87
98
  def test_on_error_neutralization
@@ -94,34 +105,17 @@ class FtOnErrorTest < Test::Unit::TestCase
94
105
  end
95
106
  end
96
107
 
97
- @engine.register_participant :catcher do
98
- @tracer << "caught\n"
108
+ @dashboard.register_participant :catcher do
109
+ tracer << "caught\n"
99
110
  end
100
111
 
101
- #noisy
102
-
103
- wfid = @engine.launch(pdef)
112
+ wfid = @dashboard.launch(pdef)
104
113
  wait_for(wfid)
105
- ps = @engine.process(wfid)
114
+ ps = @dashboard.process(wfid)
106
115
 
107
116
  assert_equal(1, ps.errors.size)
108
117
  end
109
118
 
110
- class TroubleMaker
111
- include Ruote::LocalParticipant
112
- def consume(workitem)
113
- hits = (workitem.fields['hits'] || 0) + 1
114
- workitem.fields['hits'] = hits
115
- workitem.trace << "#{hits.to_s}\n"
116
- raise 'Houston, we have a problem !' if hits == 1
117
- workitem.trace << 'done.'
118
- reply(workitem)
119
- end
120
- def cancel(fei, flavour)
121
- # nothing to do
122
- end
123
- end
124
-
125
119
  def test_on_error_redo
126
120
 
127
121
  pdef = Ruote.process_definition do
@@ -130,9 +124,7 @@ class FtOnErrorTest < Test::Unit::TestCase
130
124
  end
131
125
  end
132
126
 
133
- #noisy
134
-
135
- @engine.register_participant :troublemaker, TroubleMaker
127
+ @dashboard.register_participant :troublemaker, TroubleMaker
136
128
 
137
129
  assert_trace(%w[ 1 2 done. ], pdef)
138
130
  end
@@ -145,11 +137,26 @@ class FtOnErrorTest < Test::Unit::TestCase
145
137
  end
146
138
  end
147
139
 
148
- @engine.register_participant :troublemaker, TroubleMaker
140
+ @dashboard.register_participant :troublemaker, TroubleMaker
149
141
 
150
142
  assert_trace(%w[ 1 2 done. ], pdef)
151
143
  end
152
144
 
145
+ def test_on_error_raise
146
+
147
+ pdef = Ruote.define do
148
+ sequence :on_error => :raise do
149
+ error 'nada'
150
+ end
151
+ end
152
+
153
+ wfid = @dashboard.launch(pdef)
154
+ r = @dashboard.wait_for(wfid)
155
+
156
+ assert_equal 'error_intercepted', r['action']
157
+ assert_equal 'nada', r['error']['message']
158
+ end
159
+
153
160
  def test_on_error_undo
154
161
 
155
162
  pdef = Ruote.process_definition do
@@ -164,16 +171,14 @@ class FtOnErrorTest < Test::Unit::TestCase
164
171
  end
165
172
  end
166
173
 
167
- #noisy
168
-
169
174
  wfid = assert_trace(%w[ a b d ], pdef)
170
175
 
171
- assert_nil @engine.process(wfid)
176
+ assert_nil @dashboard.process(wfid)
172
177
  end
173
178
 
174
179
  def test_on_error_undo_single_expression
175
180
 
176
- @engine.register_participant :nemo do |wi|
181
+ @dashboard.register_participant :nemo do |wi|
177
182
  wi.fields['fail_count'] = 1
178
183
  raise 'nemo'
179
184
  end
@@ -188,7 +193,7 @@ class FtOnErrorTest < Test::Unit::TestCase
188
193
 
189
194
  wfid = assert_trace(%w[ in |1 ], pdef)
190
195
 
191
- assert_nil @engine.process(wfid)
196
+ assert_nil @dashboard.process(wfid)
192
197
  end
193
198
 
194
199
  def test_on_error_pass
@@ -205,11 +210,9 @@ class FtOnErrorTest < Test::Unit::TestCase
205
210
  end
206
211
  end
207
212
 
208
- #noisy
209
-
210
213
  wfid = assert_trace(%w[ a b d ], pdef)
211
214
 
212
- assert_nil @engine.process(wfid)
215
+ assert_nil @dashboard.process(wfid)
213
216
  end
214
217
 
215
218
  def test_missing_handler_triggers_regular_error
@@ -218,11 +221,9 @@ class FtOnErrorTest < Test::Unit::TestCase
218
221
  nemo
219
222
  end
220
223
 
221
- #noisy
222
-
223
- wfid = @engine.launch(pdef)
224
+ wfid = @dashboard.launch(pdef)
224
225
  wait_for(wfid)
225
- ps = @engine.process(wfid)
226
+ ps = @dashboard.process(wfid)
226
227
 
227
228
  assert_equal 1, ps.errors.size
228
229
 
@@ -238,8 +239,6 @@ class FtOnErrorTest < Test::Unit::TestCase
238
239
  end
239
240
  end
240
241
 
241
- #noisy
242
-
243
242
  assert_trace('failed.', pdef)
244
243
  end
245
244
 
@@ -256,17 +255,15 @@ class FtOnErrorTest < Test::Unit::TestCase
256
255
  end
257
256
  end
258
257
 
259
- @engine.context.stash[:a_count] = 0
260
- @engine.context.stash[:e_count] = 0
261
-
262
- @engine.register_participant(:alpha) { |wi| stash[:a_count] += 1 }
263
- @engine.register_participant(:emil) { |wi| stash[:e_count] += 1 }
258
+ @dashboard.context.stash[:a_count] = 0
259
+ @dashboard.context.stash[:e_count] = 0
264
260
 
265
- #noisy
261
+ @dashboard.register_participant(:alpha) { |wi| stash[:a_count] += 1 }
262
+ @dashboard.register_participant(:emil) { |wi| stash[:e_count] += 1 }
266
263
 
267
264
  assert_trace 'done.', pdef
268
- assert_equal 1, @engine.context.stash[:a_count]
269
- assert_equal 1, @engine.context.stash[:e_count]
265
+ assert_equal 1, @dashboard.context.stash[:a_count]
266
+ assert_equal 1, @dashboard.context.stash[:e_count]
270
267
  end
271
268
 
272
269
  def test_participant_on_error
@@ -278,32 +275,33 @@ class FtOnErrorTest < Test::Unit::TestCase
278
275
  end
279
276
  end
280
277
 
281
- @engine.register_participant :troublemaker do |wi|
278
+ @dashboard.register_participant :troublemaker do |wi|
282
279
  wi.fields['seen'] = true
283
280
  raise 'Beijing, we have a problem !'
284
281
  end
285
- @engine.register_participant :troublespotter do |wi|
282
+ @dashboard.register_participant :troublespotter do |wi|
286
283
  stash[:workitem] = wi
287
- @tracer << 'err...'
284
+ tracer << 'err...'
288
285
  end
289
286
 
290
- #noisy
291
-
292
- wfid = @engine.launch(pdef)
287
+ wfid = @dashboard.launch(pdef)
293
288
  wait_for(wfid)
294
289
 
295
- #er = @engine.process(wfid).errors.first
290
+ #er = @dashboard.process(wfid).errors.first
296
291
  #puts er.message
297
292
  #puts er.trace
298
293
 
299
- wi = @engine.context.stash[:workitem]
294
+ wi = @dashboard.context.stash[:workitem]
300
295
 
301
296
  assert_equal 'err...', @tracer.to_s
302
- assert_equal 5, wi.error.size
303
297
  assert_equal 'RuntimeError', wi.error['class']
304
298
  assert_equal 'Beijing, we have a problem !', wi.error['message']
305
299
  assert_equal Array, wi.error['trace'].class
306
300
  assert_equal true, wi.fields['seen']
301
+
302
+ assert_equal(
303
+ %w[ at class details deviations fei message trace tree ],
304
+ wi.error.keys.sort)
307
305
  end
308
306
 
309
307
  class Murphy
@@ -328,16 +326,371 @@ class FtOnErrorTest < Test::Unit::TestCase
328
326
  end
329
327
  end
330
328
 
331
- @engine.register do
329
+ @dashboard.register do
332
330
  murphy FtOnErrorTest::Murphy
333
331
  catchall
334
332
  end
335
333
 
336
- #@engine.noisy = true
334
+ @dashboard.launch(pdef)
335
+
336
+ @dashboard.wait_for(:catcher)
337
+ end
338
+
339
+ class RescuerOne
340
+ include Ruote::LocalParticipant
341
+ def consume(workitem)
342
+ @context.tracer << 'one'
343
+ reply_to_engine(workitem)
344
+ end
345
+ def accept?(workitem)
346
+ false
347
+ end
348
+ end
349
+ class RescuerTwo
350
+ include Ruote::LocalParticipant
351
+ def consume(workitem)
352
+ @context.tracer << 'two'
353
+ reply_to_engine(workitem)
354
+ end
355
+ #def accept?(workitem)
356
+ # true
357
+ #end
358
+ end
359
+
360
+ def test_participants_and_accept
361
+
362
+ pdef = Ruote.process_definition do
363
+ sequence :on_error => 'rescuer' do
364
+ nada
365
+ end
366
+ end
367
+
368
+ @dashboard.register do
369
+ rescuer RescuerOne
370
+ rescuer RescuerTwo
371
+ end
372
+
373
+ assert_trace('two', pdef)
374
+
375
+ assert_equal 1, logger.log.select { |e| e['action'] == 'fail' }.size
376
+ end
377
+
378
+ # Only to show what's behind :on_error
379
+ #
380
+ def test_on_error_multi
381
+
382
+ pdef = Ruote.define do
383
+ sequence :on_error => [
384
+ [ /unknown participant/, 'alpha' ],
385
+ [ nil, 'bravo' ]
386
+ ] do
387
+ nada
388
+ end
389
+ end
390
+
391
+ @dashboard.register_participant /alpha|bravo/ do |workitem|
392
+ tracer << workitem.participant_name
393
+ end
394
+
395
+ wfid = @dashboard.launch(pdef)
396
+ @dashboard.wait_for(wfid)
397
+
398
+ assert_equal 'alpha', @tracer.to_s
399
+ end
400
+
401
+ # Let's be open
402
+ #
403
+ def test_on_error_multi_nice
404
+
405
+ pdef = Ruote.process_definition do
406
+ sequence :on_error => [
407
+ { /unknown participant/ => 'alpha' },
408
+ { // => 'bravo' }
409
+ ] do
410
+ nada
411
+ end
412
+ end
413
+
414
+ @dashboard.register_participant /alpha|bravo/ do |workitem|
415
+ tracer << workitem.participant_name
416
+ end
417
+
418
+ wfid = @dashboard.launch(pdef)
419
+ @dashboard.wait_for(wfid)
420
+
421
+ assert_equal 'alpha', @tracer.to_s
422
+ end
423
+
424
+ def test_on_error_multi_pass
425
+
426
+ @dashboard.register_participant /alpha|bravo/ do |workitem|
427
+ tracer << workitem.participant_name
428
+ end
429
+
430
+ pdef = Ruote.define do
431
+ sequence :on_error => [
432
+ { /unknown participant/ => :pass },
433
+ { // => 'bravo' }
434
+ ] do
435
+ nada
436
+ end
437
+ echo 'done.'
438
+ end
439
+
440
+ wfid = @dashboard.launch(pdef)
441
+ @dashboard.wait_for(wfid)
442
+
443
+ assert_equal 'done.', @tracer.to_s
444
+ end
445
+
446
+ def test_on_error_rewind
447
+
448
+ pdef = Ruote.define do
449
+ cursor :on_error => 'rewind' do
450
+ echo 'in'
451
+ inc 'v:counter'
452
+ error 'fail', :if => '${v:counter} == 1'
453
+ echo 'over.'
454
+ end
455
+ end
456
+
457
+ wfid = @dashboard.launch(pdef)
458
+ @dashboard.wait_for(wfid)
459
+
460
+ assert_equal %w[ in in over. ], @tracer.to_a
461
+ end
462
+
463
+ def test_on_error_jump_to
464
+
465
+ pdef = Ruote.define do
466
+ cursor :on_error => 'jump to shark' do
467
+ alpha
468
+ error 'fail'
469
+ bravo
470
+ shark
471
+ delta
472
+ end
473
+ end
474
+
475
+ @dashboard.register '.+' do |workitem|
476
+ tracer << workitem.participant_name + "\n"
477
+ end
478
+
479
+ wfid = @dashboard.launch(pdef)
480
+ @dashboard.wait_for(wfid)
481
+
482
+ assert_equal %w[ alpha shark delta ], @tracer.to_a
483
+ end
484
+
485
+ def test_on_error_var
486
+
487
+ pdef = Ruote.define do
488
+ define 'sub0' do
489
+ set 'v:/a' => '$f:__error__'
490
+ end
491
+ sequence :on_error => 'sub0' do
492
+ error 'nada'
493
+ end
494
+ end
495
+
496
+ wfid = @dashboard.launch(pdef)
497
+ r = @dashboard.wait_for(wfid)
498
+
499
+ assert_equal(
500
+ 'terminated',
501
+ r['action'])
502
+ assert_equal(
503
+ %w[ at class details deviations fei message trace tree ],
504
+ r['variables']['a'].keys.sort)
505
+ assert_equal(
506
+ [ 'error', { 'nada' => nil }, [] ],
507
+ r['variables']['a']['tree'])
508
+ end
509
+
510
+ def test_on_error_kill_process
511
+
512
+ pdef = Ruote.define do
513
+ sequence do
514
+ sequence :on_error => 'cancel_process' do
515
+ nemo0
516
+ end
517
+ nemo1
518
+ end
519
+ end
520
+
521
+ wfid = @dashboard.launch(pdef)
522
+ r = @dashboard.wait_for(wfid)
523
+
524
+ assert_equal 'terminated', r['action']
525
+ end
526
+
527
+ #
528
+ # the "second take" feature
529
+
530
+ def test_second_take
531
+
532
+ @dashboard.register_participant :troublemaker, TroubleMaker
533
+
534
+ pdef = Ruote.define do
535
+ define 'sub0' do
536
+ set '__on_error__' => 'redo'
537
+ end
538
+ sequence :on_error => 'sub0' do
539
+ troublemaker
540
+ end
541
+ end
542
+
543
+ wfid = @dashboard.launch(pdef)
544
+ r = @dashboard.wait_for(wfid)
545
+
546
+ assert_equal 'terminated', r['action']
547
+ assert_equal 3, r['workitem']['fields']['_trace'].size
548
+ end
549
+
550
+ def test_blank_second_take
551
+
552
+ pdef = Ruote.define do
553
+ define 'sub0' do
554
+ set '__on_error__' => ''
555
+ end
556
+ sequence :on_error => 'sub0' do
557
+ nada
558
+ end
559
+ end
560
+
561
+ wfid = @dashboard.launch(pdef)
562
+ r = @dashboard.wait_for(wfid)
563
+
564
+ assert_equal 'terminated', r['action']
565
+ end
566
+
567
+ def test_second_take_raise
568
+
569
+ pdef = Ruote.define do
570
+ define 'sub0' do
571
+ set '__on_error__' => 'raise'
572
+ end
573
+ sequence :on_error => 'sub0' do
574
+ error 'nada'
575
+ end
576
+ end
577
+
578
+ wfid = @dashboard.launch(pdef)
579
+ r = @dashboard.wait_for(wfid)
580
+
581
+ assert_equal 'error_intercepted', r['action']
582
+ assert_equal 'nada', r['error']['message']
583
+ end
584
+
585
+ # "stashing that for now"
586
+ #
587
+ # def test_second_take_skip
588
+ #
589
+ # pdef = Ruote.define do
590
+ # define 'sub0' do
591
+ # set '__on_error__' => 'cancel'
592
+ # end
593
+ # define 'sub1' do
594
+ # set 'sub1' => true
595
+ # end
596
+ # sequence :on_error => 'sub0', :on_cancel => 'sub1' do
597
+ # error 'nada'
598
+ # end
599
+ # end
600
+ #
601
+ # wfid = @dashboard.launch(pdef)
602
+ # r = @dashboard.wait_for(wfid)
603
+ #
604
+ # #assert_equal 'error_intercepted', r['action']
605
+ # #assert_equal 'nada', r['error']['message']
606
+ # end
607
+
608
+ # behaves like 'undo' when there is no on_cancel present
609
+ #
610
+ def test_on_error_cancel
611
+
612
+ pdef = Ruote.define do
613
+ sequence :on_error => 'cancel' do
614
+ echo 'n'
615
+ error 'nada'
616
+ end
617
+ end
618
+
619
+ wfid = @dashboard.launch(pdef)
620
+ r = @dashboard.wait_for(wfid)
621
+
622
+ assert_equal 'terminated', r['action']
623
+ assert_equal %w[ n ], @tracer.to_a
624
+ end
625
+
626
+ def test_on_error_and_on_cancel
627
+
628
+ pdef = Ruote.define do
629
+ define 'rollback' do
630
+ echo 'rollback'
631
+ end
632
+ sequence :on_cancel => 'rollback', :on_error => 'cancel_process' do
633
+ echo 'in'
634
+ error 'nada'
635
+ end
636
+ end
637
+
638
+ wfid = @dashboard.launch(pdef)
639
+ r = @dashboard.wait_for(wfid)
640
+
641
+ assert_equal 'terminated', r['action']
642
+
643
+ assert_equal %w[ in rollback ], @tracer.to_a
644
+
645
+ assert_equal(
646
+ 1,
647
+ @dashboard.logger.log.select { |m| m['action'] == 'cancel_process' }.size)
648
+ end
649
+
650
+ def test_on_error_immediate
651
+
652
+ pdef = Ruote.define do
653
+ define 'rollback' do
654
+ echo 'rollback'
655
+ end
656
+ sequence :on_error => '!kill_process' do
657
+ sequence :on_cancel => 'rollback' do
658
+ echo 'in'
659
+ error 'nada'
660
+ end
661
+ end
662
+ end
663
+
664
+ wfid = @dashboard.launch(pdef)
665
+ r = @dashboard.wait_for(wfid)
666
+
667
+ assert_equal 'terminated', r['action']
668
+ assert_equal %w[ in ], @tracer.to_a
669
+
670
+ assert_nil @dashboard.ps(wfid)
671
+ end
672
+
673
+ def test_on_error_immediate_with_tree
674
+
675
+ pdef = Ruote.define do
676
+ define 'rollback' do
677
+ echo 'rollback'
678
+ end
679
+ sequence :on_error => [ '!kill_process', {}, [] ] do
680
+ sequence :on_cancel => 'rollback' do
681
+ echo 'in'
682
+ error 'nada'
683
+ end
684
+ end
685
+ end
686
+
687
+ wfid = @dashboard.launch(pdef)
688
+ r = @dashboard.wait_for(wfid)
337
689
 
338
- @engine.launch(pdef)
690
+ assert_equal 'terminated', r['action']
691
+ assert_equal %w[ in ], @tracer.to_a
339
692
 
340
- @engine.wait_for(:catcher)
693
+ assert_nil @dashboard.ps(wfid)
341
694
  end
342
695
  end
343
696