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
  # Mon Jan 24 11:11:43 JST 2011
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
 
11
11
  class FtDefaultHistoryTest < Test::Unit::TestCase
@@ -13,25 +13,30 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
13
13
 
14
14
  def test_engine_has_history
15
15
 
16
- assert_not_nil @engine.context.history
17
- assert_not_nil @engine.history
16
+ assert_not_nil @dashboard.context.history
17
+ assert_not_nil @dashboard.history
18
18
  end
19
19
 
20
20
  def launch_processes(clear=true)
21
21
 
22
- @engine.history.clear! if clear
22
+ if clear
23
+ @dashboard.history.clear!
24
+ sleep 0.050
25
+ @dashboard.history.clear!
26
+ end
27
+
28
+ @dashboard.register_participant 'alpha', Ruote::NullParticipant
23
29
 
24
- @engine.register_participant 'alpha', Ruote::NullParticipant
30
+ #puts; @dashboard.noisy = true
25
31
 
26
32
  pdef = Ruote.define do
27
33
  alpha
28
34
  end
29
35
 
30
- wfids = 2.times.collect { @engine.launch(pdef) }
36
+ wfids = 2.times.collect { @dashboard.launch(pdef) }
31
37
 
32
- @engine.wait_for(:alpha)
33
- @engine.wait_for(:alpha)
34
- sleep 0.700
38
+ @dashboard.wait_for('dispatched')
39
+ @dashboard.wait_for('dispatched')
35
40
 
36
41
  wfids
37
42
  end
@@ -42,33 +47,33 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
42
47
 
43
48
  wfids = launch_processes
44
49
 
45
- assert_equal 9, @engine.history.all.size
50
+ assert_equal 9, @dashboard.history.reject { |m| m['action'] == 'noop' }.size
46
51
  end
47
52
 
48
53
  def test_by_wfid
49
54
 
50
55
  wfids = launch_processes
51
56
 
52
- assert_equal 4, @engine.history.by_wfid(wfids[0]).size
53
- assert_not_nil @engine.history.by_wfid(wfids[0]).first['seen_at']
57
+ assert_equal 4, @dashboard.history.by_wfid(wfids[0]).size
58
+ assert_not_nil @dashboard.history.by_wfid(wfids[0]).first['seen_at']
54
59
 
55
- assert_equal 4, @engine.history.by_wfid(wfids[1]).size
60
+ assert_equal 4, @dashboard.history.by_wfid(wfids[1]).size
56
61
  end
57
62
 
58
63
  def test_clear!
59
64
 
60
65
  launch_processes
61
66
 
62
- assert_equal 9, @engine.history.all.size
67
+ assert_equal 9, @dashboard.history.reject { |m| m['action'] == 'noop' }.size
63
68
 
64
- @engine.history.clear!
69
+ @dashboard.history.clear!
65
70
 
66
- assert_equal 0, @engine.history.all.size
71
+ assert_equal 0, @dashboard.history.all.size
67
72
  end
68
73
 
69
74
  def test_default_range
70
75
 
71
- range = @engine.history.range
76
+ range = @dashboard.history.range
72
77
 
73
78
  assert_equal Time, range[0].class
74
79
  assert_equal range[0], range[1]
@@ -80,7 +85,7 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
80
85
  sleep 1
81
86
  launch_processes(false)
82
87
 
83
- range = @engine.history.range
88
+ range = @dashboard.history.range
84
89
 
85
90
  assert_not_equal range[0], range[1]
86
91
  assert range[0] < range[1]
@@ -90,20 +95,27 @@ class FtDefaultHistoryTest < Test::Unit::TestCase
90
95
 
91
96
  launch_processes
92
97
 
93
- @engine.history.all.each { |msg| msg['seen_at'] = '1970-12-25' }
98
+ @dashboard.history.all.each { |msg| msg['seen_at'] = '1970-12-25' }
94
99
 
95
100
  launch_processes(false)
96
101
 
97
- assert_equal 18, @engine.history.all.size
98
-
99
- assert_equal 9, @engine.history.by_date(Time.now).size
102
+ assert_equal(
103
+ 18,
104
+ @dashboard.history.reject { |m|
105
+ m['action'] == 'noop'
106
+ }.size)
107
+ assert_equal(
108
+ 9,
109
+ @dashboard.history.by_date(Time.now.utc).reject { |m|
110
+ m['action'] == 'noop'
111
+ }.size)
100
112
  end
