dynflow 1.3.0 → 1.4.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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +3 -4
  4. data/Dockerfile +9 -0
  5. data/Gemfile +6 -0
  6. data/Rakefile +1 -0
  7. data/doc/pages/Gemfile +1 -0
  8. data/doc/pages/Rakefile +1 -0
  9. data/doc/pages/plugins/alert_block.rb +1 -0
  10. data/doc/pages/plugins/div_tag.rb +1 -0
  11. data/doc/pages/plugins/graphviz.rb +1 -0
  12. data/doc/pages/plugins/plantuml.rb +1 -0
  13. data/doc/pages/plugins/play.rb +1 -0
  14. data/doc/pages/plugins/tags.rb +1 -0
  15. data/doc/pages/plugins/toc.rb +1 -0
  16. data/docker-compose.yml +41 -0
  17. data/dynflow.gemspec +1 -0
  18. data/examples/clock_benchmark.rb +1 -0
  19. data/examples/example_helper.rb +19 -2
  20. data/examples/future_execution.rb +2 -1
  21. data/examples/memory_limit_watcher.rb +1 -0
  22. data/examples/orchestrate.rb +4 -5
  23. data/examples/orchestrate_evented.rb +3 -2
  24. data/examples/remote_executor.rb +68 -0
  25. data/examples/singletons.rb +4 -3
  26. data/examples/sub_plan_concurrency_control.rb +2 -1
  27. data/examples/sub_plans.rb +3 -2
  28. data/examples/termination.rb +1 -0
  29. data/lib/dynflow.rb +20 -0
  30. data/lib/dynflow/action.rb +28 -3
  31. data/lib/dynflow/action/cancellable.rb +1 -0
  32. data/lib/dynflow/action/format.rb +1 -0
  33. data/lib/dynflow/action/missing.rb +1 -0
  34. data/lib/dynflow/action/polling.rb +3 -1
  35. data/lib/dynflow/action/progress.rb +1 -0
  36. data/lib/dynflow/action/rescue.rb +1 -0
  37. data/lib/dynflow/action/singleton.rb +1 -0
  38. data/lib/dynflow/action/suspended.rb +9 -2
  39. data/lib/dynflow/action/timeouts.rb +2 -1
  40. data/lib/dynflow/action/with_bulk_sub_plans.rb +2 -1
  41. data/lib/dynflow/action/with_polling_sub_plans.rb +7 -5
  42. data/lib/dynflow/action/with_sub_plans.rb +1 -0
  43. data/lib/dynflow/active_job/queue_adapter.rb +1 -0
  44. data/lib/dynflow/actor.rb +13 -5
  45. data/lib/dynflow/actors.rb +1 -0
  46. data/lib/dynflow/actors/execution_plan_cleaner.rb +1 -0
  47. data/lib/dynflow/clock.rb +27 -47
  48. data/lib/dynflow/config.rb +11 -2
  49. data/lib/dynflow/connectors.rb +1 -0
  50. data/lib/dynflow/connectors/abstract.rb +1 -0
  51. data/lib/dynflow/connectors/database.rb +1 -0
  52. data/lib/dynflow/connectors/direct.rb +1 -0
  53. data/lib/dynflow/coordinator.rb +1 -0
  54. data/lib/dynflow/coordinator_adapters.rb +1 -0
  55. data/lib/dynflow/coordinator_adapters/abstract.rb +1 -0
  56. data/lib/dynflow/coordinator_adapters/sequel.rb +1 -0
  57. data/lib/dynflow/dead_letter_silencer.rb +2 -0
  58. data/lib/dynflow/debug/telemetry/persistence.rb +1 -0
  59. data/lib/dynflow/delayed_executors.rb +1 -0
  60. data/lib/dynflow/delayed_executors/abstract.rb +1 -0
  61. data/lib/dynflow/delayed_executors/abstract_core.rb +1 -0
  62. data/lib/dynflow/delayed_executors/polling.rb +1 -0
  63. data/lib/dynflow/delayed_plan.rb +1 -0
  64. data/lib/dynflow/director.rb +80 -15
  65. data/lib/dynflow/director/execution_plan_manager.rb +17 -3
  66. data/lib/dynflow/director/flow_manager.rb +1 -0
  67. data/lib/dynflow/director/{work_queue.rb → queue_hash.rb} +9 -8
  68. data/lib/dynflow/director/running_steps_manager.rb +55 -18
  69. data/lib/dynflow/director/sequence_cursor.rb +1 -0
  70. data/lib/dynflow/director/sequential_manager.rb +12 -2
  71. data/lib/dynflow/dispatcher.rb +4 -2
  72. data/lib/dynflow/dispatcher/abstract.rb +1 -0
  73. data/lib/dynflow/dispatcher/client_dispatcher.rb +6 -4
  74. data/lib/dynflow/dispatcher/executor_dispatcher.rb +13 -1
  75. data/lib/dynflow/errors.rb +1 -0
  76. data/lib/dynflow/execution_history.rb +1 -0
  77. data/lib/dynflow/execution_plan.rb +3 -2
  78. data/lib/dynflow/execution_plan/dependency_graph.rb +1 -0
  79. data/lib/dynflow/execution_plan/hooks.rb +1 -0
  80. data/lib/dynflow/execution_plan/output_reference.rb +2 -1
  81. data/lib/dynflow/execution_plan/steps.rb +1 -0
  82. data/lib/dynflow/execution_plan/steps/abstract.rb +10 -5
  83. data/lib/dynflow/execution_plan/steps/abstract_flow_step.rb +2 -0
  84. data/lib/dynflow/execution_plan/steps/error.rb +1 -0
  85. data/lib/dynflow/execution_plan/steps/finalize_step.rb +1 -0
  86. data/lib/dynflow/execution_plan/steps/plan_step.rb +1 -0
  87. data/lib/dynflow/execution_plan/steps/run_step.rb +1 -0
  88. data/lib/dynflow/executors.rb +1 -1
  89. data/lib/dynflow/executors/abstract/core.rb +132 -0
  90. data/lib/dynflow/executors/parallel.rb +24 -11
  91. data/lib/dynflow/executors/parallel/core.rb +10 -91
  92. data/lib/dynflow/executors/parallel/pool.rb +4 -2
  93. data/lib/dynflow/executors/parallel/worker.rb +2 -1
  94. data/lib/dynflow/executors/sidekiq/core.rb +121 -0
  95. data/lib/dynflow/executors/sidekiq/internal_job_base.rb +24 -0
  96. data/lib/dynflow/executors/sidekiq/orchestrator_jobs.rb +60 -0
  97. data/lib/dynflow/executors/sidekiq/redis_locking.rb +69 -0
  98. data/lib/dynflow/executors/sidekiq/serialization.rb +33 -0
  99. data/lib/dynflow/executors/sidekiq/worker_jobs.rb +42 -0
  100. data/lib/dynflow/flows.rb +1 -0
  101. data/lib/dynflow/flows/abstract.rb +1 -0
  102. data/lib/dynflow/flows/abstract_composed.rb +1 -0
  103. data/lib/dynflow/flows/atom.rb +1 -0
  104. data/lib/dynflow/flows/concurrence.rb +1 -0
  105. data/lib/dynflow/flows/sequence.rb +1 -0
  106. data/lib/dynflow/logger_adapters.rb +1 -0
  107. data/lib/dynflow/logger_adapters/abstract.rb +1 -0
  108. data/lib/dynflow/logger_adapters/delegator.rb +1 -0
  109. data/lib/dynflow/logger_adapters/formatters.rb +1 -0
  110. data/lib/dynflow/logger_adapters/formatters/abstract.rb +1 -0
  111. data/lib/dynflow/logger_adapters/formatters/exception.rb +1 -0
  112. data/lib/dynflow/logger_adapters/simple.rb +1 -0
  113. data/lib/dynflow/middleware.rb +1 -0
  114. data/lib/dynflow/middleware/common/singleton.rb +1 -0
  115. data/lib/dynflow/middleware/common/transaction.rb +1 -0
  116. data/lib/dynflow/middleware/register.rb +1 -0
  117. data/lib/dynflow/middleware/resolver.rb +1 -0
  118. data/lib/dynflow/middleware/stack.rb +1 -0
  119. data/lib/dynflow/middleware/world.rb +1 -0
  120. data/lib/dynflow/persistence.rb +3 -2
  121. data/lib/dynflow/persistence_adapters.rb +1 -0
  122. data/lib/dynflow/persistence_adapters/abstract.rb +1 -0
  123. data/lib/dynflow/persistence_adapters/sequel.rb +10 -7
  124. data/lib/dynflow/persistence_adapters/sequel_migrations/001_initial.rb +1 -0
  125. data/lib/dynflow/persistence_adapters/sequel_migrations/002_incremental_progress.rb +1 -0
  126. data/lib/dynflow/persistence_adapters/sequel_migrations/003_parent_action.rb +1 -0
  127. data/lib/dynflow/persistence_adapters/sequel_migrations/004_coordinator_records.rb +1 -0
  128. data/lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb +1 -0
  129. data/lib/dynflow/persistence_adapters/sequel_migrations/006_fix_data_length.rb +1 -0
  130. data/lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb +1 -0
  131. data/lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb +1 -0
  132. data/lib/dynflow/persistence_adapters/sequel_migrations/009_fix_mysql_data_length.rb +1 -0
  133. data/lib/dynflow/persistence_adapters/sequel_migrations/010_add_execution_plans_label.rb +1 -0
  134. data/lib/dynflow/persistence_adapters/sequel_migrations/011_placeholder.rb +1 -0
  135. data/lib/dynflow/persistence_adapters/sequel_migrations/012_add_delayed_plans_serialized_args.rb +1 -0
  136. data/lib/dynflow/persistence_adapters/sequel_migrations/013_add_action_columns.rb +1 -0
  137. data/lib/dynflow/persistence_adapters/sequel_migrations/014_add_step_columns.rb +1 -0
  138. data/lib/dynflow/persistence_adapters/sequel_migrations/015_add_execution_plan_columns.rb +1 -0
  139. data/lib/dynflow/persistence_adapters/sequel_migrations/016_add_step_queue.rb +1 -0
  140. data/lib/dynflow/persistence_adapters/sequel_migrations/017_add_delayed_plan_frozen.rb +1 -0
  141. data/lib/dynflow/persistence_adapters/sequel_migrations/018_add_uuid_column.rb +1 -0
  142. data/lib/dynflow/persistence_adapters/sequel_migrations/019_update_mysql_time_precision.rb +48 -0
  143. data/lib/dynflow/rails.rb +1 -0
  144. data/lib/dynflow/rails/configuration.rb +6 -3
  145. data/lib/dynflow/rails/daemon.rb +1 -0
  146. data/lib/dynflow/round_robin.rb +1 -0
  147. data/lib/dynflow/semaphores.rb +1 -0
  148. data/lib/dynflow/semaphores/abstract.rb +1 -0
  149. data/lib/dynflow/semaphores/aggregating.rb +1 -0
  150. data/lib/dynflow/semaphores/dummy.rb +1 -0
  151. data/lib/dynflow/semaphores/stateful.rb +1 -0
  152. data/lib/dynflow/serializable.rb +13 -4
  153. data/lib/dynflow/serializer.rb +24 -0
  154. data/lib/dynflow/serializers.rb +1 -0
  155. data/lib/dynflow/serializers/abstract.rb +1 -0
  156. data/lib/dynflow/serializers/noop.rb +1 -0
  157. data/lib/dynflow/stateful.rb +1 -0
  158. data/lib/dynflow/telemetry.rb +1 -0
  159. data/lib/dynflow/telemetry_adapters/abstract.rb +1 -0
  160. data/lib/dynflow/telemetry_adapters/dummy.rb +1 -0
  161. data/lib/dynflow/telemetry_adapters/statsd.rb +1 -0
  162. data/lib/dynflow/testing.rb +1 -0
  163. data/lib/dynflow/testing/assertions.rb +6 -5
  164. data/lib/dynflow/testing/dummy_execution_plan.rb +1 -0
  165. data/lib/dynflow/testing/dummy_executor.rb +19 -2
  166. data/lib/dynflow/testing/dummy_planned_action.rb +1 -0
  167. data/lib/dynflow/testing/dummy_step.rb +3 -1
  168. data/lib/dynflow/testing/dummy_world.rb +9 -0
  169. data/lib/dynflow/testing/factories.rb +6 -1
  170. data/lib/dynflow/testing/in_thread_executor.rb +22 -3
  171. data/lib/dynflow/testing/in_thread_world.rb +9 -0
  172. data/lib/dynflow/testing/managed_clock.rb +1 -0
  173. data/lib/dynflow/testing/mimic.rb +1 -0
  174. data/lib/dynflow/throttle_limiter.rb +1 -0
  175. data/lib/dynflow/transaction_adapters.rb +1 -0
  176. data/lib/dynflow/transaction_adapters/abstract.rb +1 -0
  177. data/lib/dynflow/transaction_adapters/active_record.rb +1 -0
  178. data/lib/dynflow/transaction_adapters/none.rb +1 -0
  179. data/lib/dynflow/utils.rb +1 -0
  180. data/lib/dynflow/utils/indifferent_hash.rb +1 -0
  181. data/lib/dynflow/utils/priority_queue.rb +1 -0
  182. data/lib/dynflow/version.rb +2 -1
  183. data/lib/dynflow/watchers/memory_consumption_watcher.rb +1 -0
  184. data/lib/dynflow/web.rb +1 -0
  185. data/lib/dynflow/web/console.rb +1 -0
  186. data/lib/dynflow/web/console_helpers.rb +1 -0
  187. data/lib/dynflow/web/filtering_helpers.rb +1 -0
  188. data/lib/dynflow/web/world_helpers.rb +1 -0
  189. data/lib/dynflow/web_console.rb +1 -0
  190. data/lib/dynflow/world.rb +11 -1
  191. data/lib/dynflow/world/invalidation.rb +7 -1
  192. data/test/abnormal_states_recovery_test.rb +41 -40
  193. data/test/action_test.rb +160 -110
  194. data/test/activejob_adapter_test.rb +1 -0
  195. data/test/batch_sub_tasks_test.rb +12 -11
  196. data/test/clock_test.rb +2 -1
  197. data/test/concurrency_control_test.rb +20 -19
  198. data/test/coordinator_test.rb +20 -21
  199. data/test/daemon_test.rb +2 -1
  200. data/test/dead_letter_silencer_test.rb +9 -7
  201. data/test/dispatcher_test.rb +2 -1
  202. data/test/execution_plan_cleaner_test.rb +13 -12
  203. data/test/execution_plan_hooks_test.rb +3 -2
  204. data/test/execution_plan_test.rb +33 -32
  205. data/test/executor_test.rb +533 -489
  206. data/test/future_execution_test.rb +45 -44
  207. data/test/memory_cosumption_watcher_test.rb +5 -4
  208. data/test/middleware_test.rb +55 -54
  209. data/test/persistence_test.rb +56 -53
  210. data/test/rescue_test.rb +36 -35
  211. data/test/round_robin_test.rb +13 -12
  212. data/test/semaphores_test.rb +31 -30
  213. data/test/support/code_workflow_example.rb +1 -0
  214. data/test/support/dummy_example.rb +14 -1
  215. data/test/support/middleware_example.rb +2 -1
  216. data/test/support/rails/config/environment.rb +1 -0
  217. data/test/support/rescue_example.rb +1 -0
  218. data/test/support/test_execution_log.rb +1 -0
  219. data/test/test_helper.rb +18 -17
  220. data/test/testing_test.rb +45 -44
  221. data/test/utils_test.rb +18 -17
  222. data/test/web_console_test.rb +1 -0
  223. data/test/world_test.rb +7 -6
  224. metadata +13 -4
  225. data/lib/dynflow/executors/abstract.rb +0 -40
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
  require 'active_job'
