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,35 @@
1
+
2
+ $:.unshift('lib')
3
+
4
+ require 'ruote/engine'
5
+
6
+ pdef = Ruote.process_definition do
7
+ sequence do
8
+ #625.times do
9
+ #500.times do
10
+ 5000.times do
11
+ echo 'a'
12
+ end
13
+ end
14
+ end
15
+
16
+ engine = Ruote::Engine.new
17
+ t = Time.now
18
+ fei = engine.launch(pdef)
19
+ engine.wait_for(fei.wfid)
20
+ puts "#{Time.now - t}s"
21
+
22
+ #require 'eventmachine'
23
+ #EM.run {
24
+ # engine = Ruote::Engine.new
25
+ # t = Time.now
26
+ # fei = engine.launch(pdef)
27
+ # #engine.wait_for(fei.wfid)
28
+ # #puts "#{Time.now - t}s"
29
+ # #EM.stop
30
+ # engine.wqueue.observe(:processes) do |eclass, emsg, args|
31
+ # puts "#{Time.now - t}s"
32
+ # EM.stop
33
+ # end
34
+ #}
35
+
@@ -0,0 +1,247 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sat Sep 20 23:40:10 JST 2008
6
+ #
7
+
8
+ require 'fileutils'
9
+
10
+ require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
11
+ require File.join(File.dirname(__FILE__), 'storage_helper.rb')
12
+
13
+ require 'ruote'
14
+
15
+
16
+ trap 'USR2' do
17
+
18
+ require 'irb'
19
+ require 'irb/completion'
20
+
21
+ IRB.setup(nil)
22
+ ws = IRB::WorkSpace.new(binding)
23
+ irb = IRB::Irb.new(ws)
24
+ IRB::conf[:MAIN_CONTEXT] = irb.context
25
+ irb.eval_input
26
+ end
27
+
28
+ trap 'INT' do
29
+ #
30
+ # why do I have to do that ?
31
+ #
32
+ puts
33
+ puts '-' * 80
34
+ caller.each { |l| p l }
35
+ puts '-' * 80
36
+ exit 1
37
+ end if RUBY_VERSION.match(/^1.9./)
38
+
39
+ puts "pid #{$$}"
40
+
41
+
42
+ module FunctionalBase
43
+
44
+ def setup
45
+
46
+ p self.class if ARGV.include?('-T') or ARGV.include?('-N')
47
+
48
+ #require 'ruote/util/look'
49
+ #Ruote::Look.dump_lsof
50
+ #Ruote::Look.dump_lsof_count
51
+ #
52
+ # uncomment this when "too many open files"
53
+
54
+ @engine =
55
+ Ruote::Engine.new(
56
+ Ruote::Worker.new(
57
+ determine_storage(
58
+ 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])))
59
+
60
+ $_test = self
61
+ $_engine = @engine
62
+ #
63
+ # handy when hijacking (https://github.com/ileitch/hijack)
64
+ # or flinging USR2 at the test process
65
+
66
+ @tracer = Tracer.new
67
+
68
+ tracer = @tracer
69
+ @engine.context.instance_eval { @tracer = tracer }
70
+
71
+ @engine.add_service('tracer', @tracer)
72
+ @engine.add_service('stash', {})
73
+
74
+ noisy if ARGV.include?('-N')
75
+
76
+ #noisy # uncommented, it makes all the tests noisy
77
+ end
78
+
79
+ def teardown
80
+
81
+ @engine.shutdown
82
+ @engine.context.storage.purge!
83
+ @engine.context.storage.close if @engine.context.storage.respond_to?(:close)
84
+ end
85
+
86
+ def stash
87
+
88
+ @engine.context.stash
89
+ end
90
+
91
+ def assert_log_count(count, &block)
92
+
93
+ c = @engine.context.logger.log.select(&block).size
94
+
95
+ #logger.to_stdout if ( ! @engine.context[:noisy]) && c != count
96
+
97
+ assert_equal count, c
98
+ end
99
+
100
+ # assert_trace(*expected_traces, pdef)
101
+ # assert_trace(*expected_traces, fields, pdef)
102
+ #
103
+ def assert_trace(*args)
104
+
105
+ if args.last == :clear
106
+ args.pop
107
+ @tracer.clear
108
+ end
109
+
110
+ pdef = args.pop
111
+ fields = args.last.is_a?(Hash) ? args.pop : {}
112
+ expected_traces = args.collect { |et| et.is_a?(Array) ? et.join("\n") : et }
113
+
114
+ wfid = @engine.launch(pdef, fields)
115
+
116
+ r = wait_for(wfid)
117
+
118
+ assert_engine_clean(wfid)
119
+
120
+ trace = r['workitem']['fields']['_trace']
121
+ trace = trace ? trace.join('') : @tracer.to_s
122
+
123
+ if expected_traces.length > 0
124
+ ok, nok = expected_traces.partition { |et| trace == et }
125
+ assert_equal(nok.first, trace) if ok.empty?
126
+ end
127
+
128
+ assert(true)
129
+ # so that the assertion count matches
130
+
131
+ wfid
132
+ end
133
+
134
+ def logger
135
+
136
+ @engine.context.logger
137
+ end
138
+
139
+ protected
140
+
141
+ def noisy(on=true)
142
+
143
+ puts "\nnoisy " + caller[0] if on
144
+ @engine.context.logger.noisy = true
145
+ end
146
+
147
+ def wait_for(*wfid_or_part)
148
+
149
+ @engine.wait_for(*wfid_or_part)
150
+ end
151
+
152
+ def assert_engine_clean(wfid)
153
+
154
+ assert_no_errors(wfid)
155
+ assert_no_remaining_expressions(wfid)
156
+ end
157
+
158
+ def assert_no_errors(wfid)
159
+
160
+ errors = @engine.storage.get_many('errors', /#{wfid}$/)
161
+
162
+ return if errors.size == 0
163
+
164
+ puts
165
+ puts '-' * 80
166
+ puts 'remaining process error(s)'
167
+ puts
168
+ errors.each do |e|
169
+ puts " ** #{e['message']}"
170
+ puts e['trace']
171
+ end
172
+ puts '-' * 80
173
+
174
+ puts_trace_so_far
175
+
176
+ flunk 'remaining process error(s)'
177
+ end
178
+
179
+ def assert_no_remaining_expressions(wfid)
180
+
181
+ expcount = @engine.storage.get_many('expressions').size
182
+ return if expcount == 0
183
+
184
+ tf, _, tn = caller[2].split(':')
185
+
186
+ puts
187
+ puts '-' * 80
188
+ puts 'too many expressions left in storage'
189
+ puts
190
+ puts "this test : #{tf}"
191
+ puts " #{tn}"
192
+ puts
193
+ puts "this test's wfid : #{wfid}"
194
+ puts
195
+ puts 'left :'
196
+ puts
197
+ puts @engine.context.storage.dump('expressions')
198
+ puts
199
+ puts '-' * 80
200
+
201
+ puts_trace_so_far
202
+
203
+ flunk 'too many expressions left in storage'
204
+ end
205
+
206
+ def puts_trace_so_far
207
+
208
+ #puts '. ' * 40
209
+ puts 'trace so far'
210
+ puts '---8<---'
211
+ puts @tracer.to_s
212
+ puts '--->8---'
213
+ puts
214
+ end
215
+ end
216
+
217
+ # Re-opening workitem for a shortcut to a '_trace' field
218
+ #
219
+ class Ruote::Workitem
220
+ def trace
221
+ @h['fields']['_trace'] ||= []
222
+ end
223
+ end
224
+
225
+ class Tracer
226
+ attr_reader :s
227
+ def initialize
228
+ super
229
+ @s = ''
230
+ end
231
+ def to_s
232
+ @s.to_s.strip
233
+ end
234
+ def to_a
235
+ to_s.split("\n")
236
+ end
237
+ def << s
238
+ @s << s
239
+ end
240
+ def clear
241
+ @s = ''
242
+ end
243
+ def puts(s)
244
+ @s << "#{s}\n"
245
+ end
246
+ end
247
+
@@ -0,0 +1,98 @@
1
+
2
+ #
3
+ # Testing ruote
4
+ #
5
+ # Fri Dec 4 17:15:10 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base.rb')
9
+
10
+
11
+ class Ruote::Worker
12
+
13
+ public :process
14
+ end
15
+
16
+ class Ruote::Engine
17
+
18
+ def peek_msg
19
+ @msgs = @context.storage.get_msgs if ( ! @msgs) || @msgs.size < 1
20
+ @msgs.shift
21
+ end
22
+
23
+ def do_process(msg)
24
+ @context.worker.process(msg)
25
+ end
26
+
27
+ def step(count)
28
+ return if count == 0
29
+ loop do
30
+ m = next_msg
31
+ next unless m
32
+ do_process(m)
33
+ break
34
+ end
35
+ step(count - 1)
36
+ end
37
+
38
+ def next_msg
39
+ loop do
40
+ if m = peek_msg
41
+ return m
42
+ end
43
+ end
44
+ end
45
+
46
+ def gather_msgs
47
+ (1..77).to_a.inject({}) { |h, i|
48
+ #(i % 10).times { Thread.pass }
49
+ sleep 0.001
50
+ sleep 0.025 # couch :-(
51
+ m = peek_msg
52
+ h[m['_id']] = m if m
53
+ h
54
+ }.values.sort { |a, b|
55
+ a['put_at'] <=> b['put_at']
56
+ }
57
+ end
58
+ end
59
+
60
+
61
+ module ConcurrentBase
62
+
63
+ def setup
64
+
65
+ @storage = determine_storage(
66
+ 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])
67
+
68
+ @engine0 = Ruote::Engine.new(Ruote::Worker.new(@storage), false)
69
+ @engine1 = Ruote::Engine.new(Ruote::Worker.new(@storage), false)
70
+ #
71
+ # the 2 engines are set with run=false
72
+
73
+ @tracer0 = Tracer.new
74
+ @tracer1 = Tracer.new
75
+
76
+ @engine0.context.add_service('s_tracer', @tracer0, nil)
77
+ @engine1.context.add_service('s_tracer', @tracer1, nil)
78
+
79
+ @engine1.context.logger.color = '32' # green
80
+ end
81
+
82
+ def teardown
83
+
84
+ @storage.purge!
85
+
86
+ @engine0.shutdown
87
+ @engine1.shutdown
88
+ end
89
+
90
+ protected
91
+
92
+ def noisy
93
+
94
+ @engine0.context.logger.noisy = true
95
+ @engine1.context.logger.noisy = true
96
+ end
97
+ end
98
+
@@ -0,0 +1,31 @@
1
+
2
+ pers = ARGV.find { |a| a.match(/^--/) } || ''
3
+ tnumber = ARGV.find { |a| a.match(/^\d+/) } || 2
4
+
5
+ i = 0
6
+
7
+ puts `ruby -v`
8
+
9
+ loop do
10
+
11
+ t = Dir["test/functional/ct_#{tnumber}_*.rb"].first
12
+
13
+ raise "didn't find test..." unless t
14
+
15
+ s = `ruby #{t} #{pers}`
16
+
17
+ if $? != 0
18
+ puts
19
+ puts s
20
+ else
21
+ if (i % 5) == 0
22
+ print i.to_s
23
+ else
24
+ print '.'
25
+ end
26
+ STDOUT.flush
27
+ end
28
+
29
+ i = i + 1
30
+ end
31
+
@@ -0,0 +1,65 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Jul 8 15:30:55 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'concurrent_base')
9
+
10
+ #require 'ruote/part/hash_participant'
11
+
12
+
13
+ class CtConcurrenceTest < Test::Unit::TestCase
14
+ include ConcurrentBase
15
+
16
+ # A collision between two workers replying to the same concurrence expression.
17
+ #
18
+ # Worker 0 replies for echo 'a' while worker 1 replies for echo 'b'.
19
+ #
20
+ def test_collision
21
+
22
+ pdef = Ruote.process_definition do
23
+ concurrence do
24
+ echo 'a'
25
+ echo 'b'
26
+ end
27
+ end
28
+
29
+ noisy if ARGV.include?('-N')
30
+
31
+ wfid = @engine0.launch(pdef)
32
+
33
+ replies = []
34
+
35
+ while replies.size < 2
36
+
37
+ msg = @engine0.next_msg
38
+
39
+ if msg['action'] == 'reply'
40
+ replies << msg
41
+ else
42
+ @engine0.do_process(msg)
43
+ end
44
+ end
45
+
46
+ replies.sort! { |a, b| a['put_at'] <=> b['put_at'] }
47
+
48
+ #replies.each { |r| p r }
49
+
50
+ t0 = Thread.new { @engine1.do_process(replies[0]) }
51
+ t1 = Thread.new { @engine0.do_process(replies[1]) }
52
+ t0.join
53
+ t1.join
54
+
55
+ msgs = @engine0.gather_msgs
56
+
57
+ assert_equal 1, msgs.size, 'exactly 1 message was expected'
58
+
59
+ msg = msgs.first
60
+
61
+ assert_equal 'reply', msg['action']
62
+ assert_equal '0', msg['fei']['expid']
63
+ end
64
+ end
65
+