101
113
 
102
114
  def test_wfids
103
115
 
104
116
  wfids = launch_processes
105
117
 
106
- assert_equal wfids.sort, @engine.history.wfids
118
+ assert_equal wfids.sort, @dashboard.history.wfids
107
119
  end
108
120
  end
109
121
 
@@ -7,7 +7,7 @@
7
7
  # Qcon Tokyo, special day
8
8
  #
9
9
 
10
- require File.join(File.dirname(__FILE__), 'base')
10
+ require File.expand_path('../base', __FILE__)
11
11
 
12
12
  require 'ruote/part/local_participant'
13
13
 
@@ -15,6 +15,42 @@ require 'ruote/part/local_participant'
15
15
  class FtParticipantMoreTest < Test::Unit::TestCase
16
16
  include FunctionalBase
17
17
 
18
+ #
19
+ # tests about reject / re_dispatch
20
+
21
+ def test_re_dispatch_count_is_initially_zero
22
+
23
+ @dashboard.register { catchall }
24
+
25
+ wfid = @dashboard.launch(Ruote.define { alpha })
26
+ r = @dashboard.wait_for(:alpha)
27
+
28
+ assert_equal 0, r['workitem']['re_dispatch_count']
29
+ end
30
+
31
+ class CountingParticipant
32
+ include Ruote::LocalParticipant
33
+ def on_workitem
34
+ context.tracer << "#{workitem.re_dispatch_count}\n"
35
+ if workitem.re_dispatch_count < 5
36
+ re_dispatch
37
+ else
38
+ reply
39
+ end
40
+ end
41
+ end
42
+
43
+ def test_re_dispatch_count_is_incremented_at_each_re_dispatch
44
+
45
+ @dashboard.register { counter CountingParticipant }
46
+
47
+ wfid = @dashboard.launch(Ruote.define { counter })
48
+
49
+ @dashboard.wait_for(wfid)
50
+
51
+ assert_equal %w[ 0 1 2 3 4 5 ], @tracer.to_a
52
+ end
53
+
18
54
  class DifficultParticipant
19
55
  include Ruote::LocalParticipant
20
56
  def initialize(opts)
@@ -38,13 +74,55 @@ class FtParticipantMoreTest < Test::Unit::TestCase
38
74
  alpha
39
75
  end
40
76
 
41
- @engine.register_participant :alpha, DifficultParticipant
42
-
43
- #noisy
77
+ @dashboard.register_participant :alpha, DifficultParticipant
44
78
 
45
79
  assert_trace(%w[ diff diff ], pdef)
46
80
  end
47
81
 
82
+ # https://groups.google.com/d/topic/openwferu-users/_k-VIQwMvXw/discussion
83
+ #
84
+ def test_re_dispatch_outside_of_participant
85
+
86
+ @dashboard.register :alpha, Ruote::StorageParticipant
87
+
88
+ pdef = Ruote.process_definition do
89
+ alpha
90
+ end
91
+
92
+ wfid = @dashboard.launch(pdef)
93
+ r = @dashboard.wait_for('dispatched')
94
+
95
+ wi = @dashboard.storage_participant.first
96
+
97
+ @dashboard.storage_participant.re_dispatch(wi, :in => '100')
98
+
99
+ sleep 10
100
+ end
101
+
102
+ class ReluctantParticipant
103
+ include Ruote::LocalParticipant
104
+ def initialize(opts)
105
+ end
106
+ def consume(workitem)
107
+ context.tracer << "x\n"
108
+ if workitem.fields['re_dispatched'].nil?
109
+ workitem.fields['re_dispatched'] = true
110
+ re_dispatch
111
+ else
112
+ reply_to_engine(workitem)
113
+ end
114
+ end
115
+ end
116
+
117
+ # Reject and re_dispatch are aliases.
118
+ #
119
+ def test_participant_re_dispatch_no_params
120
+
121
+ @dashboard.register_participant :alpha, ReluctantParticipant
122
+
123
+ assert_trace(%w[ x x ], Ruote.define { alpha })
124
+ end
125
+
48
126
  class FightingParticipant
49
127
  include Ruote::LocalParticipant
50
128
  def initialize(opts)
@@ -61,15 +139,13 @@ class FtParticipantMoreTest < Test::Unit::TestCase
61
139
  end
62
140
  end
63
141
 
