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,35 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Aug 17 08:29:13 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class EftStallTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_no_operation
17
+
18
+ pdef = Ruote.define do
19
+ stall
20
+ end
21
+
22
+ #@dashboard.noisy = true
23
+
24
+ wfid = @dashboard.launch(pdef)
25
+
26
+ sleep 0.750
27
+
28
+ ps = @dashboard.ps(wfid)
29
+
30
+ assert_equal 0, ps.errors.size
31
+ assert_equal 2, ps.expressions.size
32
+ assert_equal 'stall', ps.expressions.last.name
33
+ end
34
+ end
35
+
@@ -5,7 +5,7 @@
5
5
  # Wed May 13 11:14:08 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
 
@@ -15,21 +15,26 @@ class EftParticipantTest < Test::Unit::TestCase
15
15
 
16
16
  def test_participant
17
17
 
18
+ @dashboard.register_participant :alpha do |workitem|
19
+ context.tracer << 'alpha'
20
+ end
21
+
18
22
  pdef = Ruote.process_definition do
19
23
  participant :ref => 'alpha'
20
24
  end
21
25
 
22
- @engine.register_participant :alpha do |workitem|
23
- @tracer << 'alpha'
24
- end
26
+ #@dashboard.noisy = true
25
27
 
26
- #noisy
28
+ wfid = @dashboard.launch(pdef)
29
+ @dashboard.wait_for(wfid)
27
30
 
28
- assert_trace 'alpha', pdef
31
+ sleep 0.300
32
+ # give a chance to the 'dispatched' message for reaching us
29
33
 
34
+ assert_equal 'alpha', @tracer.to_s
30
35
  assert_log_count(1) { |e| e['action'] == 'dispatch' }
31
- assert_log_count(1) { |e| e['action'] == 'dispatched' }
32
36
  assert_log_count(1) { |e| e['action'] == 'receive' }
37
+ assert_log_count(1) { |e| e['action'] == 'dispatched' }
33
38
  end
34
39
 
35
40
  def test_participant_att_text
@@ -38,8 +43,8 @@ class EftParticipantTest < Test::Unit::TestCase
38
43
  participant :bravo
39
44
  end
40
45
 
41
- @engine.register_participant :bravo do |workitem|
42
- @tracer << 'bravo'
46
+ @dashboard.register_participant :bravo do |workitem|
47
+ tracer << 'bravo'
43
48
  end
44
49
 
45
50
  #noisy
@@ -53,8 +58,8 @@ class EftParticipantTest < Test::Unit::TestCase
53
58
  charly
54
59
  end
55
60
 
56
- @engine.register_participant :charly do |workitem|
57
- @tracer << 'charly'
61
+ @dashboard.register_participant :charly do |workitem|
62
+ tracer << 'charly'
58
63
  end
59
64
 
60
65
  #noisy
@@ -68,14 +73,14 @@ class EftParticipantTest < Test::Unit::TestCase
68
73
  delta :tag => 'whatever'
69
74
  end
70
75
 
71
- delta = @engine.register_participant :delta, Ruote::StorageParticipant
76
+ delta = @dashboard.register_participant :delta, Ruote::StorageParticipant
72
77
 
73
- @engine.launch(pdef)
78
+ @dashboard.launch(pdef)
74
79
  wait_for(:delta)
75
80
 
76
81
  assert_equal(
77
82
  ['participant', {'tag'=>'whatever', 'ref'=>'delta'}, []],
78
- Ruote::Exp::FlowExpression.fetch(@engine.context, delta.first.h.fei).tree)
83
+ Ruote::Exp::FlowExpression.fetch(@dashboard.context, delta.first.h.fei).tree)
79
84
  end
80
85
 
81
86
  def test_participant_if
@@ -87,8 +92,8 @@ class EftParticipantTest < Test::Unit::TestCase
87
92
  end
88
93
 
89
94
  %w[ eecho fox gamma ].each do |pname|
90
- @engine.register_participant pname do |workitem|
91
- @tracer << "#{workitem.participant_name}\n"
95
+ @dashboard.register_participant pname do |workitem|
96
+ tracer << "#{workitem.participant_name}\n"
92
97
  end
