ruote 2.1.11 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. data/CHANGELOG.txt +60 -0
  2. data/CREDITS.txt +22 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +6 -7
  5. data/Rakefile +58 -59
  6. data/TODO.txt +137 -65
  7. data/couch_url.txt +1 -0
  8. data/jruby_issue.txt +32 -0
  9. data/lib/ruote.rb +1 -1
  10. data/lib/ruote/context.rb +12 -10
  11. data/lib/ruote/engine.rb +280 -145
  12. data/lib/ruote/engine/process_error.rb +5 -5
  13. data/lib/ruote/engine/process_status.rb +47 -28
  14. data/lib/ruote/exp/command.rb +7 -10
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +130 -43
  17. data/lib/ruote/exp/fe_add_branches.rb +2 -2
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_cancel_process.rb +3 -3
  20. data/lib/ruote/exp/fe_command.rb +3 -3
  21. data/lib/ruote/exp/fe_concurrence.rb +4 -4
  22. data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
  23. data/lib/ruote/exp/fe_cron.rb +3 -3
  24. data/lib/ruote/exp/fe_cursor.rb +5 -5
  25. data/lib/ruote/exp/fe_define.rb +3 -3
  26. data/lib/ruote/exp/fe_echo.rb +3 -3
  27. data/lib/ruote/exp/fe_equals.rb +2 -2
  28. data/lib/ruote/exp/fe_error.rb +2 -2
  29. data/lib/ruote/exp/fe_filter.rb +519 -0
  30. data/lib/ruote/exp/fe_forget.rb +9 -2
  31. data/lib/ruote/exp/fe_given.rb +154 -0
  32. data/lib/ruote/exp/fe_if.rb +16 -13
  33. data/lib/ruote/exp/fe_inc.rb +3 -3
  34. data/lib/ruote/exp/fe_iterator.rb +4 -4
  35. data/lib/ruote/exp/fe_let.rb +75 -0
  36. data/lib/ruote/exp/fe_listen.rb +68 -12
  37. data/lib/ruote/exp/fe_lose.rb +110 -0
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
  40. data/lib/ruote/exp/fe_participant.rb +14 -17
  41. data/lib/ruote/exp/fe_redo.rb +10 -6
  42. data/lib/ruote/exp/fe_ref.rb +1 -1
  43. data/lib/ruote/exp/fe_registerp.rb +112 -0
  44. data/lib/ruote/exp/fe_reserve.rb +3 -3
  45. data/lib/ruote/exp/fe_restore.rb +2 -2
  46. data/lib/ruote/exp/fe_save.rb +2 -2
  47. data/lib/ruote/exp/fe_sequence.rb +3 -4
  48. data/lib/ruote/exp/fe_set.rb +16 -7
  49. data/lib/ruote/exp/fe_subprocess.rb +23 -1
  50. data/lib/ruote/exp/fe_that.rb +92 -0
  51. data/lib/ruote/exp/fe_undo.rb +3 -3
  52. data/lib/ruote/exp/fe_unregisterp.rb +71 -0
  53. data/lib/ruote/exp/fe_wait.rb +2 -2
  54. data/lib/ruote/exp/flowexpression.rb +153 -78
  55. data/lib/ruote/exp/iterator.rb +2 -2
  56. data/lib/ruote/exp/merge.rb +2 -2
  57. data/lib/ruote/exp/ro_attributes.rb +14 -12
  58. data/lib/ruote/exp/ro_filters.rb +136 -0
  59. data/lib/ruote/exp/ro_persist.rb +51 -35
  60. data/lib/ruote/exp/ro_variables.rb +18 -27
  61. data/lib/ruote/fei.rb +73 -33
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
  63. data/lib/ruote/id/wfid_generator.rb +11 -4
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +36 -8
  66. data/lib/ruote/log/storage_history.rb +37 -5
  67. data/lib/ruote/log/test_logger.rb +26 -24
  68. data/lib/ruote/log/wait_logger.rb +5 -3
  69. data/lib/ruote/part/block_participant.rb +22 -11
  70. data/lib/ruote/part/engine_participant.rb +6 -7
  71. data/lib/ruote/part/local_participant.rb +6 -12
  72. data/lib/ruote/part/no_op_participant.rb +4 -4
  73. data/lib/ruote/part/null_participant.rb +4 -4
  74. data/lib/ruote/part/smtp_participant.rb +4 -4
  75. data/lib/ruote/part/storage_participant.rb +40 -20
  76. data/lib/ruote/part/template.rb +4 -4
  77. data/lib/ruote/participant.rb +0 -1
  78. data/lib/ruote/{parser.rb → reader.rb} +30 -25
  79. data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
  80. data/lib/ruote/{parser → reader}/xml.rb +6 -5
  81. data/lib/ruote/receiver/base.rb +35 -13
  82. data/lib/ruote/storage/base.rb +20 -18
  83. data/lib/ruote/storage/composite_storage.rb +10 -10
  84. data/lib/ruote/storage/fs_storage.rb +17 -10
  85. data/lib/ruote/storage/hash_storage.rb +29 -18
  86. data/lib/ruote/svc/dispatch_pool.rb +41 -14
  87. data/lib/ruote/svc/dollar_sub.rb +50 -17
  88. data/lib/ruote/svc/error_handler.rb +19 -11
  89. data/lib/ruote/svc/expression_map.rb +4 -4
  90. data/lib/ruote/svc/participant_list.rb +105 -100
  91. data/lib/ruote/svc/tracker.rb +58 -18
  92. data/lib/ruote/svc/treechecker.rb +51 -24
  93. data/lib/ruote/tree_dot.rb +4 -4
  94. data/lib/ruote/util/filter.rb +440 -0
  95. data/lib/ruote/util/hashdot.rb +4 -4
  96. data/lib/ruote/util/look.rb +2 -6
  97. data/lib/ruote/util/lookup.rb +9 -7
  98. data/lib/ruote/util/misc.rb +40 -8
  99. data/lib/ruote/util/ometa.rb +1 -1
  100. data/lib/ruote/util/serializer.rb +4 -4
  101. data/lib/ruote/util/subprocess.rb +29 -9
  102. data/lib/ruote/util/time.rb +4 -4
  103. data/lib/ruote/util/tree.rb +3 -3
  104. data/lib/ruote/version.rb +2 -2
  105. data/lib/ruote/worker.rb +55 -32
  106. data/lib/ruote/workitem.rb +64 -11
  107. data/ruote.gemspec +31 -302
  108. data/test/bm/launch_bench.rb +37 -0
  109. data/test/functional/base.rb +60 -18
  110. data/test/functional/concurrent_base.rb +2 -2
  111. data/test/functional/ct_0_concurrence.rb +1 -1
  112. data/test/functional/ct_1_iterator.rb +1 -1
  113. data/test/functional/ct_2_cancel.rb +1 -1
  114. data/test/functional/eft_0_process_definition.rb +2 -2
  115. data/test/functional/eft_10_cancel_process.rb +1 -1
  116. data/test/functional/eft_11_wait.rb +19 -11
  117. data/test/functional/eft_12_listen.rb +79 -13
  118. data/test/functional/eft_13_iterator.rb +13 -10
  119. data/test/functional/eft_14_cursor.rb +98 -9
  120. data/test/functional/eft_15_loop.rb +6 -4
  121. data/test/functional/eft_16_if.rb +12 -0
  122. data/test/functional/eft_18_concurrent_iterator.rb +31 -32
  123. data/test/functional/eft_19_reserve.rb +4 -4
  124. data/test/functional/eft_1_echo.rb +9 -0
  125. data/test/functional/eft_20_save.rb +4 -4
  126. data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
  127. data/test/functional/eft_30_ref.rb +17 -2
  128. data/test/functional/eft_31_registerp.rb +130 -0
  129. data/test/functional/eft_32_lose.rb +93 -0
  130. data/test/functional/eft_33_let.rb +31 -0
  131. data/test/functional/eft_34_given.rb +123 -0
  132. data/test/functional/eft_35_filter.rb +269 -0
  133. data/test/functional/eft_3_participant.rb +4 -6
  134. data/test/functional/eft_4_set.rb +16 -2
  135. data/test/functional/eft_5_subprocess.rb +2 -4
  136. data/test/functional/eft_6_concurrence.rb +29 -29
  137. data/test/functional/eft_8_undo.rb +39 -3
  138. data/test/functional/eft_9_redo.rb +94 -2
  139. data/test/functional/ft_10_dollar.rb +81 -2
  140. data/test/functional/ft_11_recursion.rb +13 -17
  141. data/test/functional/ft_12_launchitem.rb +9 -5
  142. data/test/functional/ft_13_variables.rb +7 -9
  143. data/test/functional/ft_14_re_apply.rb +6 -9
  144. data/test/functional/ft_15_timeout.rb +18 -18
  145. data/test/functional/ft_16_participant_params.rb +1 -3
  146. data/test/functional/ft_17_conditional.rb +25 -2
  147. data/test/functional/ft_18_kill.rb +65 -12
  148. data/test/functional/ft_1_process_status.rb +147 -71
  149. data/test/functional/ft_20_storage_participant.rb +0 -1
  150. data/test/functional/ft_21_forget.rb +82 -1
  151. data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
  152. data/test/functional/ft_25_receiver.rb +47 -17
  153. data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
  154. data/test/functional/ft_29_part_template.rb +6 -5
  155. data/test/functional/ft_2_errors.rb +21 -37
  156. data/test/functional/ft_30_smtp_participant.rb +1 -1
  157. data/test/functional/ft_31_part_blocking.rb +8 -6
  158. data/test/functional/ft_34_cursor_rewind.rb +13 -10
  159. data/test/functional/ft_35_add_service.rb +1 -1
  160. data/test/functional/ft_36_storage_history.rb +24 -1
  161. data/test/functional/ft_37_default_history.rb +109 -0
  162. data/test/functional/ft_38_participant_more.rb +10 -10
  163. data/test/functional/ft_39_wait_for.rb +12 -9
  164. data/test/functional/ft_3_participant_registration.rb +111 -32
  165. data/test/functional/ft_40_wait_logger.rb +2 -1
  166. data/test/functional/ft_41_participants.rb +30 -4
  167. data/test/functional/ft_43_participant_on_reply.rb +6 -23
  168. data/test/functional/ft_45_participant_accept.rb +4 -4
  169. data/test/functional/ft_46_launch_single.rb +36 -2
  170. data/test/functional/ft_47_wfid_generator.rb +54 -0
  171. data/test/functional/ft_48_lose.rb +112 -0
  172. data/test/functional/ft_49_engine_on_error.rb +201 -0
  173. data/test/functional/ft_4_cancel.rb +66 -6
  174. data/test/functional/ft_50_engine_config.rb +22 -0
  175. data/test/functional/ft_51_misc.rb +67 -0
  176. data/test/functional/ft_52_case.rb +134 -0
  177. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  178. data/test/functional/ft_54_patterns.rb +104 -0
  179. data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
  180. data/test/functional/ft_56_filter_attribute.rb +259 -0
  181. data/test/functional/ft_5_on_error.rb +77 -30
  182. data/test/functional/ft_6_on_cancel.rb +66 -11
  183. data/test/functional/ft_7_tags.rb +94 -5
  184. data/test/functional/ft_8_participant_consumption.rb +36 -5
  185. data/test/functional/ft_9_subprocesses.rb +10 -10
  186. data/test/functional/rt_1_listen.rb +3 -3
  187. data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
  188. data/test/functional/storage_helper.rb +15 -13
  189. data/test/functional/test.rb +1 -3
  190. data/test/test_helper.rb +0 -8
  191. data/test/unit/storage.rb +154 -10
  192. data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
  193. data/test/unit/ut_11_lookup.rb +7 -0
  194. data/test/unit/ut_13_serializer.rb +1 -1
  195. data/test/unit/ut_15_util.rb +23 -0
  196. data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
  197. data/test/unit/ut_1_fei.rb +57 -10
  198. data/test/unit/ut_20_composite_storage.rb +25 -11
  199. data/test/unit/ut_21_participant_list.rb +47 -0
  200. data/test/unit/ut_22_filter.rb +903 -0
  201. data/test/unit/ut_3_wait_logger.rb +2 -6
  202. data/test/unit/ut_6_condition.rb +164 -17
  203. data/test/unit/ut_7_workitem.rb +28 -0
  204. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  205. data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
  206. metadata +108 -84
  207. data/.gitignore +0 -4
  208. data/examples/barley.rb +0 -391
  209. data/examples/flickr_report.rb +0 -107
  210. data/examples/pong.rb +0 -37
  211. data/examples/ruote_quickstart.rb +0 -43
  212. data/examples/web_first_page.rb +0 -68
  213. data/lib/ruote/part/hash_participant.rb +0 -91
  214. data/test/README.rdoc +0 -15
  215. data/test/functional/crunner.sh +0 -19
  216. data/test/pdef.xml +0 -7
  217. data/test/unit/ut_2_wfidgen.rb +0 -21
