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,40 +1,125 @@
1
1
  require 'roby'
2
+ require 'roby/test/spec'
2
3
  require 'optparse'
3
4
 
5
+ Robot.logger.level = Logger::WARN
6
+
7
+ app = Roby.app
8
+ app.require_app_dir
9
+ app.public_logs = false
10
+ app.single = true
11
+ app.simulation = true
12
+ app.testing = true
13
+ app.auto_load_models = false
14
+
15
+ MetaRuby.keep_definition_location = false
16
+
17
+ list_tests = false
18
+ coverage_mode = false
19
+ only_self = false
20
+ all = true
4
21
  testrb_args = []
22
+ excluded_patterns = []
5
23
  parser = OptionParser.new do |opt|
6
- opt.on("-s", "--sim", "run tests in simulation mode") do |val|
7
- Roby.app.simulation = val
24
+ opt.banner = "#{File.basename($0)} test [ROBY_OPTIONS] -- [MINITEST_OPTIONS] [TEST_FILES]"
25
+ opt.on('--self', 'only run tests that are present in this bundle') do |val|
26
+ only_self = true
8
27
  end
9
- opt.on("-k", "--keep-logs", "keep all logs") do |val|
10
- Roby.app.testing_keep_logs = val
28
+ opt.on('--not-all', 'run all the tests found in the bundle, regardless of whether they are loaded by the robot configuration') do |val|
29
+ all = false
30
+ end
31
+ opt.on('--really-all', 'load all models, and run all the tests found in the bundle') do |val|
32
+ app.auto_load_models = true
33
+ all = true
11
34
  end
12
- opt.on("-o", "--overwrite-oldlogs", "if there are logs for the same test case, overwrite them") do |val|
13
- Roby.app.testing_overwrites_logs = val
35
+
36
+ opt.on('--exclude PATTERN', String, 'do not run files matching this pattern') do |pattern|
37
+ excluded_patterns << File.expand_path(pattern, Roby.app.app_dir)
38
+ end
39
+ opt.on("--distributed", "access remote systems while setting up or running the tests") do |val|
40
+ Roby.app.single = !val
41
+ end
42
+ opt.on('--list', 'lists the test files that are executed, but does not execute them') do
43
+ list_tests = true
44
+ end
45
+ opt.on("-l", "--live", "run tests in live mode") do |val|
46
+ Roby.app.simulation = !val
47
+ end
48
+ opt.on("-k", "--keep-logs", "keep all logs") do |val|
49
+ Roby.app.public_logs = true
14
50
  end
15
51
  opt.on("-i", "--interactive", "allow user interaction during tests") do |val|
16
- Roby.app.automatic_testing = false
52
+ Roby.app.automatic_testing = false
17
53
  end
18
- opt.on("-n", "--name NAME", String, "run tests matching NAME") do |name|
19
- testrb_args << "-n" << name
54
+ opt.on("--coverage", "generate code coverage information. This autoloads all files and task context models to get a full coverage information") do |name|
55
+ coverage_mode = true
20
56
  end
57
+ opt.on '--help' do
58
+ pp opt
59
+ Minitest.run ['--help']
60
+ exit 0
61
+ end
62
+ Roby::Application.common_optparse_setup(opt)
21
63
  end
22
- parser.parse! ARGV
23
- Roby.app.testing = true
24
- require 'roby/test/testcase'
25
64
 
26
- app = Roby.app
27
- app.setup
65
+ test_files = parser.parse(ARGV)
66
+ test_files.delete_if do |arg|
67
+ if arg.start_with?('-')
68
+ testrb_args << arg
69
+ true
70
+ end
71
+ end
28
72
 
29
- r = Test::Unit::AutoRunner.new(true)
30
- r.process_args(ARGV + testrb_args) or
31
- abort r.options.banner + " tests..."
73
+ if test_files.empty?
74
+ MetaRuby.keep_definition_location = true
75
+ end
32
76
 
