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,428 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Dec 14 15:03:13 JST 2009
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
9
+
10
+ require_json
11
+
12
+ require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
13
+
14
+ require 'ruote/fei'
15
+ require 'ruote/participant'
16
+
17
+
18
+ #
19
+ # note : using the 'errors' type, but this test is about generic storage, not
20
+ # about errors per se.
21
+ #
22
+
23
+ class UtStorage < Test::Unit::TestCase
24
+
25
+ def setup
26
+
27
+ @s = determine_storage({})
28
+
29
+ #@s.add_type('errors')
30
+
31
+ @s.purge_type!('errors')
32
+ @s.purge_type!('expressions')
33
+ @s.purge_type!('msgs')
34
+ @s.purge_type!('workitems')
35
+
36
+ @s.put(
37
+ '_id' => 'toto',
38
+ 'type' => 'errors',
39
+ 'message' => 'testing')
40
+ end
41
+
42
+ def teardown
43
+
44
+ @s.purge_type!('errors')
45
+ @s.purge_type!('expressions')
46
+ @s.purge_type!('msgs')
47
+ @s.purge_type!('workitems')
48
+
49
+ @s.shutdown
50
+ end
51
+
52
+ def test_get_configuration
53
+
54
+ assert_not_nil @s.get_configuration('engine')
55
+ end
56
+
57
+ def test_get
58
+
59
+ h = @s.get('errors', 'toto')
60
+
61
+ assert_not_nil h['_rev']
62
+
63
+ h = @s.get('errors', 'nada')
64
+
65
+ assert_nil h
66
+ end
67
+
68
+ def test_put
69
+
70
+ doc = {
71
+ '_id' => 'test_put', 'type' => 'errors', 'message' => 'testing (2)' }
72
+
73
+ @s.put(doc)
74
+
75
+ assert_nil doc['_rev']
76
+
77
+ h = @s.get('errors', 'test_put')
78
+
79
+ assert_not_nil h['_rev']
80
+ assert_not_nil h['put_at']
81
+ end
82
+
83
+ def test_put_fail
84
+
85
+ r = @s.put('_id' => 'toto', 'type' => 'errors', 'message' => 'more')
86
+
87
+ assert_equal 'toto', r['_id']
88
+ assert_not_nil r['_rev']
89
+ end
90
+
91
+ def test_put_update_rev
92
+
93
+ doc = { '_id' => 'tpur', 'type' => 'errors', 'message' => 'more' }
94
+
95
+ r = @s.put(doc, :update_rev => true)
96
+
97
+ assert_not_nil doc['_rev']
98
+ end
99
+
100
+ def test_put_put_and_put
101
+
102
+ doc = { '_id' => 'whiskas', 'type' => 'errors', 'message' => 'miam' }
103
+
104
+ r = @s.put(doc)
105
+ doc = @s.get('errors', 'whiskas')
106
+
107
+ r = @s.put(doc)
108
+ assert_nil r
109
+
110
+ doc = @s.get('errors', 'whiskas')
111
+
112
+ assert_not_nil doc['put_at']
113
+
114
+ r = @s.put(doc)
115
+ assert_nil r
116
+ end
117
+
118
+ def test_put_update_rev_twice
119
+
120
+ doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
121
+
122
+ r = @s.put(doc, :update_rev => true)
123
+ assert_nil r
124
+
125
+ doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
126
+
127
+ r = @s.put(doc, :update_rev => true)
128
+ assert_not_nil r
129
+ end
130
+
131
+ def test_delete_fail
132
+
133
+ # missing _rev
134
+
135
+ assert_raise(ArgumentError) do
136
+ @s.delete('_id' => 'toto')
137
+ end
138
+ end
139
+
140
+ def test_delete
141
+
142
+ doc = @s.get('errors', 'toto')
143
+
144
+ r = @s.delete(doc)
145
+
146
+ assert_nil r
147
+ end
148
+
149
+ def test_delete_missing
150
+
151
+ r = @s.delete('_id' => 'x', '_rev' => '12-13231123132', 'type' => 'errors')
152
+
153
+ assert_equal true, r
154
+ end
155
+
156
+ def test_keys_should_be_string
157
+
158
+ doc = { '_id' => 'h0', 'type' => 'errors', :m0 => :z, :m1 => [ :a, :b ] }
159
+
160
+ @s.put(doc)
161
+
162
+ doc = @s.get('errors', 'h0')
163
+
164
+ assert_equal 'z', doc['m0']
165
+ assert_equal %w[ a b ], doc['m1']
166
+ end
167
+
168
+ # Updating a gone document must result in a 'true' reply.
169
+ #
170
+ def test_put_gone
171
+
172
+ h = @s.get('errors', 'toto')
173
+
174
+ assert_nil @s.delete(h)
175
+
176
+ h['colour'] = 'blue'
177
+
178
+ assert_equal true, @s.put(h)
179
+ end
180
+
181
+ def test_purge_type
182
+
183
+ @s.purge_type!('errors')
184
+
185
+ assert_equal 0, @s.get_many('errors').size
186
+ end
187
+
188
+ def test_clear
189
+
190
+ @s.clear
191
+
192
+ assert_equal 0, @s.get_many('errors').size
193
+ end
194
+
195
+ #def test_purge
196
+ # @s.purge!
197
+ # assert_equal 0, @s.get_many('errors').size
198
+ #end
199
+
200
+ def test_ids
201
+
202
+ @s.put('_id' => 't_ids0', 'type' => 'errors', 'message' => 'testing')
203
+ @s.put('_id' => 't_ids1', 'type' => 'errors', 'message' => 'testing')
204
+ @s.put('_id' => 't_ids2', 'type' => 'errors', 'message' => 'testing')
205
+
206
+ assert_equal %w[ t_ids0 t_ids1 t_ids2 toto ], @s.ids('errors').sort
207
+ end
208
+
209
+ def test_get_many
210
+
211
+ 30.times do |i|
212
+ @s.put(
213
+ '_id' => "xx!#{i}",
214
+ 'type' => 'errors',
215
+ 'wfid' => i.to_s,
216
+ 'msg' => "whatever #{i}")
217
+ end
218
+
219
+ assert_equal 31, @s.get_many('errors').size
220
+ assert_equal 1, @s.get_many('errors', '7').size
221
+ assert_equal 1, @s.get_many('errors', /!7$/).size
222
+ assert_equal 30, @s.get_many('errors', /^xx!/).size
223
+ assert_equal 30, @s.get_many('errors', /x/).size
224
+ assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
225
+ end
226
+
227
+ def test_get_many_options
228
+
229
+ load_30_errors
230
+
231
+ # limit
232
+
233
+ assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
234
+
235
+ # count
236
+
237
+ assert_equal 31, @s.get_many('errors', nil, :count => true)
238
+
239
+ # skip and limit
240
+
241
+ assert_equal(
242
+ %w[ toto yy!00 yy!01 yy!02 ],
243
+ @s.get_many(
244
+ 'errors', nil, :skip => 0, :limit => 4
245
+ ).collect { |d| d['_id'] })
246
+ assert_equal(
247
+ %w[ yy!02 yy!03 yy!04 ],
248
+ @s.get_many(
249
+ 'errors', nil, :skip => 3, :limit => 3
250
+ ).collect { |d| d['_id'] })
251
+
252
+ # skip, limit and reverse
253
+
254
+ assert_equal(
255
+ %w[ yy!29 yy!28 yy!27 ],
256
+ @s.get_many(
257
+ 'errors', nil, :skip => 0, :limit => 3, :descending => true
258
+ ).collect { |d| d['_id'] })
259
+ assert_equal(
260
+ %w[ yy!29 yy!28 yy!27 ],
261
+ @s.get_many(
262
+ 'errors', nil, :skip => 0, :limit => 3, :descending => true
263
+ ).collect { |d| d['_id'] })
264
+ end
265
+
266
+ def test_dump
267
+
268
+ load_30_errors
269
+
270
+ assert @s.dump('errors').length > 0
271
+ end
272
+
273
+ def test_ids_and_errors
274
+
275
+ load_30_errors
276
+
277
+ assert_equal 31, @s.ids('errors').length
278
+ end
279
+
280
+ def test_ids_are_sorted
281
+
282
+ load_30_errors
283
+
284
+ assert_equal @s.ids('errors').sort, @s.ids('errors')
285
+ end
286
+
287
+ def test_reserve
288
+
289
+ taoe = Thread.abort_on_exception
290
+ Thread.abort_on_exception = true
291
+
292
+ reserved = []
293
+ threads = []
294
+
295
+ threads << Thread.new do
296
+ i = 0
297
+ loop do
298
+ @s.put_msg('launch', 'tree' => i)
299
+ i = i + 1
300
+ end
301
+ end
302
+
303
+ 2.times do
304
+
305
+ threads << Thread.new do
306
+ loop do
307
+ msgs = @s.get_msgs
308
+ msgs[0, 100].each do |msg|
309
+ next if msg['tree'].nil?
310
+ next unless @s.reserve(msg)
311
+ if reserved.include?(msg['tree'])
312
+ puts "=" * 80
313
+ p [ :dbl, :r, msg['_rev'], :t, msg['tree'] ]
314
+ end
315
+ reserved << msg['tree']
316
+ sleep(rand * 0.01)
317
+ end
318
+ end
319
+ end
320
+ end
321
+
322
+ sleep 7
323
+
324
+ threads.each { |t| t.terminate }
325
+
326
+ Thread.abort_on_exception = taoe
327
+
328
+ assert_equal false, reserved.empty?
329
+ assert_equal reserved.size, reserved.uniq.size
330
+ end
331
+
332
+ def test_by_field
333
+
334
+ return unless @s.respond_to?(:by_field)
335
+
336
+ load_workitems
337
+
338
+ assert_equal 3, @s.by_field('workitems', 'place', 'kyouto').size
339
+ assert_equal 1, @s.by_field('workitems', 'place', 'sendai').size
340
+
341
+ assert_equal(
342
+ Ruote::Workitem, @s.by_field('workitems', 'place', 'sendai').first.class)
343
+ end
344
+
345
+ def test_by_participant
346
+
347
+ return unless @s.respond_to?(:by_participant)
348
+
349
+ load_workitems
350
+
351
+ assert_equal 2, @s.by_participant('workitems', 'fujiwara', {}).size
352
+ assert_equal 1, @s.by_participant('workitems', 'shingen', {}).size
353
+
354
+ assert_equal(
355
+ Ruote::Workitem, @s.by_participant('workitems', 'shingen', {}).first.class)
356
+ end
357
+
358
+ def test_query_workitems
359
+
360
+ return unless @s.respond_to?(:query_workitems)
361
+
362
+ load_workitems
363
+
364
+ assert_equal 3, @s.query_workitems('place' => 'kyouto').size
365
+ assert_equal 1, @s.query_workitems('place' => 'kyouto', 'at' => 'kamo').size
366
+
367
+ assert_equal(
368
+ Ruote::Workitem, @s.query_workitems('place' => 'kyouto').first.class)
369
+ end
370
+
371
+ def test_override_configuration
372
+
373
+ determine_storage('house' => 'taira')
374
+ s = determine_storage('house' => 'minamoto')
375
+
376
+ assert_equal 'minamoto', s.get_configuration('engine')['house']
377
+ end
378
+
379
+ def test_preserve_configuration
380
+
381
+ return if @s.class == Ruote::HashStorage
382
+ # this test makes no sense with an in-memory hash
383
+
384
+ determine_storage(
385
+ 'house' => 'taira')
386
+ s = determine_storage(
387
+ 'house' => 'minamoto', 'preserve_configuration' => true)
388
+
389
+ assert_equal 'taira', s.get_configuration('engine')['house']
390
+ end
391
+
392
+ protected
393
+
394
+ def load_30_errors
395
+
396
+ 30.times do |i|
397
+ @s.put(
398
+ '_id' => sprintf("yy!%0.2d", i),
399
+ 'type' => 'errors',
400
+ 'msg' => "whatever #{i}")
401
+ end
402
+ end
403
+
404
+ def put_workitem(wfid, participant_name, fields)
405
+
406
+ @s.put(
407
+ 'type' => 'workitems',
408
+ '_id' => "wi!0_0!12ff!#{wfid}",
409
+ 'participant_name' => participant_name,
410
+ 'wfid' => wfid,
411
+ 'fields' => fields)
412
+ end
413
+
414
+ def load_workitems
415
+
416
+ put_workitem(
417
+ '20110218-nadanada', 'fujiwara', 'place' => 'kyouto')
418
+ put_workitem(
419
+ '20110218-nedenada', 'fujiwara', 'place' => 'kyouto', 'at' => 'kamo')
420
+ put_workitem(
421
+ '20110218-nadanodo', 'taira', 'place' => 'kyouto')
422
+ put_workitem(
423
+ '20110218-nodonada', 'date', 'place' => 'sendai')
424
+ put_workitem(
425
+ '20110218-nadanudu', 'shingen', 'place' => 'nagoya')
426
+ end
427
+ end
428
+
@@ -0,0 +1,37 @@
1
+
2
+ dashdash = `ruby -v`.match(/^ruby 1\.9\./) ? '' : '--'
3
+
4
+ puts("\n\n== in memory")
5
+ puts
6
+ puts `ruby test/unit/storage.rb`
7
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
8
+
9
+ puts("\n\n== fs")
10
+ puts
11
+ puts `ruby test/unit/storage.rb #{dashdash} --fs`
12
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
13
+
14
+ puts("\n\n== route-couch")
15
+ puts
16
+ #puts `ruby -r patron -r yajl test/unit/storage.rb #{dashdash} --couch`
17
+ puts `ruby test/unit/storage.rb #{dashdash} --couch`
18
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
19
+
20
+ puts("\n\n== route-dm")
21
+ puts
22
+ #puts `ruby -r yajl test/unit/storage.rb #{dashdash} --dm`
23
+ puts `ruby test/unit/storage.rb #{dashdash} --dm`
24
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
25
+
26
+ puts("\n\n== route-redis")
27
+ puts
28
+ #puts `ruby -r yajl test/unit/storage.rb #{dashdash} --redis`
29
+ puts `ruby test/unit/storage.rb #{dashdash} --redis`
30
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
31
+
32
+ puts("\n\n== route-beanstalk")
33
+ puts
34
+ #puts `ruby -r yajl test/unit/storage.rb #{dashdash} --beanstalk`
35
+ puts `ruby test/unit/storage.rb #{dashdash} --beanstalk`
36
+ puts("\nFAILED") if $?.exitstatus.to_i != 0
37
+