@@ -20,22 +20,53 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
20
20
  @engine.register_participant :alpha do |workitem|
21
21
  @tracer << 'alpha'
22
22
  end
23
+ @engine.register_participant /^user_/, Ruote::NullParticipant
23
24
 
24
- wait_for(1)
25
+ wait_for(2)
25
26
 
26
- msg = logger.log.last
27
- assert_equal 'participant_registered', msg['action']
28
- assert_equal 'alpha', msg['regex']
27
+ assert_equal(
28
+ 'participant_registered',
29
+ logger.log[0]['action'])
29
30
 
30
31
  assert_equal(
31
- [ 'inpa_:alpha' ],
32
- @engine.context.plist.instantiated_participants.collect { |e| e.first })
32
+ %w[ alpha /^user_/ ],
33
+ logger.log.collect { |msg| msg['regex'] })
33
34
 
34
35
  assert_equal(
35
- [ [ '^alpha$', 'inpa_:alpha' ] ],
36
+ [ [ "^alpha$",
37
+ [ "Ruote::BlockParticipant",
38
+ { "block" => "proc { |workitem| (@tracer << \"alpha\") }" } ] ],
39
+ [ "^user_",
40
+ [ "Ruote::NullParticipant",
41
+ {} ] ] ],
36
42
  @engine.participant_list.collect { |pe| pe.to_a })
