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,238 +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_DistributedPlanNotifications < Test::Unit::TestCase
7
- include Roby::Distributed::Test
8
-
9
- def test_triggers
10
- peer2peer do |remote|
11
- def remote.new_task(kind, args)
12
- engine.execute do
13
- new_task = kind.proxy(local_peer).new(args)
14
- yield(new_task.remote_id) if block_given?
15
- plan.add_mission(new_task)
16
- end
17
- nil
18
- end
19
- end
20
-
21
- notification = TaskMatcher.new.
22
- with_model(SimpleTask).
23
- with_arguments(:id => 2)
24
-
25
- FlexMock.use do |mock|
26
- remote_peer.on(notification) do |task|
27
- assert(plan.useful_task?(task))
28
- assert(task.plan)
29
- mock.notified(task.sibling_on(remote_peer))
30
- nil
31
- end
32
-
33
- simple_task = Distributed.format(SimpleTask)
34
- roby_task = Distributed.format(Roby::Task)
35
-
36
- remote.new_task(simple_task, :id => 3)
37
- remote.new_task(roby_task, :id => 2)
38
- remote.new_task(simple_task, :id => 2) do |inserted_id|
39
- mock.should_receive(:notified).with(inserted_id).once.ordered
40
- nil
41
- end
42
-
43
- remote.new_task(simple_task, :id => 3)
44
- remote.new_task(roby_task, :id => 2)
45
- remote.new_task(simple_task, :id => 2) do |inserted_id|
46
- mock.should_receive(:notified).with(inserted_id).once.ordered
47
- nil
48
- end
49
-
50
- remote_peer.synchro_point
51
- end
52
- end
53
-
54
- def test_trigger_subscribe
55
- peer2peer do |remote|
56
- def remote.new_task
57
- plan.add_mission(SimpleTask.new(:id => 1))
58
- nil
59
- end
60
- end
61
-
62
- notification = TaskMatcher.new.
63
- with_model(SimpleTask).
64
- with_arguments(:id => 1)
65
-
66
- task = nil
67
- remote_peer.on(notification) do |t|
68
- remote_peer.subscribe(t)
69
- task = t
70
- end
71
- remote.new_task
72
- while !task
73
- remote_peer.synchro_point
74
- end
75
-
76
- assert(task)
77
- assert_equal([task], plan.find_tasks.with_arguments(:id => 1).to_a)
78
- end
79
-
80
- def test_subscribe_plan
81
- peer2peer do |remote|
82
- plan.add_mission(mission = SimpleTask.new(:id => 'mission'))
83
- subtask = SimpleTask.new :id => 'subtask'
84
- plan.add_mission(next_mission = SimpleTask.new(:id => 'next_mission'))
85
- mission.depends_on subtask
86
- mission.signals(:start, next_mission, :start)
87
- end
88
-
89
- # Subscribe to the remote plan
90
- remote_peer.subscribe_plan
91
- assert(remote_peer.subscribed_plan?)
92
-
93
- # Check that the remote plan has been mapped locally
94
- process_events
95
- tasks = plan.known_tasks
96
- assert_equal(4, tasks.size)
97
- assert(p_mission = tasks.find { |t| t.arguments[:id] == 'mission' })
98
- assert(p_subtask = tasks.find { |t| t.arguments[:id] == 'subtask' })
99
- assert(p_next_mission = tasks.find { |t| t.arguments[:id] == 'next_mission' })
100
-
101
- assert(p_mission.child_object?(p_subtask, TaskStructure::Hierarchy))
102
- assert(p_mission.event(:start).child_object?(p_next_mission.event(:start), EventStructure::Signal))
103
- end
104
-
105
- def test_plan_updates
106
- peer2peer do |remote|
107
- class << remote
108
- attr_reader :mission, :subtask, :next_mission, :free_event
109
- def create_mission
110
- @mission = Roby::Task.new :id => 'mission'
111
- plan.add_mission(mission)
112
- end
113
- def create_subtask
114
- plan.add_permanent(@subtask = Roby::Task.new(:id => 'subtask'))
115
- mission.depends_on subtask
116
- end
117
- def create_next_mission
118
- @next_mission = Roby::Task.new :id => 'next_mission'
119
- mission.signals(:start, next_mission, :start)
120
- plan.add_mission(next_mission)
121
- end
122
- def create_free_event
123
- @free_event = Roby::EventGenerator.new(true)
124
- # Link the event to a task to protect it from GC
125
- @next_mission.signals(:start, @free_event, :start)
126
- plan.add(free_event)
127
- end
128
- def remove_free_event
129
- plan.remove_object(free_event)
130
- end
131
- def unlink_next_mission; mission.event(:start).remove_signal(next_mission.event(:start)) end
132
- def remove_next_mission; plan.remove_object(next_mission) end
133
- def unlink_subtask; mission.remove_child(subtask) end
134
- def remove_subtask; plan.remove_object(subtask) end
135
- def discard_mission
136
- plan.add_permanent(mission)
137
- plan.unmark_mission(mission)
138
- end
139
- def remove_mission; plan.remove_object(mission) end
140
- end
141
- end
142
-
143
- # Subscribe to the remote plan
144
- remote_peer.subscribe_plan
145
-
146
- remote.create_mission
147
- process_events
148
- p_mission = remote_task(:id => 'mission')
149
- # NOTE: the count is always remote_tasks + 1 since we have the ConnectionTask for our connection
150
- assert_equal(2, plan.size, plan.known_tasks.to_a)
151
- assert(p_mission.mission?)
152
- process_events
153
- assert(p_mission.plan)
154
-
155
- remote.create_subtask
156
- process_events
157
- p_subtask = remote_task(:id => 'subtask')
158
- assert_equal(3, plan.size)
159
- assert(p_mission.child_object?(p_subtask, TaskStructure::Hierarchy))
160
-
161
- remote.create_next_mission
162
- process_events
163
- p_next_mission = remote_task(:id => 'next_mission')
164
- assert_equal(4, plan.size)
165
- assert(p_mission.event(:start).child_object?(p_next_mission.event(:start), EventStructure::Signal))
166
-
167
- remote.create_free_event
168
- process_events
169
- assert_equal(1, plan.free_events.size)
170
- process_events
171
- assert_equal(1, plan.free_events.size)
172
-
173
- remote.remove_free_event
174
- process_events
175
- assert_equal(0, plan.free_events.size)
176
-
177
- remote.unlink_next_mission
178
- process_events
179
- assert_equal(4, plan.size)
180
- assert(!p_mission.event(:start).child_object?(p_next_mission.event(:start), EventStructure::Signal))
181
-
182
- remote.remove_next_mission
183
- process_events
184
- assert_equal(3, plan.size)
185
- assert(!p_next_mission.plan)
186
-
187
- remote.unlink_subtask
188
- assert(p_subtask.subscribed?)
189
- process_events
190
- assert_equal(3, plan.size, plan.known_tasks)
191
- assert(!p_mission.child_object?(p_subtask, TaskStructure::Hierarchy))
192
-
193
- remote.remove_subtask
194
- process_events
195
- assert_equal(2, plan.size)
196
- assert(!p_subtask.plan)
197
-
198
- remote.discard_mission
199
- process_events
200
- assert(!p_mission.mission?)
201
-
202
- remote.remove_mission
203
- process_events
204
- assert_equal(1, plan.size)
205
- assert(!p_mission.plan)
206
- end
207
-
208
- def test_unsubscribe_plan
209
- peer2peer do |remote|
210
- remote.plan.add_mission(SimpleTask.new(:id => 'remote-1'))
211
- remote.plan.add_mission(SimpleTask.new(:id => 'remote-2'))
212
-
213
- def remote.new_task
214
- plan.add_mission(SimpleTask.new(:id => 'remote-3'))
215
- end
216
- end
217
-
218
- remote_peer.subscribe_plan
219
- assert_equal(3, plan.size)
220
-
221
- # Subscribe to the remote-1 task and unsubscribe to the plan
222
- r1 = *plan.find_tasks.with_arguments(:id => 'remote-1').to_a
223
- remote_peer.subscribe(r1)
224
-
225
- remote_peer.unsubscribe_plan
226
- assert(!remote_peer.subscribed_plan?)
227
-
228
- # Start plan GC, the subscribed task should remain
229
- process_events
230
- assert_equal(2, plan.size, plan.known_tasks)
231
-
232
- # Add a new task in the remote plan, check we do not get the updates
233
- # anymore
234
- remote.new_task
235
- process_events
236
- assert_equal(2, plan.size)
237
- end
238
- end
@@ -1,525 +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_DistributedRobyProtocol < Test::Unit::TestCase
7
- include Roby::Distributed::Test
8
-
9
- def test_remote_id
10
- remote = remote_server do
11
- def remote_object
12
- @object ||= Object.new
13
- @object.remote_id
14
- end
15
- end
16
-
17
- assert_equal(remote.remote_object, remote.remote_object)
18
-
19
- h = Hash.new
20
- h[remote.remote_object] = 1
21
- assert_equal(1, h[remote.remote_object])
22
-
23
- s = Set.new
24
- s << remote.remote_object
25
- assert(s.include?(remote.remote_object))
26
-
27
- object = Object.new
28
- assert_equal(object, object.remote_id.local_object)
29
- end
30
-
31
- TEST_ARRAY_SIZE = 7
32
- def dumpable_array
33
- task = SimpleTask.new(:id => 1)
34
- [1, task,
35
- Roby::EventGenerator.new {},
36
- SimpleTask.new(:id => 2),
37
- task.event(:start),
38
- Roby::TaskStructure::Hierarchy,
39
- Class.new(SimpleTask).new(:id => 3) ]
40
- end
41
- def dumpable_hash
42
- Hash[*(0...TEST_ARRAY_SIZE).zip(dumpable_array).flatten]
43
- end
44
- def check_undumped_array(array, recursive = true)
45
- assert_equal(TEST_ARRAY_SIZE, array.size)
46
- assert_equal(1, array[0])
47
-
48
- assert_kind_of(Task::DRoby, array[1])
49
- assert_equal({:id => 1}, array[1].arguments)
50
- assert_equal(SimpleTask, array[1].model.proxy(remote_peer))
51
-
52
- assert_kind_of(EventGenerator::DRoby, array[2])
53
- assert(array[2].controlable)
54
- assert_equal(EventGenerator, array[2].model.proxy(remote_peer))
55
-
56
- assert_kind_of(Task::DRoby, array[3])
57
- assert_equal({:id => 2}, array[3].arguments)
58
- assert_equal(SimpleTask, array[3].model.proxy(remote_peer))
59
-
60
- assert_kind_of(TaskEventGenerator::DRoby, array[4])
61
- assert_equal(array[1].remote_siblings, array[4].task.remote_siblings)
62
- assert_equal(:start, array[4].symbol)
63
-
64
- assert_kind_of(Roby::Distributed::DRobyConstant, array[5])
65
- assert_equal(Roby::TaskStructure::Hierarchy.object_id, array[5].proxy(nil).object_id)
66
-
67
- assert_kind_of(Task::DRoby, array[6])
68
- assert_not_equal(Task, array[6].model.proxy(remote_peer))
69
-
70
- array.each do |element|
71
- assert_nothing_raised(element.to_s) { Marshal.dump(element) }
72
- end
73
- dumped = nil
74
- assert_nothing_raised { dumped = Marshal.dump(array) }
75
-
76
- if recursive
77
- check_undumped_array(Marshal.load(dumped), false)
78
- end
79
- end
80
-
81
- def test_array_droby_dump
82
- FlexMock.use do |mock|
83
- mock.should_receive(:droby_dump).and_return("mock")
84
- array = [1, mock]
85
- assert_equal([1, "mock"], array.droby_dump(nil))
86
- end
87
- end
88
-
89
- def test_set_droby_dump
90
- FlexMock.use do |mock|
91
- mock.should_receive(:droby_dump).and_return("mock")
92
- set = [1, mock, "q"].to_set
93
- assert_equal([1, "mock", "q"].to_set, set.droby_dump(nil))
94
- end
95
- end
96
-
97
- def test_hash_droby_dump
98
- FlexMock.use do |mock|
99
- mock.should_receive(:droby_dump).and_return("mock")
100
- hash = { 1 => mock, mock => "q" }
101
- assert_equal({ 1 => "mock", "mock" => "q" }, hash.droby_dump(nil))
102
- end
103
- end
104
-
105
- def test_value_set_droby_dump
106
- FlexMock.use do |mock|
107
- mock.should_receive(:droby_dump).and_return("mock")
108
- value_set = [1, mock, "q"].to_value_set
109
-
110
-
111
- dumped = value_set.droby_dump(nil)
112
- assert_kind_of(ValueSet, dumped)
113
- assert_equal([1, "mock", "q"].to_set, dumped.to_set)
114
- end
115
- end
116
-
117
-
118
- def test_enumerables
119
- test_case = self
120
- peer2peer do |remote|
121
- PeerServer.class_eval do
122
- define_method(:array) { test_case.dumpable_array }
123
- define_method(:value_set) { test_case.dumpable_array.to_value_set }
124
- define_method(:_hash) { test_case.dumpable_hash }
125
- define_method(:array_of_array) { [test_case.dumpable_array] }
126
- end
127
- end
128
-
129
- array = remote_peer.call(:array)
130
- assert_kind_of(Array, array)
131
- check_undumped_array(array)
132
-
133
- hash = remote_peer.call(:_hash)
134
- assert_kind_of(Hash, hash)
135
- check_undumped_array(hash)
136
-
137
- array_of_array = remote_peer.call(:array_of_array)
138
- assert_kind_of(Array, array_of_array)
139
- check_undumped_array(array_of_array[0])
140
-
141
- set = remote_peer.call(:value_set)
142
- assert_kind_of(ValueSet, set)
143
- assert_equal(TEST_ARRAY_SIZE, set.size)
144
- assert(set.find { |o| o == 1 })
145
- assert(set.find { |t| t.kind_of?(Task::DRoby) && t.arguments[:id] == 1 })
146
- assert(set.find { |e| e.kind_of?(EventGenerator::DRoby) })
147
- assert(set.find { |t| t.kind_of?(Task::DRoby) && t.arguments[:id] == 2 })
148
- end
149
-
150
- def test_marshal_peer
151
- peer2peer do |remote|
152
- def remote.remote_peer_id; Distributed.state.remote_id end
153
- end
154
-
155
- m_local = remote_peer.call(:peer)
156
- assert_equal(Distributed.remote_id, m_local.peer_id)
157
- assert_equal(Roby::Distributed, m_local.proxy(nil))
158
- assert_equal(remote_peer.remote_id, remote.remote_peer_id)
159
- end
160
-
161
- def test_marshal_model
162
- peer2peer do |remote|
163
- PeerServer.class_eval do
164
- def model; SimpleTask end
165
- def anonymous_model; @anonymous ||= Class.new(model) end
166
- def check_anonymous_model(remote_model)
167
- @anonymous == peer.local_object(remote_model)
168
- end
169
- end
170
- end
171
-
172
- assert_equal(SimpleTask, remote_peer.call(:model).proxy(remote_peer))
173
-
174
- anonymous = remote_peer.call(:anonymous_model).proxy(remote_peer)
175
- assert_not_same(anonymous, SimpleTask)
176
- assert(anonymous < SimpleTask)
177
- assert(remote_peer.call(:check_anonymous_model, anonymous))
178
- end
179
-
180
- def test_marshal_task
181
- peer2peer do |remote|
182
- PeerServer.class_eval do
183
- def task
184
- plan.add_mission(@task = Class.new(SimpleTask).new(:id => 1))
185
- @task.data = [42, @task.class]
186
- [@task, @task.remote_id]
187
- end
188
- def check_sibling(remote_id)
189
- @task.remote_siblings[peer] == remote_id
190
- end
191
- end
192
- end
193
-
194
- remote_task, remote_task_id = remote_peer.call(:task)
195
- assert_kind_of(Task::DRoby, remote_task)
196
- assert_equal({:id => 1}, remote_task.arguments)
197
- assert_kind_of(Plan::DRoby, remote_task.plan)
198
- assert_equal("Roby::Test::SimpleTask", remote_task.model.ancestors[1].first)
199
- assert_equal([42, remote_task.model], remote_task.data)
200
- assert_nothing_raised { Marshal.dump(remote_task) }
201
- assert_equal(remote_task_id, remote_task.remote_siblings[remote_peer.droby_dump(nil)], remote_task.remote_siblings)
202
- assert(!remote_task.remote_siblings[Roby::Distributed.droby_dump(nil)])
203
-
204
- plan.add_permanent(local_proxy = remote_peer.local_object(remote_task))
205
- assert_kind_of(SimpleTask, local_proxy)
206
- assert_not_same(SimpleTask, local_proxy.class)
207
- assert_equal([42, local_proxy.class], local_proxy.data)
208
-
209
- assert_equal([remote_peer], local_proxy.owners)
210
- assert_equal(remote_task_id, local_proxy.remote_siblings[remote_peer])
211
- assert(!local_proxy.read_write?)
212
- assert( local_proxy.root_object?)
213
- assert(!local_proxy.event(:start).root_object?)
214
- remote_peer.synchro_point
215
- assert(remote_peer.call(:check_sibling, local_proxy.remote_id))
216
- assert(local_proxy.executable?)
217
- Roby.execute do
218
- assert_raises(OwnershipError) { local_proxy.start! }
219
- end
220
- end
221
-
222
- class ErrorWithArguments < Exception
223
- def initialize(a, b)
224
- end
225
- end
226
-
227
- def test_marshal_exception
228
- model = Class.new(Exception)
229
- e = model.exception("test")
230
-
231
- formatted = Distributed.format(e)
232
- assert_kind_of(Exception::DRoby, formatted)
233
- assert_nothing_raised { Marshal.dump(formatted) }
234
-
235
- peer2peer do |remote|
236
- def remote.exception
237
- model = Class.new(Exception)
238
- e = model.exception("test")
239
- Distributed.format(e)
240
- end
241
-
242
- def remote.exception_with_arguments
243
- e = begin
244
- raise ErrorWithArguments.new(1, 2), "test"
245
- rescue ErrorWithArguments => e
246
- e
247
- end
248
-
249
- Distributed.format(e)
250
- end
251
- end
252
-
253
- m_e = remote.exception
254
- e = remote_peer.local_object(m_e)
255
- assert_kind_of(Exception, e)
256
- assert_not_same(Exception, e.class)
257
- assert_equal("test", e.message)
258
-
259
- m_e = remote.exception_with_arguments
260
- e = remote_peer.local_object(m_e)
261
- assert_kind_of(Exception, e)
262
- assert_same(Exception, e.class)
263
- assert_equal("test (TC_DistributedRobyProtocol::ErrorWithArguments)", e.message)
264
- end
265
-
266
- # See #test_local_task_back_forth_through_drb_race_condition
267
- # This test checks the case where we received the added_sibling message
268
- def test_local_task_back_forth_through_drb
269
- peer2peer do |remote|
270
- PeerServer.class_eval do
271
- def proxy(object)
272
- Marshal.dump(object)
273
- plan.add_permanent(task = peer.local_object(object))
274
- task
275
- end
276
- end
277
- end
278
-
279
- plan.add_permanent(local_task = SimpleTask.new(:id => 'local'))
280
- remote_proxy = remote_peer.call(:proxy, local_task)
281
- remote_peer.synchro_point
282
- assert(remote_peer.proxies[remote_proxy], [remote_peer.proxies, remote_proxy])
283
- assert_same(local_task, remote_peer.local_object(remote_proxy), "#{local_task} #{remote_proxy}")
284
- end
285
-
286
- # This tests the handling of the following race condition:
287
- # * we send throught DRb a local object and gets back the marshalled
288
- # proxy of our remote peer
289
- # * we get the local object which corresponds to the marshalled
290
- # object, which should be the original local object
291
- #
292
- # The trick here is that, since we disable communication, we call
293
- # #local_object while the local host does not know yet that the remote host
294
- # has a sibling for the object
295
- def test_local_task_back_forth_through_drb_race_condition
296
- peer2peer do |remote|
297
- def remote.proxy(object)
298
- Marshal.dump(object)
299
- plan.add_permanent(task = local_peer.local_object(object))
300
- task
301
- end
302
- end
303
-
304
- begin
305
- remote.disable_communication
306
- plan.add_permanent(local_task = SimpleTask.new(:id => 'local'))
307
- remote_proxy = remote.proxy(Distributed.format(local_task))
308
- assert_equal(remote_proxy, remote.proxy(Distributed.format(local_task)))
309
- assert(!remote_peer.proxies[remote_proxy])
310
-
311
- ensure
312
- remote.enable_communication
313
- end
314
-
315
- # Test that it is fine to receive the #added_sibling message now
316
- assert_nothing_raised { remote_peer.synchro_point }
317
- end
318
-
319
- class FinalizedRemoteTaskRaceTask < SimpleTask
320
- argument :newarg
321
- end
322
-
323
- # test a particular situations of GC/communication interaction
324
- # - A finalizes a task T which is owned by B
325
- # - A receives a message involving T which has been emitted while B was not knowing about the
326
- # deletion (it has not yet received the removed_sibling message)
327
- def test_finalized_remote_task_race_condition
328
- peer2peer do |remote|
329
- remote.plan.add_mission(task = FinalizedRemoteTaskRaceTask.new(:id => 'remote'))
330
-
331
- remote.singleton_class.class_eval do
332
- define_method(:send_task_update) do
333
- task.arguments[:newarg] = 'tested'
334
- Distributed.format(task)
335
- end
336
- end
337
- end
338
-
339
- task = remote_task(:id => 'remote') do |task|
340
- remote_peer.disable_tx
341
- task
342
- end
343
-
344
- engine.wait_one_cycle
345
- assert(!task.plan)
346
-
347
- new_task = remote_peer.local_object(remote.send_task_update)
348
- assert_not_same(task, new_task)
349
- assert_equal('tested', new_task.arguments[:newarg])
350
-
351
- ensure
352
- remote_peer.enable_tx
353
- end
354
-
355
- def test_marshal_task_arguments
356
- peer2peer do |remote|
357
- PeerServer.class_eval do
358
- def task
359
- plan.add_mission(@task = model.new(:id => 1, :model => model))
360
- @task
361
- end
362
- def model
363
- @model ||= Class.new(SimpleTask) do
364
- argument :model
365
- end
366
- end
367
- end
368
- end
369
- m_model = remote_peer.call(:model)
370
- m = m_model.proxy(remote_peer)
371
-
372
- m_task = remote_peer.call(:task)
373
- assert_nothing_raised { Marshal.dump(m_task) }
374
- assert_equal(m_model.ancestors, m_task.arguments[:model].ancestors)
375
- assert_equal(m_model.tags, m_task.arguments[:model].tags)
376
- t = remote_peer.local_object(m_task)
377
- assert_equal({ :id => 1, :model => m }, t.arguments)
378
- end
379
-
380
- def test_marshal_task_event
381
- peer2peer do |remote|
382
- PeerServer.class_eval do
383
- attr_reader :task
384
- def task_event
385
- @task = Class.new(SimpleTask).new(:id => 1)
386
- task.event(:start)
387
- end
388
- end
389
- end
390
-
391
- remote_event = remote_peer.call(:task_event)
392
- assert_nothing_raised { Marshal.dump(remote_event) }
393
- assert_kind_of(TaskEventGenerator::DRoby, remote_event)
394
- task = remote_peer.call(:task)
395
- assert_equal(task.remote_siblings, remote_event.task.remote_siblings)
396
- assert_equal(remote_peer.local_object(task), remote_peer.local_object(remote_event.task))
397
- end
398
-
399
- CommonTaskModelTag = TaskModelTag.new
400
- def test_marshal_task_model_tag
401
- peer2peer do |remote|
402
- PeerServer.class_eval do
403
- def tag; CommonTaskModelTag end
404
- def anonymous_tag
405
- @anonymous ||= TaskModelTag.new do
406
- include CommonTaskModelTag
407
- end
408
- end
409
- def tagged_task_model
410
- Class.new(SimpleTask) do
411
- include CommonTaskModelTag
412
- end
413
- end
414
- def anonymously_tagged_task_model
415
- tag = anonymous_tag
416
- Class.new(SimpleTask) do
417
- include tag
418
- end
419
- end
420
- end
421
- end
422
-
423
- Marshal.dump(CommonTaskModelTag)
424
- assert_equal(CommonTaskModelTag, remote_peer.call(:tag).proxy(remote_peer))
425
- tagged_task_model = remote_peer.call(:tagged_task_model).proxy(remote_peer)
426
- assert(tagged_task_model.has_ancestor?(CommonTaskModelTag), tagged_task_model.ancestors)
427
-
428
- anonymous_tag = remote_peer.call(:anonymous_tag).proxy(remote_peer)
429
- assert_not_equal(CommonTaskModelTag, anonymous_tag)
430
- assert(anonymous_tag.has_ancestor?(CommonTaskModelTag), anonymous_tag.ancestors)
431
- assert_equal(anonymous_tag, remote_peer.call(:anonymous_tag).proxy(remote_peer))
432
-
433
- tagged_task_model = remote_peer.call(:anonymously_tagged_task_model).proxy(remote_peer)
434
- assert(tagged_task_model.has_ancestor?(CommonTaskModelTag))
435
- assert(tagged_task_model.has_ancestor?(anonymous_tag))
436
- end
437
-
438
- def test_marshal_event
439
- peer2peer do |remote|
440
- remote.plan.add_mission(t = Task.new)
441
- t.signals(:start, (ev = EventGenerator.new(true)))
442
- t.event(:start).forward_to(ev = EventGenerator.new(false))
443
- t.signals(:start, (ev = EventGenerator.new { }))
444
- PeerServer.class_eval do
445
- include Test::Unit::Assertions
446
- define_method(:events) { plan.free_events }
447
- end
448
- end
449
-
450
- marshalled = remote_peer.call(:events)
451
- marshalled.each { |ev| assert_kind_of(EventGenerator::DRoby, ev) }
452
- Roby.execute do
453
- all_events = marshalled.map { |ev| remote_peer.local_object(ev) }
454
- assert_equal(1, all_events.find_all { |ev| !ev.controlable? }.size)
455
- assert_equal(2, all_events.find_all { |ev| ev.controlable? }.size)
456
- all_events.each do |ev|
457
- if ev.controlable?
458
- assert_raises(OwnershipError) { ev.call }
459
- end
460
- assert_raises(OwnershipError) { ev.emit }
461
- end
462
- end
463
- end
464
-
465
- def test_siblings
466
- peer2peer do |remote|
467
- plan.add_mission(Roby::Task.new(:id => 'remote'))
468
- end
469
-
470
- plan.add_mission(remote_task = remote_task(:id => 'remote'))
471
- assert(remote_task.has_sibling_on?(remote_peer))
472
- remote_object, _ = remote_peer.proxies.find { |_, task| task == remote_task }
473
- assert(remote_object)
474
- assert_equal(remote_object, remote_task.sibling_on(remote_peer))
475
-
476
- assert_equal(remote_task, remote_task(:id => 'remote'))
477
- process_events
478
- assert_equal(remote_task, remote_task(:id => 'remote'))
479
- end
480
-
481
-
482
- def test_incremental_dump
483
- DRb.start_service
484
- FlexMock.use do |obj|
485
- obj.should_receive(:droby_dump).and_return([]).once
486
- FlexMock.use do |destination|
487
- destination.should_receive(:incremental_dump?).and_return(false).once
488
- assert_equal([], Distributed.format(obj, destination))
489
- end
490
-
491
- obj.should_receive(:remote_id).and_return(Distributed::RemoteID.from_object(obj)).once
492
- FlexMock.use do |destination|
493
- destination.should_receive(:incremental_dump?).and_return(true).once
494
- assert_equal(Distributed::RemoteID.from_object(obj), Distributed.format(obj, destination))
495
- end
496
- end
497
- end
498
-
499
- def test_local_object
500
- model = Class.new(Roby::Task) do
501
- local_only
502
- end
503
- task = model.new
504
- assert(!task.distribute?)
505
- end
506
-
507
- def test_dump_sequence
508
- DRb.start_service
509
- t1, t2 = prepare_plan :add => 2
510
- p = t1+t2
511
-
512
- formatted = Distributed.format(p)
513
- assert_nothing_raised(formatted.to_s) { Marshal.dump(formatted) }
514
- end
515
-
516
- def test_dump_parallel
517
- DRb.start_service
518
- t1, t2 = prepare_plan :add => 2
519
- p = t1|t2
520
-
521
- formatted = Distributed.format(p)
522
- assert_nothing_raised(formatted.to_s) { Marshal.dump(formatted) }
523
- end
524
- end
525
-