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
@@ -0,0 +1,34 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Sep 1 02:03:39 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class FtRadialMiscTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_dollar
17
+
18
+ pdef = %{
19
+ define
20
+ set "f:a": toto
21
+ echo "$f:a"
22
+ }
23
+
24
+ @dashboard.register_participant '.+', Ruote::NullParticipant
25
+
26
+ #@dashboard.noisy = true
27
+
28
+ wfid = @dashboard.launch(pdef)
29
+ @dashboard.wait_for(wfid)
30
+
31
+ assert_equal 'toto', @tracer.to_s
32
+ end
33
+ end
34
+
@@ -0,0 +1,72 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Fri Sep 16 08:35:21 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtPutDocTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_reput_doc
15
+
16
+ #@dashboard.noisy = true
17
+
18
+ @dashboard.storage.put_msg(
19
+ 'reput',
20
+ 'doc' => {
21
+ 'type' => 'variables',
22
+ '_id' => 'variables',
23
+ 'variables' => { 'hello' => 'world' }
24
+ })
25
+ @dashboard.wait_for(1)
26
+
27
+ assert_equal 'world', @dashboard.variables['hello']
28
+ end
29
+
30
+ def test_re_reput_doc
31
+
32
+ #@dashboard.noisy = true
33
+
34
+ @dashboard.variables['hello'] = 'world'
35
+
36
+ @dashboard.storage.put_msg(
37
+ 'reput',
38
+ 'doc' => {
39
+ 'type' => 'variables',
40
+ '_id' => 'variables',
41
+ 'variables' => { 'hello' => 'Welt' }
42
+ })
43
+ @dashboard.wait_for(1)
44
+
45
+ assert_equal 'Welt', @dashboard.variables['hello']
46
+ end
47
+
48
+ def test_reput_msg
49
+
50
+ #@dashboard.noisy = true
51
+
52
+ tree = Ruote.define do
53
+ echo 'nada'
54
+ end
55
+
56
+ @dashboard.storage.put_msg(
57
+ 'reput',
58
+ {
59
+ 'msg' => {
60
+ 'action' => 'launch',
61
+ 'tree' => tree,
62
+ 'put_at' => Time.now.to_s,
63
+ 'workitem' => { 'fields' => {} }
64
+ }
65
+ })
66
+
67
+ @dashboard.wait_for('terminated')
68
+
69
+ assert_equal 'nada', @tracer.to_s
70
+ end
71
+ end
72
+
@@ -0,0 +1,56 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sun Sep 18 10:54:00 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtWorkerInfoTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_empty_worker_info
15
+
16
+ assert_nil @dashboard.worker_info
17
+ end
18
+
19
+ def test_worker_info
20
+
21
+ #@dashboard.noisy = true
22
+
23
+ 3.times {
24
+ @dashboard.launch(Ruote.define do
25
+ 10.times { echo 'hello' }
26
+ end)
27
+ }
28
+ @dashboard.wait_for(3)
29
+
30
+ info = @dashboard.worker_info
31
+
32
+ assert_equal(
33
+ "worker/#{Ruote.local_ip.gsub(/\./, '_')}/#{$$}",
34
+ info.keys.first)
35
+ assert_equal(
36
+ %w[
37
+ class hostname ip name pid
38
+ processed_last_hour processed_last_minute
39
+ put_at system uptime
40
+ wait_time_last_hour wait_time_last_minute
41
+ ],
42
+ info.values.first.keys.sort)
43
+ end
44
+
45
+ def test_worker_info_disabled
46
+
47
+ assert_not_nil @dashboard.context.worker.instance_variable_get(:@info)
48
+
49
+ worker = Ruote::Worker.new(
50
+ Ruote::HashStorage.new(
51
+ 'worker_info_enabled' => false))
52
+
53
+ assert_nil worker.instance_variable_get(:@info)
54
+ end
55
+ end
56
+
@@ -5,7 +5,7 @@
5
5
  # Wed Jun 3 21:52:09 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
 
