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,378 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/distributed'
3
- require 'roby/test/tasks/simple_task'
4
- require 'flexmock'
5
-
6
- class TC_DistributedExecution < Test::Unit::TestCase
7
- include Roby::Distributed::Test
8
- SimpleTask = Roby::Test::SimpleTask
9
-
10
- def setup
11
- super
12
- Roby.app.filter_backtraces = false
13
- end
14
-
15
- def test_event_status
16
- peer2peer do |remote|
17
- class << remote
18
- attr_reader :controlable
19
- attr_reader :contingent
20
- def create
21
- # Put the task to avoir having GC clearing the events
22
- plan.add_mission(t = SimpleTask.new(:id => 'task'))
23
- plan.add(@controlable = Roby::EventGenerator.new(true))
24
- plan.add(@contingent = Roby::EventGenerator.new(false))
25
- t.signals(:start, controlable, :start)
26
- t.forward_to(:start, contingent, :start)
27
- nil
28
- end
29
- def fire
30
- engine.execute do
31
- controlable.call(nil)
32
- contingent.emit(nil)
33
- end
34
- nil
35
- end
36
- end
37
- end
38
-
39
- remote.create
40
- task = subscribe_task(:id => 'task')
41
- controlable = *task.event(:start).child_objects(EventStructure::Signal).to_a
42
- contingent = *task.event(:start).child_objects(EventStructure::Forwarding).to_a
43
-
44
- FlexMock.use do |mock|
45
- controlable.on do
46
- mock.fired_controlable(engine.gathering?)
47
- end
48
- contingent.on do
49
- mock.fired_contingent(engine.gathering?)
50
- end
51
-
52
- mock.should_receive(:fired_controlable).with(true).once
53
- mock.should_receive(:fired_contingent).with(true).once
54
- remote.fire
55
- remote_peer.synchro_point
56
- end
57
-
58
- assert(controlable.happened?)
59
- assert(contingent.happened?)
60
- end
61
-
62
- def test_signal_establishment
63
- peer2peer do |remote|
64
- Roby::Distributed.on_transaction do |trsc|
65
- trsc.edit do
66
- local_task = trsc.find_tasks.which_fullfills(Roby::Test::SimpleTask).to_a.first
67
- t = trsc[SimpleTask.new(:id => 'remote_task')]
68
- local_task.depends_on t
69
- local_task.signals :start, t, :start
70
- nil
71
- end
72
- end
73
- end
74
-
75
- trsc = Roby::Distributed::Transaction.new(plan)
76
- trsc.add_owner remote_peer
77
- trsc.propose(remote_peer)
78
-
79
- plan.add_mission(local_task = Roby::Test::SimpleTask.new)
80
- trsc[local_task]
81
- trsc.release
82
- trsc.edit
83
- trsc.commit_transaction
84
-
85
- engine.execute { local_task.start! }
86
- engine.wait_one_cycle
87
- remote_peer.synchro_point
88
- remote_task = subscribe_task(:id => 'remote_task')
89
- assert(remote_task.running?)
90
-
91
- engine.execute do
92
- plan.unmark_mission(local_task)
93
- local_task.stop!
94
- end
95
- end
96
-
97
- # This test that the event/plan modification order is kept on a remote host
98
- def test_keeps_causality
99
- peer2peer do |remote|
100
- class << remote
101
- attr_reader :event
102
- attr_reader :task
103
- def create
104
- # Put the task to avoir having GC clearing the events
105
- plan.add_mission(@task = SimpleTask.new(:id => 'task'))
106
- plan.add(@event = Roby::EventGenerator.new(true))
107
- event.signals task.event(:start)
108
- nil
109
- end
110
- def fire
111
- engine.execute do
112
- event.on do
113
- plan.unmark_mission(task)
114
- task.event(:start).signals task.event(:success)
115
- end
116
-
117
- event.call(nil)
118
- end
119
- nil
120
- end
121
- end
122
- end
123
-
124
- remote.create
125
- task = subscribe_task(:id => 'task')
126
- event = *task.event(:start).parent_objects(EventStructure::Signal).to_a
127
-
128
- FlexMock.use do |mock|
129
- event.on do
130
- mock.fired
131
- assert(plan.free_events.include?(event))
132
- end
133
-
134
- mock.should_receive(:fired).once
135
- remote.fire
136
- remote_peer.synchro_point
137
- end
138
-
139
- assert(event.happened?)
140
- end
141
-
142
- def test_task_status
143
- Roby.app.abort_on_exception = false
144
- peer2peer do |remote|
145
- class << remote
146
- include Test::Unit::Assertions
147
- attr_reader :task
148
- def create_task
149
- plan.clear
150
- plan.add_mission(@task = SimpleTask.new(:id => 1))
151
- end
152
- def start_task; engine.once { task.start! }; nil end
153
- def stop_task
154
- assert(task.executable?)
155
- engine.once do
156
- plan.unmark_mission(task)
157
- task.stop!
158
- end
159
- nil
160
- end
161
- end
162
- end
163
-
164
- remote.create_task
165
- p_task = remote_task(:id => 1)
166
- assert(!p_task.event(:start).happened?)
167
- process_events
168
- assert(!p_task.plan)
169
-
170
- # Start the task *before* subscribing to test that #subscribe maps the
171
- # task status
172
- remote.start_task
173
- process_events
174
- p_task = subscribe_task(:id => 1)
175
- assert(p_task.running?)
176
- assert(p_task.event(:start).happened?)
177
-
178
- # Stop the task to see if the fired event is propagated
179
- remote.stop_task
180
- process_events
181
- assert(p_task.finished?)
182
- assert(p_task.failed?)
183
- assert(p_task.event(:stop).happened?)
184
- assert(p_task.finished?)
185
- end
186
-
187
- def test_signalling
188
- peer2peer do |remote|
189
- remote.plan.add_mission(task = SimpleTask.new(:id => 1))
190
- remote.class.class_eval do
191
- include Test::Unit::Assertions
192
- define_method(:start_task) do
193
- events = plan.free_events.to_a
194
- assert_equal(2, events.size)
195
- assert(sev = events.find { |ev| ev.controlable? })
196
- assert(fev = events.find { |ev| !ev.controlable? })
197
- assert(task.event(:start).child_object?(sev, Roby::EventStructure::Signal))
198
- assert(task.event(:start).child_object?(fev, Roby::EventStructure::Forwarding))
199
- engine.once { task.start! }
200
- nil
201
- end
202
- end
203
- end
204
- p_task = subscribe_task(:id => 1)
205
-
206
- FlexMock.use do |mock|
207
- signalled_ev = EventGenerator.new do |context|
208
- mock.signal_command
209
- signalled_ev.emit(nil)
210
- end
211
- signalled_ev.on { |ev| mock.signal_emitted }
212
- assert(signalled_ev.controlable?)
213
-
214
- forwarded_ev = EventGenerator.new
215
- forwarded_ev.on { |ev| mock.forward_emitted }
216
- assert(!forwarded_ev.controlable?)
217
-
218
- p_task.event(:start).signals signalled_ev
219
- p_task.event(:start).forward_to forwarded_ev
220
-
221
- mock.should_receive(:signal_command).once.ordered('signal')
222
- mock.should_receive(:signal_emitted).once.ordered('signal')
223
- mock.should_receive(:forward_emitted).once
224
- process_events
225
-
226
- remote.start_task
227
- process_events
228
- assert(signalled_ev.happened?)
229
- assert(forwarded_ev.happened?)
230
- end
231
- end
232
-
233
- def test_event_handlers
234
- peer2peer do |remote|
235
- remote.plan.add_mission(task = SimpleTask.new(:id => 1))
236
- def remote.start(task)
237
- task = local_peer.local_object(task)
238
- engine.once { task.start! }
239
- nil
240
- end
241
- end
242
- FlexMock.use do |mock|
243
- mock.should_receive(:started).once
244
-
245
- task = subscribe_task(:id => 1)
246
- task.on(:start) { mock.started }
247
- remote.start(Distributed.format(task))
248
- process_events
249
-
250
- assert(task.running?)
251
- end
252
- end
253
-
254
- # Test that we can 'forget' running tasks that was known to us because they
255
- # were related to subscribed tasks
256
- def test_forgetting
257
- peer2peer do |remote|
258
- parent, child =
259
- SimpleTask.new(:id => 'parent'),
260
- SimpleTask.new(:id => 'child')
261
- parent.depends_on child
262
-
263
- remote.plan.add_mission(parent)
264
- child.start!
265
- remote.singleton_class.class_eval do
266
- define_method(:remove_link) do
267
- parent.remove_child(child)
268
- end
269
- end
270
- end
271
-
272
- parent = subscribe_task(:id => 'parent')
273
- child = nil
274
- assert(child = local.plan.known_tasks.find { |t| t.arguments[:id] == 'child' })
275
- assert(!child.subscribed?)
276
- assert(child.running?)
277
- remote.remove_link
278
- process_events
279
- assert(!local.plan.known_tasks.find { |t| t.arguments[:id] == 'child' })
280
- end
281
-
282
- # Tests that running remote tasks are aborted and pending tasks GCed if the
283
- # connection is killed
284
- def test_disconnect_kills_tasks
285
- peer2peer do |remote|
286
- remote.plan.add_mission(task = SimpleTask.new(:id => 'remote-1'))
287
- def remote.start(task)
288
- task = local_peer.local_object(task)
289
- engine.execute do
290
- task.start!
291
- end
292
- nil
293
- end
294
- end
295
-
296
- task = subscribe_task(:id => 'remote-1')
297
- remote.start(Distributed.format(task))
298
- process_events
299
- assert(task.running?)
300
- assert(task.child_object?(remote_peer.task, TaskStructure::ExecutionAgent))
301
- assert(task.subscribed?)
302
-
303
- engine.execute do
304
- remote_peer.disconnected!
305
- end
306
- assert(!task.subscribed?)
307
- assert(remote_peer.task.finished?)
308
- assert(remote_peer.task.event(:aborted).happened?)
309
- assert(remote_peer.task.event(:stop).happened?)
310
- assert(task.finished?)
311
- end
312
-
313
- # Checks that the code blocks are called only in owning controllers
314
- class CodeBlocksOwnersMockup < Roby::Test::SimpleTask
315
- attr_reader :command_called
316
- event :start do
317
- @command_called = true
318
- emit :start
319
- end
320
-
321
- attr_reader :handler_called
322
- on(:start) { @handler_called = true }
323
-
324
- attr_reader :poller_called
325
- poll { @poller_called = true }
326
- end
327
-
328
- def test_code_blocks_owners
329
- peer2peer do |remote|
330
- remote.plan.add_mission(CodeBlocksOwnersMockup.new(:id => 'mockup'))
331
-
332
- def remote.call
333
- task = plan.find_tasks(CodeBlocksOwnersMockup).to_a.first
334
- engine.execute { task.start! }
335
- end
336
-
337
- def remote.blocks_called
338
- task = plan.find_tasks(CodeBlocksOwnersMockup).to_a.first
339
- task.command_called && task.poller_called && task.handler_called
340
- end
341
- end
342
-
343
- mockup = subscribe_task(:id => 'mockup')
344
- remote.call
345
- remote_peer.synchro_point
346
-
347
- assert(remote.blocks_called)
348
- assert(!mockup.command_called)
349
- assert(!mockup.poller_called)
350
- assert(!mockup.handler_called)
351
- end
352
-
353
- # Checks that we get the update fine if +fired+ and +signalled+ are
354
- # received in the same cycle
355
- def test_joint_fired_signalled
356
- peer2peer do |remote|
357
- remote.plan.add_mission(task = SimpleTask.new(:id => 'remote-1'))
358
- engine.once { task.start! }
359
- end
360
-
361
- event_time = Time.now
362
- remote = subscribe_task(:id => 'remote-1')
363
- plan.add_mission(local = SimpleTask.new(:id => 'local'))
364
- remote_peer.synchro_point
365
-
366
- engine.execute do
367
- remote_peer.local_server.event_fired(remote.event(:success), 0, Time.now, [42])
368
- remote_peer.local_server.event_add_propagation(true, remote.event(:success), local.event(:start), 0, event_time, [42])
369
- end
370
- process_events
371
-
372
- assert(remote.finished?)
373
- assert(remote.success?)
374
- assert(local.started?)
375
- assert_equal(1, remote.history.size, remote.history)
376
- end
377
- end
378
-
@@ -1,341 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/distributed'
3
- require 'roby/test/tasks/simple_task'
4
-
5
- # This testcase tests buildings plans where local tasks are interacting with remote tasks
6
- #
7
- # Naming scheme:
8
- # test_r<type of remote object>_realizes_l<type of local object>(_dynamic)
9
- #
10
- # For instance, test_rproxy_realizes_lproxy means that we are building a
11
- # transaction where a remote transaction proxy is linked to a local transaction
12
- # proxy. If _dynamic is appended, #propose is called when the transaction is still
13
- # empty. Otherwise, #propose is called after all modifications have been put into
14
- # the transaction (propose then build or build then propose)
15
- #
16
- # The transaction is always built locally
17
- class TC_DistributedMixedPlan < Test::Unit::TestCase
18
- include Roby::Distributed::Test
19
-
20
- # Creates in +plan+ a task which is a child in a depends_on relation and a parent
21
- # in a planned_by relation. All tasks have an ID of "#{name}-#{number}", with
22
- # 2 for the central task, 1 for its parent task and 3 for its planning task.
23
- #
24
- # Returns [-1, -2, -3]
25
- def add_tasks(plan, name)
26
- t1, t2, t3 = (1..3).map { |i| SimpleTask.new(:id => "#{name}-#{i}") }
27
- t1.depends_on t2
28
- t2.planned_by t3
29
- plan.add_mission(t1)
30
- plan.add(t2)
31
- plan.add(t3)
32
-
33
- [t1, t2, t3]
34
- end
35
-
36
- def check_local_center_structure(node, removed_planner)
37
- if node.respond_to?(:__getobj__)
38
- assert_equal(["remote-2"], node.parents.map { |obj| obj.arguments[:id] })
39
- else
40
- assert_equal(["local-1", "remote-2"].to_set, node.parents.map { |obj| obj.arguments[:id] }.to_set)
41
- unless removed_planner
42
- assert_equal(["local-3"], node.enum_for(:each_planning_task).map { |obj| obj.arguments[:id] })
43
- end
44
- end
45
- end
46
-
47
- def check_remote_center_structure(node, removed_planner)
48
- assert_equal(["local-2"], node.children.map { |obj| obj.arguments[:id] })
49
- unless node.respond_to?(:__getobj__)
50
- assert_equal(["remote-1"], node.parents.map { |obj| obj.arguments[:id] })
51
- unless removed_planner
52
- assert_equal(["remote-3"], node.enum_for(:each_planning_task).map { |obj| obj.arguments[:id] })
53
- end
54
- end
55
- end
56
-
57
- # Checks that +plan+ has all 6 tasks with remote-2 and local-2 linked as
58
- # expected +plan+ may be either the transaction or the plan
59
- #
60
- # Tests are in two parts: first we build the transaction and check the
61
- # relations of the resulting proxies. Then, we remove all relations of
62
- # tasks *in the plan*. Since we have added a depends_on between the
63
- # central tasks, the depends_on relations are kept inside the transaction.
64
- # However, this is not the case for planning relations. Thus, the planning
65
- # relation does not exist anymore in the transaction after they have been
66
- # removed from the plan.
67
- def check_resulting_plan(plan, removed_planner)
68
- assert(remote_center_node = plan.known_tasks.find { |t| t.arguments[:id] == "remote-2" }, plan.known_tasks)
69
- check_remote_center_structure(remote_center_node, removed_planner)
70
- assert(local_center_node = plan.known_tasks.find { |t| t.arguments[:id] == "local-2" }, plan.known_tasks)
71
- check_local_center_structure(local_center_node, removed_planner)
72
- end
73
-
74
- def assert_cleared_relations(plan)
75
- if remote_center_node = plan.known_tasks.find { |t| t.arguments[:id] == "remote-2" }
76
- assert_equal([], remote_center_node.enum_for(:each_planning_task).to_a)
77
- end
78
-
79
- if local_center_node = plan.known_tasks.find { |t| t.arguments[:id] == "local-2" }
80
- assert_equal([], local_center_node.enum_for(:each_planning_task).to_a)
81
- end
82
- end
83
-
84
- # Common setup of the remote peer
85
- def common_setup(propose_first)
86
- peer2peer do |remote|
87
- testcase = self
88
- remote.singleton_class.class_eval do
89
- define_method(:add_tasks) do |plan|
90
- plan = local_peer.proxy(plan)
91
- plan.edit do
92
- testcase.add_tasks(plan, "remote")
93
- end
94
- end
95
- define_method(:check_resulting_plan) do |plan, removed_planner|
96
- plan = local_peer.proxy(plan)
97
- plan.edit do
98
- testcase.check_resulting_plan(local_peer.proxy(plan), removed_planner)
99
- end
100
- end
101
- define_method(:assert_cleared_relations) do |plan|
102
- plan = local_peer.proxy(plan)
103
- plan.edit do
104
- testcase.assert_cleared_relations(local_peer.proxy(plan))
105
- end
106
- end
107
- def remove_relations(t2)
108
- plan.edit do
109
- t2 = local_peer.local_object(t2)
110
- raise unless t3 = t2.planning_task
111
- t2.remove_planning_task(t3)
112
- end
113
- end
114
- def subscribe(remote_task)
115
- local_peer.subscribe(remote_task)
116
- end
117
- end
118
- end
119
-
120
- # Create the transaction, and do the necessary modifications
121
- trsc = Distributed::Transaction.new(plan)
122
-
123
- trsc.add_owner remote_peer
124
- trsc.self_owned
125
- trsc.propose(remote_peer) if propose_first
126
-
127
- yield(trsc)
128
-
129
- # Check the transaction is still valid, regardless of the
130
- # changes we made to the plan
131
- check_resulting_plan(trsc, true)
132
- trsc.release(false)
133
- remote.check_resulting_plan(Distributed.format(trsc), true)
134
- trsc.edit
135
-
136
- # Commit and check the result
137
- trsc.commit_transaction
138
-
139
- check_resulting_plan(plan, true)
140
- remote.check_resulting_plan(Distributed.format(plan), true)
141
- end
142
-
143
- def test_rproxy_realizes_lproxy(propose_first = false)
144
- common_setup(propose_first) do |trsc|
145
- # First, add relations between two nodes that are already existing
146
- remote.add_tasks(Distributed.format(plan))
147
- r_t2 = subscribe_task(:id => 'remote-2')
148
- assert(1, r_t2.parents.to_a.size)
149
- r_t1 = r_t2.parents.find { true }
150
- t1, t2, t3 = Roby.synchronize { add_tasks(plan, "local") }
151
-
152
- assert(plan.useful_task?(r_t1))
153
- trsc[r_t2].depends_on trsc[t2]
154
- trsc[r_t2].signals(:start, trsc[t2], :start)
155
- assert(plan.useful_task?(r_t1))
156
- check_resulting_plan(trsc, false)
157
- if propose_first
158
- trsc.release(false)
159
- remote.check_resulting_plan(Distributed.format(trsc), false)
160
- trsc.edit
161
- end
162
-
163
- # Remove the relations in the real tasks (not the proxies)
164
- Roby.synchronize do
165
- t2.remove_planning_task(t3)
166
- end
167
- remote.remove_relations(Distributed.format(r_t2))
168
- remote.subscribe(Distributed.format(t2))
169
-
170
- process_events
171
- assert(plan.useful_task?(r_t1))
172
- assert_cleared_relations(plan)
173
-
174
- unless propose_first
175
- trsc.propose(remote_peer)
176
- end
177
-
178
- process_events
179
- remote.assert_cleared_relations(Distributed.format(plan))
180
- end
181
- end
182
- def test_rproxy_realizes_lproxy_dynamic; test_rproxy_realizes_lproxy(true) end
183
-
184
- def test_rproxy_realizes_ltask(propose_first = false)
185
- common_setup(propose_first) do |trsc|
186
- remote.add_tasks(Distributed.format(plan))
187
- r_t2 = subscribe_task(:id => 'remote-2')
188
- t1, t2, t3 = Roby.synchronize { add_tasks(trsc, "local") }
189
-
190
- trsc[r_t2].depends_on t2
191
- trsc[r_t2].signals(:start, t2, :start)
192
- check_resulting_plan(trsc, false)
193
- process_events
194
- if propose_first
195
- remote_peer.push_subscription(t2)
196
- trsc.release(false)
197
- remote.check_resulting_plan(Distributed.format(trsc), false)
198
- trsc.edit
199
- end
200
-
201
- # remove the relations in the real tasks (not the proxies)
202
- remote.remove_relations(Distributed.format(r_t2))
203
-
204
- unless propose_first
205
- trsc.propose(remote_peer)
206
- remote_peer.push_subscription(t2)
207
- end
208
- process_events
209
- remote.assert_cleared_relations(Distributed.format(plan))
210
- end
211
- end
212
- def test_rproxy_realizes_ltask_dynamic; test_rproxy_realizes_ltask(true) end
213
-
214
- # no non-dynamic version for that since we need the transactio to be
215
- # present on both sides if we want to have remote tasks in it
216
- def test_rtask_realizes_lproxy
217
- common_setup(true) do |trsc|
218
- trsc.release(false)
219
- r_t1, r_t2, r_t3 = remote.add_tasks(Distributed.format(trsc)).map { |t| remote_peer.proxy(t) }
220
- trsc.edit
221
-
222
- assert(r_t2.subscribed?)
223
- t1, t2, t3 = Roby.synchronize { add_tasks(plan, "local") }
224
- r_t2.depends_on trsc[t2]
225
- r_t2.signals(:start, trsc[t2], :start)
226
- remote_peer.subscribe(r_t2)
227
- remote_peer.push_subscription(t2)
228
-
229
- check_resulting_plan(trsc, false)
230
- trsc.release(false)
231
- remote.check_resulting_plan(Distributed.format(trsc), false)
232
- trsc.edit
233
-
234
- # remove the relations in the real tasks (not the proxies)
235
- t2.remove_planning_task(t3)
236
- process_events
237
- remote.assert_cleared_relations(Distributed.format(plan))
238
- end
239
- end
240
-
241
- def test_garbage_collect
242
- peer2peer do |remote|
243
- remote.plan.add_mission(SimpleTask.new(:id => 'remote-1'))
244
- def remote.insert_children(trsc, root_task)
245
- trsc = local_peer.local_object(trsc)
246
- root_task = local_peer.local_object(root_task)
247
- trsc.edit
248
-
249
- root_task.depends_on(r2 = SimpleTask.new(:id => 'remote-2'))
250
- r2.depends_on(r3 = SimpleTask.new(:id => 'remote-3'))
251
- trsc.release(false)
252
- end
253
- end
254
-
255
- r1 = subscribe_task(:id => 'remote-1')
256
- assert(!plan.unneeded_tasks.include?(r1))
257
-
258
- t1 = SimpleTask.new
259
-
260
- # Add a local child to r1. This local child, and r1, must be kept event
261
- # we are not subscribed to r1 anymore
262
- trsc = Distributed::Transaction.new(plan)
263
- trsc.add_owner(remote_peer)
264
- trsc[r1].depends_on t1
265
- Roby.synchronize do
266
- remote_peer.unsubscribe(r1)
267
- assert(!plan.unneeded_tasks.include?(r1))
268
- end
269
-
270
- trsc.propose(remote_peer)
271
- trsc.commit_transaction
272
- assert(!plan.unneeded_tasks.include?(r1))
273
- assert(!plan.unneeded_tasks.include?(t1), plan.unneeded_tasks)
274
-
275
- # Ok, we now create a r1 => t1 => t2 => t3 chain
276
- # * t2 and t3 are kept because they are useful for r1
277
- t2, t3 = nil
278
- Roby.synchronize do
279
- t1.depends_on(t2 = SimpleTask.new)
280
- assert(!plan.unneeded_tasks.include?(t2))
281
- t2.depends_on(t3 = SimpleTask.new)
282
- assert(!plan.unneeded_tasks.include?(t3))
283
- end
284
-
285
- # Now, create a t3 => r2 => r3 chain
286
- # * r2 should be kept since it is related to a task which is kept
287
- # * r3 should not be kept
288
- trsc = Distributed::Transaction.new(plan)
289
- trsc.add_owner(remote_peer)
290
- trsc.propose(remote_peer)
291
- trsc.release
292
- remote.insert_children(Distributed.format(trsc), Distributed.format(trsc[t3]))
293
- trsc.edit
294
- trsc.commit_transaction
295
- process_events
296
-
297
- r2 = remote_task(:id => 'remote-2')
298
- Roby.synchronize do
299
- assert(r2.plan && !plan.unneeded_tasks.include?(r2))
300
- assert(t3.child_object?(r2, TaskStructure::Hierarchy))
301
- end
302
-
303
- r3 = remote_task(:id => 'remote-3')
304
- Roby.synchronize do
305
- assert(!r3.plan || plan.unneeded_tasks.include?(r3))
306
- end
307
- end
308
-
309
- # This tests that the race condition between transaction commit and plan GC
310
- # is handled properly: if a task inside a transaction will be GCed just
311
- # after the commit, there is a race condition possibility if the other
312
- # peers do not have committed the transaction yet
313
- def test_commit_race_condition
314
- peer2peer do |remote|
315
- def remote.add_task(trsc)
316
- trsc = local_peer.local_object(trsc)
317
- trsc.edit
318
- trsc.add(SimpleTask.new(:id => 'remote'))
319
- trsc.release(false)
320
- end
321
- end
322
-
323
- # Create an empty transaction and send it to our peer
324
- # The peer will then add a task, which
325
- # will be GCed as soon as the transaction is committed
326
- trsc = Distributed::Transaction.new(plan)
327
- trsc.add_owner(remote_peer)
328
- trsc.propose(remote_peer)
329
- trsc.release
330
- remote.add_task(Distributed.format(trsc))
331
- trsc.edit
332
-
333
- assert_nothing_raised do
334
- trsc.commit_transaction
335
- process_events
336
- end
337
- assert(remote_peer.connected?)
338
- end
339
- end
340
-
341
-