ruote-maestrodev 2.2.1

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 (265) hide show
  1. data/CHANGELOG.txt +290 -0
  2. data/CREDITS.txt +99 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.rdoc +88 -0
  5. data/Rakefile +108 -0
  6. data/TODO.txt +488 -0
  7. data/lib/ruote.rb +7 -0
  8. data/lib/ruote/context.rb +194 -0
  9. data/lib/ruote/engine.rb +1062 -0
  10. data/lib/ruote/engine/process_error.rb +122 -0
  11. data/lib/ruote/engine/process_status.rb +448 -0
  12. data/lib/ruote/exp/command.rb +87 -0
  13. data/lib/ruote/exp/commanded.rb +69 -0
  14. data/lib/ruote/exp/condition.rb +227 -0
  15. data/lib/ruote/exp/fe_add_branches.rb +138 -0
  16. data/lib/ruote/exp/fe_apply.rb +154 -0
  17. data/lib/ruote/exp/fe_cancel_process.rb +78 -0
  18. data/lib/ruote/exp/fe_command.rb +156 -0
  19. data/lib/ruote/exp/fe_concurrence.rb +321 -0
  20. data/lib/ruote/exp/fe_concurrent_iterator.rb +219 -0
  21. data/lib/ruote/exp/fe_cron.rb +141 -0
  22. data/lib/ruote/exp/fe_cursor.rb +324 -0
  23. data/lib/ruote/exp/fe_define.rb +112 -0
  24. data/lib/ruote/exp/fe_echo.rb +60 -0
  25. data/lib/ruote/exp/fe_equals.rb +115 -0
  26. data/lib/ruote/exp/fe_error.rb +82 -0
  27. data/lib/ruote/exp/fe_filter.rb +648 -0
  28. data/lib/ruote/exp/fe_forget.rb +88 -0
  29. data/lib/ruote/exp/fe_given.rb +154 -0
  30. data/lib/ruote/exp/fe_if.rb +127 -0
  31. data/lib/ruote/exp/fe_inc.rb +205 -0
  32. data/lib/ruote/exp/fe_iterator.rb +234 -0
  33. data/lib/ruote/exp/fe_let.rb +75 -0
  34. data/lib/ruote/exp/fe_listen.rb +304 -0
  35. data/lib/ruote/exp/fe_lose.rb +110 -0
  36. data/lib/ruote/exp/fe_noop.rb +45 -0
  37. data/lib/ruote/exp/fe_once.rb +215 -0
  38. data/lib/ruote/exp/fe_participant.rb +287 -0
  39. data/lib/ruote/exp/fe_read.rb +69 -0
  40. data/lib/ruote/exp/fe_redo.rb +82 -0
  41. data/lib/ruote/exp/fe_ref.rb +152 -0
  42. data/lib/ruote/exp/fe_registerp.rb +110 -0
  43. data/lib/ruote/exp/fe_reserve.rb +126 -0
  44. data/lib/ruote/exp/fe_restore.rb +102 -0
  45. data/lib/ruote/exp/fe_save.rb +72 -0
  46. data/lib/ruote/exp/fe_sequence.rb +59 -0
  47. data/lib/ruote/exp/fe_set.rb +154 -0
  48. data/lib/ruote/exp/fe_subprocess.rb +211 -0
  49. data/lib/ruote/exp/fe_that.rb +92 -0
  50. data/lib/ruote/exp/fe_undo.rb +67 -0
  51. data/lib/ruote/exp/fe_unregisterp.rb +69 -0
  52. data/lib/ruote/exp/fe_wait.rb +95 -0
  53. data/lib/ruote/exp/flowexpression.rb +886 -0
  54. data/lib/ruote/exp/iterator.rb +81 -0
  55. data/lib/ruote/exp/merge.rb +118 -0
  56. data/lib/ruote/exp/ro_attributes.rb +212 -0
  57. data/lib/ruote/exp/ro_filters.rb +136 -0
  58. data/lib/ruote/exp/ro_persist.rb +154 -0
  59. data/lib/ruote/exp/ro_variables.rb +189 -0
  60. data/lib/ruote/exp/ro_vf.rb +68 -0
  61. data/lib/ruote/fei.rb +260 -0
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +43 -0
  63. data/lib/ruote/id/wfid_generator.rb +81 -0
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +176 -0
  66. data/lib/ruote/log/storage_history.rb +159 -0
  67. data/lib/ruote/log/test_logger.rb +208 -0
  68. data/lib/ruote/log/wait_logger.rb +64 -0
  69. data/lib/ruote/part/block_participant.rb +137 -0
  70. data/lib/ruote/part/code_participant.rb +81 -0
  71. data/lib/ruote/part/engine_participant.rb +189 -0
  72. data/lib/ruote/part/local_participant.rb +138 -0
  73. data/lib/ruote/part/no_op_participant.rb +60 -0
  74. data/lib/ruote/part/null_participant.rb +54 -0
  75. data/lib/ruote/part/rev_participant.rb +169 -0
  76. data/lib/ruote/part/smtp_participant.rb +116 -0
  77. data/lib/ruote/part/storage_participant.rb +392 -0
  78. data/lib/ruote/part/template.rb +84 -0
  79. data/lib/ruote/participant.rb +7 -0
  80. data/lib/ruote/reader.rb +278 -0
  81. data/lib/ruote/reader/json.rb +49 -0
  82. data/lib/ruote/reader/radial.rb +290 -0
  83. data/lib/ruote/reader/ruby_dsl.rb +186 -0
  84. data/lib/ruote/reader/xml.rb +99 -0
  85. data/lib/ruote/receiver/base.rb +212 -0
  86. data/lib/ruote/storage/base.rb +364 -0
  87. data/lib/ruote/storage/composite_storage.rb +121 -0
  88. data/lib/ruote/storage/fs_storage.rb +139 -0
  89. data/lib/ruote/storage/hash_storage.rb +211 -0
  90. data/lib/ruote/svc/dispatch_pool.rb +158 -0
  91. data/lib/ruote/svc/dollar_sub.rb +298 -0
  92. data/lib/ruote/svc/error_handler.rb +138 -0
  93. data/lib/ruote/svc/expression_map.rb +97 -0
  94. data/lib/ruote/svc/participant_list.rb +397 -0
  95. data/lib/ruote/svc/tracker.rb +172 -0
  96. data/lib/ruote/svc/treechecker.rb +141 -0
  97. data/lib/ruote/tree_dot.rb +85 -0
  98. data/lib/ruote/util/filter.rb +525 -0
  99. data/lib/ruote/util/hashdot.rb +79 -0
  100. data/lib/ruote/util/look.rb +128 -0
  101. data/lib/ruote/util/lookup.rb +127 -0
  102. data/lib/ruote/util/misc.rb +167 -0
  103. data/lib/ruote/util/ometa.rb +71 -0
  104. data/lib/ruote/util/serializer.rb +103 -0
  105. data/lib/ruote/util/subprocess.rb +88 -0
  106. data/lib/ruote/util/time.rb +100 -0
  107. data/lib/ruote/util/tree.rb +58 -0
  108. data/lib/ruote/version.rb +29 -0
  109. data/lib/ruote/worker.rb +386 -0
  110. data/lib/ruote/workitem.rb +394 -0
  111. data/phil.txt +14 -0
  112. data/ruote.gemspec +44 -0
  113. data/test/bm/ci.rb +55 -0
  114. data/test/bm/ici.rb +71 -0
  115. data/test/bm/juuman.rb +54 -0
  116. data/test/bm/launch_bench.rb +37 -0
  117. data/test/bm/load_26c.rb +97 -0
  118. data/test/bm/mega.rb +64 -0
  119. data/test/bm/seq_thousand.rb +31 -0
  120. data/test/bm/t.rb +35 -0
  121. data/test/functional/base.rb +247 -0
  122. data/test/functional/concurrent_base.rb +98 -0
  123. data/test/functional/crunner.rb +31 -0
  124. data/test/functional/ct_0_concurrence.rb +65 -0
  125. data/test/functional/ct_1_iterator.rb +67 -0
  126. data/test/functional/ct_2_cancel.rb +81 -0
  127. data/test/functional/eft_0_process_definition.rb +65 -0
  128. data/test/functional/eft_10_cancel_process.rb +46 -0
  129. data/test/functional/eft_11_wait.rb +109 -0
  130. data/test/functional/eft_12_listen.rb +500 -0
  131. data/test/functional/eft_13_iterator.rb +342 -0
  132. data/test/functional/eft_14_cursor.rb +456 -0
  133. data/test/functional/eft_15_loop.rb +69 -0
  134. data/test/functional/eft_16_if.rb +183 -0
  135. data/test/functional/eft_17_equals.rb +55 -0
  136. data/test/functional/eft_18_concurrent_iterator.rb +410 -0
  137. data/test/functional/eft_19_reserve.rb +136 -0
  138. data/test/functional/eft_1_echo.rb +68 -0
  139. data/test/functional/eft_20_save.rb +116 -0
  140. data/test/functional/eft_21_restore.rb +61 -0
  141. data/test/functional/eft_22_noop.rb +28 -0
  142. data/test/functional/eft_23_apply.rb +168 -0
  143. data/test/functional/eft_24_add_branches.rb +98 -0
  144. data/test/functional/eft_25_command.rb +28 -0
  145. data/test/functional/eft_26_error.rb +77 -0
  146. data/test/functional/eft_27_inc.rb +280 -0
  147. data/test/functional/eft_28_once.rb +135 -0
  148. data/test/functional/eft_29_cron.rb +64 -0
  149. data/test/functional/eft_2_sequence.rb +58 -0
  150. data/test/functional/eft_30_ref.rb +155 -0
  151. data/test/functional/eft_31_registerp.rb +130 -0
  152. data/test/functional/eft_32_lose.rb +93 -0
  153. data/test/functional/eft_33_let.rb +31 -0
  154. data/test/functional/eft_34_given.rb +123 -0
  155. data/test/functional/eft_35_filter.rb +375 -0
  156. data/test/functional/eft_36_read.rb +95 -0
  157. data/test/functional/eft_3_participant.rb +149 -0
  158. data/test/functional/eft_4_set.rb +296 -0
  159. data/test/functional/eft_5_subprocess.rb +163 -0
  160. data/test/functional/eft_6_concurrence.rb +304 -0
  161. data/test/functional/eft_7_forget.rb +61 -0
  162. data/test/functional/eft_8_undo.rb +114 -0
  163. data/test/functional/eft_9_redo.rb +138 -0
  164. data/test/functional/ft_0_worker.rb +65 -0
  165. data/test/functional/ft_10_dollar.rb +304 -0
  166. data/test/functional/ft_11_recursion.rb +109 -0
  167. data/test/functional/ft_12_launchitem.rb +43 -0
  168. data/test/functional/ft_13_variables.rb +151 -0
  169. data/test/functional/ft_14_re_apply.rb +324 -0
  170. data/test/functional/ft_15_timeout.rb +226 -0
  171. data/test/functional/ft_16_participant_params.rb +98 -0
  172. data/test/functional/ft_17_conditional.rb +102 -0
  173. data/test/functional/ft_18_kill.rb +138 -0
  174. data/test/functional/ft_19_participant_code.rb +67 -0
  175. data/test/functional/ft_1_process_status.rb +796 -0
  176. data/test/functional/ft_20_storage_participant.rb +543 -0
  177. data/test/functional/ft_21_forget.rb +153 -0
  178. data/test/functional/ft_22_process_definitions.rb +90 -0
  179. data/test/functional/ft_23_load_defs.rb +79 -0
  180. data/test/functional/ft_24_block_participant.rb +235 -0
  181. data/test/functional/ft_25_receiver.rb +207 -0
  182. data/test/functional/ft_26_participant_rtimeout.rb +179 -0
  183. data/test/functional/ft_27_var_indirection.rb +128 -0
  184. data/test/functional/ft_28_null_noop_participants.rb +51 -0
  185. data/test/functional/ft_29_part_template.rb +60 -0
  186. data/test/functional/ft_2_errors.rb +380 -0
  187. data/test/functional/ft_30_smtp_participant.rb +122 -0
  188. data/test/functional/ft_31_part_blocking.rb +72 -0
  189. data/test/functional/ft_33_participant_subprocess_priority.rb +32 -0
  190. data/test/functional/ft_34_cursor_rewind.rb +101 -0
  191. data/test/functional/ft_35_add_service.rb +56 -0
  192. data/test/functional/ft_36_storage_history.rb +150 -0
  193. data/test/functional/ft_37_default_history.rb +109 -0
  194. data/test/functional/ft_38_participant_more.rb +193 -0
  195. data/test/functional/ft_39_wait_for.rb +136 -0
  196. data/test/functional/ft_3_participant_registration.rb +574 -0
  197. data/test/functional/ft_40_wait_logger.rb +62 -0
  198. data/test/functional/ft_41_participants.rb +91 -0
  199. data/test/functional/ft_42_storage_copy.rb +71 -0
  200. data/test/functional/ft_43_participant_on_reply.rb +87 -0
  201. data/test/functional/ft_44_var_participant.rb +35 -0
  202. data/test/functional/ft_45_participant_accept.rb +64 -0
  203. data/test/functional/ft_46_launch_single.rb +83 -0
  204. data/test/functional/ft_47_wfid_generator.rb +54 -0
  205. data/test/functional/ft_48_lose.rb +112 -0
  206. data/test/functional/ft_49_engine_on_error.rb +201 -0
  207. data/test/functional/ft_4_cancel.rb +132 -0
  208. data/test/functional/ft_50_engine_config.rb +22 -0
  209. data/test/functional/ft_51_misc.rb +67 -0
  210. data/test/functional/ft_52_case.rb +134 -0
  211. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  212. data/test/functional/ft_54_patterns.rb +104 -0
  213. data/test/functional/ft_55_engine_participant.rb +303 -0
  214. data/test/functional/ft_56_filter_attribute.rb +259 -0
  215. data/test/functional/ft_57_rev_participant.rb +252 -0
  216. data/test/functional/ft_58_workitem.rb +69 -0
  217. data/test/functional/ft_59_pause.rb +343 -0
  218. data/test/functional/ft_5_on_error.rb +384 -0
  219. data/test/functional/ft_60_code_participant.rb +45 -0
  220. data/test/functional/ft_61_trailing_fields.rb +34 -0
  221. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  222. data/test/functional/ft_6_on_cancel.rb +221 -0
  223. data/test/functional/ft_7_tags.rb +177 -0
  224. data/test/functional/ft_8_participant_consumption.rb +124 -0
  225. data/test/functional/ft_9_subprocesses.rb +146 -0
  226. data/test/functional/restart_base.rb +34 -0
  227. data/test/functional/rt_0_wait.rb +55 -0
  228. data/test/functional/rt_1_listen.rb +56 -0
  229. data/test/functional/rt_2_errors.rb +56 -0
  230. data/test/functional/rt_3_once.rb +70 -0
  231. data/test/functional/rt_4_cron.rb +64 -0
  232. data/test/functional/rt_5_timeout.rb +60 -0
  233. data/test/functional/rtest.rb +8 -0
  234. data/test/functional/storage_helper.rb +93 -0
  235. data/test/functional/test.rb +44 -0
  236. data/test/functional/vertical.rb +46 -0
  237. data/test/path_helper.rb +15 -0
  238. data/test/test.rb +13 -0
  239. data/test/test_helper.rb +28 -0
  240. data/test/unit/storage.rb +428 -0
  241. data/test/unit/storages.rb +37 -0
  242. data/test/unit/test.rb +28 -0
  243. data/test/unit/ut_0_ruby_reader.rb +223 -0
  244. data/test/unit/ut_11_lookup.rb +122 -0
  245. data/test/unit/ut_13_serializer.rb +65 -0
  246. data/test/unit/ut_14_is_uri.rb +28 -0
  247. data/test/unit/ut_15_util.rb +57 -0
  248. data/test/unit/ut_16_reader.rb +225 -0
  249. data/test/unit/ut_18_engine.rb +47 -0
  250. data/test/unit/ut_19_part_template.rb +86 -0
  251. data/test/unit/ut_1_fei.rb +165 -0
  252. data/test/unit/ut_20_composite_storage.rb +74 -0
  253. data/test/unit/ut_21_svc_participant_list.rb +46 -0
  254. data/test/unit/ut_22_filter.rb +1094 -0
  255. data/test/unit/ut_23_svc_tracker.rb +48 -0
  256. data/test/unit/ut_24_radial_reader.rb +332 -0
  257. data/test/unit/ut_25_merge.rb +113 -0
  258. data/test/unit/ut_3_wait_logger.rb +39 -0
  259. data/test/unit/ut_4_expmap.rb +20 -0
  260. data/test/unit/ut_5_tree.rb +54 -0
  261. data/test/unit/ut_6_condition.rb +303 -0
  262. data/test/unit/ut_7_workitem.rb +99 -0
  263. data/test/unit/ut_8_tree_to_dot.rb +72 -0
  264. data/test/unit/ut_9_xml_reader.rb +61 -0
  265. metadata +504 -0