3
4
  require 'dynflow/active_job/queue_adapter'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -72,7 +73,7 @@ module Dynflow
72
73
  plan = world.persistence.load_execution_plan(plan.id)
73
74
  action = plan.entry_action
74
75
 
75
- action.output[:batch_count].must_equal action.total_count / action.batch_size
76
+ _(action.output[:batch_count]).must_equal action.total_count / action.batch_size
76
77
  end
77
78
 
78
79
  it 'can resume tasks' do
@@ -82,17 +83,17 @@ module Dynflow
82
83
  wait_for { future.resolved? }
83
84
  plan = world.persistence.load_execution_plan(plan.id)
84
85
  action = plan.entry_action
85
- action.output[:batch_count].must_equal 1
86
- future.value.state.must_equal :paused
86
+ _(action.output[:batch_count]).must_equal 1
87
+ _(future.value.state).must_equal :paused
87
88
 
88
89
  FailureSimulator.wont_fail!
89
90
  future = world.execute plan.id
90
91
  wait_for { future.resolved? }
91
92
  action = future.value.entry_action
92
- future.value.state.must_equal :stopped
93
- action.output[:batch_count].must_equal (action.total_count / action.batch_size) + 1
94
- action.output[:total_count].must_equal action.total_count
95
- action.output[:success_count].must_equal action.total_count
93
+ _(future.value.state).must_equal :stopped
94
+ _(action.output[:batch_count]).must_equal (action.total_count / action.batch_size) + 1
95
+ _(action.output[:total_count]).must_equal action.total_count
96
+ _(action.output[:success_count]).must_equal action.total_count
96
97
  end