@@ -21,18 +21,18 @@ class FtOnCancelTest < Test::Unit::TestCase
21
21
  end
22
22
  end
23
23
 
24
- nemo = @engine.register_participant :nemo, Ruote::StorageParticipant
24
+ nemo = @dashboard.register_participant :nemo, Ruote::StorageParticipant
25
25
 
26
- @engine.register_participant :catcher do
27
- @tracer << "caught\n"
26
+ @dashboard.register_participant :catcher do
27
+ tracer << "caught\n"
28
28
  end
29
29
 
30
30
  #noisy
31
31
 
32
- wfid = @engine.launch(pdef)
32
+ wfid = @dashboard.launch(pdef)
33
33
  wait_for(:nemo)
34
34
 
35
- @engine.cancel_process(wfid)
35
+ @dashboard.cancel_process(wfid)
36
36
  wait_for(wfid)
37
37
 
38
38
  assert_equal 'caught', @tracer.to_s
@@ -46,17 +46,17 @@ class FtOnCancelTest < Test::Unit::TestCase
46
46
  end
47
47
  end
48
48
 
49
- nemo = @engine.register_participant :nemo, Ruote::StorageParticipant
49
+ nemo = @dashboard.register_participant :nemo, Ruote::StorageParticipant
50
50
 
51
51
  #noisy
52
52
 
53
- wfid = @engine.launch(pdef)
53
+ wfid = @dashboard.launch(pdef)
54
54
  wait_for(:nemo)
55
55
 
56
- @engine.cancel_process(wfid)
56
+ @dashboard.cancel_process(wfid)
57
57
  wait_for(wfid)
58
58
 
59
- ps = @engine.process(wfid)
59
+ ps = @dashboard.process(wfid)
60
60
  assert_not_nil ps
61
61
 
62
62
  #logger.log.each { |e| puts e['action'] }
@@ -78,21 +78,21 @@ class FtOnCancelTest < Test::Unit::TestCase
78
78
  end
79
79
  end
80
80
 
81
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
81
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
82
82
 
83
83
  #noisy
84
84
 
85
- wfid = @engine.launch(pdef)
85
+ wfid = @dashboard.launch(pdef)
86
86
 
87
87
  wait_for(:alpha)
88
88
 
89
89
  assert_equal '', @tracer.to_s
90
90
 
91
- @engine.cancel_process(wfid)
91
+ @dashboard.cancel_process(wfid)
92
92
 
93
93
  wait_for(wfid)
94
94
 
95
- assert_nil @engine.process(wfid)
95
+ assert_nil @dashboard.process(wfid)
96
96
 
97
97
  assert_equal "d0\nd1", @tracer.to_s
98
98
  end
@@ -108,20 +108,20 @@ class FtOnCancelTest < Test::Unit::TestCase
108
108
  end
109
109
  end
110
110
 
111
- @engine.register_participant :alpha, Ruote::StorageParticipant
112
- sto = @engine.register_participant :bravo, Ruote::StorageParticipant
111
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
112
+ sto = @dashboard.register_participant :bravo, Ruote::StorageParticipant
113
113
 
114
114
  #noisy
115
115
 
116
- wfid = @engine.launch(pdef)
116
+ wfid = @dashboard.launch(pdef)
117
117
 
118
118
  wait_for(:alpha)
119
119
 