37
43
  end
38
44
 
45
+ def test_participant_register_position
46
+
47
+ @engine.register_participant :ur, Ruote::StorageParticipant
48
+
49
+ assert_equal(
50
+ %w[ ^ur$ ],
51
+ @engine.participant_list.collect { |pe| pe.regex.to_s })
52
+
53
+ @engine.register_participant(
54
+ :first, Ruote::StorageParticipant, :position => :first)
55
+ @engine.register_participant(
56
+ :last, Ruote::StorageParticipant, :position => :last)
57
+
58
+ assert_equal(
59
+ %w[ ^first$ ^ur$ ^last$ ],
60
+ @engine.participant_list.collect { |pe| pe.regex.to_s })
61
+
62
+ @engine.register_participant(
63
+ :x, Ruote::StorageParticipant, :position => -2)
64
+
65
+ assert_equal(
66
+ %w[ ^first$ ^ur$ ^x$ ^last$ ],
67
+ @engine.participant_list.collect { |pe| pe.regex.to_s })
68
+ end
69
+
39
70
  def test_double_registration
40
71
 
41
72
  @engine.register_participant :alpha do |workitem|
@@ -48,12 +79,14 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
48
79
  assert_equal 1, @engine.context.plist.send(:get_list)['list'].size
49
80
  end