97
98
 
98
99
  it 'is controlled only by total_count and output[:planned_count]' do
@@ -101,12 +102,12 @@ module Dynflow
101
102
  wait_for { future.resolved? }
102
103
  plan = world.persistence.load_execution_plan(plan.id)
103
104
  action = plan.entry_action
104
- action.send(:can_spawn_next_batch?).must_equal false
105
- action.current_batch.must_be :empty?
105
+ _(action.send(:can_spawn_next_batch?)).must_equal false
106
+ _(action.current_batch).must_be :empty?
106
107
  action.output[:pending_count] = 0
107
108
  action.output[:success_count] = 5
108
- action.send(:can_spawn_next_batch?).must_equal false
109
- action.current_batch.must_be :empty?
109
+ _(action.send(:can_spawn_next_batch?)).must_equal false
110
+ _(action.current_batch).must_be :empty?
110
111
  end
111
112
 
112
113
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
  require 'logger'
3
4
 
@@ -8,7 +9,7 @@ describe clock_class do
8
9
  let(:clock) { clock_class.spawn 'clock' }
9
10
 
10
11
  it 'refuses who without #<< method' do
11
- -> { clock.ping Object.new, 0.1, :pong }.must_raise TypeError
12
+ _(-> { clock.ping Object.new, 0.1, :pong }).must_raise TypeError
12
13
  clock.ping [], 0.1, :pong
