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,94 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Sep 21 15:15:09 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtTakeAndDiscardAttributesTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_take
15
+
16
+ @dashboard.register :alpha do |workitem|
17
+ workitem.fields['a'] = 'A'
18
+ workitem.fields['b'] = 'B'
19
+ end
20
+
21
+ #@dashboard.noisy = true
22
+
23
+ wfid = @dashboard.launch(Ruote.define do
24
+ set 'f:x' => 'X'
25
+ set 'f:y' => 'Y'
26
+ alpha :take => 'a'
27
+ end)
28
+
29
+ r = @dashboard.wait_for(wfid)
30
+
31
+ assert_equal %w[ a x y ], r['workitem']['fields'].keys.sort
32
+ end
33
+
34
+ def test_take_regex
35
+
36
+ @dashboard.register :alpha do |workitem|
37
+ workitem.fields['a'] = 'A'
38
+ workitem.fields['aa'] = 'A'
39
+ workitem.fields['b'] = 'B'
40
+ end
41
+
42
+ #@dashboard.noisy = true
43
+
44
+ wfid = @dashboard.launch(Ruote.define do
45
+ set 'f:x' => 'X'
46
+ set 'f:y' => 'Y'
47
+ alpha :take => /^a/
48
+ end)
49
+
50
+ r = @dashboard.wait_for(wfid)
51
+
52
+ assert_equal %w[ a aa x y ], r['workitem']['fields'].keys.sort
53
+ end
54
+
55
+ def test_discard
56
+
57
+ @dashboard.register :alpha do |workitem|
58
+ workitem.fields['a'] = 'A'
59
+ workitem.fields['b'] = 'B'
60
+ workitem.fields['c'] = 'C'
61
+ end
62
+
63
+ #@dashboard.noisy = true
64
+
65
+ wfid = @dashboard.launch(Ruote.define do
66
+ set 'f:x' => 'X'
67
+ set 'f:y' => 'Y'
68
+ alpha :discard => [ 'a', 'b' ]
69
+ end)
70
+
71
+ r = @dashboard.wait_for(wfid)
72
+
73
+ assert_equal %w[ __result__ c x y ], r['workitem']['fields'].keys.sort
74
+ end
75
+
76
+ def test_discard_true
77
+
78
+ @dashboard.register :alpha do |workitem|
79
+ workitem.fields['a'] = 'A'
80
+ end
81
+
82
+ #@dashboard.noisy = true
83
+
84
+ wfid = @dashboard.launch(Ruote.define do
85
+ set 'f:x' => 'X'
86
+ alpha :discard => true
87
+ end)
88
+
89
+ r = @dashboard.wait_for(wfid)
90
+
91
+ assert_equal %w[ x ], r['workitem']['fields'].keys.sort
92
+ end
93
+ end
94
+
@@ -0,0 +1,144 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Oct 17 09:47:52 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtRetriesTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ class BadParticipant
15
+ include Ruote::LocalParticipant
16
+ def on_workitem
17
+ fail 'badly'
18
+ end
19
+ def on_cancel
20
+ end
21
+ end
22
+
23
+ #
24
+ # :on_error => '4s: retry'
25
+
26
+ def test_single_retry
27
+
28
+ @dashboard.register_participant :alpha, BadParticipant
29
+
30
+ pdef = Ruote.process_definition do
31
+ alpha :on_error => '4s: retry'
32
+ end
33
+
34
+ #@dashboard.noisy = true
35
+
36
+ wfid = @dashboard.launch(pdef)
37
+
38
+ @dashboard.wait_for('fail')
39
+
40
+ alpha = @dashboard.ps(wfid).expressions.last
41
+
42
+ assert_not_nil alpha.h.timers
43
+ assert_nil alpha.tree[1]['on_error']
44
+
45
+ @dashboard.wait_for('error_intercepted')
46
+
47
+ ps = @dashboard.ps(wfid)
48
+
49
+ assert_equal '#<RuntimeError: badly>', ps.errors.first.message
50
+ end
51
+
52
+ #
53
+ # :on_error => '4x: retry'
54
+
55
+ def test_bad_time_syntax
56
+
57
+ @dashboard.register_participant :alpha, BadParticipant
58
+
59
+ pdef = Ruote.process_definition do
60
+ alpha :on_error => '4x: retry'
61
+ end
62
+
63
+ #@dashboard.noisy = true
64
+
65
+ wfid = @dashboard.launch(pdef)
66
+
67
+ @dashboard.wait_for('error_intercepted')
68
+
69
+ assert_equal(
70
+ "#<Ruote::MetaError: schedule_retries: unknown time char 'x'>",
71
+ @dashboard.ps(wfid).errors.first.message)
72
+ end
73
+
74
+ #
75
+ # :on_error => '2s: retry, pass'
76
+
77
+ def test_retry_then_pass
78
+
79
+ @dashboard.register_participant :alpha, BadParticipant
80
+
81
+ pdef = Ruote.process_definition do
82
+ alpha :on_error => '1s: retry, pass'
83
+ echo 'over.'
84
+ end
85
+
86
+ #@dashboard.noisy = true
87
+
88
+ wfid = @dashboard.launch(pdef)
89
+
90
+ @dashboard.wait_for('terminated')
91
+
92
+ actions = @dashboard.context.logger.log.collect { |m|
93
+ m['action']
94
+ }.group_by { |a|
95
+ a
96
+ }
97
+
98
+ assert_equal 1, actions['cancel'].size
99
+ assert_equal 2, actions['fail'].size
100
+
101
+ assert_equal 'over.', @tracer.to_s
102
+ end
103
+
104
+ #
105
+ # :on_error => '1s: retry * 3'
106
+
107
+ def test_star_three
108
+
109
+ @dashboard.register_participant :alpha, BadParticipant
110
+
111
+ pdef = Ruote.process_definition do
112
+ alpha :on_error => '1s: retry * 3'
113
+ end
114
+
115
+ #@dashboard.noisy = true
116
+
117
+ wfid = @dashboard.launch(pdef)
118
+
119
+ @dashboard.wait_for('fail')
120
+
121
+ alpha = @dashboard.ps(wfid).expressions.last
122
+
123
+ assert_equal '1s: retry * 2', alpha.tree[1]['on_error']
124
+
125
+ @dashboard.wait_for('fail')
126
+
127
+ alpha = @dashboard.ps(wfid).expressions.last
128
+
129
+ assert_equal '1s: retry', alpha.tree[1]['on_error']
130
+
131
+ @dashboard.wait_for('fail')
132
+
133
+ alpha = @dashboard.ps(wfid).expressions.last
134
+
135
+ assert_equal nil, alpha.tree[1]['on_error']
136
+
137
+ @dashboard.wait_for('error_intercepted')
138
+
139
+ assert_equal(
140
+ '#<RuntimeError: badly>',
141
+ @dashboard.ps(wfid).errors.first.message)
142
+ end
143
+ end
144
+
@@ -0,0 +1,60 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Oct 24 09:10:41 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtOnTerminateTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_regenerate
15
+
16
+ # var0 is used to determine if root variables are passed correctly
17
+ # to the next generation of the workflow instance.
18
+
19
+ pdef = Ruote.define :on_terminate => :regenerate do
20
+ echo '${wfid}'
21
+ echo '${v:var0}'
22
+ end
23
+
24
+ #@dashboard.noisy = true
25
+
26
+ wfid = @dashboard.launch(pdef, {}, { 'var0' => 'x' })
27
+
28
+ 3.times { @dashboard.wait_for('regenerate') }
29
+
30
+ assert @tracer.to_a.size >= 3
31
+ assert_equal [ wfid, 'x' ], @tracer.to_a.uniq
32
+ #assert_not_nil @dashboard.ps(wfid)
33
+ end
34
+
35
+ def test_cancel_regenerating_flow
36
+
37
+ pdef = Ruote.define :on_terminate => :regenerate do
38
+ echo 'a'
39
+ wait 0.100
40
+ end
41
+
42
+ #@dashboard.noisy = true
43
+
44
+ wfid = @dashboard.launch(pdef)
45
+
46
+ 2.times { @dashboard.wait_for('regenerate') }
47
+
48
+ @dashboard.cancel(wfid)
49
+ @dashboard.cancel(wfid)
50
+
51
+ sleep 3.0
52
+
53
+ assert_equal(
54
+ 2,
55
+ @dashboard.context.logger.log.select { |m|
56
+ m['action'] == 'regenerate'
57
+ }.size)
58
+ end
59
+ end
60
+
@@ -0,0 +1,107 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Jun 13 13:50:56 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtRaiseMsgTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ class FaultyParticipant
15
+ include Ruote::LocalParticipant
16
+
17
+ def on_workitem
18
+
19
+ @context.storage.put_msg(
20
+ 'raise',
21
+ 'fei' => workitem.h.fei,
22
+ 'wfid' => workitem.h.fei['wfid'],
23
+ 'msg' => {
24
+ 'fei' => workitem.h.fei,
25
+ 'wfid' => workitem.h.fei['wfid'],
26
+ 'workitem' => workitem.h },
27
+ 'error' => {
28
+ 'class' => 'ArgumentError',
29
+ 'message' => "that's very wrong",
30
+ 'trace' => [ "local.rb:126:in `whatever'" ] })
31
+
32
+ # do not reply
33
+ end
34
+ end
35
+
36
+ def test_raise_via_put_msg
37
+
38
+ # participant doesn't reply but places "raise" msg
39
+
40
+ @dashboard.register :faulty, FaultyParticipant
41
+
42
+ pdef = Ruote.define do
43
+ faulty
44
+ end
45
+
46
+ wfid = @dashboard.launch(pdef)
47
+
48
+ r = @dashboard.wait_for('error_intercepted')
49
+
50
+ assert_equal 'ArgumentError', r['error']['class']
51
+ assert_equal "that's very wrong", r['error']['message']
52
+ assert_equal "local.rb:126:in `whatever'", r['error']['trace'].join
53
+
54
+ ps = @dashboard.ps(wfid)
55
+
56
+ assert_equal(
57
+ 1, ps.errors.size)
58
+ assert_equal(
59
+ "raised: ArgumentError: that's very wrong", ps.errors.first.message)
60
+ end
61
+
62
+ class RaisyParticipant
63
+ include Ruote::LocalParticipant
64
+
65
+ def on_workitem
66
+
67
+ raise "I don't like pasta!"
68
+
69
+ rescue => err
70
+
71
+ @context.error_handler.msg_raise(
72
+ { 'fei' => workitem.h.fei,
73
+ 'wfid' => workitem.h.fei['wfid'],
74
+ 'workitem' => workitem.h },
75
+ err)
76
+
77
+ # do not reply
78
+ end
79
+ end
80
+
81
+ def test_raise_via_raise_msg
82
+
83
+ # participant doesn't reply but places "raise" msg
84
+
85
+ @dashboard.register :raisy, RaisyParticipant
86
+
87
+ pdef = Ruote.define do
88
+ raisy
89
+ end
90
+
91
+ wfid = @dashboard.launch(pdef)
92
+
93
+ r = @dashboard.wait_for('error_intercepted')
94
+
95
+ assert_equal 'RuntimeError', r['error']['class']
96
+ assert_equal "I don't like pasta!", r['error']['message']
97
+ assert_equal Array, r['error']['trace'].class
98
+
99
+ ps = @dashboard.ps(wfid)
100
+
101
+ assert_equal(
102
+ 1, ps.errors.size)
103
+ assert_equal(
104
+ "raised: RuntimeError: I don't like pasta!", ps.errors.first.message)
105
+ end
106
+ end
107
+
@@ -0,0 +1,106 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Jul 26 15:17:44 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtResparkTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_respark
15
+
16
+ @dashboard.register do
17
+ alpha Ruote::NullParticipant
18
+ end
19
+
20
+ pdef = Ruote.define do
21
+ concurrence do
22
+ alpha; alpha
23
+ end
24
+ end
25
+
26
+ wfid = @dashboard.launch(pdef)
27
+ 2.times { @dashboard.wait_for('dispatched') }
28
+
29
+ # flow stalled...
30
+
31
+ @dashboard.register do
32
+ alpha Ruote::StorageParticipant
33
+ end
34
+
35
+ @dashboard.respark(wfid)
36
+
37
+ 2.times { @dashboard.wait_for('dispatched') }
38
+
39
+ assert_equal 2, @dashboard.storage_participant.size
40
+ end
41
+
42
+ # Errors are not re-applied
43
+ #
44
+ def test_respark_when_errors
45
+
46
+ @dashboard.register 'alpha', Ruote::NullParticipant
47
+ @dashboard.register 'bravo' do |workitem|
48
+ raise "nada"
49
+ end
50
+
51
+ pdef = Ruote.define do
52
+ concurrence do
53
+ alpha; bravo
54
+ end
55
+ end
56
+
57
+ wfid = @dashboard.launch(pdef)
58
+ @dashboard.wait_for('error_intercepted')
59
+
60
+ error_at = @dashboard.process(wfid).errors.first.at
61
+
62
+ # flow stalled...
63
+
64
+ @dashboard.register 'alpha', Ruote::StorageParticipant
65
+
66
+ @dashboard.respark(wfid)
67
+
68
+ @dashboard.wait_for('dispatched')
69
+ sleep 0.100
70
+
71
+ assert_equal 1, @dashboard.storage_participant.size
72
+ assert_equal error_at, @dashboard.process(wfid).errors.first.at
73
+ end
74
+
75
+ def test_respark_errors_too
76
+
77
+ @dashboard.register 'alpha', Ruote::NullParticipant
78
+ @dashboard.register 'bravo' do |workitem|
79
+ raise "nada"
80
+ end
81
+
82
+ pdef = Ruote.define do
83
+ concurrence do
84
+ alpha; bravo
85
+ end
86
+ end
87
+
88
+ wfid = @dashboard.launch(pdef)
89
+ @dashboard.wait_for('error_intercepted')
90
+
91
+ error_at = @dashboard.process(wfid).errors.first.at
92
+
93
+ # flow stalled...
94
+
95
+ @dashboard.register 'alpha', Ruote::StorageParticipant
96
+
97
+ @dashboard.respark(wfid, 'errors_too' => true)
98
+
99
+ @dashboard.wait_for('error_intercepted')
100
+ sleep 0.100
101
+
102
+ assert_equal 1, @dashboard.storage_participant.size
103
+ assert_not_equal error_at, @dashboard.process(wfid).errors.first.at
104
+ end
105
+ end
106
+