120
- fei = @engine.process(wfid).expressions.find { |e|
120
+ fei = @dashboard.process(wfid).expressions.find { |e|
121
121
  e.fei.expid == '0_1'
122
122
  }.fei
123
123
 
124
- @engine.cancel_expression(fei)
124
+ @dashboard.cancel_expression(fei)
125
125
 
126
126
  wait_for(:bravo)
127
127
 
@@ -139,16 +139,16 @@ class FtOnCancelTest < Test::Unit::TestCase
139
139
  end
140
140
  end
141
141
 
142
- @engine.register_participant :alpha, Ruote::StorageParticipant
143
- @engine.register_participant :bravo, Ruote::StorageParticipant
142
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
143
+ @dashboard.register_participant :bravo, Ruote::StorageParticipant
144
144
 
145
145
  #noisy
146
146
 
147
- wfid = @engine.launch(pdef)
147
+ wfid = @dashboard.launch(pdef)
148
148
 
149
149
  wait_for(:alpha)
150
150
 
151
- @engine.cancel_process(wfid)
151
+ @dashboard.cancel_process(wfid)
152
152
 
153
153
  wait_for(:bravo)
154
154
 
@@ -156,12 +156,39 @@ class FtOnCancelTest < Test::Unit::TestCase
156
156
  ["define", {"name"=>"test"}, [
157
157
  ["define", {"sub0"=>nil}, [["bravo", {}, []]]],
158
158
  ["sequence", {"on_cancel"=>"sub0"}, [["alpha", {}, []]]]]],
159
- @engine.process(wfid).original_tree)
159
+ @dashboard.process(wfid).original_tree)
160
160
  assert_equal(
161
161
  ["define", {"name"=>"test"}, [
162
162
  ["define", {"sub0"=>nil}, [["participant", {"ref"=>"bravo"}, []]]],
163
163
  ["sequence", {"on_cancel"=>"sub0", "_triggered"=>"on_cancel"}, [["alpha", {}, []]]]]],
164
- @engine.process(wfid).current_tree)
164
+ @dashboard.process(wfid).current_tree)
165
+ end
166
+
167
+ def test_on_cancel_tree
168
+
169
+ pdef = Ruote.process_definition :name => 'test' do
170
+ set 'bar' => 'baz'
171
+ sequence :on_cancel => [ 'sub0', { 'foo' => '${bar}' }, [] ] do
172
+ alpha
173
+ end
174
+ define 'sub0' do
175
+ echo 'foo:${v:foo}'
176
+ end
177
+ end
178
+
179
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
180
+
181
+ #@dashboard.noisy = true
182
+
183
+ wfid = @dashboard.launch(pdef)
184
+
185
+ wait_for(:alpha)
186
+
187
+ @dashboard.cancel_process(wfid)
188
+
189
+ wait_for(wfid)
190
+
191
+ assert_equal 'foo:baz', @tracer.to_s
165
192
  end
166
193
 
167
194
  def test_on_cancel_participant_resume
@@ -176,17 +203,17 @@ class FtOnCancelTest < Test::Unit::TestCase
176
203
  end
177
204
  end
178
205
 
179
- @engine.register :alpha, Ruote::StorageParticipant
206
+ @dashboard.register :alpha, Ruote::StorageParticipant
180
207
 
181
208
  #noisy
182
209
 
183
- wfid = @engine.launch(pdef)
210
+ wfid = @dashboard.launch(pdef)
184
211
 
185
- @engine.wait_for(:alpha)
212
+ @dashboard.wait_for(:alpha)
186
213
 
187
- @engine.cancel(@engine.storage_participant.first)
214
+ @dashboard.cancel(@dashboard.storage_participant.first)
188
215
 
189
- @engine.wait_for(wfid)
216
+ @dashboard.wait_for(wfid)
190
217
 
191
218
  assert_equal "bailed\ndone.", @tracer.to_s
192
219
  end
@@ -204,17 +231,143 @@ class FtOnCancelTest < Test::Unit::TestCase
204
231
  end
205
232
  end
206
233
 
207
- #noisy
234
+ wfid = @dashboard.launch(pdef)
208
235
 
209
- wfid = @engine.launch(pdef)
236
+ @dashboard.wait_for('action' => 'apply', 'exp_name' => 'wait')
210
237
 
211
- @engine.wait_for(6)
238
+ @dashboard.cancel(@dashboard.process(wfid).expressions.last)
212
239
 
213
- @engine.cancel(@engine.process(wfid).expressions.last)
214
-
215
- @engine.wait_for(wfid)
240
+ @dashboard.wait_for('terminated')
216
241
 
217
242
  assert_equal "bailed\ndone.", @tracer.to_s
