roby 0.8.0 → 3.0.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 (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,591 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'flexmock'
4
- require 'roby/test/tasks/simple_task'
5
-
6
- require 'roby'
7
-
8
- class TC_Exceptions < Test::Unit::TestCase
9
- include Roby::Test
10
- class SpecializedError < LocalizedError; end
11
-
12
- def test_execution_exception_initialize
13
- plan.add(task = Task.new)
14
- error = ExecutionException.new(LocalizedError.new(task))
15
- assert_equal(task, error.task)
16
- assert_equal([task], error.trace)
17
- assert_equal(nil, error.generator)
18
-
19
- ev = task.event(:start)
20
- error = ExecutionException.new(LocalizedError.new(ev))
21
- assert_equal(task, error.task)
22
- assert_equal(ev, error.generator)
23
- assert_equal([task], error.trace)
24
- end
25
-
26
- def test_execution_exception_fork
27
- task, t1, t2, t3 = prepare_plan :add => 5
28
- e = ExecutionException.new(LocalizedError.new(task))
29
- s = e.fork
30
-
31
- assert_equal([e, s], e.siblings)
32
- assert_equal([e, s], s.siblings)
33
- e.trace << t1
34
- s.trace << t2
35
- assert_equal([task, t1], e.trace)
36
- assert_equal([task, t2], s.trace)
37
-
38
- e.merge(s)
39
- assert_equal([task, [t1, t2]], e.trace)
40
-
41
- s = e.fork
42
- e.merge(s)
43
- assert_equal([t1, t2], e.task)
44
- assert_equal(task, e.origin)
45
-
46
- s = e.fork
47
- s.trace << t3
48
- e.merge(s)
49
- assert_equal([t1, t2, t3], e.task)
50
- assert_equal(task, e.origin)
51
-
52
- e = ExecutionException.new(LocalizedError.new(task))
53
- s = e.fork
54
- t1, t2 = prepare_plan :add => 2
55
- s.trace << t1 << t2
56
- e.merge(s)
57
- assert_equal([task, t2], e.task)
58
- assert_equal(task, e.origin)
59
-
60
- e = ExecutionException.new(LocalizedError.new(task))
61
- s = e.fork
62
- e.merge(s)
63
- assert_equal(task, e.task)
64
- assert_equal(task, e.origin)
65
- end
66
-
67
- class SignallingHandler < Roby::LocalizedError; end
68
- def test_task_handle_exception
69
- FlexMock.use do |mock|
70
- received_handler2 = false
71
- klass = Class.new(Task) do
72
- on_exception(SpecializedError) do |exception|
73
- mock.handler1(exception, exception.task, self)
74
- end
75
- on_exception(SpecializedError) do |exception|
76
- if received_handler2
77
- pass_exception
78
- end
79
- received_handler2 = true
80
- mock.handler2(exception, exception.task, self)
81
- end
82
- on_exception(RuntimeError) do |exception|
83
- pass_exception
84
- end
85
- on_exception(SignalException) do |exception|
86
- raise
87
- end
88
- end
89
-
90
- plan.add(task = klass.new)
91
- error = ExecutionException.new(SpecializedError.new(task))
92
- mock.should_receive(:handler2).with(error, task, task).once.ordered
93
- mock.should_receive(:handler1).with(error, task, task).once.ordered
94
- assert(task.handle_exception(error))
95
- assert(task.handle_exception(error))
96
-
97
- error = ExecutionException.new(CodeError.new(nil, task))
98
- assert(! task.handle_exception(error))
99
- error = ExecutionException.new(SignallingHandler.new(task))
100
- assert(! task.handle_exception(error))
101
- end
102
- end
103
-
104
- def test_exception_in_handler
105
- Roby.logger.level = Logger::FATAL
106
-
107
- Roby.app.abort_on_exception = true
108
- Roby.app.abort_on_application_exception = false
109
- FlexMock.use do |mock|
110
- klass = Class.new(SimpleTask) do
111
- define_method(:mock) { mock }
112
- event :start do |context|
113
- mock.event_called
114
- raise SpecializedError.new(self)
115
- end
116
-
117
- on_exception(RuntimeError) do |exception|
118
- mock.task_handler_called
119
- raise
120
- end
121
- end
122
-
123
- plan.on_exception(RuntimeError) do |task, exception|
124
- mock.global_handler_called
125
- raise
126
- end
127
-
128
- t1, t2 = klass.new, klass.new
129
- t1.depends_on t2
130
- plan.add_mission(t1)
131
-
132
- mock.should_receive(:event_called).once.ordered
133
- mock.should_receive(:task_handler_called).once.ordered
134
- mock.should_receive(:global_handler_called).once.ordered
135
- engine.once { t2.start! }
136
- assert_raises(SpecializedError) { process_events }
137
- end
138
- end
139
-
140
- def test_linear_propagation
141
- FlexMock.use do |mock|
142
- t1, t2 = Task.new, Task.new
143
- t0 = Class.new(Task) do
144
- on_exception(SpecializedError) do |exception|
145
- mock.handler(exception, exception.task, self)
146
- end
147
- end.new
148
- plan.add(t0)
149
- t0.depends_on t1
150
- t1.depends_on t2
151
-
152
- error = ExecutionException.new(SpecializedError.new(t2))
153
- mock.should_receive(:handler).with(error, t1, t0).once
154
- assert_equal([], engine.propagate_exceptions([error]))
155
- assert_equal([error], error.siblings)
156
- assert_equal([t2, t1], error.trace)
157
-
158
- error = ExecutionException.new(CodeError.new(nil, t2))
159
- assert_equal([error], engine.propagate_exceptions([error]))
160
- assert_equal(t0, error.task)
161
- assert_equal([t2, t1, t0], error.trace)
162
-
163
- # Redo that but this time define a global exception handler
164
- error = ExecutionException.new(CodeError.new(nil, t2))
165
- plan.on_exception(CodeError) do |mod, exception|
166
- mock.global_handler(exception, exception.task, mod)
167
- end
168
- mock.should_receive(:global_handler).with(error, t0, plan).once
169
- assert_equal([], engine.propagate_exceptions([error]))
170
- end
171
- end
172
-
173
- def test_forked_propagation
174
- # We build a 0 -> 1 -> 2 3 -> 2 task tree with
175
- # 0 being able to handle the exception and 1, 3 not
176
-
177
- FlexMock.use do |mock|
178
- t1, t2, t3 = prepare_plan :add => 3
179
- t0 = Class.new(Task) do
180
- attr_accessor :handled_exception
181
- on_exception(CodeError) do |exception|
182
- self.handled_exception = exception
183
- mock.handler(exception, exception.task, self)
184
- end
185
- end.new
186
- plan.add(t0)
187
- t0.depends_on t1
188
- t1.depends_on t2
189
- t3.depends_on t2
190
-
191
- error = ExecutionException.new(CodeError.new(nil, t2))
192
- mock.should_receive(:handler).with(ExecutionException, t1, t0).once
193
- # There are two possibilities here:
194
- # 1/ the error propagation begins with t1 -> t0, in which case +error+
195
- # is t0.handled_exception and there may be no sibling (the error is
196
- # never tested on t3
197
- # 2/ propagation begins with t3, in which case +error+ is a sibling of
198
- # t0.handled_exception
199
- assert_equal([], engine.propagate_exceptions([error]))
200
- assert_equal([t2, t1], t0.handled_exception.trace)
201
- if t0.handled_exception != error
202
- assert_equal([t2, t3], error.trace)
203
- assert_equal([t0.handled_exception, error].to_set, error.siblings.to_set)
204
- end
205
-
206
- error = ExecutionException.new(LocalizedError.new(t2))
207
- assert(fatal = engine.propagate_exceptions([error]))
208
- assert_equal(1, fatal.size)
209
- e = *fatal
210
- assert_equal(t2, e.origin)
211
- assert_equal([t3, t0], e.task)
212
- end
213
- end
214
-
215
- def test_diamond_propagation
216
- # We build a 0 -> 1 -> 2 3 -> 2 task tree with
217
- # 0 being able to handle the exception and 1, 3 not
218
-
219
- FlexMock.use do |mock|
220
- t1, t2, t3 = prepare_plan :add => 3
221
-
222
- found_exception = nil
223
- t0 = Class.new(Task) do
224
- on_exception(LocalizedError) do |exception|
225
- found_exception = exception
226
- mock.handler(exception, exception.task.to_set, self)
227
- end
228
- end.new
229
- plan.add(t0)
230
- t0.depends_on t1 ; t1.depends_on t2
231
- t0.depends_on t3 ; t3.depends_on t2
232
-
233
-
234
- error = ExecutionException.new(LocalizedError.new(t2))
235
- mock.should_receive(:handler).with(ExecutionException, [t1, t3].to_set, t0).once
236
- assert_equal([], engine.propagate_exceptions([error]))
237
- assert_equal(2, found_exception.trace.size, found_exception.trace)
238
- assert_equal(t2, found_exception.origin)
239
- assert_equal([t3, t1].to_set, found_exception.task.to_set)
240
- end
241
- end
242
-
243
- def test_event_propagation_with_exception
244
- ev = EventGenerator.new do |context|
245
- raise RuntimeError
246
- ev.emit(context)
247
- end
248
- plan.add(ev)
249
- assert_original_error(RuntimeError, CommandFailed) { ev.call(nil) }
250
- assert(!ev.happened?)
251
-
252
- # Check that the event is emitted anyway
253
- ev = EventGenerator.new do |context|
254
- ev.emit(context)
255
- raise RuntimeError
256
- end
257
- plan.add(ev)
258
- assert_original_error(RuntimeError, CommandFailed) { ev.call(nil) }
259
- assert(ev.happened?)
260
-
261
- # Check signalling
262
- ev = EventGenerator.new do |context|
263
- ev.emit(context)
264
- raise RuntimeError
265
- end
266
- plan.add(ev)
267
- ev2 = EventGenerator.new(true)
268
- ev.signals ev2
269
-
270
- assert_original_error(RuntimeError, CommandFailed) { ev.call(nil) }
271
- assert(ev.happened?)
272
- assert(ev2.happened?)
273
-
274
- # Check event handlers
275
- FlexMock.use do |mock|
276
- ev = EventGenerator.new(true)
277
- plan.add(ev)
278
- ev.on { mock.handler ; raise RuntimeError }
279
- ev.on { mock.handler }
280
- mock.should_receive(:handler).twice
281
- assert_original_error(RuntimeError, EventHandlerError) { ev.call }
282
- end
283
- end
284
-
285
- # Tests exception handling mechanism during event propagation
286
- def test_task_propagation_with_exception
287
- Roby.app.abort_on_exception = true
288
- Roby.logger.level = Logger::FATAL
289
-
290
- task = Class.new(SimpleTask) do
291
- event :start do |context|
292
- emit(:start)
293
- raise RuntimeError, "failed"
294
- end
295
- end.new
296
-
297
- FlexMock.use do |mock|
298
- parent = Class.new(Task) do
299
- on_exception RuntimeError do
300
- mock.exception
301
- task.pass_exception
302
- end
303
- end.new
304
- mock.should_receive(:exception).once
305
-
306
- parent.depends_on task
307
- plan.add_mission(parent)
308
-
309
- engine.once { task.start! }
310
-
311
- mock.should_receive(:other_once_handler).once
312
- mock.should_receive(:other_event_processing).once
313
- engine.once { mock.other_once_handler }
314
- engine.add_propagation_handler { |plan| mock.other_event_processing }
315
-
316
- begin
317
- process_events
318
- flunk("should have raised")
319
- rescue Roby::CommandFailed => e
320
- assert_kind_of(RuntimeError, e.error)
321
- end
322
- end
323
- assert(task.event(:start).happened?)
324
- end
325
-
326
- def test_exception_argument_count_validation
327
- assert_raises(ArgumentError) do
328
- Class.new(Task).on_exception(RuntimeError) do ||
329
- end
330
- end
331
- assert_raises(ArgumentError) do
332
- Class.new(Task).on_exception(RuntimeError) do |a, b|
333
- end
334
- end
335
- assert_nothing_raised do
336
- Class.new(Task).on_exception(RuntimeError) do |_|
337
- end
338
- end
339
-
340
- assert_raises(ArgumentError) do
341
- plan.on_exception(RuntimeError) do ||
342
- end
343
- end
344
- assert_raises(ArgumentError) do |a, b|
345
- plan.on_exception(RuntimeError) do |_|
346
- end
347
- end
348
- assert_nothing_raised do
349
- plan.on_exception(RuntimeError) do |_, _|
350
- end
351
- end
352
- end
353
-
354
- def test_exception_propagation_merging
355
- FlexMock.use do |mock|
356
- t11 = Task.new(:id => '11')
357
- t12 = Task.new(:id => '12')
358
- t13 = Task.new(:id => '13')
359
-
360
- root = Class.new(Task) do
361
- include Test::Unit::Assertions
362
- on_exception(RuntimeError) do |exception|
363
- assert_equal([t11, t12, t13].to_set, exception.task.to_set)
364
- mock.caught(exception.task)
365
- end
366
- end.new(:id => 'root')
367
- plan.add(root)
368
- root.depends_on(t11)
369
- root.depends_on(t12)
370
- root.depends_on(t13)
371
-
372
- t11.depends_on(t21 = Task.new(:id => '21'))
373
- t12.depends_on(t21)
374
-
375
- t13.depends_on(t22 = Task.new(:id => '22'))
376
- t22.depends_on(t31 = Task.new(:id => '31'))
377
- t31.depends_on(t21)
378
-
379
- mock.should_receive(:caught).once
380
- engine.propagate_exceptions([ExecutionException.new(LocalizedError.new(t21))])
381
- end
382
- end
383
-
384
- def test_plan_repairs
385
- model = Class.new(SimpleTask) do
386
- event :blocked
387
- forward :blocked => :failed
388
- end
389
-
390
- # First, check methods located in Plan
391
- plan.add(task = model.new)
392
- r1, r2 = SimpleTask.new, SimpleTask.new
393
-
394
- task.start!
395
- task.emit :blocked
396
-
397
- blocked_event = task.history[-3]
398
- failed_event = task.history[-2]
399
- stop_event = task.history[-1]
400
- plan.add_repair failed_event, r1
401
- plan.add_repair blocked_event, r2
402
- assert(plan.task_index.repaired_tasks.include?(task))
403
-
404
- assert_equal({}, plan.repairs_for(stop_event))
405
- assert_equal({failed_event => r1}, plan.repairs_for(failed_event))
406
- assert_equal({blocked_event => r2, failed_event => r1}, plan.repairs_for(blocked_event))
407
- plan.remove_repair r1
408
- assert_equal({}, plan.repairs_for(failed_event))
409
- assert_equal({blocked_event => r2}, plan.repairs_for(blocked_event))
410
- plan.remove_repair r2
411
- assert_equal({}, plan.repairs_for(stop_event))
412
- assert_equal({}, plan.repairs_for(failed_event))
413
- assert_equal({}, plan.repairs_for(blocked_event))
414
- assert(!plan.task_index.repaired_tasks.include?(task))
415
- end
416
-
417
- def test_exception_inhibition
418
- parent, child = prepare_plan :tasks => 2, :model => SimpleTask
419
- plan.add_mission(parent)
420
- parent.depends_on child
421
- parent.signals :start, child, :start
422
- parent.start!
423
- child.failed!
424
-
425
- exceptions = plan.check_structure
426
-
427
- plan.add(repairing_task = SimpleTask.new)
428
- repairing_task.start!
429
- assert_equal(exceptions.to_a, engine.remove_inhibited_exceptions(exceptions))
430
- assert_equal(exceptions.keys, engine.propagate_exceptions(exceptions))
431
- plan.add_repair(child.terminal_event, repairing_task)
432
- assert_equal([], engine.remove_inhibited_exceptions(exceptions))
433
- assert_equal([], engine.propagate_exceptions(exceptions))
434
-
435
- ensure
436
- # Remove the child so that the test's plan cleanup does not complain
437
- parent.remove_child child if child
438
- end
439
-
440
- def test_error_handling_relation(error_event = :failed)
441
- task_model = Class.new(SimpleTask) do
442
- event :blocked
443
- forward :blocked => :failed
444
- end
445
-
446
- parent, child = prepare_plan :tasks => 2, :model => task_model
447
- plan.add_mission(parent)
448
- parent.depends_on child
449
- repairing_task = SimpleTask.new
450
- child.event(:failed).handle_with repairing_task
451
-
452
- parent.start!
453
- child.start!
454
- child.emit error_event
455
-
456
- exceptions = plan.check_structure
457
-
458
- assert_equal([], engine.propagate_exceptions(exceptions))
459
- assert_equal({ child.terminal_event => repairing_task },
460
- plan.repairs_for(child.terminal_event), [plan.repairs, child.terminal_event])
461
-
462
- Roby.app.abort_on_exception = false
463
- process_events
464
- assert(repairing_task.running?)
465
-
466
- # Make the "repair task" finish, but do not repair the plan.
467
- # propagate_exceptions must not add a new repair
468
- repairing_task.success!
469
- assert_equal(exceptions.keys, engine.propagate_exceptions(exceptions))
470
-
471
- ensure
472
- parent.remove_child child if child
473
- end
474
-
475
- def test_error_handling_relation_generalization
476
- test_error_handling_relation(:blocked)
477
- end
478
-
479
- def test_mission_exceptions
480
- mission = prepare_plan :missions => 1, :model => SimpleTask
481
- repairing_task = SimpleTask.new
482
- mission.event(:failed).handle_with repairing_task
483
-
484
- mission.start!
485
- mission.emit :failed
486
-
487
- exceptions = plan.check_structure
488
- assert_equal(1, exceptions.size)
489
- assert_kind_of(Roby::MissionFailedError, exceptions.to_a[0][0].exception, exceptions)
490
-
491
- assert_equal([], engine.propagate_exceptions(exceptions))
492
- assert_equal({ mission.terminal_event => repairing_task },
493
- plan.repairs_for(mission.terminal_event), [plan.repairs, mission.terminal_event])
494
-
495
- Roby.app.abort_on_exception = false
496
- process_events
497
- assert(plan.mission?(mission))
498
- assert(repairing_task.running?)
499
-
500
- # Make the "repair task" finish, but do not repair the plan.
501
- # propagate_exceptions must not add a new repair
502
- repairing_task.success!
503
- assert_equal(exceptions.keys, engine.propagate_exceptions(exceptions))
504
-
505
- # Discard the mission so that the test teardown does not complain
506
- plan.unmark_mission(mission)
507
- end
508
-
509
- def test_filter_command_errors
510
- Roby.app.filter_backtraces = true
511
- model = Class.new(SimpleTask) do
512
- event :start do
513
- raise ArgumentError
514
- end
515
- end
516
-
517
- task = prepare_plan :permanent => 1, :model => model
518
- error = begin task.start!
519
- rescue Exception => e; e
520
- end
521
- assert_kind_of CodeError, e
522
- assert_nothing_raised do
523
- Roby.format_exception e
524
- end
525
-
526
- trace = e.error.backtrace
527
- filtered = Roby.filter_backtrace(trace)
528
- assert(filtered[0] =~ /command for 'start'/, filtered[0])
529
- assert(filtered[1] =~ /test_filter_command_errors/, filtered[1])
530
- end
531
-
532
- def test_filter_handler_errors
533
- task = prepare_plan :permanent => 1, :model => SimpleTask
534
- task.on(:start) { raise ArgumentError }
535
- error = begin task.start!
536
- rescue Exception => e; e
537
- end
538
- assert_kind_of CodeError, e
539
- assert_nothing_raised do
540
- Roby.format_exception e
541
- end
542
-
543
- trace = e.error.backtrace
544
- filtered = Roby.filter_backtrace(trace)
545
- assert(filtered[0] =~ /event handler/, filtered.join("\n"))
546
- assert(filtered[1] =~ /test_filter_handler_errors/, filtered.join("\n"))
547
-
548
- model = Class.new(SimpleTask) do
549
- on :start do
550
- raise ArgumentError
551
- end
552
- end
553
- task = prepare_plan :permanent => 1, :model => model
554
- error = begin task.start!
555
- rescue Exception => e; e
556
- end
557
- assert_kind_of CodeError, e
558
- assert_nothing_raised do
559
- Roby.format_exception e
560
- end
561
-
562
- trace = e.error.backtrace
563
- filtered = Roby.filter_backtrace(trace)
564
- assert(filtered[0] =~ /event handler for 'start'$/, filtered.join("\n"))
565
- assert(filtered[1] =~ /test_filter_handler_errors/, filtered.join("\n"))
566
- end
567
-
568
- def test_filter_polling_errors
569
- model = Class.new(SimpleTask) do
570
- poll do
571
- raise ArgumentError, "bla"
572
- end
573
- end
574
-
575
- parent = prepare_plan :permanent => 1, :model => SimpleTask
576
- child = prepare_plan :permanent => 1, :model => model
577
- parent.depends_on child
578
- parent.start!
579
- child.start!
580
- child.failed!
581
-
582
- error = TaskStructure::Hierarchy.check_structure(plan).first.exception
583
- assert_kind_of(ChildFailedError, error)
584
- assert_nothing_raised do
585
- Roby.format_exception(error)
586
- end
587
- # To silently finish the test ...
588
- parent.stop!
589
- end
590
- end
591
-