64
- # Reject and re_dispatch are aliases.
65
- #
66
142
  def test_participant_re_dispatch
67
143
 
68
144
  pdef = Ruote.process_definition do
69
145
  alpha
70
146
  end
71
147
 
72
- @engine.register_participant :alpha, FightingParticipant
148
+ @dashboard.register_participant :alpha, FightingParticipant
73
149
 
74
150
  #noisy
75
151
 
@@ -96,8 +172,6 @@ class FtParticipantMoreTest < Test::Unit::TestCase
96
172
  end
97
173
  end
98
174
 
99
- # Reject and re_dispatch are aliases.
100
- #
101
175
  # re_dispatch with an :in or an :at parameter makes sure the dispatch is
102
176
  # performed once more, but a bit later (:in / :at timepoint).
103
177
  #
@@ -107,18 +181,16 @@ class FtParticipantMoreTest < Test::Unit::TestCase
107
181
  alpha
108
182
  end
109
183
 
110
- @engine.register_participant :alpha, RetryParticipant
111
-
112
- #noisy
184
+ @dashboard.register_participant :alpha, RetryParticipant
113
185
 
114
- wfid = @engine.launch(pdef)
186
+ wfid = @dashboard.launch(pdef)
115
187
  wait_for(wfid)
116
188
 
117
189
  times = @tracer.to_s.split("\n").collect { |t| Float(t) }
118
190
  t = times.last - times.first
119
191
 
120
192
  assert t >= 1.0, "took less that 1 second"
121
- assert t < 2.0, "took more than 1.99 second"
193
+ assert t < 2.8, "took more than 2.8 second"
122
194
  end
123
195
 
124
196
  # Making sure that when a process gets cancelled, its 'later' re-dispatches
@@ -130,19 +202,22 @@ class FtParticipantMoreTest < Test::Unit::TestCase
130
202
  alpha
131
203
  end
132
204
 
133
- @engine.register_participant :alpha, RetryParticipant, 'delay' => '1m'
205
+ @dashboard.register_participant :alpha, RetryParticipant, 'delay' => '1m'
134
206
 
135
207
  #noisy
136
208
 
137
- wfid = @engine.launch(pdef)
209
+ wfid = @dashboard.launch(pdef)
138
210
  sleep 0.7
139
211
 
140
- @engine.cancel_process(wfid)
212
+ @dashboard.cancel_process(wfid)
141
213
  wait_for(wfid)
142
214
 
143
- assert_equal 0, @engine.storage.get_many('schedules').size
215
+ assert_equal 0, @dashboard.storage.get_many('schedules').size
144
216
  end
145
217
 
218
+ #
219
+ # tests about stash_put and stash_get
220
+
146
221
  BLACKBOARD = {}
147
222
 
148
223
  class StashingParticipant
@@ -150,11 +225,12 @@ class FtParticipantMoreTest < Test::Unit::TestCase
150
225
  def initialize(opts)
151
226
  end
152
227
  def consume(workitem)
153
- put(workitem.fei, 'token' => workitem.params['token'])
228
+ put('token0' => workitem.params['token0'])
229
+ put('token1', workitem.params['token1'])
154
230
  end
155
231
  def cancel(fei, flavour)
156
- BLACKBOARD['token'] = get(fei, 'token')
157
- BLACKBOARD['all'] = get(fei)
232
+ BLACKBOARD['token0'] = get('token0')
233
+ BLACKBOARD['all'] = get
158
234
  end
159
235
  end
160
236
 
@@ -166,28 +242,109 @@ class FtParticipantMoreTest < Test::Unit::TestCase
166
242
  BLACKBOARD.clear
167
243
 
168
244
  pdef = Ruote.process_definition do
169
- alpha :token => 'of esteem'
245
+ alpha :token0 => 'of esteem', :token1 => 'of whatever'
170
246
  end
171
247
 
172
- @engine.register_participant :alpha, StashingParticipant
248
+ @dashboard.register_participant :alpha, StashingParticipant
173
249
 
174
- #noisy
250
+ #@dashboard.noisy = true
175
251
 
176
- wfid = @engine.launch(pdef)
252
+ wfid = @dashboard.launch(pdef)
177
253
  wait_for(:alpha)
254
+ wait_for(1)
178
255
 
179
- sleep 0.350 # since wait_for(:alpha) releases too early sometimes
180
-
181
- ps = @engine.process(wfid)
256
+ ps = @dashboard.process(wfid)
182
257
  fexp = ps.expressions.find { |e| e.fei.expid == '0_0' }