@@ -0,0 +1,109 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sat Jun 13 22:43:16 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ require 'ruote/part/local_participant'
11
+
12
+
13
+ class FtRecursionTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ class CountingParticipant
17
+ include Ruote::LocalParticipant
18
+
19
+ def consume(workitem)
20
+
21
+ @context.stash[:wfids] ||= []
22
+ @context.stash[:wfids] << "#{workitem.fei.wfid}|#{workitem.fei.subid}"
23
+
24
+ workitem.fields['count'] ||= 0
25
+ workitem.fields['count'] = workitem.fields['count'] + 1
26
+
27
+ @context.tracer << workitem.fields['count'].to_s + "\n"
28
+
29
+ if workitem.fields['count'] > 5
30
+ @context.engine.cancel_process(workitem.fei.wfid)
31
+ else
32
+ reply_to_engine(workitem)
33
+ end
34
+ end
35
+
36
+ def cancel(fei, flavour)
37
+ end
38
+ end
39
+
40
+ def test_main_recursion
41
+
42
+ @engine.context.stash[:wfids] = []
43
+
44
+ pdef = Ruote.process_definition :name => 'def0' do
45
+ sequence do
46
+ alpha
47
+ def0
48
+ end
49
+ end
50
+
51
+ alpha = @engine.register_participant :alpha, CountingParticipant
52
+
53
+ #noisy
54
+
55
+ assert_trace(%w[ 1 2 3 4 5 6 ], pdef)
56
+
57
+ assert_equal 6, @engine.context.stash[:wfids].uniq.size
58
+ end
59
+
60
+ def test_sub_recursion
61
+
62
+ @engine.context.stash[:wfids] = []
63
+
64
+ pdef = Ruote.process_definition do
65
+ define 'sub0' do
66
+ sequence do
67
+ alpha
68
+ sub0
69
+ end
70
+ end
71
+ sub0
72
+ end
73
+
74
+ alpha = @engine.register_participant :alpha, CountingParticipant
75
+
76
+ #noisy
77
+
78
+ assert_trace %w[ 1 2 3 4 5 6 ], pdef
79
+
80
+ #p alpha.wfids.uniq
81
+
82
+ assert_equal 6, @engine.context.stash[:wfids].uniq.size
83
+ end
84
+
85
+ def test_forgotten_main_recursion
86
+
87
+ pdef = Ruote.process_definition :name => 'def0' do
88
+ sequence do
89
+ alpha
90
+ forget do
91
+ def0
92
+ end
93
+ end
94
+ end
95
+
96
+ alpha = @engine.register_participant :alpha, CountingParticipant
97
+
98
+ #noisy
99
+
100
+ wfid = @engine.launch(pdef)
101
+
102
+ 6.times { wait_for(:alpha) }
103
+
104
+ wait_for(1)
105
+
106
+ assert_equal((1..6).to_a.join("\n"), @tracer.to_s)
107
+ end
108
+ end
109
+
@@ -0,0 +1,43 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Jun 23 10:55:16 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class FtLaunchitemTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_launch
15
+
16
+ pdef = Ruote.process_definition do
17
+ alpha
18
+ end
19
+
20
+ @engine.register_participant :alpha do |workitem|
21
+ stash[:fields] = workitem.fields
22
+ @tracer << 'a'
23
+ nil
24
+ end
25
+
26
+ #noisy
27
+
28
+ wfid = @engine.launch(pdef, 'a' => 0, 'b' => 1)
29
+ wait_for(wfid)
30
+
31
+ assert_equal('a', @tracer.to_s)
32
+
33
+ @engine.context.stash[:fields].delete('__result__')
34
+
35
+ assert_not_nil(
36
+ @engine.context.stash[:fields].delete('dispatched_at'))
37
+
38
+ assert_equal(
39
+ {"a"=>0, "b"=>1, "params"=>{"ref"=>"alpha"}},
40
+ @engine.context.stash[:fields])
41
+ end
42
+ end
43
+
@@ -0,0 +1,151 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Jun 23 11:16:39 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class FtVariablesTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_wfid_and_expid
15
+
16
+ pdef = Ruote.process_definition do
17
+ echo 'at:${wfid}:${expid}'
18
+ end
19
+
20
+ #noisy
21
+
22
+ wfid = @engine.launch(pdef)
23
+ wait_for(wfid)
24
+
25
+ assert_equal "at:#{wfid}:0_0", @tracer.to_s
26
+ end
27
+
28
+ def test_variables_event
29
+
30
+ pdef = Ruote.process_definition do
31
+ sequence do
32
+ set :var => 'v', :val => 'x'
33
+ unset :var => 'v'
34
+ echo 'done.'
35
+ end
36
+ end
37
+
38
+ #noisy
39
+
40
+ assert_trace('done.', pdef)
41
+
42
+ #logger.log.each { |e| p e }
43
+
44
+ assert_equal(
45
+ 1, logger.log.select { |e| e['action'] == 'variable_set' }.size)
46
+ assert_equal(
47
+ 1, logger.log.select { |e| e['action'] == 'variable_unset' }.size)
48
+ end
49
+
50
+ def test_process_root_variables
51
+
52
+ pdef = Ruote.process_definition do
53
+ sequence do
54
+ set 'v:va' => 'a0'
55
+ set 'v:/vb' => 'b0'
56
+ echo '${v:va}:${v:vb}:${v:/va}:${v:/vb}'
57
+ sub0
58
+ echo '${v:va}:${v:vb}:${v:/va}:${v:/vb}'
59
+ end
60
+ define 'sub0' do
61
+ set 'v:va' => 'a1'
62
+ set 'v:/vb' => 'b1'
63
+ echo '${v:va}:${v:vb}:${v:/va}:${v:/vb}'
64
+ end
65
+ end
66
+
67
+ #noisy
68
+
69
+ assert_trace(%w[ a0:b0:a0:b0 a1:b1:a0:b1 a0:b1:a0:b1 ], pdef)
70
+ end
71
+
72
+ def test_engine_variables
73
+
74
+ pdef = Ruote.process_definition do
75
+ sequence do
76
+ set 'v:va' => 'a0'
77
+ echo '${v:va}:${v://va}'
78
+ echo '${v:vb}:${v://vb}'
79
+ echo 'done.'
80
+ end
81
+ end
82
+
83
+ #noisy
84
+
85
+ @engine.variables['vb'] = 'b0'
86
+
87
+ assert_trace(%w[ a0: b0:b0 done. ], pdef)
88
+
89
+ assert_equal(
90
+ 1, logger.log.select { |e| e['action'] == 'variable_set' }.size)
91
+ end
92
+
93
+ # A test about a protected method in FlowExpression, quite low level.
94
+ #
95
+ def test_lookup_var_site
96
+
97
+ pdef = Ruote.process_definition do
98
+ sequence do
99
+ sub0
100
+ echo 'done.'
101
+ end
102
+ define 'sub0' do
103
+ alpha
104
+ end
105
+ end
106
+
107
+ @engine.context.stash[:results] = []
108
+
109
+ @engine.register_participant :alpha do |workitem, fexp|
110
+
111
+ class << fexp
112
+ public :locate_var
113
+ end
114
+
115
+ stash[:results] << fexp.locate_var('//a')
116
+ stash[:results] << fexp.locate_var('/a').first.fei.to_storage_id
117
+ stash[:results] << fexp.locate_var('a').first.fei.to_storage_id
118
+ end
119
+
120
+ #noisy
121
+
122
+ assert_trace 'done.', pdef
123
+
124
+ assert_equal(nil, @engine.context.stash[:results][0])
125
+ assert_match(/^0||\d+_\d+$/, @engine.context.stash[:results][1])
126
+ assert_match(/^0\_0|\d+|\d+_\d+$/, @engine.context.stash[:results][2])
127
+ end
128
+
129
+ def test_lookup_in_var
130
+
131
+ @engine.register_participant :echo_toto do |wi, fexp|
132
+ @tracer << fexp.lookup_variable('toto').join
133
+ @tracer << "\n"
134
+ end
135
+
136
+ pdef = Ruote.process_definition do
137
+
138
+ set 'v:toto' => %w[ a b c ]
139
+ echo '${v:toto.1}'
140
+
141
+ set 'v:toto.2' => 'C'
142
+ echo_toto
143
+
144
+ unset 'v:toto.1'
145
+ echo_toto
146
+ end
147
+
148
+ assert_trace(%w[ b abC aC ], pdef)
149
+ end
150
+ end
151
+
@@ -0,0 +1,324 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Jun 25 13:31:26 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class FtReApplyTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ PDEF = Ruote.process_definition do
15
+ sequence do
16
+ alpha
17
+ echo 'done.'
18
+ end
19
+ end
20
+
21
+ def test_re_apply
22
+
23
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
24
+
25
+ #noisy
26
+
27
+ wfid = @engine.launch(PDEF)
28
+ wait_for(:alpha)
29
+
30
+ id0 = alpha.first.object_id
31
+
32
+ # ... flow stalled ...
33
+
34
+ ps = @engine.process(wfid)
35
+
36
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
37
+
38
+ @engine.re_apply(stalled_exp.fei)
39
+
40
+ wait_for(:alpha)
41
+
42
+ assert_equal 1, alpha.size
43
+ assert_not_equal id0, alpha.first.object_id
44
+
45
+ alpha.proceed(alpha.first)
46
+
47
+ wait_for(wfid)
48
+
49
+ assert_equal 'done.', @tracer.to_s
50
+ end
51
+
52
+ def test_cancel_and_re_apply
53
+
54
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
55
+
56
+ #noisy
57
+
58
+ wfid = @engine.launch(PDEF)
59
+ wait_for(:alpha)
60
+
61
+ id0 = alpha.first.object_id
62
+
63
+ # ... flow stalled ...
64
+
65
+ ps = @engine.process(wfid)
66
+
67
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
68
+
69
+ @engine.re_apply(stalled_exp.fei)
70
+
71
+ wait_for(:alpha)
72
+
73
+ assert_equal 1, alpha.size
74
+ assert_not_equal id0, alpha.first.object_id
75
+
76
+ alpha.proceed(alpha.first)
77
+
78
+ wait_for(wfid)
79
+
80
+ assert_equal 'done.', @tracer.to_s
81
+ end
82
+
83
+ def test_update_expression_and_re_apply
84
+
85
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
86
+
87
+ #noisy
88
+
89
+ wfid = @engine.launch(PDEF)
90
+ wait_for(:alpha)
91
+
92
+ sleep 0.350 # threaded dispatch
93
+
94
+ id0 = alpha.first.object_id
95
+
96
+ # ... flow stalled ...
97
+
98
+ ps = @engine.process(wfid)
99
+
100
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
101
+
102
+ stalled_exp.update_tree([
103
+ 'participant', { 'ref' => 'alpha', 'activity' => 'mow lawn' }, [] ])
104
+ #p [ :stalled, stalled_exp.h['_rev'] ]
105
+ stalled_exp.persist
106
+
107
+ @engine.re_apply(stalled_exp.fei)
108
+
109
+ wait_for(:alpha)
110
+
111
+ assert_equal 'mow lawn', alpha.first.fields['params']['activity']
112
+
113
+ alpha.proceed(alpha.first)
114
+
115
+ wait_for(wfid)
116
+
117
+ assert_equal 'done.', @tracer.to_s
118
+ end
119
+
120
+ def test_re_apply_with_new_workitem_fields
121
+
122
+ pdef = Ruote.process_definition do
123
+ sequence do
124
+ alpha
125
+ echo 'done for ${f:x}.'
126
+ end
127
+ end
128
+
129
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
130
+
131
+ #noisy
132
+
133
+ wfid = @engine.launch(pdef)
134
+ wait_for(:alpha)
135
+
136
+ id0 = alpha.first.object_id
137
+
138
+ # ... flow stalled ...
139
+
140
+ ps = @engine.process(wfid)
141
+
142
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
143
+
144
+ @engine.re_apply(stalled_exp.fei, :fields => { 'x' => 'nada' })
145
+
146
+ wait_for(:alpha)
147
+
148
+ assert_equal 1, alpha.size
149
+ assert_not_equal id0, alpha.first.object_id
150
+
151
+ alpha.proceed(alpha.first)
152
+
153
+ wait_for(wfid)
154
+
155
+ assert_equal 'done for nada.', @tracer.to_s
156
+ end
157
+
158
+ def test_re_apply_with_merged_workitem_fields
159
+
160
+ pdef = Ruote.process_definition do
161
+ sequence do
162
+ alpha
163
+ echo 'done for ${f:x} and ${f:y}.'
164
+ end
165
+ end
166
+
167
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
168
+
169
+ #noisy
170
+
171
+ wfid = @engine.launch(pdef, { 'y' => 'nemo' })
172
+ wait_for(:alpha)
173
+
174
+ id0 = alpha.first.object_id
175
+
176
+ # ... flow stalled ...
177
+
178
+ ps = @engine.process(wfid)
179
+
180
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
181
+
182
+ @engine.re_apply(stalled_exp.fei, :merge_in_fields => { 'x' => 'nada' })
183
+
184
+ wait_for(:alpha)
185
+
186
+ assert_equal 1, alpha.size
187
+ assert_not_equal id0, alpha.first.object_id
188
+
189
+ alpha.proceed(alpha.first)
190
+
191
+ wait_for(wfid)
192
+
193
+ assert_equal 'done for nada and nemo.', @tracer.to_s
194
+ end
195
+
196
+ def test_re_apply_with_new_tree
197
+
198
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
199
+
200
+ #noisy
201
+
202
+ wfid = @engine.launch(PDEF)
203
+ wait_for(:alpha)
204
+
205
+ id0 = alpha.first.object_id
206
+
207
+ # ... flow stalled ...
208
+
209
+ ps = @engine.process(wfid)
210
+
211
+ stalled_exp = ps.expressions.find { |fexp| fexp.fei.expid == '0_0_0' }
212
+
213
+ @engine.re_apply(
214
+ stalled_exp.fei, :tree => [ 'echo', { 're_applied' => nil }, [] ])
215
+
216
+ wait_for(wfid)
217
+
218
+ assert_equal "re_applied\ndone.", @tracer.to_s
219
+ end
220
+
221
+ def test_new_tree_and_process_status_current_tree
222
+
223
+ #@engine.noisy = true
224
+
225
+ @engine.register_participant '.+', Ruote::StorageParticipant
226
+
227
+ wfid = @engine.launch(Ruote.define { alpha })
228
+
229
+ @engine.wait_for(:alpha)
230
+
231
+ assert_equal(
232
+ [ 'define', {}, [ [ 'participant', { 'ref' => 'alpha' }, [] ] ] ],
233
+ @engine.process(wfid).current_tree)
234
+
235
+ fei = @engine.storage_participant.first.fei
236
+
237
+ @engine.re_apply(fei, :tree => [ 'bravo', {}, [] ])
238
+
239
+ @engine.wait_for(:bravo)
240
+
241
+ assert_equal(
242
+ 'bravo',
243
+ @engine.storage_participant.first.participant_name)
244
+
245
+ assert_equal(
246
+ [ 'participant', { 'ref' => 'bravo', '_triggered' => 'on_re_apply' }, [] ],
247
+ @engine.process(wfid).expressions.last.tree)
248
+
249
+ assert_equal(
250
+ [ 'define', {}, [ [ 'participant', { 'ref' => 'bravo', '_triggered' => 'on_re_apply' }, [] ] ] ],
251
+ @engine.process(wfid).current_tree)
252
+ end
253
+
254
+ # Issue reported by Brett Anthoine
255
+ #
256
+ def test_re_apply_root
257
+
258
+ @engine.register_participant '.+', Ruote::StorageParticipant
259
+
260
+ wfid = @engine.launch(Ruote.define { alpha })
261
+
262
+ @engine.wait_for(:alpha)
263
+ at0 = @engine.storage_participant.first.dispatched_at
264
+
265
+ root = @engine.process(wfid).root_expression
266
+ @engine.re_apply(root.fei)
267
+
268
+ @engine.wait_for(:alpha)
269
+ at1 = @engine.storage_participant.first.dispatched_at
270
+
271
+ assert at1 > at0
272
+ end
273
+
274
+ def test_re_apply_define
275
+
276
+ @engine.register_participant '.+', Ruote::StorageParticipant
277
+
278
+ wfid = @engine.launch(Ruote.define do
279
+ sub0
280
+ define 'sub0' do
281
+ alpha
282
+ end
283
+ end)
284
+
285
+ @engine.wait_for(:alpha)
286
+ at0 = @engine.storage_participant.first.dispatched_at
287
+
288
+ exp = @engine.process(wfid).expressions[1]
289
+
290
+ @engine.re_apply(exp.fei)
291
+
292
+ @engine.wait_for(:alpha)
293
+ at1 = @engine.storage_participant.first.dispatched_at
294
+
295
+ assert at1 > at0
296
+ end
297
+
298
+ # Making sure re_apply nukes errors
299
+ #
300
+ def test_re_apply_error
301
+
302
+ #@engine.noisy = true
303
+
304
+ @engine.register_participant '.+', Ruote::StorageParticipant
305
+
306
+ wfid = @engine.launch(Ruote.define do
307
+ error "X"
308
+ end)
309
+
310
+ @engine.wait_for(wfid)
311
+
312
+ fei = @engine.ps(wfid).expressions.last.fei
313
+
314
+ @engine.re_apply(fei, :tree => [ 'alpha', {}, [] ])
315
+
316
+ @engine.wait_for(:alpha)
317
+
318
+ ps = @engine.ps(wfid)
319
+
320
+ assert_equal 0, ps.errors.size
321
+ assert_equal Ruote::Exp::ParticipantExpression, ps.expressions.last.class
322
+ end
323
+ end
324
+