13
14
  end
14
15
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -80,9 +81,9 @@ module Dynflow
80
81
  end
81
82
 
82
83
  def check_step(plan, total, finished)
83
- world.throttle_limiter.observe(plan.id).length.must_equal (total - finished)
84
- plan.sub_plans.select { |sub| planned? sub }.count.must_equal (total - finished)
85
- plan.sub_plans.select { |sub| successful? sub }.count.must_equal finished
84
+ _(world.throttle_limiter.observe(plan.id).length).must_equal (total - finished)
85
+ _(plan.sub_plans.select { |sub| planned? sub }.count).must_equal (total - finished)
86
+ _(plan.sub_plans.select { |sub| successful? sub }.count).must_equal finished
86
87
  end
87
88
 
88
89
  def planned?(plan)
@@ -126,7 +127,7 @@ module Dynflow
126
127
  future = world.execute plan.id
127
128
  wait_for { future.resolved? }
128
129
  plan.sub_plans.all? { |sub| successful? sub }
129
- world.throttle_limiter.core.ask!(:running).must_equal [0]
130
+ _(world.throttle_limiter.core.ask!(:running)).must_equal [0]
130
131
  end
131
132
 
132
133
  it 'limits by concurrency level' do
@@ -135,7 +136,7 @@ module Dynflow
135
136
  plan = world.plan(ParentAction, total, level)
