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,106 +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_DistributedQuery < Test::Unit::TestCase
7
- include Roby::Distributed::Test
8
-
9
- def test_ownership
10
- DRb.start_service
11
- FlexMock.use do |fake_peer|
12
- fake_peer.should_receive(:remote_name).and_return('fake_peer')
13
- fake_peer.should_receive(:subscribed_plan?).and_return(false)
14
- fake_peer.should_receive(:subscribed?).and_return(false)
15
-
16
- t1 = Class.new(Task).new
17
- t2 = Class.new(Task).new
18
- t2.owners << fake_peer
19
- plan.add [t1, t2]
20
-
21
- assert_equal([t1].to_set, TaskMatcher.owned_by(Distributed).enum_for(:each, plan).to_set)
22
- assert_equal([t1].to_set, TaskMatcher.self_owned.enum_for(:each, plan).to_set)
23
- assert_equal([t2].to_set, TaskMatcher.owned_by(fake_peer, Distributed).enum_for(:each, plan).to_set, plan.task_index.by_owner)
24
- assert_equal([].to_set, TaskMatcher.owned_by(fake_peer).enum_for(:each, plan).to_set, plan.task_index.by_owner)
25
- end
26
- end
27
-
28
- def test_marshal_query
29
- peer2peer do |remote|
30
- PeerServer.class_eval do
31
- def query
32
- plan.find_tasks
33
- end
34
- end
35
- end
36
-
37
- m_query = remote_peer.call(:query)
38
- assert_kind_of(Query::DRoby, m_query)
39
- query = remote_peer.local_object(m_query)
40
- assert_kind_of(Query, query)
41
- end
42
-
43
- class QueryTaskModel < Roby::Task
44
- argument :id
45
- end
46
-
47
- # Check that we can query the remote plan database
48
- def test_query
49
- peer2peer do |remote|
50
- local_model = Class.new(SimpleTask)
51
-
52
- mission, subtask = QueryTaskModel.new(:id => 1), local_model.new(:id => 2)
53
- mission.depends_on subtask
54
- remote.plan.add_mission(mission)
55
- end
56
-
57
- # Get the remote missions
58
- r_missions = remote_peer.find_tasks.mission.to_a
59
- assert(r_missions.find { |t| t.arguments[:id] == 1 }, r_missions)
60
-
61
- # Test queries
62
- result = remote_peer.find_tasks.to_a
63
- assert_equal(2, result.size)
64
-
65
- result = remote_peer.find_tasks.
66
- with_arguments(:id => 1).to_a
67
- assert_equal(1, result.size)
68
- assert_equal(1, result[0].arguments[:id])
69
-
70
- result = remote_peer.find_tasks.
71
- with_arguments(:id => 2).to_a
72
- assert_equal(1, result.size)
73
- assert(2, result[0].arguments[:id])
74
-
75
- result = (TaskMatcher.with_arguments(:id => 1) | TaskMatcher.with_arguments(:id => 2)).enum_for(:each, remote_peer).to_a
76
- assert_equal(2, result.size)
77
-
78
- result = (TaskMatcher.with_arguments(:id => 1) & TaskMatcher.with_model(SimpleTask)).enum_for(:each, remote_peer).to_a
79
- assert_equal(0, result.size)
80
-
81
- result = TaskMatcher.with_arguments(:id => 1).negate.enum_for(:each, remote_peer).to_a
82
- assert_equal(1, result.size, result)
83
-
84
- result = remote_peer.find_tasks.
85
- with_model(Roby::Task).to_a
86
- assert_equal(2, result.size)
87
-
88
- result = remote_peer.find_tasks.
89
- with_model(SimpleTask).to_a
90
- assert_equal(1, result.size)
91
- assert(2, result[0].arguments[:id])
92
-
93
- r_subtask = *remote_peer.find_tasks.
94
- with_arguments(:id => 2).to_a
95
- result = remote_peer.find_tasks.
96
- with_model(r_subtask.model).to_a
97
- assert_equal(1, result.size)
98
- assert(2, result[0].arguments[:id])
99
-
100
- assert_equal([], remote_peer.find_tasks.
101
- self_owned.to_a)
102
- assert_equal(2, remote_peer.find_tasks.
103
- owned_by(remote_peer).to_a.size)
104
- end
105
- end
106
-
@@ -1,491 +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 local views of remote plans
6
- class TC_DistributedRemotePlan < Test::Unit::TestCase
7
- include Roby::Distributed::Test
8
-
9
- def test_distributed_update
10
- objects = (1..10).map { |i| SimpleTask.new(:id => i) }
11
- obj = Object.new
12
-
13
- Distributed.update(obj) do
14
- assert(Distributed.updating?(obj))
15
- end
16
- assert(!Distributed.updating?(obj))
17
-
18
- Distributed.update_all(objects) do
19
- objects.each { |o| assert(Distributed.updating?(o)) }
20
- assert(Distributed.updating_all?(objects))
21
- assert(!Distributed.updating?(obj))
22
- assert(!Distributed.updating_all?(objects.dup << obj))
23
- end
24
- objects.each { |o| assert(!Distributed.updating?(o)) }
25
- assert(!Distributed.updating_all?(objects))
26
-
27
- # Recursive behaviour
28
- Distributed.update(obj) do
29
- Distributed.update(obj) do
30
- assert(Distributed.updating?(obj))
31
- end
32
- assert(Distributed.updating?(obj))
33
-
34
- Distributed.update_all(objects) do
35
- objects.each { |o| assert(Distributed.updating?(o)) }
36
- assert(Distributed.updating_all?(objects))
37
- assert(Distributed.updating?(obj))
38
- assert(Distributed.updating_all?(objects.dup << obj))
39
- end
40
- objects.each { |o| assert(!Distributed.updating?(o), o) }
41
- assert(!Distributed.updating_all?(objects))
42
- assert(!Distributed.updating_all?(objects.dup << obj))
43
- assert(Distributed.updating?(obj))
44
- end
45
- assert(!Distributed.updating?(obj))
46
-
47
- # Recursive behaviour
48
- Distributed.update_all(objects) do
49
- Distributed.update(obj) do
50
- assert(Distributed.updating?(obj))
51
- assert(Distributed.updating_all?(objects.dup << obj))
52
- end
53
- assert(!Distributed.updating?(obj))
54
- assert(Distributed.updating_all?(objects))
55
-
56
- Distributed.update_all(objects[1..4]) do
57
- assert(Distributed.updating_all?(objects))
58
- assert(!Distributed.updating?(obj))
59
- end
60
- assert(Distributed.updating_all?(objects))
61
- assert(!Distributed.updating_all?(objects.dup << obj))
62
- assert(!Distributed.updating?(obj))
63
- end
64
- assert(!Distributed.updating?(obj))
65
- assert(!Distributed.updating_all?(objects))
66
- end
67
-
68
- def test_remote_proxy_update
69
- peer2peer do |remote|
70
- remote.plan.add_mission(SimpleTask.new(:id => 'simple_task'))
71
- remote.plan.add_permanent(SimpleTask.new(:id => 'task'))
72
- remote.plan.add_permanent(SimpleTask.new(:id => 'other_task'))
73
- end
74
-
75
- r_simple_task = remote_task(:id => 'simple_task', :permanent => true)
76
- r_task = remote_task(:id => 'task', :permanent => true)
77
- r_other_task = remote_task(:id => 'other_task', :permanent => true)
78
-
79
- task = SimpleTask.new
80
- assert(!r_simple_task.read_write?, r_simple_task.plan)
81
- Distributed.update(r_simple_task) do
82
- assert(r_simple_task.read_write?)
83
- assert_nothing_raised do
84
- r_simple_task.depends_on task
85
- r_simple_task.remove_child task
86
- task.depends_on r_simple_task
87
- task.remove_child r_simple_task
88
- end
89
- end
90
- assert(!r_simple_task.read_write?)
91
-
92
- assert_raises(OwnershipError) { r_simple_task.depends_on task }
93
- assert_raises(OwnershipError) { task.depends_on r_simple_task }
94
- Distributed.update(r_simple_task) { r_simple_task.depends_on task }
95
- assert_nothing_raised { r_simple_task.remove_child task }
96
- Distributed.update(r_simple_task) { task.depends_on r_simple_task }
97
- assert_nothing_raised { task.remove_child r_simple_task }
98
-
99
- assert_raises(OwnershipError) { r_simple_task.depends_on r_other_task }
100
- assert_raises(OwnershipError) { r_other_task.depends_on r_simple_task }
101
- Distributed.update_all([r_simple_task, r_other_task]) { r_simple_task.depends_on r_other_task }
102
- assert_raises(OwnershipError) { r_simple_task.remove_child r_other_task }
103
- Distributed.update_all([r_simple_task, r_other_task]) do
104
- r_simple_task.remove_child r_other_task
105
- r_other_task.depends_on r_simple_task
106
- end
107
- assert_raises(OwnershipError) { r_other_task.remove_child r_simple_task }
108
-
109
- # Force a synchro point, or we will have a conflict between the remote
110
- # GC process and the pending messages
111
- #
112
- # ... did I already told that distributed transactions were here for
113
- # something ?
114
- remote_peer.synchro_point
115
- end
116
-
117
- # Test that the remote plan structure is properly mapped to the local
118
- # plan database
119
- def test_discover_neighborhood
120
- peer2peer do |remote|
121
- mission, subtask, next_mission =
122
- SimpleTask.new(:id => 'mission'),
123
- SimpleTask.new(:id => 'subtask'),
124
- SimpleTask.new(:id => 'next_mission')
125
- mission.depends_on subtask
126
- mission.signals(:stop, next_mission, :start)
127
-
128
- remote.plan.add_mission(mission)
129
- remote.plan.add_mission(next_mission)
130
- end
131
-
132
- r_mission = remote_task(:id => 'mission', :permanent => true)
133
- r_subtask = remote_task(:id => 'subtask', :permanent => true)
134
- r_next_mission = remote_task(:id => 'next_mission', :permanent => true)
135
-
136
- # We don't know about the remote relations
137
- assert_equal([], r_mission.children.to_a)
138
- assert_equal([], r_mission.event(:stop).child_objects(EventStructure::Signal).to_a)
139
-
140
- # add remote relations
141
- remote_peer.discover_neighborhood(r_mission, 1) do |r_mission|
142
- proxies = r_mission.children.to_a
143
- assert_equal(1, proxies.to_a.size)
144
- assert_equal(r_subtask, proxies.first)
145
- proxies = r_mission.event(:stop).child_objects(EventStructure::Signal).to_a
146
- assert_equal(r_next_mission.event(:start), proxies.first)
147
- end
148
-
149
- plan.unmark_permanent(r_mission)
150
- plan.unmark_permanent(r_subtask)
151
- plan.unmark_permanent(r_next_mission)
152
- engine.wait_one_cycle
153
- assert_equal([remote_peer.task], plan.permanent_tasks.to_a)
154
- end
155
-
156
- def test_subscribing_old_objects
157
- peer2peer do |remote|
158
- plan.add_mission(@task = SimpleTask.new(:id => 1))
159
- end
160
-
161
- r_task, r_task_id = nil
162
- r_task = remote_task(:id => 1) do |t|
163
- assert(r_task_id = t.remote_siblings[remote_peer])
164
- t
165
- end
166
-
167
- process_events
168
- assert(!r_task.plan)
169
- assert_raises(Roby::RemotePeerMismatch) { remote_peer.subscribe(r_task) }
170
- end
171
-
172
- def test_subscription
173
- peer2peer do |remote|
174
- root, mission, subtask, next_mission =
175
- SimpleTask.new(:id => 'root'),
176
- SimpleTask.new(:id => 'mission'),
177
- SimpleTask.new(:id => 'subtask'),
178
- SimpleTask.new(:id => 'next_mission')
179
- root.depends_on mission
180
- mission.depends_on subtask
181
- mission.signals(:stop, next_mission, :start)
182
-
183
- remote.plan.add_permanent(subtask)
184
- remote.plan.add_mission(root)
185
- remote.plan.add_mission(mission)
186
- remote.plan.add_mission(next_mission)
187
-
188
- remote.singleton_class.class_eval do
189
- include Test::Unit::Assertions
190
- def check_local_updated(m_task)
191
- task = local_peer.local_object(m_task)
192
- sibling = nil
193
- assert_nothing_raised { sibling = task.sibling_on(local_peer) }
194
- assert(!task.subscribed?)
195
- assert(task.updated?)
196
- assert(task.update_on?(local_peer))
197
- assert(task.updated_by?(local_peer))
198
- assert_equal([local_peer], Distributed.enum_for(:each_updated_peer, task).to_a)
199
- assert_equal([local_peer], task.updated_peers)
200
- assert(task.remotely_useful?)
201
- end
202
-
203
- define_method(:remove_mission_subtask) do
204
- mission.remove_child subtask
205
- end
206
- define_method(:add_mission_subtask) do
207
- mission.depends_on subtask
208
- end
209
- end
210
- end
211
-
212
- r_root = subscribe_task(:id => 'root')
213
- # Check that the task index has been updated
214
- assert(plan.task_index.by_owner[remote_peer].include?(r_root))
215
-
216
- # No need to explicitely synchronize here. #subscribe is supposed to return only
217
- # when the subscription is completely done (i.e. the remote peer knows we have
218
- # a sibling)
219
- remote.check_local_updated(Distributed.format(r_root))
220
- assert(r_root.subscribed?, remote_peer.subscriptions)
221
- assert(r_root.updated_by?(remote_peer))
222
- assert(r_root.update_on?(remote_peer))
223
- assert_equal([remote_peer], r_root.updated_peers)
224
- assert(!r_root.remotely_useful?)
225
- assert_equal([remote_peer], Distributed.enum_for(:each_updated_peer, r_root).to_a)
226
-
227
- assert(r_root.mission?)
228
- r_mission = remote_task(:id => 'mission')
229
- assert_equal([r_mission], r_root.children.to_a)
230
- assert_equal([], r_mission.children.to_a)
231
- assert_equal([], r_mission.event(:stop).child_objects(EventStructure::Signal).to_a)
232
-
233
- assert(plan.useful_task?(r_mission))
234
- r_next_mission = remote_task(:id => 'next_mission')
235
- r_subtask = remote_task(:id => 'subtask')
236
- Roby.synchronize do
237
- assert(!r_next_mission.plan || !plan.useful_task?(r_next_mission))
238
- assert(!r_subtask.plan || !plan.useful_task?(r_subtask))
239
- end
240
- engine.wait_one_cycle
241
-
242
- # Check that the task index has been updated
243
- assert(!plan.task_index.by_owner[remote_peer].include?(r_subtask))
244
-
245
- # Check that subscribing again is handled nicely
246
- assert_same(r_root, remote_peer.subscribe(r_root))
247
- assert_same(r_mission, remote_peer.subscribe(r_mission))
248
- r_subtask = remote_task(:id => 'subtask')
249
- assert(!plan.unneeded_tasks.include?(r_subtask))
250
- r_next_mission = remote_task(:id => 'next_mission')
251
- Roby.synchronize do
252
- assert(!r_next_mission.plan || plan.unneeded_tasks.include?(r_next_mission))
253
- end
254
-
255
- assert_equal([r_subtask], r_mission.children.to_a)
256
-
257
- ## Check plan GC after we have unsubscribed from mission
258
- remote_peer.unsubscribe(r_mission)
259
- Roby.synchronize do
260
- assert(r_mission.plan)
261
- assert(!plan.unneeded_tasks.include?(r_mission))
262
- assert(!remote_peer.subscribed?(r_mission))
263
- assert(plan.unneeded_tasks.include?(r_subtask))
264
- end
265
- engine.wait_one_cycle
266
-
267
- # Check that subtask and next_mission are removed from the plan
268
- assert(!r_subtask.plan)
269
- assert_raises(RemotePeerMismatch) { r_subtask.sibling_on(remote_peer) }
270
- subtask_proxy = remote_peer.proxies.find do |_, obj|
271
- obj == r_subtask ||
272
- (obj.root_object == r_subtask if obj.respond_to?(:root_object))
273
- end
274
- assert(!subtask_proxy)
275
- assert_raises(RemotePeerMismatch) { r_next_mission.sibling_on(remote_peer) }
276
- next_mission_proxy = remote_peer.proxies.find do |_, obj|
277
- obj == r_next_mission ||
278
- (obj.root_object == r_next_mission if obj.respond_to?(:root_object))
279
- end
280
- assert(!next_mission_proxy)
281
- # Check that mission is still included, and is still linked to root
282
- assert(r_mission.plan)
283
- assert(r_root.child_object?(r_mission, TaskStructure::Hierarchy))
284
-
285
- ## Check that #subscribe takes the plan modification into account
286
- remote.remove_mission_subtask
287
- assert_same(r_mission, remote_peer.subscribe(r_mission))
288
- proxies = r_mission.children.to_a
289
- assert(proxies.empty?, proxies)
290
- assert(!plan.unneeded_tasks.include?(r_mission))
291
- assert(!plan.unneeded_tasks.include?(r_mission.event(:stop)))
292
-
293
- ## Re-add the child relation and test #unsubscribe
294
- remote_peer.unsubscribe(r_mission)
295
- process_events
296
- remote.add_mission_subtask
297
- process_events
298
- assert(r_mission.plan)
299
- assert(r_mission.leaf?(TaskStructure::Hierarchy))
300
-
301
- r_mission = remote_peer.subscribe(r_mission)
302
- r_subtask = remote_task(:id => 'subtask')
303
- r_next_mission = remote_task(:id => 'next_mission')
304
- engine.wait_one_cycle
305
-
306
- proxies = r_mission.children.to_a
307
- assert(! proxies.empty?)
308
- end
309
-
310
- def test_remove_not_needed
311
- peer2peer do |remote|
312
- left, right, middle =
313
- SimpleTask.new(:id => 'left'),
314
- SimpleTask.new(:id => 'right'),
315
- SimpleTask.new(:id => 'middle')
316
- remote.plan.add_mission(left)
317
- remote.plan.add_mission(right)
318
-
319
- left.depends_on middle
320
- right.depends_on middle
321
-
322
- remote.singleton_class.class_eval do
323
- include Test::Unit::Assertions
324
- define_method(:remove_last_link) do
325
- assert(left.update_on?(local_peer))
326
- assert(middle.update_on?(local_peer))
327
- left.remove_child(middle)
328
- nil
329
- end
330
- end
331
- end
332
-
333
- left = subscribe_task(:id => 'left')
334
- right = subscribe_task(:id => 'right')
335
- middle = remote_task(:id => 'middle')
336
- assert(!middle.subscribed?)
337
- assert(!plan.unneeded_tasks.include?(left))
338
- assert(!plan.unneeded_tasks.include?(right))
339
- assert(!plan.unneeded_tasks.include?(middle))
340
-
341
- Roby.synchronize do
342
- remote_peer.unsubscribe(right)
343
- assert(!right.remotely_useful?)
344
- assert(!right.subscribed?)
345
- assert(plan.unneeded_tasks.include?(right))
346
- assert(!plan.unneeded_tasks.include?(middle))
347
- end
348
- process_events
349
- assert(!right.plan)
350
-
351
- assert(middle.plan)
352
- assert_equal(1, middle.parent_objects(TaskStructure::Hierarchy).to_a.size)
353
-
354
- remote.remove_last_link
355
- process_events
356
- assert(!middle.plan)
357
- end
358
-
359
- def test_data_update
360
- peer2peer do |remote|
361
- task = SimpleTask.new(:id => 'task')
362
- task.data = [4, 2]
363
- remote.plan.add_mission(task)
364
-
365
- remote.singleton_class.class_eval do
366
- define_method(:change_data) { task.data = 42 }
367
- end
368
- end
369
- task = subscribe_task(:id => 'task')
370
- assert_equal([4, 2], task.data)
371
-
372
- remote.change_data
373
- process_events
374
- assert_equal(42, task.data)
375
- end
376
-
377
- def test_mission_notifications
378
- peer2peer do |remote|
379
- plan.add_mission(mission = SimpleTask.new(:id => 'mission'))
380
-
381
- remote.class.class_eval do
382
- define_method(:discard_mission) do
383
- Roby.synchronize do
384
- remote.plan.unmark_mission(mission)
385
- remote.plan.add_permanent(mission)
386
- end
387
- end
388
- define_method(:insert_mission) do
389
- Roby.synchronize do
390
- remote.plan.unmark_permanent(mission)
391
- remote.plan.add_mission(mission)
392
- end
393
- end
394
- end
395
- end
396
- r_mission = subscribe_task(:id => 'mission')
397
- assert(r_mission.mission?)
398
- assert(!plan.mission?(r_mission))
399
-
400
- remote.discard_mission
401
- process_events
402
- assert(!r_mission.mission?)
403
- assert(!plan.mission?(r_mission))
404
-
405
- remote.insert_mission
406
- process_events
407
- assert(r_mission.mission?)
408
- assert(!plan.mission?(r_mission))
409
- end
410
-
411
- def test_relation_updates
412
- peer2peer do |remote|
413
- mission, subtask, next_mission =
414
- SimpleTask.new(:id => 'mission'),
415
- SimpleTask.new(:id => 'subtask'),
416
- SimpleTask.new(:id => 'next_mission')
417
-
418
- remote.plan.add_mission(mission)
419
- remote.plan.add_mission(next_mission)
420
- remote.plan.add_permanent(subtask)
421
-
422
- remote.singleton_class.class_eval do
423
- define_method(:add_mission_subtask) do
424
- mission.depends_on subtask
425
- end
426
- define_method(:remove_mission_subtask) do
427
- mission.remove_child subtask
428
- end
429
- define_method(:add_mission_stop_next_start) do
430
- mission.signals(:stop, next_mission, :start)
431
- end
432
- define_method(:remove_mission_stop_next_start) do
433
- mission.event(:stop).remove_signal(next_mission.event(:start))
434
- end
435
- end
436
- end
437
-
438
- r_mission = subscribe_task(:id => 'mission')
439
- r_subtask = subscribe_task(:id => 'subtask')
440
- r_next_mission = subscribe_task(:id => 'next_mission')
441
-
442
- remote.add_mission_subtask
443
- process_events
444
- assert_equal([r_subtask], r_mission.children.to_a)
445
-
446
- remote.remove_mission_subtask
447
- process_events
448
- assert(r_mission.leaf?(TaskStructure::Hierarchy))
449
-
450
- remote.add_mission_stop_next_start
451
- process_events
452
- assert_equal([r_next_mission.event(:start)], r_mission.event(:stop).child_objects(EventStructure::Signal).to_a)
453
-
454
- remote.remove_mission_stop_next_start
455
- process_events
456
- assert(r_mission.event(:stop).leaf?(EventStructure::Signal))
457
- end
458
-
459
- # Check that remote events that are unknown locally are properly ignored
460
- def test_ignored_events
461
- peer2peer do |remote|
462
- model = Class.new(SimpleTask) do
463
- event :unknown, :command => true
464
- end
465
- remote.plan.add_mission(t1 = SimpleTask.new(:id => 1))
466
- remote.plan.add_mission(t2 = SimpleTask.new(:id => 2))
467
- remote.plan.add_mission(u = model.new(:id => 0))
468
-
469
- t1.signals(:start, u, :unknown)
470
- u.forward_to(:unknown, t2, :start)
471
-
472
- remote.singleton_class.class_eval do
473
- define_method(:remove_relations) do
474
- t1.event(:start).remove_signal u.event(:unknown)
475
- u.event(:unknown).remove_forwarding t2.event(:start)
476
- end
477
- end
478
- end
479
-
480
- u = subscribe_task(:id => 0)
481
- t1 = remote_task(:id => 1)
482
- t2 = remote_task(:id => 2)
483
-
484
- assert(remote_peer.connected?)
485
-
486
- remote.remove_relations
487
- assert_nothing_raised { process_events }
488
- assert(remote_peer.connected?)
489
- end
490
- end
491
-