50
81
 
51
- def test_register_and_return_participant
82
+ def test_register_and_return_something
52
83
 
53
84
  pa = @engine.register_participant :alpha do |workitem|
54
85
  end
86
+ pb = @engine.register_participant :bravo, Ruote::StorageParticipant
55
87
 
56
- assert_kind_of Ruote::BlockParticipant, pa
88
+ assert_nil pa
89
+ assert_equal Ruote::StorageParticipant, pb.class
57
90
  end
58
91
 
59
92
  def test_participant_unregister_by_name
@@ -63,7 +96,7 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
63
96
  @engine.register_participant :alpha do |workitem|
64
97
  end
65
98
 
66
- @engine.unregister_participant :alpha
99
+ @engine.unregister_participant(:alpha)
67
100
 
68
101
  wait_for(2)
69
102
  Thread.pass
@@ -71,16 +104,14 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
71
104
  msg = logger.log.last
72
105
  assert_equal 'participant_unregistered', msg['action']
73
106
  assert_equal '^alpha$', msg['regex']
74
-
75
- assert_equal 0, @engine.context.plist.instantiated_participants.size
76
107
  end
77
108
 
78
109
  def test_participant_unregister
79
110
 
80
- pa = @engine.register_participant :alpha do |workitem|
111
+ @engine.register_participant :alpha do |workitem|
81
112
  end