136
137
  future = world.execute plan.id
137
138
  wait_for { future.resolved? }
138
- world.throttle_limiter.core.ask!(:running).max.must_be :<=, level
139
+ _(world.throttle_limiter.core.ask!(:running).max).must_be :<=, level
139
140
  end
140
141
 
141
142
  it 'allows to cancel' do
@@ -147,8 +148,8 @@ module Dynflow
147
148
  world.event(plan.id, plan.steps.values.last.id, ::Dynflow::Action::Cancellable::Cancel)
148
149
  wait_for { triggered.resolved? }
149
150
  plan = world.persistence.load_execution_plan(plan.id)
150
- plan.entry_action.output[:failed_count].must_equal total
151
- world.throttle_limiter.core.ask!(:running).max.must_be :<=, 0
151
+ _(plan.entry_action.output[:failed_count]).must_equal total
152
+ _(world.throttle_limiter.core.ask!(:running).max).must_be :<=, 0
152
153
  end
153
154
  end
154
155
 
@@ -165,21 +166,21 @@ module Dynflow
165
166
  wait_for { plan.sub_plans_count == total }
166
167
  wait_for { klok.progress; plan.sub_plans.all? { |sub| successful? sub } }
167
168
  # 10 tasks over 10 seconds, one task at a time, 1 task every second
168
- get_interval.call(plan).must_equal 1.0
169
+ _(get_interval.call(plan)).must_equal 1.0
169
170
 
170
171
  plan = world.plan(ParentAction, total, 4, 10)
171
172
  world.execute(plan.id)
172
173
  wait_for { plan.sub_plans_count == total }
173
174
  wait_for { klok.progress; plan.sub_plans.all? { |sub| successful? sub } }
174
175
  # 10 tasks over 10 seconds, four tasks at a time, 1 task every 0.25 second
175
- get_interval.call(plan).must_equal 0.25
176
+ _(get_interval.call(plan)).must_equal 0.25
176
177
 
177
178
  plan = world.plan(ParentAction, total, nil, 10)
178
179
  world.execute(plan.id)
179
180
  wait_for { plan.sub_plans_count == total }
180
181
  wait_for { klok.progress; plan.sub_plans.all? { |sub| successful? sub } }
181
182
  # 1o tasks over 10 seconds, one task at a time (default), 1 task every second
182
- get_interval.call(plan).must_equal 1.0
183
+ _(get_interval.call(plan)).must_equal 1.0
183
184
  end
184
185
  end
185
186
 
@@ -204,9 +205,9 @@ module Dynflow
204
205
  check_step(plan, total, finished)
205
206
  end
206
207
  end_time = klok.current_time
207
- (end_time - start_time).must_equal 4
208
- world.throttle_limiter.observe(plan.id).must_equal []
209
- world.throttle_limiter.core.ask!(:running).max.must_be :<=, level
208
+ _((end_time - start_time)).must_equal 4
209
+ _(world.throttle_limiter.observe(plan.id)).must_equal []
210
+ _(world.throttle_limiter.core.ask!(:running).max).must_be :<=, level
210
211
  end
