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,252 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Apr 6 06:52:53 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+ require 'ruote'
13
+ #require 'ruote/participant'
14
+
15
+
16
+ class FtRevParticipantTest < Test::Unit::TestCase
17
+ include FunctionalBase
18
+
19
+ def test_consume
20
+
21
+ dir = compute_dir_name
22
+
23
+ FileUtils.mkdir(dir)
24
+
25
+ File.open(dir + '/alpha.rb', 'wb') do |f|
26
+ f.write(%{
27
+ def consume(workitem)
28
+ (workitem.fields['seen'] ||= []) << 'alpha'
29
+ reply_to_engine(workitem)
30
+ end
31
+ })
32
+ end
33
+ File.open(dir + '/alpha__z.rb', 'wb') do |f|
34
+ f.write(%{
35
+ def consume(workitem)
36
+ (workitem.fields['seen'] ||= []) << 'alpha__z'
37
+ reply_to_engine(workitem)
38
+ end
39
+ })
40
+ end
41
+
42
+ @dashboard.register do
43
+ catchall Ruote::RevParticipant, :dir => dir
44
+ end
45
+
46
+ pdef = Ruote.process_definition 'x', :revision => 'y' do
47
+ alpha :rev => 'z'
48
+ alpha
49
+ end
50
+
51
+ #@dashboard.noisy = true
52
+
53
+ wfid = @dashboard.launch(pdef)
54
+
55
+ r = @dashboard.wait_for(wfid)
56
+
57
+ assert_equal %w[ alpha__z alpha ], r['workitem']['fields']['seen']
58
+
59
+ ensure
60
+ FileUtils.rm_rf(dir)
61
+ end
62
+
63
+ def test_cancel
64
+
65
+ dir = compute_dir_name
66
+
67
+ FileUtils.mkdir(dir)
68
+
69
+ $seen = false
70
+
71
+ File.open(dir + '/alpha.rb', 'wb') do |f|
72
+ f.write(%{
73
+ def consume(workitem)
74
+ # do nothing
75
+ end
76
+ def cancel(fei, flavour)
77
+ $seen = true
78
+ end
79
+ })
80
+ end
81
+
82
+ @dashboard.register do
83
+ catchall Ruote::RevParticipant, :dir => dir
84
+ end
85
+
86
+ pdef = Ruote.process_definition do
87
+ alpha
88
+ end
89
+
90
+ #@dashboard.noisy = true
91
+
92
+ wfid = @dashboard.launch(pdef)
93
+
94
+ @dashboard.wait_for(:alpha)
95
+
96
+ assert_equal false, $seen
97
+
98
+ @dashboard.cancel(wfid)
99
+
100
+ @dashboard.wait_for(wfid)
101
+
102
+ assert_equal true, $seen
103
+
104
+ ensure
105
+ FileUtils.rm_rf(dir)
106
+ end
107
+
108
+ def test_accept
109
+
110
+ dir = compute_dir_name
111
+
112
+ FileUtils.mkdir(dir)
113
+
114
+ File.open(dir + '/alpha.rb', 'wb') do |f|
115
+ f.write(%{
116
+ def consume(workitem)
117
+ (workitem.fields['seen'] ||= []) << 'alpha'
118
+ reply_to_engine(workitem)
119
+ end
120
+ })
121
+ end
122
+ File.open(dir + '/alpha__z.rb', 'wb') do |f|
123
+ f.write(%{
124
+ def consume(workitem)
125
+ raise "I should never get raised !"
126
+ end
127
+ def accept?(workitem)
128
+ false
129
+ end
130
+ })
131
+ end
132
+
133
+ @dashboard.register do
134
+ catchall Ruote::RevParticipant, :dir => dir
135
+ end
136
+
137
+ pdef = Ruote.process_definition do
138
+ alpha :rev => 'z'
139
+ end
140
+
141
+ #@dashboard.noisy = true
142
+
143
+ wfid = @dashboard.launch(pdef)
144
+
145
+ r = @dashboard.wait_for(wfid)
146
+
147
+ assert_equal %w[ alpha ], r['workitem']['fields']['seen']
148
+
149
+ ensure
150
+ FileUtils.rm_rf(dir)
151
+ end
152
+
153
+ def test_on_reply
154
+
155
+ dir = compute_dir_name
156
+
157
+ FileUtils.mkdir(dir)
158
+
159
+ File.open(dir + '/alpha.rb', 'wb') do |f|
160
+ f.write(%{
161
+ def consume(workitem)
162
+ reply_to_engine(workitem)
163
+ end
164
+ def on_reply(workitem)
165
+ (workitem.fields['seen'] ||= []) << 'on_reply'
166
+ end
167
+ })
168
+ end
169
+
170
+ @dashboard.register do
171
+ catchall Ruote::RevParticipant, :dir => dir
172
+ end
173
+
174
+ pdef = Ruote.process_definition do
175
+ alpha
176
+ end
177
+
178
+ #@dashboard.noisy = true
179
+
180
+ wfid = @dashboard.launch(pdef)
181
+
182
+ r = @dashboard.wait_for(wfid)
183
+
184
+ assert_equal %w[ on_reply ], r['workitem']['fields']['seen']
185
+
186
+ ensure
187
+ FileUtils.rm_rf(dir)
188
+ end
189
+
190
+ def test_rtimeout
191
+
192
+ dir = compute_dir_name
193
+
194
+ FileUtils.mkdir(dir)
195
+
196
+ File.open(dir + '/alpha.rb', 'wb') do |f|
197
+ f.write(%{
198
+ def consume(workitem)
199
+ #reply_to_engine(workitem)
200
+ end
201
+ })
202
+ end
203
+ File.open(dir + '/bravo.rb', 'wb') do |f|
204
+ f.write(%{
205
+ def consume(workitem)
206
+ #reply_to_engine(workitem)
207
+ end
208
+ def rtimeout(workitem)
209
+ '2d'
210
+ end
211
+ })
212
+ end
213
+
214
+ @dashboard.register do
215
+ catchall Ruote::RevParticipant, :dir => dir
216
+ end
217
+
218
+ pdef = Ruote.process_definition do
219
+ alpha
220
+ bravo
221
+ end
222
+
223
+ #@dashboard.noisy = true
224
+
225
+ wfid = @dashboard.launch(pdef)
226
+
227
+ r = @dashboard.wait_for(:alpha)
228
+ sleep 0.350
229
+
230
+ assert_equal 0, @dashboard.storage.get_many('schedules').size
231
+
232
+ wi = @dashboard.ps(wfid).workitems.first
233
+
234
+ @dashboard.receive(wi)
235
+
236
+ r = @dashboard.wait_for(:bravo)
237
+ sleep 0.350
238
+
239
+ assert_equal 1, @dashboard.storage.get_many('schedules').size
240
+
241
+ ensure
242
+ FileUtils.rm_rf(dir)
243
+ end
244
+
245
+ protected
246
+
247
+ def compute_dir_name
248
+
249
+ [ 'rev_participant', $$, Time.now.to_f ].collect { |e| e.to_s }.join('_')
250
+ end
251
+ end
252
+
@@ -0,0 +1,150 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Apr 6 08:39:36 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+ require 'ruote'
13
+
14
+
15
+ class FtWorkitemTest < Test::Unit::TestCase
16
+ include FunctionalBase
17
+
18
+ class TraceParticipant
19
+ include Ruote::LocalParticipant
20
+
21
+ def consume(wi)
22
+ @context.tracer << "#{wi.wf_name}/#{wi.wf_revision}\n"
23
+ reply_to_engine(wi)
24
+ end
25
+ end
26
+
27
+ def test_name_and_revision
28
+
29
+ @dashboard.register :alpha, TraceParticipant
30
+
31
+ assert_trace(
32
+ 'x/y',
33
+ Ruote.process_definition(:name => 'x', :revision => 'y') do
34
+ alpha
35
+ end,
36
+ :clear)
37
+
38
+ assert_trace(
39
+ 'x/y',
40
+ Ruote.process_definition('x', :revision => 'y') do
41
+ alpha
42
+ end,
43
+ :clear)
44
+
45
+ assert_trace(
46
+ 'x/y',
47
+ Ruote.process_definition('x', :rev => 'y') do
48
+ alpha
49
+ end,
50
+ :clear)
51
+
52
+ assert_trace(
53
+ 'x/',
54
+ Ruote.process_definition('x') do
55
+ alpha
56
+ end,
57
+ :clear)
58
+
59
+ assert_trace(
60
+ '/',
61
+ Ruote.process_definition do
62
+ alpha
63
+ end,
64
+ :clear)
65
+ end
66
+
67
+ def test_wf_launched_at
68
+
69
+ pdef = Ruote.define do
70
+ sub0
71
+ define 'sub0' do
72
+ end
73
+ end
74
+
75
+ wfid = @dashboard.launch(pdef)
76
+ r = @dashboard.wait_for(wfid)
77
+
78
+ assert_not_nil r['workitem']['wf_launched_at']
79
+ assert_not_nil r['workitem']['sub_wf_launched_at']
80
+ end
81
+
82
+ class SubTraceParticipant
83
+ include Ruote::LocalParticipant
84
+
85
+ def consume(wi)
86
+ @context.tracer << "#{wi.sub_wf_name}/#{wi.sub_wf_revision}\n"
87
+ reply_to_engine(wi)
88
+ end
89
+ end
90
+
91
+ def test_sub_name_and_sub_revision
92
+
93
+ @dashboard.register :bravo, SubTraceParticipant
94
+
95
+ assert_trace(
96
+ 'x/y',
97
+ Ruote.define('x', :revision => 'y') do
98
+ bravo
99
+ end,
100
+ :clear)
101
+
102
+ assert_trace(
103
+ 'sub0/',
104
+ Ruote.define('x', :revision => 'y') do
105
+ sub0
106
+ define 'sub0' do
107
+ bravo
108
+ end
109
+ end,
110
+ :clear)
111
+
112
+ assert_trace(
113
+ 'sub0/2.5',
114
+ Ruote.define('x', :revision => 'y') do
115
+ sub0
116
+ define 'sub0', :revision => '2.5' do
117
+ bravo
118
+ end
119
+ end,
120
+ :clear)
121
+
122
+ assert_trace(
123
+ 'sub1/',
124
+ Ruote.define('x', :revision => 'y') do
125
+ sub0
126
+ define 'sub0', :revision => '2.5' do
127
+ sub1
128
+ end
129
+ define 'sub1' do
130
+ bravo
131
+ end
132
+ end,
133
+ :clear)
134
+
135
+ assert_trace(
136
+ 'sub0/2.5',
137
+ Ruote.define('x', :revision => 'y') do
138
+ sub0
139
+ define 'sub0', :revision => '2.5' do
140
+ sub1
141
+ bravo
142
+ end
143
+ define 'sub1' do
144
+ noop
145
+ end
146
+ end,
147
+ :clear)
148
+ end
149
+ end
150
+
@@ -0,0 +1,329 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Apr 12 06:10:17 JST 2011
6
+ #
7
+ # Santa Barbara
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class FtPauseTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_pause_process
17
+
18
+ @dashboard.register { catchall }
19
+
20
+ pdef = Ruote.define { alice }
21
+
22
+ wfid = @dashboard.launch(pdef)
23
+
24
+ @dashboard.wait_for(:alice)
25
+
26
+ #
27
+ # pause the process
28
+
29
+ @dashboard.pause(wfid)
30
+
31
+ @dashboard.wait_for('dispatch_pause')
32
+
33
+ ps = @dashboard.ps(wfid)
34
+
35
+ assert_equal %w[ paused ], ps.expressions.collect { |fexp| fexp.state }.uniq
36
+
37
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
38
+
39
+ @dashboard.wait_for('receive')
40
+
41
+ ps = @dashboard.ps(wfid)
42
+
43
+ exp = ps.expressions.last
44
+
45
+ assert_not_nil exp.h.paused_replies
46
+
47
+ #
48
+ # resume the process
49
+
50
+ @dashboard.resume(wfid)
51
+
52
+ @dashboard.wait_for(wfid)
53
+
54
+ assert_nil @dashboard.ps(wfid)
55
+ end
56
+
57
+ def test_pause_process_in_error
58
+
59
+ pdef = Ruote.process_definition do
60
+ nada
61
+ end
62
+
63
+ wfid = @dashboard.launch(pdef)
64
+
65
+ @dashboard.wait_for(wfid)
66
+
67
+ @dashboard.pause(wfid)
68
+
69
+ @dashboard.wait_for(3)
70
+
71
+ ps = @dashboard.ps(wfid)
72
+
73
+ assert_equal(
74
+ %w[ paused failed ],
75
+ ps.expressions.collect { |fexp| fexp.state })
76
+
77
+ #
78
+ # cancel at error
79
+
80
+ @dashboard.cancel(ps.expressions.last.fei)
81
+
82
+ #
83
+ # resume the process
84
+
85
+ @dashboard.resume(wfid)
86
+
87
+ @dashboard.wait_for(wfid)
88
+
89
+ assert_nil @dashboard.ps(wfid)
90
+ end
91
+
92
+ def test_cancel_paused_branch
93
+
94
+ pdef = Ruote.process_definition do
95
+ sequence do
96
+ alice
97
+ end
98
+ bob
99
+ end
100
+
101
+ @dashboard.register do
102
+ catchall
103
+ end
104
+
105
+ wfid = @dashboard.launch(pdef)
106
+
107
+ @dashboard.wait_for(:alice)
108
+
109
+ exp = @dashboard.ps(wfid).expressions.find { |e| e.name == 'sequence' }
110
+
111
+ @dashboard.pause(exp.fei)
112
+
113
+ @dashboard.wait_for('dispatch_pause')
114
+
115
+ assert_equal(
116
+ %w[ 0/ 0_0/paused 0_0_0/paused ],
117
+ @dashboard.ps(wfid).expressions.collect { |fe|
118
+ "#{fe.fei.expid}/#{fe.state}"
119
+ })
120
+
121
+ @dashboard.cancel(exp.fei)
122
+
123
+ @dashboard.wait_for(:bob)
124
+
125
+ assert_equal(
126
+ %w[ 0/ 0_1/ ],
127
+ @dashboard.ps(wfid).expressions.collect { |fe|
128
+ "#{fe.fei.expid}/#{fe.state}"
129
+ })
130
+ end
131
+
132
+ class AlphaParticipant
133
+ include Ruote::LocalParticipant
134
+ def consume(workitem)
135
+ @context.tracer << "dispatched:#{workitem.fei.wfid}\n"
136
+ end
137
+ def on_pause(fei)
138
+ @context.tracer << "pause:#{fei.wfid}\n"
139
+ end
140
+ def on_resume(fei)
141
+ @context.tracer << "resume:#{fei.wfid}\n"
142
+ end
143
+ end
144
+
145
+ def test_propagation_to_participant
146
+
147
+ pdef = Ruote.define do
148
+ alpha
149
+ end
150
+
151
+ @dashboard.register do
152
+ alpha AlphaParticipant
153
+ end
154
+
155
+ wfid = @dashboard.launch(pdef)
156
+
157
+ #@dashboard.wait_for(:alpha)
158
+ @dashboard.wait_for('dispatched')
159
+
160
+ @dashboard.pause(wfid)
161
+
162
+ @dashboard.wait_for('dispatch_pause')
163
+
164
+ assert_equal(
165
+ [ "dispatched:#{wfid}", "pause:#{wfid}" ],
166
+ @tracer.to_a)
167
+
168
+ @dashboard.resume(wfid)
169
+
170
+ @dashboard.wait_for('dispatch_resume')
171
+
172
+ assert_equal(
173
+ [ "dispatched:#{wfid}", "pause:#{wfid}", "resume:#{wfid}" ],
174
+ @tracer.to_a)
175
+ end
176
+
177
+ def test_propagation_to_participant_when_participant_has_already_replied
178
+
179
+ pdef = Ruote.define do
180
+ alpha
181
+ end
182
+
183
+ @dashboard.register do
184
+ alpha AlphaParticipant
185
+ end
186
+
187
+ wfid = @dashboard.launch(pdef)
188
+
189
+ @dashboard.wait_for(:alpha)
190
+
191
+ @dashboard.pause(wfid)
192
+
193
+ @dashboard.wait_for('dispatch_pause')
194
+
195
+ wi = @dashboard.ps(wfid).expressions.last.h.applied_workitem
196
+
197
+ part = @dashboard.participant(:alpha.to_s)
198
+
199
+ part.instance_eval { reply_to_engine(Ruote::Workitem.new(wi)) }
200
+
201
+ @dashboard.wait_for(1)
202
+
203
+ assert_equal(
204
+ [ "dispatched:#{wfid}", "pause:#{wfid}" ],
205
+ @tracer.to_a)
206
+
207
+ @dashboard.resume(wfid)
208
+
209
+ @dashboard.wait_for(wfid)
210
+
211
+ assert_equal(
212
+ [ "dispatched:#{wfid}", "pause:#{wfid}" ],
213
+ @tracer.to_a)
214
+ #
215
+ # no 'resume:xxx'
216
+ end
217
+
218
+ def test_breakpoint
219
+
220
+ pdef = Ruote.define do
221
+ sequence do
222
+ alpha
223
+ end
224
+ end
225
+
226
+ @dashboard.register do
227
+ catchall
228
+ end
229
+
230
+ wfid = @dashboard.launch(pdef)
231
+
232
+ @dashboard.wait_for(:alpha)
233
+
234
+ sequence = @dashboard.ps(wfid).expressions[1]
235
+
236
+ @dashboard.pause(sequence.fei, :breakpoint => true)
237
+
238
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
239
+
240
+ @dashboard.wait_for('reply')
241
+
242
+ assert_equal(
243
+ [ nil, 'paused' ],
244
+ @dashboard.ps(wfid).expressions.collect { |fexp| fexp.state })
245
+ end
246
+
247
+ def test_no_propagation_to_participant_when_breakpoint
248
+
249
+ pdef = Ruote.define do
250
+ alpha
251
+ end
252
+
253
+ @dashboard.register do
254
+ alpha AlphaParticipant
255
+ end
256
+
257
+ wfid = @dashboard.launch(pdef)
258
+
259
+ #@dashboard.wait_for(:alpha)
260
+ @dashboard.wait_for('dispatched')
261
+
262
+ alpha = @dashboard.ps(wfid).expressions.last
263
+
264
+ @dashboard.pause(alpha.fei, :breakpoint => true)
265
+
266
+ @dashboard.wait_for('pause')
267
+
268
+ assert_equal([ "dispatched:#{wfid}" ], @tracer.to_a)
269
+
270
+ @dashboard.resume(alpha.fei)
271
+
272
+ @dashboard.wait_for('resume')
273
+
274
+ assert_equal([ "dispatched:#{wfid}" ], @tracer.to_a)
275
+ end
276
+
277
+ def test_resume_anyway
278
+
279
+ pdef = Ruote.define do
280
+ concurrence do
281
+ alpha
282
+ sequence do
283
+ bravo
284
+ end
285
+ end
286
+ end
287
+
288
+ @dashboard.register do
289
+ catchall
290
+ end
291
+
292
+ wfid = @dashboard.launch(pdef)
293
+
294
+ @dashboard.wait_for(:alpha)
295
+ @dashboard.wait_for(:bravo)
296
+
297
+ exps = @dashboard.ps(wfid).expressions.select { |fexp|
298
+ fexp.fei.expid.match(/^0_0_[01]$/)
299
+ }
300
+
301
+ exps.each { |fexp| @dashboard.pause(fexp.fei) }
302
+
303
+ @dashboard.wait_for('dispatch_pause')
304
+ @dashboard.wait_for('dispatch_pause')
305
+
306
+ assert_equal(
307
+ [ nil, nil, 'paused', 'paused', 'paused' ],
308
+ @dashboard.ps(wfid).expressions.collect { |fexp| fexp.state })
309
+
310
+ @dashboard.resume(wfid)
311
+ # won't resume the process, since the root is not paused
312
+
313
+ @dashboard.wait_for(2)
314
+
315
+ assert_equal(
316
+ [ nil, nil, 'paused', 'paused', 'paused' ],
317
+ @dashboard.ps(wfid).expressions.collect { |fexp| fexp.state })
318
+
319
+ @dashboard.resume(wfid, :anyway => true)
320
+
321
+ @dashboard.wait_for('dispatch_resume')
322
+ @dashboard.wait_for('dispatch_resume')
323
+
324
+ assert_equal(
325
+ [ nil, nil, nil, nil, nil ],
326
+ @dashboard.ps(wfid).expressions.collect { |fexp| fexp.state })
327
+ end
328
+ end
329
+