33
- if r.filters.empty?
34
- r.filters << lambda do |t|
35
- t.class != Roby::Test::TestCase
36
- end
77
+ if coverage_mode
78
+ require 'simplecov'
79
+ SimpleCov.start
37
80
  end
38
81
 
39
- exit r.run
82
+ exception = Roby.display_exception do
83
+ Roby.app.setup
84
+ if Roby.app.public_logs?
85
+ STDOUT.puts "Test logs are saved in #{Roby.app.log_dir}"
86
+ end
87
+ begin
88
+ Roby.app.prepare
89
+
90
+ if test_files.empty?
91
+ test_files = app.discover_test_files(all: all, only_self: only_self).map(&:first)
92
+ self_files, dependent_files = test_files.partition { |f| app.self_file?(f) }
93
+ test_files = self_files.sort + dependent_files.sort
94
+ if list_tests
95
+ puts "Would load #{test_files.size} test files"
96
+ test_files.each do |path|
97
+ puts " #{path}"
98
+ end
99
+
100
+ all_existing_tests = app.find_dirs('test', order: :specific_first, all: !only_self).inject(Set.new) do |all, dir|
101
+ all.merge(Find.enum_for(:find, dir).find_all { |f| f =~ /\/test_.*\.rb$/ && File.file?(f) }.to_set)
102
+ end
103
+ not_run = (all_existing_tests - test_files.to_set)
104
+ if !not_run.empty?
105
+ puts "\nWould NOT load #{not_run.size} tests"
106
+ not_run.to_a.sort.each do |not_loaded|
107
+ puts " #{not_loaded}"
108
+ end
109
+ end
110
+ exit 0
111
+ end
112
+ end
40
113
 
