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,41 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Jun 29 07:42:42 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtStash < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ class SolParticipant
15
+ include Ruote::LocalParticipant
16
+ def on_workitem
17
+ @context.tracer << stash_get(fexp.root_id, 'lost')
18
+ @context.tracer << "\n" + (get('lost') || 'nada')
19
+ reply
20
+ end
21
+ end
22
+
23
+ def test_stash_on_launch
24
+
25
+ @dashboard.register { sally SolParticipant }
26
+
27
+ #@dashboard.noisy = true
28
+
29
+ wfid = @dashboard.launch(Ruote.define do
30
+ sally
31
+ end,
32
+ {}, # workitem fields
33
+ {}, # process variables
34
+ { 'lost' => 'wallet' }) # root stash
35
+
36
+ r = @dashboard.wait_for(wfid)
37
+
38
+ assert_equal "wallet\nnada", @tracer.to_s
39
+ end
40
+ end
41
+
@@ -0,0 +1,313 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Aug 15 20:43:11 JST 2011
6
+ #
7
+ # Right before the international date change line
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class FtTimersTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_single_timeout
17
+
18
+ pdef = Ruote.process_definition do
19
+ alpha :timers => '1d: timeout'
20
+ end
21
+
22
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
23
+
24
+ wfid = @dashboard.launch(pdef)
25
+
26
+ @dashboard.wait_for(:alpha)
27
+
28
+ assert_equal(
29
+ 1, @dashboard.storage.get_many('schedules').size)
30
+ assert_equal(
31
+ 'cancel', @dashboard.storage.get_many('schedules').first['msg']['action'])
32
+
33
+ ps = @dashboard.ps(wfid)
34
+
35
+ assert_not_nil ps.expressions.last.h.timers
36
+ assert_equal 1, ps.expressions.last.h.timers.size
37
+ assert_match /^at-/, ps.expressions.last.h.timers.first.first
38
+ assert_equal 'timeout', ps.expressions.last.h.timers.first.last
39
+ end
40
+
41
+ def test_reminders
42
+
43
+ pdef = Ruote.process_definition do
44
+ alpha :timers => '1s: remind, 2s: remind'
45
+ define 'remind' do
46
+ echo 'reminder'
47
+ end
48
+ end
49
+
50
+ @dashboard.register_participant :alpha, Ruote::NullParticipant
51
+
52
+ wfid = @dashboard.launch(pdef)
53
+
54
+ @dashboard.wait_for(20)
55
+
56
+ assert_equal %w[ reminder reminder ], @tracer.to_a
57
+ end
58
+
59
+ def test_expid
60
+
61
+ # same expid as expression sporting the :timers
62
+
63
+ pdef = Ruote.process_definition do
64
+ alpha :timers => '1s: remind'
65
+ end
66
+
67
+ @dashboard.register_participant :alpha, Ruote::NullParticipant
68
+
69
+ @dashboard.register_participant :remind do |workitem|
70
+ tracer << workitem.fei.expid
71
+ end
72
+
73
+ wfid = @dashboard.launch(pdef)
74
+
75
+ @dashboard.wait_for(10)
76
+
77
+ assert_equal '0_0', @tracer.to_s
78
+ end
79
+
80
+ def test_cancelling
81
+
82
+ pdef = Ruote.process_definition do
83
+ alpha :timers => '1d: remind'
84
+ bravo
85
+ end
86
+
87
+ @dashboard.register_participant /alpha|bravo/, Ruote::StorageParticipant
88
+
89
+ wfid = @dashboard.launch(pdef)
90
+
91
+ @dashboard.wait_for(:alpha)
92
+ @dashboard.wait_for(1)
93
+
94
+ fei = @dashboard.ps(wfid).expressions.last.fei
95
+
96
+ @dashboard.cancel(fei)
97
+
98
+ @dashboard.wait_for(:bravo)
99
+ @dashboard.wait_for(1)
100
+
101
+ ps = @dashboard.ps(wfid)
102
+
103
+ assert_equal 0, ps.schedules.size
104
+ end
105
+
106
+ def test_flanks
107
+
108
+ pdef = Ruote.process_definition do
109
+ alpha :timers => '1s: reminder'
110
+ end
111
+
112
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
113
+ @dashboard.register_participant :reminder, Ruote::NullParticipant
114
+
115
+ wfid = @dashboard.launch(pdef)
116
+
117
+ @dashboard.wait_for(:reminder)
118
+ @dashboard.wait_for(1)
119
+
120
+ ps = @dashboard.ps(wfid)
121
+
122
+ alpha = ps.expressions.find { |e| e.h.participant_name == 'alpha' }
123
+
124
+ assert_equal [ '0_0' ], alpha.h.flanks.collect { |fei| fei['expid'] }
125
+ end
126
+
127
+ def test_cancelling_running_side
128
+
129
+ pdef = Ruote.process_definition do
130
+ alpha :timers => '1s: reminder'
131
+ end
132
+
133
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
134
+ @dashboard.register_participant :reminder, Ruote::NullParticipant
135
+
136
+ wfid = @dashboard.launch(pdef)
137
+
138
+ @dashboard.wait_for(:reminder)
139
+ @dashboard.wait_for(1)
140
+
141
+ ps = @dashboard.ps(wfid)
142
+
143
+ assert_equal 3, ps.expressions.size
144
+
145
+ alpha = ps.expressions.find { |e| e.h.participant_name == 'alpha' }
146
+
147
+ @dashboard.cancel(alpha)
148
+
149
+ @dashboard.wait_for(wfid)
150
+
151
+ assert_nil @dashboard.ps(wfid)
152
+ end
153
+
154
+ def test_error
155
+
156
+ @dashboard.register_participant :alpha, Ruote::NullParticipant
157
+
158
+ pdef = Ruote.process_definition do
159
+ alpha :timers => '1s: error'
160
+ end
161
+
162
+ wfid = @dashboard.launch(pdef)
163
+
164
+ @dashboard.wait_for(wfid)
165
+
166
+ ps = @dashboard.ps(wfid)
167
+
168
+ assert_equal 1, ps.errors.size
169
+ assert_equal 2, ps.expressions.size
170
+
171
+ assert_equal(
172
+ '#<Ruote::ForcedError: timer induced error ("1s: error")>',
173
+ ps.errors.first.message)
174
+ end
175
+
176
+ def test_error_message
177
+
178
+ @dashboard.register_participant :alpha, Ruote::NullParticipant
179
+
180
+ pdef = Ruote.process_definition do
181
+ alpha :timers => '1s: error it went wrong, 3d: nada'
182
+ end
183
+
184
+ wfid = @dashboard.launch(pdef)
185
+
186
+ @dashboard.wait_for(wfid)
187
+
188
+ ps = @dashboard.ps(wfid)
189
+
190
+ assert_equal 1, ps.errors.size
191
+ assert_equal 2, ps.expressions.size
192
+ assert_equal '#<Ruote::ForcedError: it went wrong>', ps.errors[0].message
193
+ end
194
+
195
+ def test_redo_or_retry
196
+
197
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
198
+
199
+ pdef = Ruote.process_definition do
200
+ alpha :timers => '3s: retry'
201
+ end
202
+
203
+ wfid = @dashboard.launch(pdef)
204
+
205
+ @dashboard.wait_for(:alpha)
206
+ @dashboard.wait_for(:alpha)
207
+
208
+ assert_equal(
209
+ 'on_re_apply',
210
+ @dashboard.storage_participant.first.params['_triggered'])
211
+ end
212
+
213
+ def test_undo_or_pass
214
+
215
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
216
+ @dashboard.register_participant :bravo, Ruote::StorageParticipant
217
+
218
+ pdef = Ruote.process_definition do
219
+ alpha :timers => '1s: pass'
220
+ bravo
221
+ end
222
+
223
+ wfid = @dashboard.launch(pdef)
224
+
225
+ @dashboard.wait_for(:bravo)
226
+
227
+ ps = @dashboard.ps(wfid)
228
+
229
+ assert_equal 0, ps.errors.size
230
+ assert_equal 2, ps.expressions.size
231
+ end
232
+
233
+ def test_jump_and_other_commands
234
+
235
+ @dashboard.register '.+', Ruote::StorageParticipant
236
+
237
+ pdef = Ruote.process_definition do
238
+ cursor do
239
+ alpha :timers => '1s: jump to charly'
240
+ bravo
241
+ charly
242
+ end
243
+ end
244
+
245
+ wfid = @dashboard.launch(pdef)
246
+
247
+ @dashboard.wait_for(:charly)
248
+ end
249
+
250
+ class MyParticipant
251
+ include Ruote::LocalParticipant
252
+
253
+ def consume(workitem)
254
+ # do nothing
255
+ end
256
+
257
+ def rtimers(workitem)
258
+ "2d: reminder"
259
+ end
260
+ end
261
+
262
+ def test_participant_defined_timers
263
+
264
+ @dashboard.register 'alpha', MyParticipant
265
+
266
+ wfid = @dashboard.launch(Ruote.define do
267
+ alpha
268
+ end)
269
+
270
+ @dashboard.wait_for(:alpha)
271
+
272
+ alpha = @dashboard.ps(wfid).expressions.last
273
+
274
+ assert_equal 1, alpha.h.timers.size
275
+ end
276
+
277
+ def test_bad_syntax
278
+
279
+ pdef = Ruote.process_definition do
280
+ alpha :timers => '1x: timeout'
281
+ end
282
+
283
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
284
+
285
+ wfid = @dashboard.launch(pdef)
286
+
287
+ @dashboard.wait_for('error_intercepted')
288
+
289
+ err = @dashboard.ps(wfid).errors.first
290
+
291
+ assert_equal "#<ArgumentError: unknown time char 'x'>", err.message
292
+ end
293
+
294
+ def test_process_status_and_timers
295
+
296
+ @dashboard.register :alpha, Ruote::StorageParticipant
297
+
298
+ pdef = Ruote.process_definition do
299
+ alpha :timers => '3h: x, 1d: timeout'
300
+ end
301
+
302
+ wfid = @dashboard.launch(pdef)
303
+
304
+ @dashboard.wait_for('launch')
305
+ @dashboard.wait_for('dispatched')
306
+
307
+ ps = @dashboard.ps(wfid).inspect
308
+
309
+ assert_match /apply\n\s+\*\* no target \*\*/, ps
310
+ assert_match /cancel\n\s+0_0!/, ps
311
+ end
312
+ end
313
+
@@ -0,0 +1,133 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Aug 30 00:46:07 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class FtFlankTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_flank
17
+
18
+ pdef = Ruote.process_definition do
19
+ sequence do
20
+ bravo :flank => true
21
+ alpha
22
+ end
23
+ end
24
+
25
+ @dashboard.register_participant '.+', Ruote::NullParticipant
26
+
27
+ wfid = @dashboard.launch(pdef)
28
+
29
+ @dashboard.wait_for(:alpha)
30
+
31
+ ps = @dashboard.ps(wfid)
32
+
33
+ assert_equal 4, ps.expressions.size
34
+ assert_equal [ ps.expressions[2].fei.h ], ps.expressions[1].h.flanks
35
+
36
+ assert_equal(
37
+ [ ["participant", { "flank" => true, "ref" => "bravo" }, [] ],
38
+ ["participant", { "ref" => "alpha" }, [] ] ],
39
+ ps.leaves.collect(&:tree))
40
+ end
41
+
42
+ # Cancelling the sequence also cancels its "flanks".
43
+ #
44
+ def test_cancel
45
+
46
+ pdef = Ruote.process_definition do
47
+ sequence do
48
+ bravo :flank => true
49
+ alpha
50
+ end
51
+ end
52
+
53
+ @dashboard.register_participant '.+', Ruote::NullParticipant
54
+
55
+ wfid = @dashboard.launch(pdef)
56
+
57
+ @dashboard.wait_for(:alpha)
58
+ @dashboard.wait_for(1)
59
+
60
+ fei = @dashboard.ps(wfid).expressions[1].fei
61
+
62
+ @dashboard.cancel(fei)
63
+
64
+ @dashboard.wait_for(wfid)
65
+ sleep 1.0
66
+
67
+ assert_nil @dashboard.ps(wfid)
68
+ end
69
+
70
+ # Expressions replying "naturally" to their parent weren't cancelling their
71
+ # flanks.
72
+ #
73
+ # https://github.com/kennethkalmer/ruote-kit/issues/13
74
+ #
75
+ # This test verifies the fix is in place.
76
+ #
77
+ def test_cancel_flank_when_done
78
+
79
+ pdef = Ruote.process_definition do
80
+ sequence do
81
+ sub0 :flank => true
82
+ echo 'over'
83
+ end
84
+ define 'sub0' do
85
+ stall
86
+ end
87
+ end
88
+
89
+ wfid = @dashboard.launch(pdef)
90
+
91
+ @dashboard.wait_for(19)
92
+
93
+ assert_nil @dashboard.ps(wfid)
94
+ end
95
+
96
+ # https://github.com/jmettraux/ruote/issues/47
97
+ #
98
+ def test_cancelling_reminders
99
+
100
+ @dashboard.register_participant 'notifier' do |wi|
101
+ tracer << wi.participant_name + "\n"
102
+ end
103
+
104
+ @dashboard.register_participant 'form_submitter', Ruote::StorageParticipant
105
+
106
+ pdef = Ruote.define do
107
+
108
+ form_submitter :timers => '1s: reminder, 2s: cancel_submission'
109
+
110
+ define 'reminder' do
111
+ notifier :message_type => 'reminder'
112
+ end
113
+
114
+ define 'cancel_submission' do
115
+ notifier :message_type => 'draft_timeout'
116
+ kill_process
117
+ end
118
+ end
119
+
120
+ wfid = @dashboard.launch(pdef, 'status' => 'draft')
121
+
122
+ r = @dashboard.wait_for(wfid)
123
+
124
+ assert_equal 'terminated', r['action']
125
+
126
+ sleep 1
127
+
128
+ assert_equal %w[ notifier ] * 2, @tracer.to_a
129
+ assert_equal 0, @dashboard.storage.get_many('expressions').size
130
+ assert_equal 0, @dashboard.storage.get_many('workitems').size
131
+ end
132
+ end
133
+