211
212
  end
212
213
 
@@ -218,7 +219,7 @@ module Dynflow
218
219
  plan = world.plan(ParentAction, total, level, time_span)
219
220
  future = world.execute(plan.id)
220
221
  wait_for { future.resolved? }
221
- plan.sub_plans.all? { |sub| sub.result == :error }.must_equal true
222
+ _(plan.sub_plans.all? { |sub| sub.result == :error }).must_equal true
222
223
  end
223
224
 
224
225
  it 'cancels tasks which could not be started within the time window' do
@@ -230,14 +231,14 @@ module Dynflow
230
231
  future = world.execute(plan.id)
231
232
  wait_for { plan.sub_plans_count == total && plan.sub_plans.all? { |sub| sub.result == :pending } }
232
233
  planned, running = plan.sub_plans.partition { |sub| planned? sub }
233
- planned.count.must_equal total - level
234
- running.count.must_equal level
235
- world.throttle_limiter.observe(plan.id).length.must_equal (total - 1)
234
+ _(planned.count).must_equal total - level
235
+ _(running.count).must_equal level
236
+ _(world.throttle_limiter.observe(plan.id).length).must_equal (total - 1)
236
237
  4.times { klok.progress }
237
238
  wait_for { future.resolved? }
238
239
  finished, stopped = plan.sub_plans.partition { |sub| successful? sub }
239
- finished.count.must_equal level
240
- stopped.count.must_equal (total - level)
240
+ _(finished.count).must_equal level
241
+ _(stopped.count).must_equal (total - level)
241
242
  end
242
243
  end
243
244
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
  require 'fileutils'
3
4
 
@@ -11,13 +12,13 @@ module Dynflow
11
12
  it 'unlocks the lock, when the block is passed' do
12
13
  world.coordinator.acquire(Coordinator::AutoExecuteLock.new(world)) {}
13
14
  expected_locks = ["lock auto-execute", "unlock auto-execute"]
14
- world.coordinator.adapter.lock_log.must_equal(expected_locks)
15
+ _(world.coordinator.adapter.lock_log).must_equal(expected_locks)
15
16
  end
16
17
 
17
18
  it "doesn't unlock, when the block is not passed" do
18
19
  world.coordinator.acquire(Coordinator::AutoExecuteLock.new(world))
19
20
  expected_locks = ["lock auto-execute"]
20
- world.coordinator.adapter.lock_log.must_equal(expected_locks)
21
+ _(world.coordinator.adapter.lock_log).must_equal(expected_locks)
21
22
  end
22
23
 
23
24
  it 'supports unlocking by owner' do
@@ -35,23 +36,23 @@ module Dynflow
35
36
  it 'supports checking about locks' do
36
37
  world.coordinator.acquire(Coordinator::AutoExecuteLock.new(world))
37
38
  locks = world.coordinator.find_locks(Coordinator::AutoExecuteLock.unique_filter)
38
- locks.map(&:world_id).must_equal([world.id])
39
+ _(locks.map(&:world_id)).must_equal([world.id])
39
40
  end
40
41
 
41
42
  it 'deserializes the data from the adapter when searching for locks' do
42
43
  lock = Coordinator::AutoExecuteLock.new(world)
43
44
  world.coordinator.acquire(lock)
44
45
  found_locks = world.coordinator.find_locks(owner_id: lock.owner_id)
45
- found_locks.size.must_equal 1
46
- found_locks.first.data.must_equal lock.data
46
+ _(found_locks.size).must_equal 1
47
+ _(found_locks.first.data).must_equal lock.data
47
48
 
48
49
  found_locks = world.coordinator.find_locks(class: lock.class.name, id: lock.id)
49
- found_locks.size.must_equal 1
50
- found_locks.first.data.must_equal lock.data
50
+ _(found_locks.size).must_equal 1
51
+ _(found_locks.first.data).must_equal lock.data
51
52
 
52
53
  another_lock = Coordinator::AutoExecuteLock.new(another_world)
53
54
  found_locks = world.coordinator.find_locks(owner_id: another_lock.owner_id)
54
- found_locks.size.must_equal 0
55
+ _(found_locks.size).must_equal 0
55
56
  end
56
57
  end
57
58
 
@@ -76,15 +77,15 @@ module Dynflow
76
77
  dummy_record = DummyRecord.new('dummy', 'Foo')
77
78
  world.coordinator.create_record(dummy_record)
78
79
  saved_dummy_record = world.coordinator.find_records(class: dummy_record.class.name).first
79
- saved_dummy_record.must_equal dummy_record
80
+ _(saved_dummy_record).must_equal dummy_record
80
81
 
81
82
  dummy_record.value = 'Bar'
82
83
  world.coordinator.update_record(dummy_record)