114
+ test_files.each do |arg|
115
+ next if excluded_patterns.any? { |pattern| File.fnmatch?(pattern, arg) }
116
+ require arg
117
+ end
118
+ passed = Minitest.run(testrb_args)
119
+ exit(1) unless passed
120
+ ensure
121
+ Roby.app.shutdown
122
+ Roby.app.cleanup
123
+ end
124
+ end
125
+ exit(exception ? 1 : 0)
@@ -0,0 +1,74 @@
1
+ require 'roby/app/test_server'
2
+
3
+ module Roby
4
+ module App
5
+ # Minitest reporter for a client/server scheme in autotest
6
+ #
7
+ # Note that the idea and a big chunk of the implementation has been
8
+ # taken from the minitest-server plugin. The main differences is that it
9
+ # accounts for load errors (exceptions that happen outside of minitest
10
+ # itself) and is using DRoby's marshalling for exceptions
11
+ class TestReporter
12
+ attr_reader :pid
13
+ attr_reader :slave_name
14
+ attr_reader :server
15
+ attr_reader :manager
16
+
17
+ # Whether some failures were reported
18
+ attr_predicate :has_failures?
19
+
20
+ def initialize(pid, slave_name, server_pid, manager: DRoby::Marshal.new)
21
+ @pid = pid
22
+ @slave_name = slave_name
23
+ uri = TestServer.path(server_pid)
24
+ @server = DRbObject.new_with_uri uri
25
+ @manager = manager
26
+ super()
27
+ end
28
+
29
+ def exception(e)
30
+ @has_failures = true
31
+ server.exception(pid, manager.dump(e))
32
+ end
33
+
34
+ def discovery_start
35
+ server.discovery_start(pid)
36
+ end
37
+
38
+ def discovery_finished
39
+ server.discovery_finished(pid)
40
+ end
41
+
42
+ def test_start
43
+ server.test_start(pid)
44
+ end
45
+
46
+ # This method is part of the minitest API
47
+ def prerecord(klass, method_name)
48
+ file, = klass.instance_method(method_name).source_location
49
+ server.test_method(pid, file, klass.name, method_name)
50
+ end
51
+
52
+ # This method is part of the minitest API ... cannot change its name
53
+ def record(result)
54
+ r = result
55
+ if r.respond_to?(:source_location) # Minitest 3.11+
56
+ class_name = r.klass
57
+ file, = r.source_location
58
+ else
59
+ c = r.class
60
+ file, = c.instance_method(r.name).source_location
61
+ class_name = c.name
62
+ end
63
+ failures = manager.dump(r.failures)
64
+ @has_failures ||= r.failures.any? { |e| !e.kind_of?(Minitest::Skip) }
65
+ server.test_result(pid, file, class_name, r.name, failures, r.assertions, r.time)
66
+ end
67
+
68
+ def test_finished
69
+ server.test_finished(pid)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
@@ -0,0 +1,159 @@
1
+ require 'minitest'
2
+ require "drb"
3
+ require "tmpdir"
4
+ require 'roby/hooks'
5
+ require 'roby/droby'
6
+
7
+ module Roby
8
+ module App
9
+ class Minitest::UnexpectedError
10
+ def droby_dump(peer = nil)
11
+ result = dup
12
+ result.exception = exception.droby_dump(peer)
13
+ result
14
+ end
15
+
16
+ def proxy(manager)
17
+ result = dup
18
+ result.exception = manager.local_object(result.exception)
19
+ result
20
+ end
21
+
22
+ def pretty_print(pp)
23
+ exception.pretty_print(pp)
24
+ end
25
+ end
26
+
27
+ # DRuby server for a client/server scheme in autotest
28
+ #
29
+ # The client side is implemented in {TestReporter}
30
+ #
31
+ # Note that the idea and a big chunk of the implementation has been
32
+ # taken from the minitest-server plugin. The main differences is that it
33
+ # accounts for load errors (exceptions that happen outside of minitest
34
+ # itself) and is using DRoby's marshalling for exceptions
35
+ class TestServer
36
+ def self.path(pid = Process.pid)
37
+ "drbunix:#{Dir.tmpdir}/minitest.#{pid}"
38
+ end
39
+
40
+ include Hooks
41
+ include Hooks::InstanceHooks
42
+
43
+ # @!method on_exception
44
+ #
45
+ # Hook called when an exception has been caught by Autorespawn
46
+ #
47
+ # @yieldparam [Integer] pid the client PID
48
+ # @yieldparam [Exception] exception
49
+ define_hooks :on_exception
50
+
51
+ # @!method on_discovery_start
52
+ #
53
+ # Hook called when a discovery process starts
54
+ #
55
+ # @yieldparam [Integer] pid the client PID
56
+ define_hooks :on_discovery_start
57
+
58
+ # @!method on_discovery_finished
59
+ #
60
+ # Hook called when a discovery process finishes
61
+ #
62
+ # @yieldparam [Integer] pid the client PID
63
+ # @yieldparam [Hash] id the test ID
64
+ define_hooks :on_discovery_finished
65
+
66
+ # @!method on_test_start
67
+ #
68
+ # Hook called when a test starts
69
+ #
70
+ # @yieldparam [Integer] pid the client PID
71
+ define_hooks :on_test_start
72
+
73
+ # @!method on_test_method
74
+ #
75
+ # Hook called when a test method starts its execution
76
+ #
77
+ # @yieldparam [Integer] pid the client PID
78
+ # @yieldparam [String] file the file containing the test
79
+ # @yieldparam [String] test_case_name the test case name
80
+ # @yieldparam [String] test_name the test name
81
+ define_hooks :on_test_method
82
+
83
+ # @!method on_test_result
84
+ #
85
+ # Hook called when a test has been executed
86
+ #
87
+ # @yieldparam [Integer] pid the client PID
88
+ # @yieldparam [String] file the file containing the test
89
+ # @yieldparam [String] test_case_name the test case name
90
+ # @yieldparam [String] test_name the test name
91
+ # @yieldparam [Array<Minitest::Assertion>] failures the list of test failures
92
+ # @yieldparam [Integer] assertions the number of assertions
93
+ # @yieldparam [Time] time the time spent running the test
94
+ define_hooks :on_test_result
95
+
96
+ # @!method on_test_finished
97
+ #
98
+ # Hook called when a test finished
99
+ #
100
+ # @yieldparam [Integer] pid the client PID
101
+ define_hooks :on_test_finished
102
+
103
+ # A value that allows to identify this server uniquely
104
+ #
105
+ # Usually the server PID
106
+ attr_reader :server_id
107
+
108
+ # The autorespawn manager
109
+ #
110
+ # @return [Autorespawn::Manager]
111
+ attr_reader :manager
112
+
113
+ def self.start(id)
114
+ server = new(id)
115
+ DRb.start_service path, server
116
+ server
117
+ end
118
+
119
+ def self.stop
120
+ DRb.stop_service
121
+ end
122
+
123
+ def initialize(server_id, manager = DRoby::Marshal.new(auto_create_plans: true))
124
+ @server_id = server_id
125
+ @manager = manager
126
+ end
127
+
128
+ def discovery_start(pid)
129
+ run_hook :on_discovery_start, pid
130
+ end
131
+
132
+ def discovery_finished(pid)
133
+ run_hook :on_discovery_finished, pid
134
+ end
135
+
136
+ def exception(pid, e)
137
+ run_hook :on_exception, pid, manager.local_object(e)
138
+ end
139
+
140
+ def test_start(pid)
141
+ run_hook :on_test_start, pid
142
+ end
143
+
144
+ def test_method(pid, file, klass, method)
145
+ run_hook :on_test_method, pid, file, klass, method
146
+ end
147
+
148
+ def test_result(pid, file, klass, method, fails, assertions, time)
149
+ run_hook :on_test_result, pid, file, klass, method,
150
+ manager.local_object(fails), assertions, time
151
+ end
152
+
153
+ def test_finished(pid)
154
+ run_hook :on_test_finished, pid
155
+ end
156
+ end
157
+ end
158
+ end
159
+
@@ -0,0 +1,47 @@
1
+ module Roby
2
+ module App
3
+ # Utilities related to Vagrant VMs
4
+ module Vagrant
5
+ # Exception thrown when trying to resolve a vagrant VM and it is not
6
+ # running
7
+ class NotRunning < ArgumentError; end
8
+
9
+ # Exception raise when trying to resolve a vagrant VM but cannot find it
10
+ class NotFound < ArgumentError; end
11
+
12
+ # Exception raised when a vagrant VM could be found, but its IP cannot
13
+ # be resolved through 'vagrant ssh-config'
14
+ class CannotResolveHostname < ArgumentError; end
15
+
16
+ # Resolves the global ID of a vagrant VM
17
+ #
18
+ # @param [String] vagrant_name the name or ID of the vagrant VM
19
+ # @raise VagrantVMNotFound
20
+ # @raise VagrantVMNotRunning
21
+ def self.resolve_vm(vagrant_name)
22
+ IO.popen(['vagrant', 'global-status']).each_line do |line|
23
+ id, name, provider, state, * = line.chomp.split(/\s+/)
24
+ if vagrant_name == id || vagrant_name == name
25
+ if state != 'running'
26
+ raise NotRunning, "cannot connect to vagrant VM #{vagrant_name}: in state #{state} (requires running)"
27
+ end
28
+ return id
29
+ end
30
+ end
31
+ raise NotFound, "cannot find a vagrant VM called #{vagrant_name}, run vagrant global-status to check vagrant's status"
32
+ end
33
+
34
+ # Resolve the IP of a vagrant VM
35
+ def self.resolve_ip(vagrant_name)
36
+ id = resolve_vm(vagrant_name)
37
+ IO.popen(['vagrant', 'ssh-config', id]).each_line do |line|
38
+ if line =~ /HostName (.*)/
39
+ return $1.strip
40
+ end
41
+ end
42
+ raise CannotResolveHostname, "did not find a Hostname in the ssh-config of vagrant VM #{vagrant_name} (with id #{id}). Check the result of vagrant ssh-config #{id}"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,16 @@
1
+ # List of backports waiting to be accepted in the backports gem
2
+ class Set
3
+ # Defined in 2.4.0
4
+ #
5
+ # Hash#compare_by_identity appeared in ruby 1.9.1
6
+ def compare_by_identity
7
+ @hash.compare_by_identity
8
+ end
9
+
10
+ # Defined in 2.4.0
11
+ #
12
+ # Hash#compare_by_identity? appeard in ruby 1.9.1
13
+ def compare_by_identity?
14
+ @hash.compare_by_identity?
15
+ end
16
+ end
@@ -0,0 +1,190 @@
1
+ require 'roby'
2
+ require 'thor'
3
+ require 'roby/droby/logfile/server'
4
+ require 'roby/droby/logfile/client'
5
+ require 'roby/interface'
6
+
7
+ module Roby
8
+ module CLI
9
+ class Display < Thor
10
+ Server = Roby::DRoby::Logfile::Server
11
+
12
+ default_command 'backward'
13
+
14
+ class_option :debug, type: :boolean, default: false
15
+ class_option :config, type: :string, default: nil,
16
+ desc: 'path to the roby-display configuration file'
17
+
18
+ desc 'backward', 'backward-compatible interface with the old roby-display'
19
+ option :client, type: :string, lazy_default: "localhost:#{Interface::DEFAULT_PORT}"
20
+ option :host, type: :string, lazy_default: "localhost:#{Interface::DEFAULT_PORT}"
21
+ option :vagrant, type: :string, default: nil
22
+ option :server, type: :numeric
23
+ option :sampling, type: :numeric
24
+ def backward(*path)
25
+ host, port = 'localhost', Server::DEFAULT_PORT
26
+ if remote_addr = (options[:client] || options[:host])
27
+ if options[:host]
28
+ Roby.warn_deprecated "--host is deprecated, use 'roby-display client' instead, run roby-display help for more information"
29
+ else
30
+ Roby.warn_deprecated "roby-display --client=HOST is now roby-display client HOST, run roby-display help for more information"
31
+ end
32
+ if vagrant_host = options[:vagrant]
33
+ _, port = remote_addr.split(':')
34
+ remote_addr = "vagrant:#{vagrant_host}:#{port}"
35
+ end
36
+ client(remote_addr)
37
+ elsif bind_port = options[:server]
38
+ Roby.warn_deprecated "roby-display --server PATH is now roby-display server PATH, run roby-display help for more information"
39
+ server(*path, port: bind_port)
40
+ else
41
+ file(*path)
42
+ end
43
+ end
44
+
45
+ desc 'file PATH', 'inspect an existing log file'
46
+ option :display, type: :string, desc: 'a display to open right away (relations, chronicle or all)'
47
+ def file(path)
48
+ apply_common_options
49
+
50
+ with_display do |app, display|
51
+ display.open(path)
52
+ end
53
+ end
54
+
55
+ desc 'client HOST[:PORT]', 'connect to a running Roby instance'
56
+ option :display, type: :string, desc: 'a display to open right away (relations, chronicle or all)'
57
+ def client(remote_addr)
58
+ apply_common_options
59
+
60
+ host, port = resolve_remote_host(remote_addr)
61
+ with_display do |app, display|
62
+ display.connect(host, port: port)
63
+ end
64
+ end
65
+
66
+ desc 'server PATH', "serve the given log file"
67
+ option :fd, desc: 'the file descriptor of the TCP server socket',
68
+ type: :numeric
69
+ option :port, desc: 'port number on which to create the server',
70
+ type: :numeric, default: Server::DEFAULT_PORT
71
+ option :sampling, type: :numeric,
72
+ default: Server::DEFAULT_SAMPLING_PERIOD,
73
+ desc: 'period in seconds at which the server should poll the log file'
74
+ def server(path, port: options[:port])
75
+ # NOTE: the 'port' argument is here so that it can be overriden
76
+ # in {#backward}
77
+ apply_common_options
78
+
79
+ if server_fd = options[:fd]
80
+ server_io = TCPServer.for_fd(server_fd)
81
+ else
82
+ server_io =
83
+ begin TCPServer.new(port)
84
+ rescue TypeError # Workaround for https://bugs.ruby-lang.org/issues/10203
85
+ raise Errno::EADDRINUSE, "Address already in use - bind(2) for \"0.0.0.0\" port #{port}"
86
+ end
87
+ end
88
+
89
+ server = Roby::DRoby::Logfile::Server.new(path, options[:sampling], server_io)
90
+ port = server_io.local_address.ip_port
91
+ Server.info "Roby log server listening on port #{port}, sampling period=#{options[:sampling]}"
92
+ Server.info "watching #{path}"
93
+ server.exec
94
+ ensure
95
+ server_io.close if server_io
96
+ end
97
+
98
+ attr_reader :config_path
99
+
100
+ no_commands do
101
+ def apply_common_options
102
+ if options[:debug]
103
+ Server.logger.level = Logger::DEBUG
104
+ Roby::DRoby::Logfile.logger.level = Logger::DEBUG
105
+ end
106
+
107
+ if config_path = options[:config]
108
+ @config_path = File.expand_path(config_path)
109
+ elsif Roby.app.app_dir
110
+ @config_path = Roby.app.find_file('config', 'roby-display.yml', order: :specific_first) ||
111
+ File.join(Roby.app.app_dir, "config", "roby-display.yml")
112
+ end
113
+ end
114
+
115
+ def discover_log_server_port(host, interface_port)
116
+ client = Interface.connect_with_tcp_to(host, interface_port)
117
+ port = client.log_server_port
118
+ ensure
119
+ client.close if client
120
+ end
121
+
122
+ def resolve_remote_host(host_spec = '')
123
+ parts = host_spec.split(':')
124
+ if parts[0] == 'vagrant'
125
+ vagrant_id = parts[1]
126
+ if !vagrant_id
127
+ raise ArgumentError, "expected vagrant: to be followed by the ID of a vagrant VM"
128
+ end
129
+ require 'roby/app/vagrant'
130
+ host = Roby::App::Vagrant.resolve_ip(vagrant_id)
131
+ port = parts[2]
132
+ else
133
+ host, port = *parts
134
+ host = 'localhost' if !host || host.empty?
135
+ end
136
+ port = Interface::DEFAULT_PORT.to_s if !port
137
+
138
+ if port[0, 1] != '!'
139
+ port = discover_log_server_port(host, Integer(port) || Interface::DEFAULT_PORT)
140
+ else
141
+ port = Integer(port[1..-1] || Server::DEFAULT_PORT)
142
+ end
143
+ return host, port
144
+ end
145
+
146
+ def with_display
147
+ require 'Qt'
148
+ require 'roby/droby/logfile/reader'
149
+ require 'roby/droby/plan_rebuilder'
150
+ require 'roby/gui/log_display'
151
+
152
+ app = Qt::Application.new(ARGV)
153
+
154
+ display = Roby::GUI::LogDisplay.new
155
+ if display_mode = options[:display]
156
+ if display_mode == 'all'
157
+ display.create_all_displays
158
+ else
159
+ display.create_display(display_mode)
160
+ end
161
+ end
162
+
163
+ if config_path
164
+ apply_config(display, config_path)
165
+ end
166
+ yield(app, display)
167
+ display.show
168
+ app.exec
169
+ ensure
170
+ if config_path
171
+ save_config(display, config_path)
172
+ end
173
+ end
174
+
175
+ def apply_config(display, config_path)
176
+ if File.file?(config_path)
177
+ display.load_options(config_path)
178
+ end
179
+ end
180
+ def save_config(display, config_path)
181
+ FileUtils.mkdir_p(File.dirname(config_path))
182
+ File.open(config_path, 'w') do |io|
183
+ YAML.dump(display.save_options, io)
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+