183
258
 
184
- assert_equal({ 'token' => 'of esteem' }, fexp.h.stash)
259
+ assert_equal(
260
+ { 'token0' => 'of esteem', 'token1' => 'of whatever' },
261
+ fexp.h.stash)
185
262
 
186
- @engine.cancel_process(wfid)
263
+ @dashboard.cancel_process(wfid)
187
264
  wait_for(wfid)
188
265
 
189
- assert_equal('of esteem', BLACKBOARD['token'])
190
- assert_equal({ 'token' => 'of esteem' }, BLACKBOARD['all'])
266
+ assert_equal(
267
+ 'of esteem',
268
+ BLACKBOARD['token0'])
269
+ assert_equal(
270
+ { 'token0' => 'of esteem', 'token1' => 'of whatever' },
271
+ BLACKBOARD['all'])
272
+ end
273
+
274
+ class Doubtful
275
+ include Ruote::LocalParticipant
276
+
277
+ def on_workitem
278
+ context.tracer << "canceled:#{is_canceled?}\n"
279
+ context.tracer << "gone:#{is_gone?}\n"
280
+ sleep 5
281
+ context.tracer << "cancelled:#{is_cancelled?}\n"
282
+ context.tracer << "gone:#{is_gone?}\n"
283
+ end
284
+
285
+ def on_cancel
286
+ # nothing
287
+ end
288
+ end
289
+
290
+ def test_is_cancelled
291
+
292
+ @dashboard.register :alpha, Doubtful
293
+
294
+ pdef = Ruote.define do
295
+ alpha
296
+ end
297
+
298
+ #@dashboard.noisy = true
299
+
300
+ wfid = @dashboard.launch(pdef)
301
+
302
+ @dashboard.wait_for(:alpha)
303
+ sleep 1.0 # making sure on_workitem reaches its sleep
304
+
305
+ @dashboard.cancel(@dashboard.ps(wfid).expressions.last)
306
+
307
+ @dashboard.wait_for(wfid)
308
+
309
+ sleep 10
310
+
311
+ assert_equal(
312
+ %w[ canceled:false gone:false cancelled:true gone:true ],
313
+ @tracer.to_a)
314
+ end
315
+
316
+ class Robust
317
+ include Ruote::LocalParticipant
318
+
319
+ def on_workitem
320
+ context.tracer << "on_workitem\n"
321
+ sleep 5
322
+ workitem.fields['toto'] = 'seen'
323
+ reply
324
+ end
325
+
326
+ def on_cancel
327
+ context.tracer << "on_cancel\n"
328
+ false
329
+ end
330
+ end
331
+
332
+ def test_on_cancel_returning_false
333
+
334
+ @dashboard.register :rob, Robust
335
+
336
+ #@dashboard.noisy = true
337
+
338
+ wfid = @dashboard.launch(Ruote.define { rob })
339
+
340
+ @dashboard.wait_for(:rob)
341
+
342
+ @dashboard.cancel(@dashboard.ps(wfid).expressions.last)
343
+
344
+ r = @dashboard.wait_for(wfid)
345
+
346
+ assert_equal 'seen', r['workitem']['fields']['toto']
347
+ assert_equal %w[ on_cancel on_workitem ], @tracer.to_a.sort
191
348
  end
192
349
  end
193
350
 
@@ -5,7 +5,7 @@
5
5
  # Tue Apr 20 12:32:44 JST 2010
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/part/storage_participant'
11
11
 
@@ -19,17 +19,17 @@ class FtWaitForTest < Test::Unit::TestCase
19
19
  alpha
20
20
  end
21
21
 
22
- sp = @engine.register_participant :alpha, Ruote::StorageParticipant
22
+ sp = @dashboard.register_participant :alpha, Ruote::StorageParticipant
23
23
 
24
24
  #noisy
25
25
 
26
- wfid = @engine.launch(pdef)
26
+ wfid = @dashboard.launch(pdef)
27
27
 
28
28
  r = wait_for(:alpha)
29
29
 
30
30
  assert_equal(
31
31
  Ruote::Workitem,
32
- @engine.workitem(Ruote.sid(r['fei'])).class)
32
+ @dashboard.workitem(Ruote.sid(r['fei'])).class)
33
33
  end
34
34
 
35
35
  class MyParticipant