93
98
  end
94
99
 
@@ -104,7 +109,7 @@ class EftParticipantTest < Test::Unit::TestCase
104
109
  echo 'done.'
105
110
  end
106
111
 
107
- @engine.register_participant :notify do |wi, fe|
112
+ @dashboard.register_participant :notify do |wi, fe|
108
113
  #p fe.attribute_text
109
114
  stash[:atts] = fe.attributes
110
115
  end
@@ -120,7 +125,28 @@ class EftParticipantTest < Test::Unit::TestCase
120
125
 
121
126
  def test_dispatched
122
127
 
123
- @engine.register_participant :hotel do
128
+ @dashboard.register 'toto', Ruote::StorageParticipant
129
+
130
+ pdef = Ruote.process_definition do
131
+ toto
132
+ end
133
+
134
+ wfid = @dashboard.launch(pdef)
135
+
136
+ r = @dashboard.wait_for('dispatched')
137
+ sleep 0.700
138
+
139
+ fexp = @dashboard.ps(wfid).expressions.last
140
+
141
+ assert_equal true, fexp.dispatched
142
+ assert r.has_key?('fei')
143
+ assert r.has_key?('workitem')
144
+ assert r.has_key?('participant_name')
145
+ end
146
+
147
+ def test_not_dispatched
148
+
149
+ @dashboard.register_participant :hotel do
124
150
  sleep 5
125
151
  end
126
152
 
@@ -128,15 +154,13 @@ class EftParticipantTest < Test::Unit::TestCase
128
154
  hotel
129
155
  end
130
156
 
131
- #noisy
132
-
133
- wfid = @engine.launch(pdef)
157
+ wfid = @dashboard.launch(pdef)
134
158
 
135
159
  #wait_for(:hotel)
136
160
  sleep 0.777
137
161
  sleep 1 # just for ruote-couch :-(
138
162
 
139
- ps = @engine.process(wfid)
163
+ ps = @dashboard.process(wfid)
140
164
 
