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,54 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sat Oct 23 14:22:15 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class FtWfidGeneratorTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ # an old test, brought back
15
+ #
16
+ def test_generate_unique_ids
17
+
18
+ n = 147
19
+
20
+ wfids = []
21
+ n.times { wfids << @engine.context.wfidgen.generate }
22
+
23
+ assert_equal n, wfids.uniq.size
24
+ end
25
+
26
+ # making a purge! doesn't incapacitate wfid generation
27
+ # (had a false alert when working with @hassox)
28
+ #
29
+ def test_generate_even_after_a_purge
30
+
31
+ assert_not_nil @engine.context.wfidgen.generate
32
+
33
+ @engine.storage.purge!
34
+ #@engine.context.wfidgen.instance_eval { @last = nil }
35
+
36
+ assert_not_nil @engine.context.wfidgen.generate
37
+ end
38
+
39
+ def test_generate_after_a_put_failed
40
+
41
+ assert_not_nil @engine.context.wfidgen.generate
42
+
43
+ @engine.context.wfidgen.instance_eval do
44
+ if @last['_rev'].is_a?(String)
45
+ @last['_rev'] = '1-cc9bc774f00b65ee28a6c0e4f26474de'
46
+ else # integer
47
+ @last['_rev'] = 123456789
48
+ end
49
+ end
50
+
51
+ assert_not_nil @engine.context.wfidgen.generate
52
+ end
53
+ end
54
+
@@ -0,0 +1,112 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Nov 25 11:20:04 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ #require 'ruote/part/storage_participant'
11
+
12
+
13
+ class FtLoseTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_lose_participiant
17
+
18
+ pdef = Ruote.process_definition do
19
+ sequence do
20
+ alpha :lose => true
21
+ alpha
22
+ end
23
+ end
24
+
25
+ @engine.register_participant '.+' do |wi|
26
+ @tracer << wi.participant_name + "\n"
27
+ end
28
+
29
+ #@engine.noisy = true
30
+
31
+ wfid = @engine.launch(pdef)
32
+
33
+ @engine.wait_for(6)
34
+
35
+ #sleep 0.500
36
+
37
+ assert_equal 'alpha', @tracer.to_s
38
+
39
+ ps = @engine.process(wfid)
40
+
41
+ assert_equal 3, ps.expressions.size
42
+ assert_equal 0, ps.errors.size
43
+ # the sequence is stuck, the lost alpha is not replying
44
+ end
45
+
46
+ def test_lose_sequence
47
+
48
+ pdef = Ruote.process_definition do
49
+ concurrence do
50
+ alpha
51
+ sequence :lose => 'true' do
52
+ bravo
53
+ end
54
+ end
55
+ end
56
+
57
+ @engine.register_participant '.+' do |wi|
58
+ @tracer << wi.participant_name + "\n"
59
+ end
60
+
61
+ #@engine.noisy = true
62
+
63
+ wfid = @engine.launch(pdef)
64
+
65
+ @engine.wait_for(12)
66
+
67
+ assert_match /alpha/, @tracer.to_s
68
+ assert_match /bravo/, @tracer.to_s
69
+
70
+ ps = @engine.process(wfid)
71
+
72
+ assert_equal 3, ps.expressions.size
73
+ assert_equal 0, ps.errors.size
74
+ # the concurrence is stuck, the lost sequence won't reply
75
+ end
76
+
77
+ def test_cancel_lost_expression
78
+
79
+ pdef = Ruote.define do
80
+ sequence do
81
+ alpha
82
+ bravo :lose => true
83
+ charly
84
+ end
85
+ end
86
+
87
+ @engine.register_participant '.+' do |wi|
88
+ @tracer << wi.participant_name + "\n"
89
+ end
90
+
91
+ #@engine.noisy = true
92
+
93
+ wfid = @engine.launch(pdef)
94
+
95
+ @engine.wait_for(12)
96
+ # until bravo is reached
97
+
98
+ #sleep 0.500
99
+
100
+ assert_equal "alpha\nbravo", @tracer.to_s
101
+
102
+ bravo = @engine.process(wfid).expressions.last
103
+
104
+ @engine.cancel_expression(bravo.fei)
105
+
106
+ @engine.wait_for(wfid)
107
+
108
+ assert_equal "alpha\nbravo\ncharly", @tracer.to_s
109
+ assert_nil @engine.process(wfid)
110
+ end
111
+ end
112
+
@@ -0,0 +1,201 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Dec 6 10:02:56 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ require 'ruote/participant'
11
+
12
+
13
+ class FtEngineOnErrorTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def setup
17
+ super
18
+ @engine.context.stash[:seen] = []
19
+ end
20
+
21
+ def test_no_on_error
22
+
23
+ assert_nil @engine.on_error
24
+ end
25
+
26
+ def test_on_error
27
+
28
+ @engine.on_error = 'supervisor'
29
+
30
+ assert_equal(
31
+ [ 'define', {}, [ [ 'supervisor', {}, [] ] ] ],
32
+ @engine.on_error)
33
+ end
34
+
35
+ class Supervisor
36
+ include Ruote::LocalParticipant
37
+ def initialize(opts)
38
+ @opts = opts
39
+ end
40
+ def consume(workitem)
41
+ workitem.fields['flavour'] = @opts['flavour']
42
+ @context.stash[:seen] << workitem
43
+ reply(workitem)
44
+ end
45
+ end
46
+
47
+ WRONGY = Ruote.process_definition do
48
+ error "something went wrong"
49
+ end
50
+
51
+ def test_on_error_participant
52
+
53
+ @engine.register 'supervisor', Supervisor, 'flavour' => 'vanilla'
54
+ @engine.on_error = 'supervisor'
55
+
56
+ #@engine.noisy = true
57
+
58
+ wfid = @engine.launch(WRONGY, 'colour' => 'yellow')
59
+
60
+ @engine.wait_for(wfid)
61
+ @engine.wait_for(:supervisor)
62
+
63
+ sleep 0.350
64
+ # unfortunately waiting for a participant triggers right
65
+ # before the consume
66
+
67
+ assert_equal 1, @engine.context.stash[:seen].size
68
+ assert_equal 'yellow', @engine.context.stash[:seen].first.fields['colour']
69
+ assert_equal 'vanilla', @engine.context.stash[:seen].first.fields['flavour']
70
+ assert_not_nil @engine.context.stash[:seen].first.fei.subid
71
+
72
+ # TODO : look for error message and such
73
+
74
+ @engine.wait_for(@engine.context.stash[:seen].first.wfid)
75
+
76
+ assert_equal 1, @engine.processes.size
77
+ end
78
+
79
+ def test_on_error_engine_subprocess_name
80
+
81
+ @engine.variables['trigger_alarm'] = Ruote.define do
82
+ echo '${colour} seen'
83
+ end
84
+ @engine.on_error = 'trigger_alarm'
85
+
86
+ #@engine.noisy = true
87
+
88
+ wfid = @engine.launch(WRONGY, 'colour' => 'red')
89
+
90
+ @engine.wait_for(wfid)
91
+
92
+ sleep 0.700
93
+ # letting the subprocess getting triggered
94
+
95
+ assert_equal 'red seen', @tracer.to_s
96
+ assert_equal 1, @engine.processes.size
97
+ end
98
+
99
+ def test_on_error_local_subprocess_name
100
+
101
+ @engine.variables['trigger_alarm'] = Ruote.define do
102
+ echo '${colour} seen'
103
+ end
104
+ @engine.on_error = 'trigger_alarm'
105
+
106
+ pdef = Ruote.define do
107
+ error 'still wrong'
108
+ define 'trigger_alarm' do
109
+ echo 'saw ${colour}'
110
+ end
111
+ end
112
+
113
+ wfid = @engine.launch(pdef, 'colour' => 'green')
114
+
115
+ @engine.wait_for(wfid)
116
+
117
+ sleep 0.700
118
+ # letting the subprocess getting triggered
119
+
120
+ assert_equal 'saw green', @tracer.to_s
121
+ assert_equal 1, @engine.processes.size
122
+ end
123
+
124
+ def test_on_error_subprocess_tree
125
+
126
+ @engine.on_error = Ruote.define do
127
+ echo 'case ${colour}'
128
+ end
129
+
130
+ wfid = @engine.launch(WRONGY, 'colour' => 'blue')
131
+
132
+ @engine.wait_for(wfid)
133
+
134
+ sleep 0.700
135
+ # letting the subprocess getting triggered
136
+
137
+ assert_equal 'case blue', @tracer.to_s
138
+ assert_equal 1, @engine.processes.size
139
+ end
140
+
141
+ def test_on_error_workitem
142
+
143
+ @engine.register 'supervisor', Supervisor
144
+ @engine.on_error = 'supervisor'
145
+
146
+ #@engine.noisy = true
147
+
148
+ wfid = @engine.launch(WRONGY, 'colour' => 'crimson')
149
+
150
+ @engine.wait_for(wfid)
151
+ @engine.wait_for(:supervisor)
152
+
153
+ sleep 0.350
154
+ # unfortunately waiting for a participant triggers right
155
+ # before the consume
156
+
157
+ wi = @engine.context.stash[:seen].first
158
+
159
+ assert_not_nil wi.error
160
+ end
161
+
162
+ def test_cascade_prevention
163
+
164
+ @engine.on_error = Ruote.define { error "nada" }
165
+
166
+ #@engine.noisy = true
167
+
168
+ wfid = @engine.launch(WRONGY, 'colour' => 'purple')
169
+
170
+ @engine.wait_for(wfid)
171
+ @engine.wait_for(wfid)
172
+
173
+ sleep 0.700
174
+ # give it a bit of time, to make sure no supplementary errors crop up
175
+
176
+ assert_equal 2, @engine.process(wfid).errors.size
177
+ end
178
+
179
+ def test_doesnt_trigger_for_checked_error
180
+
181
+ pdef = Ruote.define do
182
+ nemo :on_error => 'pass'
183
+ end
184
+
185
+ @engine.on_error = Ruote.define do
186
+ echo 'seen'
187
+ end
188
+
189
+ wfid = @engine.launch(pdef)
190
+
191
+ #noisy
192
+
193
+ @engine.wait_for(wfid)
194
+
195
+ sleep 0.700
196
+ # give it a bit of time, to make sure no supplementary errors crop up
197
+
198
+ assert_equal '', @tracer.to_s
199
+ end
200
+ end
201
+
@@ -0,0 +1,132 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Jun 3 08:42:07 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ require 'ruote/participant'
11
+
12
+
13
+ class FtCancelTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_cancel_process
17
+
18
+ pdef = Ruote.process_definition do
19
+ alpha
20
+ end
21
+
22
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
23
+
24
+ #noisy
25
+
26
+ wfid = @engine.launch(pdef)
27
+ wait_for(:alpha)
28
+
29
+ ps = @engine.process(wfid)
30
+ assert_equal 1, alpha.size
31
+
32
+ assert_not_nil ps
33
+
34
+ @engine.cancel_process(wfid)
35
+
36
+ wait_for(wfid)
37
+ ps = @engine.process(wfid)
38
+
39
+ assert_nil ps
40
+ assert_equal 0, alpha.size
41
+
42
+ #puts; logger.log.each { |e| p e['action'] }; puts
43
+ assert_equal 1, logger.log.select { |e| e['action'] == 'cancel_process' }.size
44
+ assert_equal 2, logger.log.select { |e| e['action'] == 'cancel' }.size
45
+ end
46
+
47
+ def test_cancel_expression
48
+
49
+ pdef = Ruote.process_definition do
50
+ sequence do
51
+ alpha
52
+ bravo
53
+ end
54
+ end
55
+
56
+ @engine.register_participant :alpha, Ruote::StorageParticipant
57
+ sto = @engine.register_participant :bravo, Ruote::StorageParticipant
58
+
59
+ #noisy
60
+
61
+ wfid = @engine.launch(pdef)
62
+ wait_for(:alpha)
63
+
64
+ assert_equal 1, sto.size
65
+
66
+ wi = sto.first
67
+
68
+ @engine.cancel_expression(wi.fei)
69
+ wait_for(:bravo)
70
+
71
+ assert_equal 1, sto.size
72
+ assert_equal 'bravo', sto.first.participant_name
73
+ end
74
+
75
+ def test_cancel__process
76
+
77
+ pdef = Ruote.process_definition do
78
+ alpha
79
+ end
80
+
81
+ @engine.register_participant :alpha, Ruote::NullParticipant
82
+
83
+ #noisy
84
+
85
+ wfid = @engine.launch(pdef)
86
+
87
+ @engine.wait_for(:alpha)
88
+
89
+ @engine.cancel(wfid)
90
+
91
+ @engine.wait_for(wfid)
92
+
93
+ assert_nil @engine.process(wfid)
94
+
95
+ assert_equal 1, logger.log.select { |e| e['action'] == 'cancel_process' }.size
96
+ end
97
+
98
+ def test_cancel__expression
99
+
100
+ pdef = Ruote.process_definition do
101
+ alpha
102
+ echo '0'
103
+ alpha
104
+ echo '1'
105
+ alpha
106
+ echo '2'
107
+ end
108
+
109
+ @engine.register_participant :alpha, Ruote::NullParticipant
110
+
111
+ wfid = @engine.launch(pdef)
112
+
113
+ r = @engine.wait_for(:alpha)
114
+
115
+ @engine.cancel(r['fei']) # fei as a Hash
116
+
117
+ r = @engine.wait_for(:alpha)
118
+
119
+ @engine.cancel(Ruote.sid(r['fei'])) # fei as a String
120
+
121
+ r = @engine.wait_for(:alpha)
122
+
123
+ @engine.cancel(Ruote::Workitem.new(r['workitem'])) # fei as workitem
124
+
125
+ @engine.wait_for(wfid)
126
+
127
+ assert_equal %w[ 0 1 2 ], @tracer.to_a
128
+
129
+ assert_equal 3, logger.log.select { |e| e['action'] == 'cancel' }.size
130
+ end
131
+ end
132
+