218
243
  end
244
+
245
+ def test_on_cancel_is_not_triggered_by_on_error_undo
246
+
247
+ pdef = Ruote.define do
248
+ sequence :on_cancel => 'c', :on_error => 'undo' do
249
+ echo 'n'
250
+ error 'nada'
251
+ end
252
+ define 'c' do
253
+ echo 'c'
254
+ end
255
+ end
256
+
257
+ wfid = @dashboard.launch(pdef)
258
+ r = @dashboard.wait_for(wfid)
259
+
260
+ assert_equal 'terminated', r['action']
261
+ assert_equal %w[ n ], @tracer.to_a
262
+ end
263
+
264
+ def test_on_cancel_is_triggered_by_on_error_cancel
265
+
266
+ pdef = Ruote.define do
267
+ sequence :on_cancel => 'c', :on_error => 'cancel' do
268
+ echo 'n'
269
+ error 'nada'
270
+ end
271
+ define 'c' do
272
+ echo 'c'
273
+ end
274
+ end
275
+
276
+ wfid = @dashboard.launch(pdef)
277
+ r = @dashboard.wait_for(wfid)
278
+
279
+ assert_equal 'terminated', r['action']
280
+ assert_equal %w[ n c ], @tracer.to_a
281
+ end
282
+
283
+ #
284
+ # 'cando'
285
+
286
+ class MyBrokenParticipant
287
+ include Ruote::LocalParticipant
288
+ def self.reset
289
+ @@seen = 0
290
+ end
291
+ def on_workitem
292
+ if @@seen > 1
293
+ reply
294
+ else
295
+ @@seen += 1
296
+ fail 'broke'
297
+ end
298
+ end
299
+ def on_cancel
300
+ end
301
+ end
302
+
303
+ def test_on_cancel_is_triggered_by_on_error_cando
304
+
305
+ MyBrokenParticipant.reset
306
+
307
+ @dashboard.register :broken, MyBrokenParticipant
308
+
309
+ pdef = Ruote.define do
310
+ define 'c' do; echo 'c'; end
311
+ sequence :on_cancel => 'c', :on_error => 'cando' do
312
+ echo 'n'
313
+ broken
314
+ end
315
+ echo 'z'
316
+ end
317
+
318
+ wfid = @dashboard.launch(pdef)
319
+ r = @dashboard.wait_for(wfid)
320
+
321
+ assert_equal 'terminated', r['action']
322
+ assert_equal %w[ n c n c n z ], @tracer.to_a
323
+ end
324
+
325
+ def test_on_error_cando_when_no_on_cancel
326
+
327
+ MyBrokenParticipant.reset
328
+
329
+ @dashboard.register :broken, MyBrokenParticipant
330
+
331
+ pdef = Ruote.define do
332
+ sequence :on_error => 'cando' do
333
+ echo 'n'
334
+ broken
335
+ end
336
+ echo 'z'
337
+ end
338
+
339
+ wfid = @dashboard.launch(pdef)
340
+ r = @dashboard.wait_for(wfid)
341
+
342
+ assert_equal 'terminated', r['action']
343
+ assert_equal %w[ n n n z ], @tracer.to_a
344
+ end
345
+
346
+ #
347
+ # the "second take" feature
348
+
349
+ def test_second_take
350
+
351
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
352
+
353
+ pdef = Ruote.define do
354
+ define 'sub0' do
355
+ set '__on_cancel__' => 'redo'
356
+ end
357
+ sequence :on_cancel => 'sub0' do
358
+ alpha
359
+ end
360
+ end
361
+
362
+ wfid = @dashboard.launch(pdef)
363
+ r = @dashboard.wait_for('dispatched')
364
+
365
+ exp = @dashboard.ps(wfid).expressions[1]
366
+ @dashboard.cancel(exp)
367
+
368
+ r = @dashboard.wait_for('dispatched')
369
+
370
+ assert_equal 'alpha', r['participant_name']
371
+ end
219
372
  end
220
373