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.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- 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.
|
|
7
|
-
|
|
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(
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
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
|
-
|
|
52
|
+
Roby.app.automatic_testing = false
|
|
17
53
|
end
|
|
18
|
-
opt.on("
|
|
19
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
73
|
+
if test_files.empty?
|
|
74
|
+
MetaRuby.keep_definition_location = true
|
|
75
|
+
end
|
|
32
76
|
|
|
33
|
-
if
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
end
|
|
77
|
+
if coverage_mode
|
|
78
|
+
require 'simplecov'
|
|
79
|
+
SimpleCov.start
|
|
37
80
|
end
|
|
38
81
|
|
|
39
|
-
|
|
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
|
+
|