@@ -48,17 +48,17 @@ class FtWaitForTest < Test::Unit::TestCase
48
48
  alpha
49
49
  end
50
50
 
51
- @engine.register_participant :alpha, MyParticipant
51
+ @dashboard.register_participant :alpha, MyParticipant
52
52
 
53
53
  4.times do
54
- @engine.launch(pdef)
54
+ @dashboard.launch(pdef)
55
55
  end
56
56
 
57
57
  #noisy
58
58
 
59
- @engine.wait_for(:empty)
59
+ @dashboard.wait_for(:empty)
60
60
 
61
- assert_equal [], @engine.processes
61
+ assert_equal [], @dashboard.processes
62
62
  end
63
63
 
64
64
  def test_wait_for_multiple
@@ -66,18 +66,18 @@ class FtWaitForTest < Test::Unit::TestCase
66
66
  pdef0 = Ruote.process_definition { alpha }
67
67
  pdef1 = Ruote.process_definition { bravo }
68
68
 
69
- @engine.register_participant :alpha, MyParticipant
69
+ @dashboard.register_participant :alpha, MyParticipant
70
70
 
71
71
  #noisy
72
72
 
73
73
  wfids = []
74
74
 
75
- 2.times { wfids << @engine.launch(pdef0) }
76
- 2.times { wfids << @engine.launch(pdef1) }
75
+ 2.times { wfids << @dashboard.launch(pdef0) }
76
+ 2.times { wfids << @dashboard.launch(pdef1) }
77
77
 
78
- @engine.wait_for(*wfids)
78
+ @dashboard.wait_for(*wfids)
79
79
 
80
- assert_equal 2, @engine.processes.size
80
+ assert_equal 2, @dashboard.processes.size
81
81
  end
82
82
 
83
83
  def test_wait_for_inactive
@@ -85,52 +85,52 @@ class FtWaitForTest < Test::Unit::TestCase
85
85
  pdef0 = Ruote.process_definition { alpha }
86
86
  pdef1 = Ruote.process_definition { bravo }
87
87
 
88
- @engine.register_participant :alpha, MyParticipant
88
+ @dashboard.register_participant :alpha, MyParticipant
89
89
 
90
90
  #noisy
91
91
 
92
92
  wfids = []
93
93
 
94
- 2.times { @engine.launch(pdef0) }
95
- 2.times { wfids << @engine.launch(pdef1) }
94
+ 2.times { @dashboard.launch(pdef0) }
95
+ 2.times { wfids << @dashboard.launch(pdef1) }
96
96
 
97
- @engine.wait_for(:inactive)
97
+ @dashboard.wait_for(:inactive)
98
98
 
99
- assert_equal wfids.sort, @engine.processes.collect { |ps| ps.wfid }.sort
99
+ assert_equal wfids.sort, @dashboard.processes.collect { |ps| ps.wfid }.sort
100
100
  end
101
101
 
102
102
  def test_wait_for_multithreaded
103
103
 
104
104
  pdef = Ruote.process_definition { alpha }
105
105
 
106
- sp = @engine.register_participant :alpha, Ruote::StorageParticipant
106
+ sp = @dashboard.register_participant :alpha, Ruote::StorageParticipant
107
107
 
108
108
  #noisy
109
109
 
110
- wfid = @engine.launch(pdef)
110
+ wfid = @dashboard.launch(pdef)
111
111
 
112
112
  seen = []
113
113
  threads = []
114
114
 
115
115
  threads << Thread.new do
116
- @engine.wait_for(wfid)
116
+ @dashboard.wait_for(wfid)
117
117
  seen << 'this'
118
118
  end
119
119
  threads << Thread.new do
120
- @engine.wait_for(wfid)
120
+ @dashboard.wait_for(wfid)
121
121
  seen << 'that'
122
122
  end
123
123
 
124
- @engine.wait_for(:alpha)
124
+ @dashboard.wait_for(:alpha)
125
125
 
126
- sp.reply(sp.first)
126
+ sp.proceed(sp.first)
127
127
 
128
128
  threads.each do |t|
129
129
  t.join
130
130
  end
131
131
 
132
132
  assert_equal %w[ that this ], seen.sort
133
- assert_equal [], @engine.context.logger.instance_variable_get(:@waiting)
133
+ assert_equal [], @dashboard.context.logger.instance_variable_get(:@waiting)
134
134
  end
135
135
  end
136
136