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,163 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed May 20 17:08:17 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class EftSubprocessTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_subprocess_ref
15
+
16
+ pdef = Ruote.process_definition do
17
+ subprocess :ref => 'sub0'
18
+ define :sub0 do
19
+ echo 'a'
20
+ end
21
+ end
22
+
23
+ #noisy
24
+
25
+ assert_trace 'a', pdef
26
+ end
27
+
28
+ def test_subprocess_att_text
29
+
30
+ pdef = Ruote.process_definition do
31
+ subprocess 'sub0'
32
+ define :sub0 do
33
+ echo 'a'
34
+ end
35
+ end
36
+
37
+ #noisy
38
+
39
+ assert_trace 'a', pdef
40
+ end
41
+
42
+ def test_subprocess_exp_name
43
+
44
+ pdef = Ruote.process_definition do
45
+ sub0
46
+ define :sub0 do
47
+ echo 'a'
48
+ end
49
+ end
50
+
51
+ #noisy
52
+
53
+ assert_trace 'a', pdef
54
+ end
55
+
56
+ def test_subprocess_if
57
+
58
+ pdef = Ruote.process_definition do
59
+ define :sub0 do
60
+ echo 'a'
61
+ end
62
+ sequence do
63
+ subprocess :ref => 'sub0'
64
+ subprocess :ref => 'sub0', :if => 'true == false'
65
+ subprocess :ref => 'sub0'
66
+ end
67
+ end
68
+
69
+ #noisy
70
+
71
+ assert_trace %w[ a a ], pdef
72
+ end
73
+
74
+ def test_subprocess_atts_to_vars
75
+
76
+ pdef = Ruote.process_definition do
77
+ subprocess 'sub0', :a => 'A', :b => 'B'
78
+ define :sub0 do
79
+ echo '${v:a}:${v:b}'
80
+ end
81
+ end
82
+
83
+ #noisy
84
+
85
+ assert_trace 'A:B', pdef
86
+ end
87
+
88
+ def test_subprocess_passing_tree
89
+
90
+ pdef = Ruote.process_definition do
91
+ subprocess 'sub0' do
92
+ noop
93
+ end
94
+ define :sub0 do
95
+ alpha
96
+ end
97
+ end
98
+
99
+ @engine.register_participant :alpha do |workitem, fexp|
100
+ stash[:tree] = fexp.lookup_variable('tree')
101
+ end
102
+
103
+ #noisy
104
+
105
+ assert_trace '', pdef
106
+
107
+ assert_equal ["noop", {}, []], stash[:tree]
108
+ end
109
+
110
+ def test_subprocess_uri
111
+
112
+ pdef = Ruote.process_definition do
113
+ sequence do
114
+ echo 'in'
115
+ subprocess :ref => File.join(File.dirname(__FILE__), '..', 'pdef.xml')
116
+ echo 'out.'
117
+ end
118
+ end
119
+
120
+ #noisy
121
+
122
+ assert_trace %w[ in a b out. ], pdef
123
+ end
124
+
125
+ def test_missing_uri
126
+
127
+ pdef = Ruote.process_definition do
128
+ sequence do
129
+ echo 'in'
130
+ subprocess :ref => 'nada'
131
+ echo 'out.'
132
+ end
133
+ end
134
+
135
+ #noisy
136
+
137
+ wfid = @engine.launch(pdef)
138
+
139
+ wait_for(wfid)
140
+
141
+ assert_equal(
142
+ "#<RuntimeError: no subprocess named 'nada' found>",
143
+ #"#<RuntimeError: unknown participant or subprocess 'nada'>",
144
+ @engine.process(wfid).errors.first.message)
145
+ end
146
+
147
+ def test_subprocess_in_engine_variable
148
+
149
+ pdef = Ruote.process_definition do
150
+ sequence do
151
+ sub0
152
+ echo 'done.'
153
+ end
154
+ end
155
+
156
+ @engine.variables['sub0'] = Ruote.process_definition do
157
+ echo 'in sub0'
158
+ end
159
+
160
+ assert_trace "in sub0\ndone.", pdef
161
+ end
162
+ end
163
+
@@ -0,0 +1,304 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Jun 11 15:24:47 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ #require 'ruote/part/hash_participant'
11
+
12
+
13
+ class EftConcurrenceTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_basic
17
+
18
+ pdef = Ruote.process_definition do
19
+ concurrence do
20
+ alpha
21
+ alpha
22
+ end
23
+ end
24
+
25
+ @engine.register_participant :alpha do
26
+ @tracer << "alpha\n"
27
+ end
28
+
29
+ #noisy
30
+
31
+ assert_trace %w[ alpha alpha ], pdef
32
+ end
33
+
34
+ def test_over_if
35
+
36
+ pdef = Ruote.process_definition do
37
+ concurrence :over_if => "${f:seen}", :merge_type => :isolate do
38
+ alpha
39
+ alpha
40
+ alpha
41
+ end
42
+ bravo
43
+ end
44
+
45
+ @engine.context.instance_eval do
46
+ @count = 0
47
+ end
48
+ # since block participants are evaluated in the context context
49
+
50
+ alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
51
+ wi.fields['seen'] = 'indeed' if @count == 1
52
+ @tracer << "alpha\n"
53
+ @count = @count + 1
54
+ nil
55
+ end
56
+
57
+ @engine.register_participant :bravo do |workitem|
58
+ stash[:fields] = workitem.fields
59
+ nil
60
+ end
61
+
62
+ #noisy
63
+
64
+ assert_trace(%w[ alpha ] * 3, pdef)
65
+
66
+ #assert_equal(
67
+ # {'1'=>{"seen"=>"indeed"}, '0'=>{}, "params"=>{"ref"=>"bravo"}},
68
+ # fields)
69
+
70
+ params = @engine.context.stash[:fields].delete('params')
71
+
72
+ assert_equal({ 'ref' => 'bravo' }, params)
73
+ assert_match /seen/, @engine.context.stash[:fields].inspect
74
+ end
75
+
76
+ def test_over_unless
77
+
78
+ pdef = Ruote.process_definition do
79
+ set 'f:ok' => 'true'
80
+ concurrence :over_unless => '${f:ok}', :merge_type => :isolate do
81
+ alpha
82
+ alpha
83
+ alpha
84
+ end
85
+ echo 'done.'
86
+ end
87
+
88
+ @engine.context.instance_eval do
89
+ @count = 0
90
+ end
91
+ # since block participants are evaluated in the context context
92
+
93
+ alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
94
+ if @count > 1
95
+ wi.fields['ok'] = false
96
+ else
97
+ @tracer << "a\n"
98
+ @count = @count + 1
99
+ end
100
+ end
101
+
102
+ fields = nil
103
+
104
+ @engine.register_participant :bravo do |workitem|
105
+ fields = workitem.fields
106
+ end
107
+
108
+ #noisy
109
+
110
+ assert_trace(%w[ a a done. ], pdef)
111
+ end
112
+
113
+ def test_remaining_forget_when_no_remains
114
+
115
+ pdef = Ruote.process_definition do
116
+ concurrence :remaining => :forget do
117
+ echo 'a'
118
+ echo 'b'
119
+ end
120
+ echo 'done.'
121
+ end
122
+
123
+ #noisy
124
+
125
+ assert_trace %w[ a b done. ], %w[ b a done. ], pdef
126
+ end
127
+
128
+ # helper
129
+ #
130
+ def run_concurrence(concurrence_attributes, noise)
131
+
132
+ pdef = Ruote.process_definition do
133
+ sequence do
134
+ concurrence(concurrence_attributes) do
135
+ alpha
136
+ alpha
137
+ end
138
+ end
139
+ alpha
140
+ end
141
+
142
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
143
+
144
+ noisy if noise
145
+
146
+ wfid = @engine.launch(pdef)
147
+
148
+ wait_for(:alpha)
149
+ wait_for(:alpha)
150
+
151
+ 2.times do
152
+ wi = alpha.first
153
+ wi.fields['seen'] = wi.fei.expid
154
+ alpha.proceed(wi)
155
+ end
156
+
157
+ wait_for(:alpha)
158
+
159
+ wi = alpha.first
160
+
161
+ ps = @engine.process(wi.fei.wfid)
162
+ assert_equal %w[ 0 0_1 ], ps.expressions.collect { |e| e.fei.expid }.sort
163
+
164
+ wi
165
+ end
166
+
167
+ def test_default_merge
168
+
169
+ wi = run_concurrence({}, false)
170
+
171
+ assert_equal '0_1', wi.fei.expid
172
+ assert_not_nil wi.fields['seen']
173
+ end
174
+
175
+ def test_merge_last
176
+
177
+ wi = run_concurrence({ :merge => :last }, false)
178
+
179
+ assert_equal '0_1', wi.fei.expid
180
+ assert_not_nil wi.fields['seen']
181
+ end
182
+
183
+ def test_concurrence_merge_type_isolate
184
+
185
+ wi = run_concurrence({ :merge_type => :isolate }, false)
186
+
187
+ assert_equal(
188
+ %w[ 0 1 dispatched_at params ],
189
+ wi.fields.keys.collect { |k| k.to_s }.sort)
190
+
191
+ assert_equal({ 'ref' => 'alpha' }, wi.fields['params'])
192
+ assert_equal(%w[ seen ], wi.fields['0'].keys)
193
+ assert_equal(%w[ seen ], wi.fields['1'].keys)
194
+ end
195
+
196
+ def test_concurrence_merge_type_stack
197
+
198
+ wi = run_concurrence({ :merge_type => :stack }, false)
199
+
200
+ assert_equal(
201
+ %w[ dispatched_at params stack stack_attributes ],
202
+ wi.fields.keys.collect { |k| k.to_s }.sort)
203
+
204
+ assert_equal({ 'ref' => 'alpha' }, wi.fields['params'])
205
+ assert_equal(%w[ seen ], wi.fields['stack'][0].keys)
206
+ assert_equal(%w[ seen ], wi.fields['stack'][1].keys)
207
+ end
208
+
209
+ # helper
210
+ #
211
+ def run_test_count(remaining, noise)
212
+
213
+ pdef = Ruote.process_definition do
214
+ concurrence :count => 1, :remaining => remaining do
215
+ alpha
216
+ bravo
217
+ end
218
+ end
219
+
220
+ @engine.register_participant '.+', Ruote::StorageParticipant
221
+
222
+ noisy if noise
223
+
224
+ wfid = @engine.launch(pdef)
225
+
226
+ wait_for(:alpha)
227
+
228
+ @engine.storage_participant.proceed(@engine.storage_participant.first)
229
+
230
+ wait_for(wfid)
231
+
232
+ wfid
233
+ end
234
+
235
+ def test_count
236
+
237
+ #noisy
238
+
239
+ wfid = run_test_count('cancel', false)
240
+
241
+ #puts
242
+ #logger.log.each { |e| p e }
243
+ #puts
244
+ assert_equal 1, logger.log.select { |e| e['action'] == 'cancel' }.size
245
+
246
+ sleep 0.350 # since now dispatch_cancel occurs asynchronously...
247
+
248
+ assert_equal 0, @engine.storage_participant.size
249
+ end
250
+
251
+ def test_count_remaining_forget
252
+
253
+ #noisy
254
+
255
+ wfid = run_test_count('forget', false)
256
+
257
+ #assert_equal 1, logger.log.select { |e| e['action'] == 'forget' }.size
258
+
259
+ assert_equal 1, @engine.storage_participant.size
260
+ assert_equal 'bravo', @engine.storage_participant.first.participant_name
261
+
262
+ #@engine.context.storage.get_many('expressions').each { |e| p e['fei'] }
263
+ #puts @engine.context.storage.dump('expressions')
264
+ assert_equal 2, @engine.context.storage.get_many('expressions').size
265
+ assert_not_nil @engine.process(wfid)
266
+
267
+ @engine.storage_participant.proceed(@engine.storage_participant.first)
268
+
269
+ wait_for(wfid)
270
+
271
+ @engine.context.storage.get_many('expressions').each { |e| p e['fei'] }
272
+ assert_equal 0, @engine.context.storage.get_many('expressions').size
273
+ end
274
+
275
+ def test_cancel
276
+
277
+ pdef = Ruote.process_definition do
278
+ concurrence do
279
+ alpha
280
+ alpha
281
+ end
282
+ end
283
+
284
+ alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
285
+
286
+ #noisy
287
+
288
+ wfid = @engine.launch(pdef)
289
+
290
+ wait_for(:alpha)
291
+ wait_for(:alpha)
292
+
293
+ assert_equal 2, alpha.size
294
+
295
+ @engine.cancel_process(wfid)
296
+
297
+ wait_for(wfid)
298
+
299
+ ps = @engine.process(wfid)
300
+
301
+ assert_nil ps
302
+ end
303
+ end
304
+