82
113
 
83
- @engine.unregister_participant pa
114
+ @engine.unregister_participant('alpha')
84
115
 
85
116
  wait_for(2)
86
117
 
@@ -88,26 +119,28 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
88
119
  assert_equal 'participant_unregistered', msg['action']
89
120
  assert_equal '^alpha$', msg['regex']
90
121
 
91
- assert_equal 0, @engine.context.plist.instantiated_participants.size
122
+ assert_equal 0, @engine.context.plist.list.size
92
123
  end
93
124
 
94
125
  class MyParticipant
95
- attr_reader :down
126
+ @@down = false
127
+ def self.down
128
+ @@down
129
+ end
96
130
  def initialize
97
- @down = false
98
131
  end
99
132
  def shutdown
100
- @down = true
133
+ @@down = true
101
134
  end
102
135
  end
103
136
 
104
137
  def test_participant_shutdown
105
138
 
106
- alpha = @engine.register :alpha, MyParticipant.new
139
+ alpha = @engine.register :alpha, MyParticipant
107
140
 
108
141
  @engine.context.plist.shutdown
109
142
 
110
- assert_equal true, alpha.down
143
+ assert_equal true, MyParticipant.down
111
144
  end
112
145
 
113
146
  def test_participant_list_of_names
@@ -128,10 +161,10 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
128
161
  f.write(%{
129
162
  class RequiredParticipant
130
163
  include Ruote::LocalParticipant
131
- def initialize (opts)
164
+ def initialize(opts)
132
165
  @opts = opts
133
166
  end
134
- def consume (workitem)
167
+ def consume(workitem)
135
168
  workitem.fields['message'] = @opts['message']
136
169
  reply(workitem)
137
170
  end
@@ -164,10 +197,10 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
164
197
  f.write(%{
165
198
  class RequiredParticipant
166
199
  include Ruote::LocalParticipant
167
- def initialize (opts)
200
+ def initialize(opts)
168
201
  @opts = opts
169
202
  end
170
- def consume (workitem)
203
+ def consume(workitem)
171
204
  workitem.fields['message'] = 'second run'
172
205
  reply(workitem)
173
206
  end
@@ -194,10 +227,10 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
194
227
  f.write(%{
195
228
  class LoadedParticipant
196
229
  include Ruote::LocalParticipant
197
- def initialize (opts)
230
+ def initialize(opts)
198
231
  @opts = opts
199
232
  end
200
- def consume (workitem)
233
+ def consume(workitem)
201
234
  workitem.fields['message'] = @opts['message']
202
235
  reply(workitem)
203
236
  end
@@ -230,10 +263,10 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
230
263
  f.write(%{
231
264
  class LoadedParticipant
232
265
  include Ruote::LocalParticipant
233
- def initialize (opts)
266
+ def initialize(opts)
234
267
  @opts = opts
235
268
  end
236
- def consume (workitem)
269
+ def consume(workitem)
237
270
  workitem.fields['message'] = 'second run'
238
271
  reply(workitem)
239
272
  end
@@ -348,25 +381,31 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
348
381
  alpha 'Participants::Alpha', 'flavour' => 'vanilla'
349
382
  participant 'bravo', 'Participants::Bravo', :flavour => 'peach'
350
383
  participant 'charlie', 'Participants::Charlie'
384
+ participant 'david' do |wi|
385
+ p wi
386
+ end
351
387
  catchall 'Participants::Zebda', 'flavour' => 'coconut'
352
388
  end
353
389
 
354
- assert_equal 4, @engine.participant_list.size
390
+ assert_equal 5, @engine.participant_list.size
355
391
 
356
392
  assert_equal(
357
- %w[ ^alpha$ ^bravo$ ^charlie$ ^.+$ ],
393
+ %w[ ^alpha$ ^bravo$ ^charlie$ ^david$ ^.+$ ],
358
394
  @engine.participant_list.collect { |pe| pe.regex.to_s })
359
395
 
360
396
  assert_equal(
361
397
  %w[ Participants::Alpha
362
398
  Participants::Bravo
363
399
  Participants::Charlie
400
+ Ruote::BlockParticipant
364
401
  Participants::Zebda ],
365
402
  @engine.participant_list.collect { |pe| pe.classname })
366
403
 
367
404
  assert_equal(
368
- %w[ vanilla peach nil coconut ],
369
- @engine.participant_list.collect { |pe| pe.options['flavour'] || 'nil' })
405
+ %w[ vanilla peach nil nil coconut ],
406
+ @engine.participant_list.collect { |pe|
407
+ (pe.options['flavour'] || 'nil') rescue 'nil'
408
+ })
370
409
  end
371
410
 
372
411
  def test_register_block_catchall_default
@@ -379,5 +418,45 @@ class FtParticipantRegistrationTest < Test::Unit::TestCase
379
418
  %w[ Ruote::StorageParticipant ],
380
419
  @engine.participant_list.collect { |pe| pe.classname })
381
420
  end
421
+
422
+ def test_argument_error_on_instantiated_participant
423
+
424
+ assert_raise ArgumentError do
425
+ @engine.register 'alpha', Ruote::StorageParticipant.new
426
+ end
427
+ assert_raise ArgumentError do
428
+ @engine.register 'alpha', Ruote::StorageParticipant.new, 'hello' => 'kitty'
429
+ end
430
+ end
431
+
432
+ class AaParticipant
433
+ include Ruote::LocalParticipant
434
+ attr_reader :opts
435
+ def initialize(opts)
436
+ @opts = opts
437
+ end
438
+ end
439
+ class BbParticipant < AaParticipant
440
+ def accept?(workitem)
441
+ false
442
+ end
443
+ end
444
+
445
+ def test_engine_participant
446
+
447
+ @engine.register do
448
+ alpha AaParticipant
449
+ bravo BbParticipant
450
+ catchall AaParticipant, :catch_all => 'oh yeah'
451
+ end
452
+
453
+ assert_equal AaParticipant, @engine.participant('alpha').class
454
+ assert_equal BbParticipant, @engine.participant('bravo').class
455
+
456
+ assert_equal AaParticipant, @engine.participant('charly').class
457
+ assert_equal 'oh yeah', @engine.participant('charly').opts['catch_all']
458
+
459
+ assert_equal Ruote::Context, @engine.participant('alpha').context.class
460
+ end
382
461
  end
383
462
 
@@ -48,7 +48,8 @@ class FtWaitLoggerTest < Test::Unit::TestCase
48
48
 
49
49
  wfid = @engine.launch(pdef)
50
50
 
51
- sleep 1.400 # worst case is ruote-couch
51
+ sleep 0.500
52
+ sleep 2.000 if @engine.storage.class.name.match(/Couch/)
52
53
 
53
54
  assert_equal 2, @engine.context.logger.instance_variable_get(:@seen).size
54
55
 
@@ -10,12 +10,12 @@ require File.join(File.dirname(__FILE__), 'base')
10
10
  require 'ruote/part/local_participant'
11
11
 
12
12
 
13
- class FtMiscParticipantTest < Test::Unit::TestCase
13
+ class FtParticipantsTest < Test::Unit::TestCase
14
14
  include FunctionalBase
15
15
 
16
16
  class MyParticipant
17
17
  include Ruote::LocalParticipant
18
- def consume (workitem)
18
+ def consume(workitem)
19
19
  workitem.fields['seen'] = true
20
20
  reply_to_engine(workitem)
21
21
  end
@@ -23,10 +23,10 @@ class FtMiscParticipantTest < Test::Unit::TestCase
23
23
 
24
24
  class MyMessageParticipant
25
25
  include Ruote::LocalParticipant
26
- def initialize (opts)
26
+ def initialize(opts)
27
27
  @opts = opts
28
28
  end
29
- def consume (workitem)
29
+ def consume(workitem)
30
30
  workitem.fields['message'] = @opts['message']
31
31
  reply_to_engine(workitem)
32
32
  end
@@ -61,5 +61,31 @@ class FtMiscParticipantTest < Test::Unit::TestCase
61
61
 
62
62
  assert_equal 'hi', r['workitem']['fields']['message']
63
63
  end
64
+
65
+ class MyOtherParticipant
66
+ include Ruote::LocalParticipant
67
+ def consume(wi)
68
+ wi.fields['hello'] = 'kitty'
69
+ reply_to_engine(wi)
70
+ end
71
+ def on_reply(wi)
72
+ @context.tracer << wi.fields['hello'] + "\n"
73
+ @context.tracer << applied_workitem(wi.fei).fields['hello'] + "\n"
74
+ @context.tracer << workitem(wi.fei).fields['hello']
75
+ end
76
+ end
77
+
78
+ def test_workitem_method
79
+
80
+ @engine.register 'alpha', MyOtherParticipant
81
+
82
+ #noisy
83
+
84
+ wfid = @engine.launch(Ruote.define { alpha }, 'hello' => 'world')
85
+
86
+ @engine.wait_for(wfid)
87
+
88
+ assert_equal %w[ kitty world world ], @tracer.to_a
89
+ end
64
90
  end
65
91
 
@@ -15,12 +15,12 @@ class FtParticipantOnReplyTest < Test::Unit::TestCase
15
15
 
16
16
  class MyParticipant
17
17
  include Ruote::LocalParticipant
18
- def initialize (opts)
18
+ def initialize(opts)
19
19
  end
20
- def consume (workitem)
20
+ def consume(workitem)
21
21
  reply(workitem)
22
22
  end
23
- def on_reply (workitem)
23
+ def on_reply(workitem)
24
24
  workitem.fields['message'] = 'hello'
25
25
  end
26
26
  end
@@ -41,31 +41,14 @@ class FtParticipantOnReplyTest < Test::Unit::TestCase
41
41
  assert_trace('hello', pdef)
42
42
  end
43
43
 
44
- def test_instantiated_participant_on_reply
45
-
46
- pdef = Ruote.process_definition do
47
- sequence do
48
- alpha
49
- echo '${f:message}'
50
- end
51
- end
52
-
53
- @engine.register_participant :alpha, MyParticipant.new(nil)
54
- # instantiated participant :-(
55
-
56
- #noisy
57
-
58
- assert_trace('hello', pdef)
59
- end
60
-
61
44
  class AwkwardParticipant
62
45
  include Ruote::LocalParticipant
63
- def initialize (opts)
46
+ def initialize(opts)
64
47
  end
65
- def consume (workitem)
48
+ def consume(workitem)
66
49
  reply(workitem)
67
50
  end
68
- def on_reply (workitem)
51
+ def on_reply(workitem)
69
52
  return if workitem.fields['pass']
70
53
  raise "something went wrong"
71
54
  end
@@ -16,15 +16,15 @@ class FtParticipantAcceptTest < Test::Unit::TestCase
16
16
  class MyParticipant
17
17
  include Ruote::LocalParticipant
18
18
 
19
- def initialize (opts)
19
+ def initialize(opts)
20
20
  @opts = opts
21
21
  end
22
22
 
23
- def accept? (workitem)
23
+ def accept?(workitem)
24
24
  workitem.participant_name.match(@opts['filter'] || '.?')
25
25
  end
26
26
 
27
- def consume (workitem)
27
+ def consume(workitem)
28
28
  @context.tracer << 'filtered:'
29
29
  @context.tracer << workitem.participant_name
30
30
  @context.tracer << "\n"
@@ -35,7 +35,7 @@ class FtParticipantAcceptTest < Test::Unit::TestCase
35
35
  class MyOtherParticipant
36
36
  include Ruote::LocalParticipant
37
37
 
38
- def consume (workitem)
38
+ def consume(workitem)
39
39
  @context.tracer << workitem.participant_name
40
40
  @context.tracer << "\n"
41
41
  reply(workitem)
@@ -28,22 +28,56 @@ class FtLaunchSingleTest < Test::Unit::TestCase
28
28
  echo 'over.'
29
29
  end
30
30
 
31
+ #noisy
32
+
31
33
  wfid = @engine.launch_single(pdef)
32
34
 
33
35
  assert_equal(
34
36
  wfid,
35
37
  @engine.storage.get('variables', 'singles')['h']['unique_process'].first)
36
38
 
37
- sleep 0.700
39
+ @engine.wait_for(2)
38
40
 
39
41
  assert_not_nil @engine.process(wfid)
40
42
 
41
43
  wfid1 = @engine.launch_single(pdef)
42
44
 
43
- sleep 0.700
45
+ sleep 1
44
46
 
45
47
  assert_equal wfid, wfid1
46
48
  assert_equal 1, @engine.processes.size
47
49
  end
50
+
51
+ # Fighting the issue reported by Gonzalo in
52
+ # http://groups.google.com/group/openwferu-users/browse_thread/thread/fa9c8b414f355f79
53
+ #
54
+ def test_launch_single_cancel_launch_single
55
+
56
+ pdef = Ruote.process_definition 'unique_process' do
57
+ wait '2y'
58
+ echo 'over.'
59
+ end
60
+
61
+ #noisy
62
+
63
+ wfid0 = @engine.launch_single(pdef)
64
+
65
+ sleep 0.700
66
+ assert_not_nil @engine.process(wfid0)
67
+
68
+ @engine.cancel(wfid0)
69
+
70
+ @engine.wait_for(6)
71
+ assert_nil @engine.process(wfid0)
72
+
73
+ sleep 0.700
74
+ wfid1 = @engine.launch_single(pdef)
75
+
76
+ @engine.wait_for(2)
77
+
78
+ assert_not_equal wfid0, wfid1
79
+ assert_nil @engine.process(wfid0)
80
+ assert_not_nil @engine.process(wfid1)
81
+ end
48
82
  end
49
83