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,42 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
-
3
- require 'roby/test/common'
4
- require 'roby/test/tasks/simple_task'
5
- require 'roby/relations/conflicts'
6
- require 'flexmock'
7
-
8
- class TC_Conflicts < Test::Unit::TestCase
9
- include Roby::Test
10
-
11
- def test_model_relations
12
- m1, m2 = (1..2).map do
13
- Class.new(SimpleTask)
14
- end
15
-
16
- m1.conflicts_with m2
17
- assert(!m1.conflicts_with?(m1))
18
- assert(m1.conflicts_with?(m2))
19
- assert(m2.conflicts_with?(m1))
20
-
21
- # Create two tasks ...
22
- plan.add(t1 = m1.new)
23
- plan.add(t2 = m2.new)
24
- assert !t1.child_object?(t2, Roby::TaskStructure::Conflicts)
25
- assert !t2.child_object?(t1, Roby::TaskStructure::Conflicts)
26
-
27
- # Start t1 ...
28
- t1.start!
29
- assert !t1.child_object?(t2, Roby::TaskStructure::Conflicts)
30
- assert t2.child_object?(t1, Roby::TaskStructure::Conflicts)
31
-
32
- # And now, start the conflicting task. The default decision control
33
- # should postpone start until t1 is stopped
34
- t2.start!
35
- assert(!t2.running?)
36
- assert t1.event(:stop).child_object?(t2.event(:start), Roby::EventStructure::Signal)
37
- t1.stop!
38
- assert(!t1.running?)
39
- assert(t2.running?)
40
- end
41
- end
42
-
@@ -1,324 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'roby/test/tasks/simple_task'
4
-
5
- class TC_RealizedBy < Test::Unit::TestCase
6
- include Roby::Test
7
-
8
- def test_check_structure_registration
9
- assert plan.structure_checks.include?(Dependency.method(:check_structure))
10
- end
11
-
12
- def test_definition
13
- tag = TaskModelTag.new
14
- klass = Class.new(SimpleTask) do
15
- argument :id
16
- include tag
17
- end
18
- plan.add(t1 = SimpleTask.new)
19
-
20
- # Check validation of the model
21
- child = nil
22
- assert_nothing_raised { t1.depends_on((child = klass.new), :model => SimpleTask) }
23
- assert_equal([SimpleTask, {}], t1[child, Dependency][:model])
24
-
25
- assert_nothing_raised { t1.depends_on klass.new, :model => [Roby::Task, {}] }
26
- assert_nothing_raised { t1.depends_on klass.new, :model => tag }
27
-
28
- plan.add(simple_task = SimpleTask.new)
29
- assert_raises(ArgumentError) { t1.depends_on simple_task, :model => [Class.new(Roby::Task), {}] }
30
- assert_raises(ArgumentError) { t1.depends_on simple_task, :model => TaskModelTag.new }
31
-
32
- # Check validation of the arguments
33
- plan.add(model_task = klass.new)
34
- assert_raises(ArgumentError) { t1.depends_on model_task, :model => [SimpleTask, {:id => 'bad'}] }
35
-
36
- plan.add(child = klass.new(:id => 'good'))
37
- assert_raises(ArgumentError) { t1.depends_on child, :model => [klass, {:id => 'bad'}] }
38
- assert_nothing_raised { t1.depends_on child, :model => [klass, {:id => 'good'}] }
39
- assert_equal([klass, { :id => 'good' }], t1[child, TaskStructure::Dependency][:model])
40
-
41
- # Check edge annotation
42
- t2 = SimpleTask.new
43
- t1.depends_on t2, :model => SimpleTask
44
- assert_equal([SimpleTask, {}], t1[t2, TaskStructure::Dependency][:model])
45
- t2 = klass.new(:id => 10)
46
- t1.depends_on t2, :model => [klass, { :id => 10 }]
47
- end
48
-
49
- Dependency = TaskStructure::Dependency
50
-
51
- def test_exception_printing
52
- parent, child = prepare_plan :add => 2, :model => SimpleTask
53
- parent.depends_on child
54
- parent.start!
55
- child.start!
56
- child.failed!
57
-
58
- error = plan.check_structure.find { true }[0].exception
59
- assert_kind_of(ChildFailedError, error)
60
- assert_nothing_raised do
61
- Roby.format_exception(error)
62
- end
63
-
64
- parent.stop!
65
- end
66
-
67
- # This method is a common method used in the various error/nominal tests
68
- # below. It creates two tasks:
69
- # p1 which is an instance of SimpleTask
70
- # child which is an instance of a task model with two controllable events
71
- # 'first' and 'second'
72
- #
73
- # p1 is a parent of child. Both tasks are started and returned.
74
- def create_pair(options)
75
- child_model = Class.new(SimpleTask) do
76
- event :first, :command => true
77
- event :second, :command => true
78
- end
79
-
80
- p1 = SimpleTask.new
81
- child = child_model.new
82
- plan.add([p1, child])
83
- p1.depends_on child, options
84
- plan.add_mission(p1)
85
-
86
- child.start!; p1.start!
87
- return p1, child
88
- end
89
-
90
- def assert_child_failed(child, reason, plan)
91
- result = plan.check_structure
92
- assert_equal([child].to_set, result.map { |e, _| e.exception.failed_task }.to_set)
93
- assert_equal([reason].to_set, result.map { |e, _| e.exception.failed_event }.to_set)
94
- end
95
-
96
-
97
- def test_success
98
- parent, child = create_pair :success => [:first],
99
- :failure => [:stop],
100
- :remove_when_done => false
101
-
102
- assert_equal({}, plan.check_structure)
103
- child.first!
104
- assert_equal({}, plan.check_structure)
105
- assert(parent.depends_on?(child))
106
- end
107
-
108
- def test_success_removal
109
- parent, child = create_pair :success => [:first],
110
- :failure => [:stop],
111
- :remove_when_done => true
112
-
113
- child.first!
114
- assert_equal({}, plan.check_structure)
115
- assert(!parent.depends_on?(child))
116
- end
117
-
118
- def test_success_preempts_explicit_failed
119
- parent, child = create_pair :success => [:first],
120
- :failure => [:stop]
121
-
122
- child.first!
123
- child.stop!
124
- assert_equal({}, plan.check_structure)
125
- end
126
-
127
- def test_success_preempts_failure_on_unreachable
128
- parent, child = create_pair :success => [:first]
129
-
130
- child.first!
131
- child.stop!
132
- assert_equal({}, plan.check_structure)
133
- end
134
-
135
- def test_failure_explicit
136
- parent, child = create_pair :success => [:first],
137
- :failure => [:stop]
138
-
139
- child.stop!
140
- assert_child_failed(child, child.event(:stop).last, plan)
141
- plan.clear
142
- end
143
-
144
- def test_failure_on_unreachable
145
- parent, child = create_pair :success => [:first]
146
-
147
- child.stop!
148
- assert_child_failed(child, child.event(:failed).last, plan)
149
- plan.clear
150
- end
151
-
152
- def test_fullfilled_model_validation
153
- tag = TaskModelTag.new
154
- klass = Class.new(Roby::Task)
155
-
156
- p1, p2, child = prepare_plan :add => 3, :model => SimpleTask
157
- p1.depends_on child, :model => [SimpleTask, { :id => "discover-3" }]
158
- p2.depends_on child, :model => [SimpleTask, { :id => 'discover-3' }]
159
-
160
- # Mess with the relation definition
161
- p1[child, Dependency][:model].last[:id] = 'discover-10'
162
- assert_raises(ModelViolation) { child.fullfilled_model }
163
- p1[child, Dependency][:model] = [klass, {}]
164
- assert_raises(ModelViolation) { child.fullfilled_model }
165
- end
166
-
167
- def test_fullfilled_model
168
- tag = TaskModelTag.new
169
- klass = Class.new(SimpleTask) do
170
- include tag
171
- end
172
-
173
- p1, p2, child = prepare_plan :add => 3, :model => klass
174
-
175
- p1.depends_on child, :model => [SimpleTask, { :id => "discover-3" }]
176
- p2.depends_on child, :model => Roby::Task
177
- assert_equal([[SimpleTask], {:id => 'discover-3'}], child.fullfilled_model)
178
- p1.remove_child(child)
179
- assert_equal([[Roby::Task], {}], child.fullfilled_model)
180
- p1.depends_on child, :model => tag
181
- assert_equal([[Roby::Task, tag], {}], child.fullfilled_model)
182
- p2.remove_child(child)
183
- p2.depends_on child, :model => [klass, { :id => 'discover-3' }]
184
- assert_equal([[klass, tag], {:id => 'discover-3'}], child.fullfilled_model)
185
- end
186
-
187
- def test_fullfilled_model_transaction
188
- tag = TaskModelTag.new
189
- klass = Class.new(SimpleTask) do
190
- include tag
191
- end
192
-
193
- p1, p2, child = prepare_plan :add => 3, :model => Class.new(klass)
194
- trsc = Transaction.new(plan)
195
-
196
- p1.depends_on child, :model => [SimpleTask, { :id => "discover-3" }]
197
- p2.depends_on child, :model => klass
198
-
199
- t_child = trsc[child]
200
- assert_equal([[klass], {:id => "discover-3"}], t_child.fullfilled_model)
201
- t_p2 = trsc[p2]
202
- assert_equal([[klass], {:id => "discover-3"}], t_child.fullfilled_model)
203
- t_p2.remove_child(t_child)
204
- assert_equal([[SimpleTask], { :id => 'discover-3' }], t_child.fullfilled_model)
205
- t_p2.depends_on t_child, :model => klass
206
- assert_equal([[klass], { :id => 'discover-3' }], t_child.fullfilled_model)
207
- trsc.remove_object(t_p2)
208
- assert_equal([[SimpleTask], { :id => 'discover-3' }], t_child.fullfilled_model)
209
- end
210
-
211
- def test_first_children
212
- p, c1, c2 = prepare_plan :add => 3, :model => SimpleTask
213
- p.depends_on c1
214
- p.depends_on c2
215
- assert_equal([c1, c2].to_value_set, p.first_children)
216
-
217
- c1.signals(:start, c2, :start)
218
- assert_equal([c1].to_value_set, p.first_children)
219
- end
220
-
221
- def test_remove_finished_children
222
- p, c1, c2 = prepare_plan :add => 3, :model => SimpleTask
223
- plan.add_permanent(p)
224
- p.depends_on c1
225
- p.depends_on c2
226
-
227
- p.start!
228
- c1.start!
229
- c1.success!
230
- p.remove_finished_children
231
- process_events
232
- assert(!plan.include?(c1))
233
- assert(plan.include?(c2))
234
- end
235
-
236
- def test_role_definition
237
- plan.add(parent = SimpleTask.new)
238
-
239
- child = SimpleTask.new
240
- parent.depends_on child, :role => 'child1'
241
- assert_equal(['child1'].to_set, parent.roles_of(child))
242
-
243
- child = SimpleTask.new
244
- parent.depends_on child, :roles => ['child1', 'child2']
245
- assert_equal(['child1', 'child2'].to_set, parent.roles_of(child))
246
- end
247
-
248
- def setup_merging_test
249
- plan.add(parent = SimpleTask.new)
250
- tag = TaskModelTag.new
251
- intermediate = Class.new(SimpleTask)
252
- intermediate.include tag
253
- child_model = Class.new(intermediate)
254
- child = child_model.new(:id => 'child')
255
- parent.depends_on child, :role => 'child1', :model => Task, :success => [], :failure => []
256
-
257
- expected_info = { :remove_when_done=>true,
258
- :model => [Roby::Task, {}],
259
- :roles => ['child1'].to_set,
260
- :success=>[],
261
- :failure=>[] }
262
- assert_equal expected_info, parent[child, Dependency]
263
-
264
- return parent, child, expected_info, child_model, tag
265
- end
266
-
267
- def test_merging_events
268
- parent, child, info, child_model, _ = setup_merging_test
269
- parent.depends_on child, :success => []
270
- info[:model] = [child_model, {:id => 'child'}]
271
- assert_equal info, parent[child, Dependency]
272
-
273
- parent.depends_on child, :success => [:success]
274
- info[:success] = [:success]
275
- assert_equal info, parent[child, Dependency]
276
-
277
- assert_raises(ModelViolation) { parent.depends_on child, :failure => [:success] }
278
- assert_equal info, parent[child, Dependency]
279
-
280
- parent.depends_on child, :failure => [:stop]
281
- info[:failure] = [:stop]
282
- assert_equal info, parent[child, Dependency]
283
- end
284
-
285
- def test_merging_remove_when_done_cannot_change
286
- parent, child, info, _ = setup_merging_test
287
- assert_raises(ModelViolation) { parent.depends_on child, :remove_when_done => false }
288
- parent.depends_on child, :model => info[:model], :remove_when_done => true, :success => []
289
- assert_equal info, parent[child, Dependency]
290
- end
291
-
292
- def test_merging_models
293
- parent, child, info, child_model, tag = setup_merging_test
294
-
295
- # Test that models are "upgraded"
296
- parent.depends_on child, :model => SimpleTask, :success => []
297
- info[:model][0] = SimpleTask
298
- assert_equal info, parent[child, Dependency]
299
- parent.depends_on child, :model => Roby::Task, :remove_when_done => true, :success => []
300
- assert_equal info, parent[child, Dependency]
301
-
302
- # Test that arguments are merged
303
- parent.depends_on child, :model => [SimpleTask, {:id => 'child'}], :success => []
304
- info[:model][1] = {:id => 'child'}
305
- assert_equal info, parent[child, Dependency]
306
- # note: arguments can't be changed on the task *and* #depends_on
307
- # validates them, so we don't need to test that.
308
-
309
- # Test model/tag handling: #depends_on should find the most generic
310
- # model matching +task+ that includes all required models
311
- parent.depends_on child, :model => tag, :success => []
312
- info[:model][0] = child_model.superclass
313
- assert_equal info, parent[child, Dependency]
314
- end
315
-
316
- def test_merging_roles
317
- parent, child, info, _ = setup_merging_test
318
-
319
- parent.depends_on child, :model => Roby::Task, :role => 'child2', :success => []
320
- info[:roles] << 'child2'
321
- assert_equal info, parent[child, Dependency]
322
- end
323
- end
324
-
@@ -1,38 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'flexmock'
4
-
5
- class TC_EnsuredEvent < Test::Unit::TestCase
6
- include Roby::Test
7
-
8
- def test_ensure
9
- setup = lambda do |mock|
10
- e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
11
- plan.add [e1, e2]
12
- e1.ensure e2
13
- e1.on { mock.e1 }
14
- e2.on { mock.e2 }
15
- [e1, e2]
16
- end
17
- FlexMock.use do |mock|
18
- e1, e2 = setup[mock]
19
- mock.should_receive(:e2).ordered.once
20
- mock.should_receive(:e1).ordered.once
21
- e1.call(nil)
22
- end
23
- FlexMock.use do |mock|
24
- e1, e2 = setup[mock]
25
- mock.should_receive(:e1).never
26
- mock.should_receive(:e2).once
27
- e2.call(nil)
28
- end
29
- FlexMock.use do |mock|
30
- e1, e2 = setup[mock]
31
- mock.should_receive(:e2).ordered.once
32
- mock.should_receive(:e1).ordered.once
33
- e2.call(nil)
34
- e1.call(nil)
35
- end
36
- end
37
- end
38
-
@@ -1,224 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'roby/test/tasks/simple_task'
4
- require 'flexmock'
5
-
6
- class TC_ExecutedBy < Test::Unit::TestCase
7
- include Roby::Test
8
-
9
- class ExecutionAgentModel < SimpleTask
10
- event :ready
11
- forward :start => :ready
12
- end
13
- class SecondExecutionModel < SimpleTask
14
- event :ready
15
- forward :start => :ready
16
- end
17
-
18
- def test_relationships
19
- plan.add(task = SimpleTask.new)
20
- exec_task = ExecutionAgentModel.new
21
-
22
- task.executed_by exec_task
23
- assert_equal(exec_task, task.execution_agent)
24
- end
25
-
26
- def test_inherits_execution_model
27
- model = Class.new(Roby::Task) do
28
- executed_by ExecutionAgentModel, :id => 20
29
- end
30
- submodel = Class.new(model)
31
-
32
- assert_equal([ExecutionAgentModel, {:id => 20}], submodel.execution_agent)
33
- end
34
-
35
- def test_nominal
36
- plan.add(task = SimpleTask.new)
37
- task.executed_by(ExecutionAgentModel.new)
38
- task.executed_by(exec = ExecutionAgentModel.new)
39
-
40
- FlexMock.use do |mock|
41
- exec.on(:start) { mock.agent_started }
42
- exec.on(:ready) { mock.agent_ready }
43
- task.on(:start) { mock.task_started }
44
-
45
- mock.should_receive(:agent_started).once.ordered
46
- mock.should_receive(:agent_ready).once.ordered
47
- mock.should_receive(:task_started).once.ordered
48
- task.start!
49
- end
50
-
51
- task.stop!
52
- assert_nothing_raised { exec.stop! }
53
- end
54
-
55
- def test_agent_fails
56
- plan.add(task = SimpleTask.new)
57
- exec = ExecutionAgentModel.new
58
- task.executed_by exec
59
- task.start!
60
-
61
- FlexMock.use do |mock|
62
- task.on(:aborted) { mock.aborted }
63
- mock.should_receive(:aborted).once
64
- exec.stop!
65
- end
66
- assert(!task.running?)
67
- end
68
-
69
- def test_agent_start_failed
70
- plan.add_mission(task = SimpleTask.new)
71
- exec = Class.new(SimpleTask) do
72
- event :ready
73
- signal :start => :failed
74
- end.new
75
- task.executed_by exec
76
-
77
- assert_original_error(NilClass, EmissionFailed) { task.start! }
78
- assert(!task.running?)
79
- assert(!exec.running?)
80
- assert(exec.finished?)
81
- end
82
-
83
- def test_agent_model_spawns
84
- task_model = Class.new(SimpleTask)
85
-
86
- task_model.executed_by ExecutionAgentModel, :id => 10
87
- plan.add_mission(task = task_model.new)
88
- assert(task.execution_agent)
89
- assert_equal(10, task.execution_agent.arguments[:id])
90
- assert_kind_of(ExecutionAgentModel, task.execution_agent)
91
-
92
- task.start!
93
- assert(task.running?)
94
- assert(task.execution_agent.running?)
95
- end
96
-
97
- def test_agent_model_reuses
98
- plan.add_permanent(agent = ExecutionAgentModel.new)
99
-
100
- task_model = Class.new(SimpleTask)
101
- task_model.executed_by ExecutionAgentModel
102
-
103
- plan.add_mission(task = task_model.new)
104
- assert_same(agent, task.execution_agent)
105
-
106
- task.start!
107
- assert(task.running?)
108
- assert(task.execution_agent.running?)
109
- end
110
-
111
- def test_agent_model_reuses_running_agent
112
- plan.add_permanent(agent = ExecutionAgentModel.new)
113
- agent.start!
114
-
115
- task_model = Class.new(SimpleTask)
116
- task_model.executed_by ExecutionAgentModel
117
-
118
- plan.add_mission(task = task_model.new)
119
- assert_same(agent, task.execution_agent)
120
-
121
- task.start!
122
- assert(task.running?)
123
- end
124
-
125
- def test_agent_model_arguments
126
- plan.add_permanent(agent1 = ExecutionAgentModel.new(:id => 1))
127
- plan.add_permanent(agent2 = ExecutionAgentModel.new(:id => 2))
128
-
129
- task_model = Class.new(SimpleTask)
130
- task_model.executed_by ExecutionAgentModel, :id => 2
131
-
132
- plan.add_mission(task = task_model.new)
133
- assert_same(agent2, task.execution_agent)
134
-
135
- task.start!
136
- assert(task.running?)
137
- assert(task.execution_agent.running?)
138
- end
139
-
140
- def test_task_has_wrong_agent
141
- task_model = Class.new(SimpleTask)
142
- task_model.executed_by ExecutionAgentModel, :id => 2
143
-
144
- plan.add_mission(task = task_model.new)
145
-
146
- # Wrong agent type
147
- plan.remove_object(task.execution_agent)
148
- task.executed_by SecondExecutionModel.new(:id => 2)
149
- assert_raises(Roby::CommandFailed) { task.start! }
150
-
151
- # Wrong agent arguments
152
- plan.remove_object(task.execution_agent)
153
- task.executed_by ExecutionAgentModel.new(:id => 3)
154
- assert_raises(Roby::CommandFailed) { task.start! }
155
- end
156
-
157
- def test_model_requires_agent_but_none_exists
158
- task_model = Class.new(SimpleTask)
159
- task_model.executed_by ExecutionAgentModel, :id => 2
160
-
161
- plan.add_mission(task = task_model.new)
162
- plan.remove_object(task.execution_agent)
163
-
164
- assert_raises(Roby::CommandFailed) { task.start! }
165
- end
166
-
167
- def test_respawn
168
- task_model = Class.new(SimpleTask)
169
- task_model.executed_by ExecutionAgentModel
170
- first, second = prepare_plan :add => 2, :model => task_model
171
- assert(first.execution_agent)
172
- assert(ExecutionAgentModel, first.execution_agent.class)
173
- assert(second.execution_agent)
174
- assert(ExecutionAgentModel, second.execution_agent.class)
175
- assert_same(first.execution_agent, second.execution_agent)
176
-
177
- first.start!
178
- assert(first.running?)
179
- first_agent = first.execution_agent
180
- assert(first_agent.running?)
181
-
182
- plan.add(third = task_model.new)
183
- assert_equal(first.execution_agent, third.execution_agent)
184
-
185
- first.execution_agent.stop!
186
- assert(first.event(:aborted).happened?)
187
- assert(first_agent.finished?)
188
- assert(second.execution_agent)
189
- assert(second.execution_agent.pending?)
190
- end
191
-
192
- def test_cannot_respawn
193
- plan.add_mission(task = Class.new(SimpleTask).new)
194
- task.executed_by(agent = ExecutionAgentModel.new)
195
-
196
- agent.start!
197
- agent.stop!
198
- assert_raises(CommandFailed) { task.start! }
199
- end
200
-
201
- def test_initialization
202
- agent = Class.new(SimpleTask) do
203
- event :ready, :command => true
204
- end.new
205
- task, (init1, init2) = prepare_plan :missions => 1, :add => 2, :model => SimpleTask
206
- task.executed_by agent
207
- init1.executed_by agent
208
- init2.executed_by agent
209
-
210
- agent.depends_on(init = (init1 + init2))
211
- agent.signals(:start, init, :start)
212
- init.forward_to(:success, agent, :ready)
213
-
214
- task.start!
215
- assert(!task.running?)
216
- assert(!agent.event(:ready).happened?)
217
- assert(init1.running?)
218
- assert(!init2.running?)
219
- init1.success!
220
- init2.success!
221
- assert(agent.event(:ready).happened?)
222
- end
223
- end
224
-