83
84
  saved_dummy_record = world.coordinator.find_records(class: dummy_record.class.name).first
84
- saved_dummy_record.data.must_equal dummy_record.data
85
+ _(saved_dummy_record.data).must_equal dummy_record.data
85
86
 
86
87
  world.coordinator.delete_record(dummy_record)
87
- world.coordinator.find_records(class: dummy_record.class.name).must_equal []
88
+ _(world.coordinator.find_records(class: dummy_record.class.name)).must_equal []
88
89
  end
89
90
  end
90
91
 
@@ -94,14 +95,12 @@ module Dynflow
94
95
  another_world.coordinator.acquire Coordinator::WorldInvalidationLock.new(another_world, another_world)
95
96
  world.terminate.wait
96
97
  expected_locks = ["lock auto-execute", "unlock auto-execute"]
97
- world.coordinator.adapter.lock_log.must_equal(expected_locks)
98
+ _(world.coordinator.adapter.lock_log).must_equal(expected_locks)
98
99
  end
99
100
 
100
101
  it 'prevents new locks to be acquired by the world being terminated' do
101
102
  world.terminate
102
- -> do
103
- world.coordinator.acquire(Coordinator::AutoExecuteLock.new(world))
104
- end.must_raise(Errors::InactiveWorldError)
103
+ _(-> { world.coordinator.acquire(Coordinator::AutoExecuteLock.new(world)) }).must_raise(Errors::InactiveWorldError)
105
104
  end
106
105
  end
107
106
 
@@ -114,7 +113,7 @@ module Dynflow
114
113
  adapter.create_record(record)
115
114
  tester.pause
116
115
  end
117
- -> { another_adapter.create_record(record) }.must_raise(Coordinator::DuplicateRecordError)
116
+ _(-> { another_adapter.create_record(record) }).must_raise(Coordinator::DuplicateRecordError)
118
117
  tester.finish
119
118
  end
120
119
 
@@ -134,16 +133,16 @@ module Dynflow
134
133
  lock = Coordinator::AutoExecuteLock.new(world)
135
134
  adapter.create_record(lock)
136
135
  found_records = adapter.find_records(owner_id: lock.owner_id)
137
- found_records.size.must_equal 1
138
- found_records.first.must_equal lock.data
136
+ _(found_records.size).must_equal 1
137
+ _(found_records.first).must_equal lock.data
139
138
 
140
139
  found_records = adapter.find_records(class: lock.class.name, id: lock.id)
141
- found_records.size.must_equal 1
142
- found_records.first.must_equal lock.data
140
+ _(found_records.size).must_equal 1
141
+ _(found_records.first).must_equal lock.data
143
142
 
144
143
  another_lock = Coordinator::AutoExecuteLock.new(another_world)
145
144
  found_records = adapter.find_records(owner_id: another_lock.owner_id)
146
- found_records.size.must_equal 0
145
+ _(found_records.size).must_equal 0
147
146
  end
148
147
  end
149
148
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require 'active_support'
3
- require 'mocha/mini_test'
4
+ require 'mocha/minitest'
4
5
  require 'logging'
5
6
  require 'dynflow/testing'
6
7
  require_relative '../lib/dynflow/rails'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
  require 'ostruct'
3
4
 
@@ -10,7 +11,7 @@ module Dynflow
10
11
  let(:world) { WorldFactory.create_world }
11
12
 
12
13
  it 'is started for each world' do
13
- world.dead_letter_handler.actor_class
14
+ _(world.dead_letter_handler.actor_class)
14
15
  .must_equal ::Dynflow::DeadLetterSilencer
15
16
  end
16
17
 
@@ -26,19 +27,20 @@ module Dynflow
26
27
  end
27
28
 
28
29
  it 'matches any' do
29
- DeadLetterSilencer::Matcher.new(any, any, any).match?(letter).must_equal true
30
+ _(DeadLetterSilencer::Matcher.new(any, any, any).match?(letter)).must_equal true
30
31
  end
31
32
 
32
33
  it 'matches comparing for equality' do
33
- DeadLetterSilencer::Matcher.new(sender, msg, receiver)
34
- .match?(letter).must_equal true
35
- DeadLetterSilencer::Matcher.new(any, :bad, any).match?(letter).must_equal false
34
+ matcher = DeadLetterSilencer::Matcher.new(sender, msg, receiver)
35
+ _(matcher.match?(letter)).must_equal true
36
+ matcher = DeadLetterSilencer::Matcher.new(any, :bad, any)
37
+ _(matcher.match?(letter)).must_equal false
36
38
  end
37
39
 
38
40
  it 'matches by calling the proc' do
39
41
  condition = proc { |actor_class| actor_class.is_a? Class }