141
165
  fexp = ps.expressions.find { |fe|
142
166
  fe.class == Ruote::Exp::ParticipantExpression
@@ -145,5 +169,36 @@ class EftParticipantTest < Test::Unit::TestCase
145
169
  assert_equal nil, fexp.dispatched
146
170
  # not yet 'dispatched'
147
171
  end
172
+
173
+ def test_tree
174
+
175
+ require_json
176
+ Rufus::Json.detect_backend
177
+
178
+ @dashboard.register_participant :alice do |workitem|
179
+ tracer << Rufus::Json.encode(workitem.params['__children__'])
180
+ end
181
+
182
+ pdef = Ruote.define do
183
+ alice do
184
+ on_error /500/ => 'this_or_${that}'
185
+ whatever 'list' => '$f:list'
186
+ end
187
+ end
188
+
189
+ #@dashboard.noisy = true
190
+
191
+ wfid = @dashboard.launch(
192
+ pdef,
193
+ 'that' => 'those',
194
+ 'list' => [ 1, 'two of ${that}', 3 ])
195
+
196
+ @dashboard.wait_for(wfid)
197
+
198
+ assert_equal(
199
+ [ [ 'on_error', { '/500/' => 'this_or_those' }, [] ],
200
+ [ 'whatever', { 'list' => [ 1, 'two of ${that}', 3 ] }, [] ] ],
201
+ Rufus::Json.decode(@tracer.to_s))
202
+ end
148
203
  end
149
204
 
@@ -0,0 +1,297 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sat Jan 7 15:23:56 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class EftAwaitTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_await_tag
15
+
16
+ pdef = Ruote.process_definition do
17
+ concurrence :wait_for => 4 do
18
+ sequence do
19
+ await :left_tag => 'alpha'
20
+ echo 'a0'
21
+ end
22
+ sequence do
23
+ await :entered_tag => 'alpha'
24
+ echo 'a1'
25
+ end
26
+ sequence do
27
+ await :entered_tag => /pha$/
28
+ echo 'a2'
29
+ end
30
+ sequence do
31
+ await :tags => 'alpha'
32
+ echo 'a3'
33
+ end
34
+ sequence do
35
+ await :entered_tag => /pha./
36
+ echo 'a9'
37
+ end
38
+ sequence do
39
+ noop # skip a beat
40
+ sequence :tag => 'alpha' do
41
+ echo 'alpha'
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ wfid = @dashboard.launch(pdef)
48
+ r = @dashboard.wait_for(wfid)
49
+
50
+ assert_equal %w[ a0 a1 a2 a3 alpha ], @tracer.to_a.sort
51
+
52
+ assert @tracer.to_a.index('a1') < @tracer.to_a.index('a0')
53
+ end
54
+
55
+ def test_await_participant
56
+
57
+ @dashboard.register 'a' do
58
+ tracer << "a\n"
59
+ end
60
+
61
+ pdef = Ruote.process_definition do
62
+ concurrence do
63
+ sequence do
64
+ await :reached_participant => 'a'
65
+ echo 'b'
66
+ end
67
+ sequence do
68
+ await :left_participant => 'a'
69
+ echo 'c'
70
+ end
71
+ sequence do
72
+ noop # skip a beat
73
+ participant 'a'
74
+ end
75
+ end
76
+ end
77
+
78
+ wfid = @dashboard.launch(pdef)
79
+ r = @dashboard.wait_for(wfid)
80
+
81
+ assert_equal 3, @tracer.to_a.size
82
+ assert_equal 3, @tracer.to_a.uniq.size
83
+ assert_equal 'c', @tracer.to_a.last
84
+ end
85
+
86
+ def test_tag_or_tag
87
+
88
+ pdef = Ruote.process_definition do
89
+ concurrence do
90
+ sequence do
91
+ await :left_tag => 'a, b'
92
+ echo 'ab'
93
+ end
94
+ sequence do
95
+ await :left_tag => %w[ c d ]
96
+ echo 'cd'
97
+ end
98
+ sequence do
99
+ noop # skip a beat
100
+ concurrence do
101
+ echo 'a', :tag => 'a'
102
+ echo 'c', :tag => 'c'
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ wfid = @dashboard.launch(pdef)
109
+ r = @dashboard.wait_for(wfid)
110
+
111
+ assert_equal %w[ a ab c cd ], @tracer.to_a.sort
112
+ end
113
+
114
+ def test_absolute_tag
115
+
116
+ pdef = Ruote.define do
117
+ concurrence do
118
+ sequence do
119
+ await :tags => 'a/b'
120
+ echo 'a/b'
121
+ end
122
+ sequence :tag => 'a' do
123
+ noop
124
+ sequence :tag => 'b' do
125
+ echo 'b'
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ wfid = @dashboard.launch(pdef)
132
+ r = @dashboard.wait_for(wfid)
133
+
134
+ assert_equal %w[ a/b b ], @tracer.to_a.sort
135
+ end
136
+
137
+ def test_error
138
+
139
+ pdef = Ruote.process_definition do
140
+ concurrence :wait_for => 4 do
141
+ sequence do
142
+ await :error => /na(d|f)a/
143
+ echo 'e0'
144
+ end
145
+ sequence do
146
+ await :error => 'nada'
147
+ echo 'e1'
148
+ end
149
+ sequence do
150
+ await :error => 'Ruote::ForcedError, ArgumentError'
151
+ echo 'e2'
152
+ end
153
+ sequence do
154
+ await 'error'
155
+ echo 'e3'
156
+ end
157
+ sequence do
158
+ noop # skip a beat
159
+ error 'nada'
160
+ end
161
+ end
162
+ end
163
+
164
+ wfid = @dashboard.launch(pdef)
165
+ r = @dashboard.wait_for('terminated')
166
+
167
+ assert_equal %w[ e0 e1 e2 e3 ], @tracer.to_a.sort
168
+ end
169
+
170
+ def test_where
171
+
172
+ @dashboard.register 'a' do |workitem|
173
+ workitem['task'] = workitem.params['task']
174
+ end
175
+
176
+ pdef = Ruote.define do
177
+ concurrence :wait_for => 1 do
178
+ await :left_participant => 'a', :where => "${task} == 'sing'" do
179
+ echo 'sing-a'
180
+ end
181
+ await :left_participant => 'a' do
182
+ echo 'any-a'
183
+ end
184
+ concurrence do
185
+ participant 'a', :task => 'talk'
186
+ participant 'a', :task => 'sing'
187
+ end
188
+ end
189
+ end
190
+
191
+ wfid = @dashboard.launch(pdef)
192
+ r = @dashboard.wait_for('terminated')
193
+
194
+ assert_equal %w[ any-a any-a sing-a ], @tracer.to_a.sort
195
+ end
196
+
197
+ def test_implicit_sequence
198
+
199
+ @dashboard.register 'a' do |workitem|
200
+ end
201
+
202
+ pdef = Ruote.define do
203
+ concurrence :wait_for => 1 do
204
+ await :left_participant => 'a' do
205
+ echo 'a0'
206
+ echo 'a1'
207
+ end
208
+ sequence do
209
+ participant 'a'
210
+ noop; noop; noop # give time to concurrent branch to reach a1
211
+ end
212
+ end
213
+ end
214
+
215
+ wfid = @dashboard.launch(pdef)
216
+ r = @dashboard.wait_for('terminated')
217
+
218
+ assert_equal %w[ a0 a1 ], @tracer.to_a.sort
219
+ end
220
+
221
+ def test_other_process
222
+
223
+ wfid = @dashboard.launch(Ruote.define do
224
+ await :tags => 'a'
225
+ echo 'local' # shouldn't happen
226
+ end)
227
+ @dashboard.launch(Ruote.define do
228
+ await :tags => 'a', :global => true
229
+ echo 'global'
230
+ end)
231
+ @dashboard.launch(Ruote.define do
232
+ noop; noop # making sure the 'awaits' are in place
233
+ noop :tag => 'a'
234
+ end)
235
+
236
+ @dashboard.wait_for('terminated')
237
+ @dashboard.wait_for('terminated')
238
+
239
+ assert_equal %w[ global ], @tracer.to_a.sort
240
+ assert_not_nil @dashboard.ps(wfid)
241
+ end
242
+
243
+ def test_merge
244
+
245
+ # override / ignore / incoming / awaiting
246
+
247
+ pdef = Ruote.define do
248
+
249
+ set 'customer' => 'bamboku'
250
+ set 'city' => 'kyouto'
251
+
252
+ concurrence do
253
+
254
+ sequence do
255
+ await :in_tag => 'alpha'
256
+ echo 'a:${customer}/${city}/${region}'
257
+ end
258
+ sequence do
259
+ await :in_tag => 'alpha', :merge => 'override'
260
+ echo 'b:${customer}/${city}/${region}'
261
+ end
262
+ sequence do
263
+ await :in_tag => 'alpha', :merge => 'ignore'
264
+ echo 'c:${customer}/${city}/${region}'
265
+ end
266
+ sequence do
267
+ await :in_tag => 'alpha', :merge => 'incoming'
268
+ echo 'd:${customer}/${city}/${region}'
269
+ end
270
+ sequence do
271
+ await :in_tag => 'alpha', :merge => 'awaiting'
272
+ echo 'e:${customer}/${city}/${region}'
273
+ end
274
+
275
+ sequence do
276
+ 4.times { noop } # making sure the 'awaits' are in place
277
+ set 'customer' => 'antoku'
278
+ unset 'city'
279
+ set 'region' => 'fukuhara'
280
+ noop :tag => 'alpha'
281
+ end
282
+ end
283
+ end
284
+
285
+ wfid = @dashboard.launch(pdef)
286
+ r = @dashboard.wait_for(wfid)
287
+
288
+ assert_equal %w[
289
+ a:antoku//fukuhara
290
+ b:antoku//fukuhara
291
+ c:bamboku/kyouto/
292
+ d:antoku/kyouto/fukuhara
293
+ e:bamboku/kyouto/fukuhara
294
+ ], @tracer.to_a.sort
295
+ end
296
+ end
297
+