40
- DeadLetterSilencer::Matcher.new(condition, any, condition)
41
- .match?(letter).must_equal true
42
+ matcher = DeadLetterSilencer::Matcher.new(condition, any, condition)
43
+ _(matcher.match?(letter)).must_equal true
42
44
  end
43
45
  end
44
46
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -24,7 +25,7 @@ module Dynflow
24
25
 
25
26
  describe 'event passing' do
26
27
  it 'succeeds when expected' do
27
- result = client_world.trigger(Support::DummyExample::EventedAction, :timeout => 3)
28
+ result = client_world.trigger(Support::DummyExample::DeprecatedEventedAction, :timeout => 3)
28
29
  step = wait_for do
29
30
  client_world.persistence.load_execution_plan(result.id).
30
31
  steps_in_state(:suspended).first
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
- require 'mocha/mini_test'
3
+ require 'mocha/minitest'
3
4
 
4
5
  module Dynflow
5
6
  module ExecutionPlanCleanerTest
@@ -28,16 +29,16 @@ module Dynflow
28
29
  let(:clock) { Testing::ManagedClock.new }
29
30
 
30
31
  it 'is disabled by default' do
31
- default_world.execution_plan_cleaner.must_be_nil
32
- world.execution_plan_cleaner
33
- .must_be_instance_of ::Dynflow::Actors::ExecutionPlanCleaner
32
+ assert_nil default_world.execution_plan_cleaner
33
+ _(world.execution_plan_cleaner)
34
+ .must_be_instance_of ::Dynflow::Actors::ExecutionPlanCleaner
34
35
  end
35
36
 
36
37
  it 'periodically looks for old execution plans' do
37
38
  world.stub(:clock, clock) do
38
- clock.pending_pings.count.must_equal 0
39
+ _(clock.pending_pings.count).must_equal 0
39
40
  world.execution_plan_cleaner.core.ask!(:start)
40
- clock.pending_pings.count.must_equal 1
41
+ _(clock.pending_pings.count).must_equal 1
41
42
  world.persistence.expects(:find_old_execution_plans).returns([])
42
43
  world.persistence.expects(:delete_execution_plans).with(:uuid => [])
43
44
  clock.progress
@@ -48,7 +49,7 @@ module Dynflow
48
49
  it 'cleans up old plans' do
49
50
  world.stub(:clock, clock) do
50
51
  world.execution_plan_cleaner.core.ask!(:start)
51
- clock.pending_pings.count.must_equal 1
52
+ _(clock.pending_pings.count).must_equal 1
52
53
  plans = (1..10).map { world.trigger SimpleAction }
53
54
  .each { |plan| plan.finished.wait }
54
55
  world.persistence.find_execution_plans(:uuid => plans.map(&:id))
@@ -57,8 +58,8 @@ module Dynflow
57
58
  plan.save
58
59
  end
59
60
  world.execution_plan_cleaner.core.ask!(:clean!)
60
- world.persistence.find_execution_plans(:uuid => plans.map(&:id))
61
- .count.must_equal 0
61
+ plans = world.persistence.find_execution_plans(:uuid => plans.map(&:id))
62
+ _(plans.count).must_equal 0
62
63
  end
63
64
  end
64
65
 
@@ -66,12 +67,12 @@ module Dynflow
66
67
  world.stub(:clock, clock) do
67
68
  count = 10
68
69
  world.execution_plan_cleaner.core.ask!(:start)
69
- clock.pending_pings.count.must_equal 1
70
+ _(clock.pending_pings.count).must_equal 1
70
71
  plans = (1..10).map { world.trigger SimpleAction }
71
72
  .each { |plan| plan.finished.wait }
72
73
  world.execution_plan_cleaner.core.ask!(:clean!)
73
- world.persistence.find_execution_plans(:uuid => plans.map(&:id))
74
- .count.must_equal count
74
+ plans = world.persistence.find_execution_plans(:uuid => plans.map(&:id))
75
+ _(plans.count).must_equal count
75
76
  end
76
77
  end
77
78
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -137,7 +138,7 @@ module Dynflow
137
138
  plan = world.plan(ActionOnStop)
138
139
  plan = world.execute(plan.id).wait!.value
139
140
  assert Flag.raised?
140
- plan.result.must_equal :success
141
+ _(plan.result).must_equal :success
141
142
  end
142
143
 
143
144
  it 'inherits the hooks when subclassing' do
@@ -158,7 +159,7 @@ module Dynflow
158
159
  refute Flag.raised?
159
160
  plan = world.trigger(ComposedAction)
160
161
  plan.finished.wait!
161
- Flag.raised_count.must_equal 1
162
+ _(Flag.raised_count).must_equal 1
162
163
  end
163
164
  end
164
165
  end