roby 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -5
- data/Manifest.txt +91 -16
- data/README.txt +24 -24
- data/Rakefile +92 -64
- data/app/config/app.yml +42 -43
- data/app/config/init.rb +26 -0
- data/benchmark/alloc_misc.rb +123 -0
- data/benchmark/discovery_latency.rb +67 -0
- data/benchmark/garbage_collection.rb +48 -0
- data/benchmark/genom.rb +31 -0
- data/benchmark/transactions.rb +62 -0
- data/bin/roby +1 -1
- data/bin/roby-log +16 -6
- data/doc/guide/.gitignore +2 -0
- data/doc/guide/config.yaml +34 -0
- data/doc/guide/ext/init.rb +14 -0
- data/doc/guide/ext/previous_next.rb +40 -0
- data/doc/guide/ext/rdoc_links.rb +33 -0
- data/doc/guide/index.rdoc +16 -0
- data/doc/guide/overview.rdoc +62 -0
- data/doc/guide/plan_modifications.rdoc +67 -0
- data/doc/guide/src/abstraction/achieve_with.page +8 -0
- data/doc/guide/src/abstraction/forwarding.page +8 -0
- data/doc/guide/src/abstraction/hierarchy.page +19 -0
- data/doc/guide/src/abstraction/index.page +28 -0
- data/doc/guide/src/abstraction/task_models.page +13 -0
- data/doc/guide/src/basics.template +6 -0
- data/doc/guide/src/basics/app.page +139 -0
- data/doc/guide/src/basics/code_examples.page +33 -0
- data/doc/guide/src/basics/dry.page +69 -0
- data/doc/guide/src/basics/errors.page +443 -0
- data/doc/guide/src/basics/events.page +179 -0
- data/doc/guide/src/basics/hierarchy.page +275 -0
- data/doc/guide/src/basics/index.page +11 -0
- 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_4.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_3.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/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/basics/plan_objects.page +71 -0
- data/doc/guide/src/basics/relations_display.page +203 -0
- data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
- data/doc/guide/src/basics/shell.page +102 -0
- data/doc/guide/src/basics/summary.page +32 -0
- data/doc/guide/src/basics/tasks.page +357 -0
- data/doc/guide/src/basics_shell_header.txt +16 -0
- data/doc/guide/src/cycle/cycle-overview.png +0 -0
- data/doc/guide/src/cycle/cycle-overview.svg +208 -0
- data/doc/guide/src/cycle/error_handling.page +168 -0
- data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
- data/doc/guide/src/cycle/garbage_collection.page +10 -0
- data/doc/guide/src/cycle/index.page +23 -0
- data/doc/guide/src/cycle/propagation.page +154 -0
- data/doc/guide/src/cycle/propagation_diamond.png +0 -0
- data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
- data/doc/guide/src/default.css +319 -0
- data/doc/guide/src/default.template +74 -0
- data/doc/guide/src/htmldoc.metainfo +20 -0
- data/doc/guide/src/htmldoc.virtual +18 -0
- data/doc/guide/src/images/bodybg.png +0 -0
- data/doc/guide/src/images/contbg.png +0 -0
- data/doc/guide/src/images/footerbg.png +0 -0
- data/doc/guide/src/images/gradient1.png +0 -0
- data/doc/guide/src/images/gradient2.png +0 -0
- data/doc/guide/src/index.page +7 -0
- data/doc/guide/src/introduction/index.page +29 -0
- data/doc/guide/src/introduction/install.page +133 -0
- data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
- data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
- data/doc/guide/src/plugins/fault_tolerance.page +44 -0
- data/doc/guide/src/plugins/index.page +11 -0
- data/doc/guide/src/plugins/subsystems.page +45 -0
- data/doc/guide/src/relations/dependency.page +89 -0
- data/doc/guide/src/relations/index.page +12 -0
- data/doc/misc/update_github +24 -0
- data/doc/tutorials/02-GoForward.rdoc +3 -3
- data/ext/graph/graph.cc +46 -0
- data/lib/roby.rb +57 -22
- data/lib/roby/app.rb +132 -112
- data/lib/roby/app/plugins/rake.rb +21 -0
- data/lib/roby/app/rake.rb +0 -7
- data/lib/roby/app/run.rb +1 -1
- data/lib/roby/app/scripts/distributed.rb +1 -2
- data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
- data/lib/roby/app/scripts/results.rb +2 -1
- data/lib/roby/app/scripts/run.rb +6 -2
- data/lib/roby/app/scripts/shell.rb +11 -11
- data/lib/roby/config.rb +1 -1
- data/lib/roby/decision_control.rb +62 -3
- data/lib/roby/distributed.rb +4 -0
- data/lib/roby/distributed/base.rb +8 -0
- data/lib/roby/distributed/communication.rb +12 -8
- data/lib/roby/distributed/connection_space.rb +61 -44
- data/lib/roby/distributed/distributed_object.rb +1 -1
- data/lib/roby/distributed/notifications.rb +22 -30
- data/lib/roby/distributed/peer.rb +13 -8
- data/lib/roby/distributed/proxy.rb +5 -5
- data/lib/roby/distributed/subscription.rb +4 -4
- data/lib/roby/distributed/transaction.rb +3 -3
- data/lib/roby/event.rb +176 -110
- data/lib/roby/exceptions.rb +12 -4
- data/lib/roby/execution_engine.rb +1604 -0
- data/lib/roby/external_process_task.rb +225 -0
- data/lib/roby/graph.rb +0 -6
- data/lib/roby/interface.rb +221 -137
- data/lib/roby/log/console.rb +5 -3
- data/lib/roby/log/data_stream.rb +94 -16
- data/lib/roby/log/dot.rb +8 -8
- data/lib/roby/log/event_stream.rb +13 -3
- data/lib/roby/log/file.rb +43 -18
- data/lib/roby/log/gui/basic_display_ui.rb +89 -0
- data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
- data/lib/roby/log/gui/data_displays.rb +4 -5
- data/lib/roby/log/gui/data_displays_ui.rb +146 -0
- data/lib/roby/log/gui/relations.rb +18 -18
- data/lib/roby/log/gui/relations_ui.rb +120 -0
- data/lib/roby/log/gui/relations_view_ui.rb +144 -0
- data/lib/roby/log/gui/replay.rb +41 -13
- data/lib/roby/log/gui/replay_controls.rb +3 -0
- data/lib/roby/log/gui/replay_controls.ui +133 -110
- data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
- data/lib/roby/log/hooks.rb +19 -18
- data/lib/roby/log/logger.rb +7 -6
- data/lib/roby/log/notifications.rb +4 -4
- data/lib/roby/log/plan_rebuilder.rb +20 -22
- data/lib/roby/log/relations.rb +44 -16
- data/lib/roby/log/server.rb +1 -4
- data/lib/roby/log/timings.rb +88 -19
- data/lib/roby/plan-object.rb +135 -11
- data/lib/roby/plan.rb +408 -224
- data/lib/roby/planning/loops.rb +32 -25
- data/lib/roby/planning/model.rb +157 -51
- data/lib/roby/planning/task.rb +47 -20
- data/lib/roby/query.rb +128 -92
- data/lib/roby/relations.rb +254 -136
- data/lib/roby/relations/conflicts.rb +6 -9
- data/lib/roby/relations/dependency.rb +358 -0
- data/lib/roby/relations/ensured.rb +0 -1
- data/lib/roby/relations/error_handling.rb +0 -1
- data/lib/roby/relations/events.rb +0 -2
- data/lib/roby/relations/executed_by.rb +26 -11
- data/lib/roby/relations/planned_by.rb +14 -14
- data/lib/roby/robot.rb +46 -0
- data/lib/roby/schedulers/basic.rb +34 -0
- data/lib/roby/standalone.rb +4 -0
- data/lib/roby/standard_errors.rb +21 -15
- data/lib/roby/state/events.rb +5 -4
- data/lib/roby/support.rb +107 -6
- data/lib/roby/task-operations.rb +23 -19
- data/lib/roby/task.rb +522 -148
- data/lib/roby/task_index.rb +80 -0
- data/lib/roby/test/common.rb +283 -44
- data/lib/roby/test/distributed.rb +53 -37
- data/lib/roby/test/testcase.rb +9 -204
- data/lib/roby/test/tools.rb +3 -3
- data/lib/roby/transactions.rb +154 -111
- data/lib/roby/transactions/proxy.rb +40 -7
- data/manifest.xml +20 -0
- data/plugins/fault_injection/README.txt +0 -3
- data/plugins/fault_injection/Rakefile +2 -8
- data/plugins/fault_injection/app.rb +1 -1
- data/plugins/fault_injection/fault_injection.rb +3 -3
- data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
- data/plugins/subsystems/README.txt +0 -3
- data/plugins/subsystems/Rakefile +2 -7
- data/plugins/subsystems/app.rb +27 -16
- data/plugins/subsystems/test/app/config/init.rb +3 -0
- data/plugins/subsystems/test/app/planners/main.rb +1 -1
- data/plugins/subsystems/test/app/tasks/services.rb +1 -1
- data/plugins/subsystems/test/test_subsystems.rb +23 -16
- data/test/distributed/test_communication.rb +32 -15
- data/test/distributed/test_connection.rb +28 -26
- data/test/distributed/test_execution.rb +59 -54
- data/test/distributed/test_mixed_plan.rb +34 -34
- data/test/distributed/test_plan_notifications.rb +26 -26
- data/test/distributed/test_protocol.rb +57 -48
- data/test/distributed/test_query.rb +11 -7
- data/test/distributed/test_remote_plan.rb +71 -71
- data/test/distributed/test_transaction.rb +50 -47
- data/test/mockups/external_process +28 -0
- data/test/planning/test_loops.rb +163 -119
- data/test/planning/test_model.rb +3 -3
- data/test/planning/test_task.rb +27 -7
- data/test/relations/test_conflicts.rb +3 -3
- data/test/relations/test_dependency.rb +324 -0
- data/test/relations/test_ensured.rb +2 -2
- data/test/relations/test_executed_by.rb +94 -19
- data/test/relations/test_planned_by.rb +11 -9
- data/test/suite_core.rb +6 -3
- data/test/suite_distributed.rb +1 -0
- data/test/suite_planning.rb +1 -0
- data/test/suite_relations.rb +2 -2
- data/test/tasks/test_external_process.rb +126 -0
- data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
- data/test/test_bgl.rb +21 -1
- data/test/test_event.rb +229 -155
- data/test/test_exceptions.rb +79 -80
- data/test/test_execution_engine.rb +987 -0
- data/test/test_gui.rb +1 -1
- data/test/test_interface.rb +11 -5
- data/test/test_log.rb +18 -7
- data/test/test_log_server.rb +1 -0
- data/test/test_plan.rb +229 -395
- data/test/test_query.rb +193 -35
- data/test/test_relations.rb +88 -8
- data/test/test_state.rb +55 -37
- data/test/test_support.rb +1 -1
- data/test/test_task.rb +371 -218
- data/test/test_testcase.rb +32 -16
- data/test/test_transactions.rb +211 -170
- data/test/test_transactions_proxy.rb +37 -19
- metadata +169 -71
- data/.gitignore +0 -29
- data/doc/styles/allison.css +0 -314
- data/doc/styles/allison.js +0 -316
- data/doc/styles/allison.rb +0 -276
- data/doc/styles/jamis.rb +0 -593
- data/lib/roby/control.rb +0 -746
- data/lib/roby/executives/simple.rb +0 -30
- data/lib/roby/propagation.rb +0 -562
- data/lib/roby/relations/hierarchy.rb +0 -239
- data/lib/roby/transactions/updates.rb +0 -139
- data/test/relations/test_hierarchy.rb +0 -158
- data/test/test_control.rb +0 -399
- data/test/test_propagation.rb +0 -210
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
|
2
2
|
require 'roby/test/common'
|
3
3
|
require 'roby/test/tasks/simple_task'
|
4
4
|
|
@@ -8,7 +8,7 @@ class TC_PlannedBy < Test::Unit::TestCase
|
|
8
8
|
PlannedBy = Roby::TaskStructure::PlannedBy
|
9
9
|
SimpleTask = Roby::Test::SimpleTask
|
10
10
|
def test_replace
|
11
|
-
task, p1, p2 = prepare_plan :
|
11
|
+
task, p1, p2 = prepare_plan :add => 3
|
12
12
|
task.planned_by p1
|
13
13
|
|
14
14
|
assert_raises(ArgumentError) { task.planned_by p2 }
|
@@ -24,24 +24,26 @@ class TC_PlannedBy < Test::Unit::TestCase
|
|
24
24
|
task = Roby::Task.new
|
25
25
|
planner = Roby::Test::SimpleTask.new
|
26
26
|
task.planned_by planner
|
27
|
-
plan.
|
27
|
+
plan.add_permanent(task)
|
28
28
|
|
29
|
-
assert_equal([],
|
29
|
+
assert_equal([], plan.check_structure.to_a)
|
30
30
|
planner.start!
|
31
|
-
assert_equal([],
|
31
|
+
assert_equal([], plan.check_structure.to_a)
|
32
32
|
planner.success!
|
33
|
-
assert_equal([],
|
33
|
+
assert_equal([], plan.check_structure.to_a)
|
34
34
|
|
35
35
|
task.remove_planning_task planner
|
36
36
|
planner = Roby::Test::SimpleTask.new
|
37
37
|
task.planned_by planner
|
38
38
|
|
39
|
-
assert_equal([],
|
39
|
+
assert_equal([], plan.check_structure.to_a)
|
40
40
|
planner.start!
|
41
|
-
assert_equal([],
|
41
|
+
assert_equal([], plan.check_structure.to_a)
|
42
42
|
planner.failed!
|
43
43
|
|
44
|
-
|
44
|
+
errors = plan.check_structure.to_a
|
45
|
+
assert_equal 1, errors.size
|
46
|
+
error = errors.first.first.exception
|
45
47
|
assert_kind_of(Roby::PlanningFailedError, error)
|
46
48
|
assert_equal(planner, error.failed_task)
|
47
49
|
assert_equal(task, error.planned_task)
|
data/test/suite_core.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
|
1
2
|
require 'test_support'
|
2
3
|
|
3
4
|
require 'test_bgl'
|
@@ -6,19 +7,21 @@ require 'test_event'
|
|
6
7
|
require 'test_task'
|
7
8
|
require 'test_state'
|
8
9
|
|
9
|
-
require '
|
10
|
+
require 'test_execution_engine'
|
10
11
|
require 'test_exceptions'
|
11
12
|
|
12
13
|
require 'test_plan'
|
13
14
|
require 'test_query'
|
14
15
|
require 'test_transactions'
|
15
16
|
require 'test_transactions_proxy'
|
16
|
-
|
17
|
+
|
18
|
+
require 'tasks/test_thread_task'
|
19
|
+
|
20
|
+
require 'test_testcase'
|
17
21
|
|
18
22
|
require 'suite_planning'
|
19
23
|
require 'suite_relations'
|
20
24
|
|
21
|
-
require 'test_control'
|
22
25
|
require 'test_interface'
|
23
26
|
require 'test_log'
|
24
27
|
|
data/test/suite_distributed.rb
CHANGED
data/test/suite_planning.rb
CHANGED
data/test/suite_relations.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
|
1
2
|
require 'test_relations'
|
2
|
-
require 'relations/
|
3
|
+
require 'relations/test_dependency'
|
3
4
|
require 'relations/test_executed_by'
|
4
5
|
require 'relations/test_planned_by'
|
5
6
|
require 'relations/test_conflicts'
|
6
|
-
|
7
7
|
require 'relations/test_ensured'
|
8
8
|
|
@@ -0,0 +1,126 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
|
2
|
+
require 'roby/test/common'
|
3
|
+
require 'roby/external_process_task'
|
4
|
+
require 'roby/test/tasks/simple_task'
|
5
|
+
require 'roby/test/tasks/empty_task'
|
6
|
+
|
7
|
+
class TC_ThreadTask < Test::Unit::TestCase
|
8
|
+
include Roby::Test
|
9
|
+
|
10
|
+
MOCKUP = File.expand_path(
|
11
|
+
File.join("..", "mockups", "external_process"),
|
12
|
+
File.dirname(__FILE__))
|
13
|
+
|
14
|
+
class MockupTask < Roby::ExternalProcessTask
|
15
|
+
event :stop do
|
16
|
+
FileUtils.touch "/tmp/external_process_mockup_stop"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def assert_polling_successful(timeout, sleep = 0.05)
|
21
|
+
now = Time.now
|
22
|
+
while (Time.now - now) < timeout
|
23
|
+
if yield
|
24
|
+
return
|
25
|
+
end
|
26
|
+
end
|
27
|
+
flunk "reached timeout"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_nominal
|
31
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => [MOCKUP, "--no-output"]))
|
32
|
+
engine.run
|
33
|
+
engine.once { task.start! }
|
34
|
+
|
35
|
+
assert_polling_successful(5) { task.success? }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_nominal_array_with_one_element
|
39
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => [MOCKUP]))
|
40
|
+
engine.run
|
41
|
+
engine.once { task.start! }
|
42
|
+
|
43
|
+
assert_polling_successful(5) { task.success? }
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_nominal_no_array
|
47
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => MOCKUP))
|
48
|
+
engine.run
|
49
|
+
engine.once { task.start! }
|
50
|
+
|
51
|
+
assert_polling_successful(5) { task.success? }
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_inexistent_program
|
55
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => ['does_not_exist', "--error"]))
|
56
|
+
engine.run
|
57
|
+
engine.once { task.start! }
|
58
|
+
|
59
|
+
assert_polling_successful(5) { task.failed? }
|
60
|
+
assert_equal 1, task.event(:failed).last.context.first.exitstatus
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_failure
|
64
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => [MOCKUP, "--error"]))
|
65
|
+
engine.run
|
66
|
+
engine.once { task.start! }
|
67
|
+
|
68
|
+
assert_polling_successful(5) { task.failed? }
|
69
|
+
assert_equal 1, task.event(:failed).last.context.first.exitstatus
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_signaling
|
73
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => [MOCKUP, "--block"]))
|
74
|
+
engine.run
|
75
|
+
engine.once { task.start! }
|
76
|
+
assert_polling_successful(5) { task.running? }
|
77
|
+
|
78
|
+
Process.kill 'KILL', task.pid
|
79
|
+
assert_polling_successful(5) { task.failed? }
|
80
|
+
assert task.event(:signaled).happened?
|
81
|
+
|
82
|
+
ev = task.event(:signaled).last
|
83
|
+
assert_equal 9, ev.context.first.termsig
|
84
|
+
end
|
85
|
+
|
86
|
+
def do_redirection(expected)
|
87
|
+
plan.add_permanent(task = ExternalProcessTask.new(:command_line => [MOCKUP]))
|
88
|
+
yield(task)
|
89
|
+
engine.run
|
90
|
+
engine.once { task.start! }
|
91
|
+
|
92
|
+
assert_polling_successful(5) { task.success? }
|
93
|
+
|
94
|
+
assert File.exists?("mockup-#{task.pid}.log")
|
95
|
+
File.read("mockup-#{task.pid}.log")
|
96
|
+
|
97
|
+
ensure
|
98
|
+
FileUtils.rm_f "mockup-#{task.pid}.log"
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_stdout_redirection
|
102
|
+
do_redirection `#{MOCKUP}` do |task|
|
103
|
+
task.redirect_output :stdout => 'mockup-%p.log'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_stderr_redirection
|
108
|
+
do_redirection `#{MOCKUP}` do |task|
|
109
|
+
task.command_line << "--stderr"
|
110
|
+
task.redirect_output :stderr => 'mockup-%p.log'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_common_redirection
|
115
|
+
output = do_redirection(nil) do |task|
|
116
|
+
task.command_line << "--common"
|
117
|
+
task.redirect_output 'mockup-%p.log'
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
expected = `#{MOCKUP} --common 2>&1`
|
122
|
+
assert_equal expected, output
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), File.dirname(__FILE__))
|
2
2
|
require 'roby/test/common'
|
3
3
|
require 'roby/thread_task'
|
4
4
|
require 'roby/test/tasks/simple_task'
|
@@ -7,6 +7,15 @@ require 'roby/test/tasks/empty_task'
|
|
7
7
|
class TC_ThreadTask < Test::Unit::TestCase
|
8
8
|
include Roby::Test
|
9
9
|
|
10
|
+
# Starts +task+ and waits for the thread to end
|
11
|
+
def wait_thread_end(task)
|
12
|
+
task.start!
|
13
|
+
while task.thread
|
14
|
+
process_events
|
15
|
+
sleep 0.1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
10
19
|
def test_normal
|
11
20
|
model = Class.new(Roby::ThreadTask) do
|
12
21
|
implementation do
|
@@ -14,12 +23,8 @@ class TC_ThreadTask < Test::Unit::TestCase
|
|
14
23
|
end
|
15
24
|
end
|
16
25
|
|
17
|
-
plan.
|
18
|
-
|
19
|
-
while task.thread
|
20
|
-
process_events
|
21
|
-
sleep 0.1
|
22
|
-
end
|
26
|
+
plan.add_mission(task = model.new)
|
27
|
+
wait_thread_end(task)
|
23
28
|
|
24
29
|
assert task.success?
|
25
30
|
assert_equal 1, task.result
|
@@ -27,19 +32,15 @@ class TC_ThreadTask < Test::Unit::TestCase
|
|
27
32
|
|
28
33
|
def test_implementation_fails
|
29
34
|
Thread.abort_on_exception = false
|
30
|
-
Roby.
|
35
|
+
Roby.app.abort_on_exception = false
|
31
36
|
model = Class.new(Roby::ThreadTask) do
|
32
37
|
implementation do
|
33
38
|
raise ArgumentError, "blaaaaaaaaah"
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
37
|
-
plan.
|
38
|
-
|
39
|
-
while task.thread
|
40
|
-
process_events
|
41
|
-
sleep 0.1
|
42
|
-
end
|
42
|
+
plan.add_permanent(task = model.new)
|
43
|
+
wait_thread_end(task)
|
43
44
|
|
44
45
|
assert task.failed?
|
45
46
|
assert_kind_of ArgumentError, task.event(:failed).last.context.first
|
@@ -58,12 +59,8 @@ class TC_ThreadTask < Test::Unit::TestCase
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
61
|
-
plan.
|
62
|
-
|
63
|
-
while task.thread
|
64
|
-
process_events
|
65
|
-
sleep 0.1
|
66
|
-
end
|
62
|
+
plan.add(task = model.new)
|
63
|
+
wait_thread_end(task)
|
67
64
|
|
68
65
|
assert task.failed?
|
69
66
|
assert_kind_of Interrupt, task.event(:failed).last.context.first
|
data/test/test_bgl.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
|
2
2
|
require 'roby/test/common'
|
3
3
|
require 'enumerator'
|
4
4
|
require 'flexmock'
|
@@ -75,6 +75,26 @@ class TC_BGL < Test::Unit::TestCase
|
|
75
75
|
assert_equal(2, v4[v3, graph])
|
76
76
|
end
|
77
77
|
|
78
|
+
def test_clear
|
79
|
+
g1, g2 = Graph.new, Graph.new
|
80
|
+
|
81
|
+
vertices = (1..3).map do
|
82
|
+
g1.insert(v = Vertex.new)
|
83
|
+
g2.insert(v)
|
84
|
+
|
85
|
+
assert g1.include?(v)
|
86
|
+
assert g2.include?(v)
|
87
|
+
v
|
88
|
+
end
|
89
|
+
|
90
|
+
g1.clear
|
91
|
+
vertices.each do |v|
|
92
|
+
assert !g1.include?(v)
|
93
|
+
assert g2.include?(v)
|
94
|
+
assert_equal [g2], v.enum_for(:each_graph).to_a
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
78
98
|
def test_edge_objects
|
79
99
|
g1, g2 = Graph.new, Graph.new
|
80
100
|
|
data/test/test_event.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
|
2
2
|
require 'roby/test/common'
|
3
3
|
require 'flexmock'
|
4
4
|
require 'roby/test/tasks/simple_task'
|
@@ -6,17 +6,28 @@ require 'roby/test/tasks/simple_task'
|
|
6
6
|
require 'roby'
|
7
7
|
class TC_Event < Test::Unit::TestCase
|
8
8
|
include Roby::Test
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
Roby.app.filter_backtraces = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_no_plan
|
15
|
+
event = EventGenerator.new { }
|
16
|
+
assert(!event.executable?)
|
17
|
+
assert_raises(Roby::EventNotExecutable) { event.emit }
|
18
|
+
assert_raises(Roby::EventNotExecutable) { event.call }
|
9
19
|
|
10
|
-
|
11
|
-
|
12
|
-
|
20
|
+
plan.add(event)
|
21
|
+
assert(event.executable?)
|
22
|
+
end
|
13
23
|
|
24
|
+
def test_controlable_events
|
14
25
|
event = EventGenerator.new(true)
|
15
26
|
assert(event.controlable?)
|
16
27
|
|
17
28
|
# Check command & emission behavior for controlable events
|
18
29
|
FlexMock.use do |mock|
|
19
|
-
plan.
|
30
|
+
plan.add(event = EventGenerator.new { |context| mock.call_handler(context); event.emit(*context) })
|
20
31
|
event.on { |event| mock.event_handler(event.context) }
|
21
32
|
|
22
33
|
assert(event.controlable?)
|
@@ -24,19 +35,22 @@ class TC_Event < Test::Unit::TestCase
|
|
24
35
|
mock.should_receive(:event_handler).once.with([42])
|
25
36
|
event.call(42)
|
26
37
|
end
|
38
|
+
end
|
27
39
|
|
40
|
+
def test_contingent_events
|
28
41
|
# Check emission behavior for non-controlable events
|
29
42
|
FlexMock.use do |mock|
|
30
43
|
event = EventGenerator.new
|
31
|
-
plan.
|
44
|
+
plan.add(event)
|
32
45
|
event.on { |event| mock.event(event.context) }
|
33
46
|
mock.should_receive(:event).once.with([42])
|
34
47
|
event.emit(42)
|
35
48
|
end
|
36
49
|
end
|
37
50
|
|
38
|
-
def
|
39
|
-
plan.
|
51
|
+
def test_explicit_executable_flag
|
52
|
+
plan.add(event = EventGenerator.new(true))
|
53
|
+
assert(event.executable?)
|
40
54
|
event.executable = false
|
41
55
|
assert_raises(EventNotExecutable) { event.call(nil) }
|
42
56
|
assert_raises(EventNotExecutable) { event.emit(nil) }
|
@@ -45,14 +59,14 @@ class TC_Event < Test::Unit::TestCase
|
|
45
59
|
assert_nothing_raised { event.call(nil) }
|
46
60
|
assert_nothing_raised { event.emit(nil) }
|
47
61
|
|
48
|
-
plan.
|
62
|
+
plan.add(other = EventGenerator.new(true))
|
49
63
|
other.executable = false
|
50
|
-
event.
|
64
|
+
event.signals other
|
51
65
|
assert_raises(EventNotExecutable) { event.call(nil) }
|
52
66
|
|
53
67
|
event.remove_signal(other)
|
54
68
|
assert_nothing_raised { event.emit(nil) }
|
55
|
-
|
69
|
+
event.forward_to other
|
56
70
|
assert_raises(EventNotExecutable) { event.call(nil) }
|
57
71
|
|
58
72
|
event.remove_forwarding(other)
|
@@ -61,9 +75,8 @@ class TC_Event < Test::Unit::TestCase
|
|
61
75
|
assert_original_error(EventNotExecutable, EventHandlerError) { event.call(nil) }
|
62
76
|
end
|
63
77
|
|
64
|
-
def
|
65
|
-
event = EventGenerator.new
|
66
|
-
plan.discover(event)
|
78
|
+
def test_emit_failed_raises
|
79
|
+
plan.add(event = EventGenerator.new)
|
67
80
|
assert_original_error(NilClass, EmissionFailed) { event.emit_failed }
|
68
81
|
assert_original_error(NilClass, EmissionFailed) { event.emit_failed("test") }
|
69
82
|
|
@@ -82,9 +95,11 @@ class TC_Event < Test::Unit::TestCase
|
|
82
95
|
assert_equal(event, e.failed_generator)
|
83
96
|
assert( e.message =~ /: test$/ )
|
84
97
|
end
|
98
|
+
end
|
85
99
|
|
100
|
+
def test_emit_failed_removes_pending
|
86
101
|
event = EventGenerator.new { }
|
87
|
-
plan.
|
102
|
+
plan.add(event)
|
88
103
|
event.call
|
89
104
|
assert(event.pending?)
|
90
105
|
assert_raises(EmissionFailed) { event.emit_failed }
|
@@ -93,8 +108,8 @@ class TC_Event < Test::Unit::TestCase
|
|
93
108
|
|
94
109
|
def test_propagation_id
|
95
110
|
e1, e2, e3 = (1..3).map { EventGenerator.new(true) }.
|
96
|
-
each { |e| plan.
|
97
|
-
e1.
|
111
|
+
each { |e| plan.add(e) }
|
112
|
+
e1.signals e2
|
98
113
|
e1.emit(nil)
|
99
114
|
assert_equal(e1.last.propagation_id, e2.last.propagation_id)
|
100
115
|
|
@@ -107,21 +122,82 @@ class TC_Event < Test::Unit::TestCase
|
|
107
122
|
end
|
108
123
|
|
109
124
|
|
110
|
-
def
|
125
|
+
def test_signals_without_delay
|
111
126
|
e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
|
112
|
-
plan.
|
127
|
+
plan.add([e1, e2])
|
113
128
|
|
114
|
-
|
115
|
-
assert( e1.child_object?( e2, EventStructure::Signal ))
|
116
|
-
assert( e2.parent_object?( e1, EventStructure::Signal ))
|
129
|
+
e1.signals e2
|
117
130
|
|
118
|
-
|
119
|
-
|
131
|
+
assert( e1.child_object?( e2, EventStructure::Signal ))
|
132
|
+
assert( e2.parent_object?( e1, EventStructure::Signal ))
|
133
|
+
|
134
|
+
e1.call(nil)
|
135
|
+
assert(e2.happened?)
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_forward_to_without_delay
|
139
|
+
e1, e2 = EventGenerator.new, Roby::EventGenerator.new
|
140
|
+
plan.add([e1, e2])
|
141
|
+
|
142
|
+
e1.forward_to e2
|
143
|
+
|
144
|
+
assert( e1.child_object?( e2, EventStructure::Forwarding ))
|
145
|
+
assert( e2.parent_object?( e1, EventStructure::Forwarding ))
|
146
|
+
|
147
|
+
e1.emit(nil)
|
148
|
+
assert(e2.happened?)
|
149
|
+
end
|
150
|
+
|
151
|
+
# b.emit_on(a) is replaced by a.forward_to(b)
|
152
|
+
def test_deprecated_emit_on
|
153
|
+
e1, e2 = EventGenerator.new, Roby::EventGenerator.new
|
154
|
+
plan.add([e1, e2])
|
155
|
+
|
156
|
+
deprecated_feature do
|
157
|
+
e2.emit_on e1
|
158
|
+
end
|
159
|
+
|
160
|
+
assert( e1.child_object?( e2, EventStructure::Forwarding ))
|
161
|
+
assert( e2.parent_object?( e1, EventStructure::Forwarding ))
|
162
|
+
|
163
|
+
e1.emit(nil)
|
164
|
+
assert(e2.happened?)
|
165
|
+
end
|
166
|
+
|
167
|
+
# forward has been renamed into #forward_to
|
168
|
+
def test_deprecated_forward
|
169
|
+
e1, e2 = EventGenerator.new, Roby::EventGenerator.new
|
170
|
+
plan.add([e1, e2])
|
171
|
+
|
172
|
+
deprecated_feature do
|
173
|
+
e1.forward e2
|
174
|
+
end
|
175
|
+
|
176
|
+
assert( e1.child_object?( e2, EventStructure::Forwarding ))
|
177
|
+
assert( e2.parent_object?( e1, EventStructure::Forwarding ))
|
178
|
+
|
179
|
+
e1.emit(nil)
|
180
|
+
assert(e2.happened?)
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_deprecated_on
|
184
|
+
e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
|
185
|
+
plan.add([e1, e2])
|
186
|
+
|
187
|
+
deprecated_feature do
|
188
|
+
e1.on e2
|
189
|
+
end
|
190
|
+
|
191
|
+
assert( e1.child_object?( e2, EventStructure::Signal ))
|
192
|
+
assert( e2.parent_object?( e1, EventStructure::Signal ))
|
193
|
+
|
194
|
+
e1.call(nil)
|
195
|
+
assert(e2.happened?)
|
120
196
|
end
|
121
197
|
|
122
198
|
def test_handlers
|
123
199
|
e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
|
124
|
-
plan.
|
200
|
+
plan.add([e1, e2])
|
125
201
|
e1.on { e2.call(nil) }
|
126
202
|
|
127
203
|
FlexMock.use do |mock|
|
@@ -135,45 +211,45 @@ class TC_Event < Test::Unit::TestCase
|
|
135
211
|
end
|
136
212
|
end
|
137
213
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
214
|
+
def common_test_source_setup(forwarding)
|
215
|
+
src = EventGenerator.new(true)
|
216
|
+
e = EventGenerator.new(true)
|
217
|
+
target = EventGenerator.new(true)
|
218
|
+
plan.add([src, e, target])
|
219
|
+
src.signals e
|
220
|
+
yield(e, target)
|
221
|
+
src.call
|
222
|
+
if forwarding
|
223
|
+
assert_equal([e.last], target.last.sources.to_a)
|
224
|
+
else
|
225
|
+
assert_equal([], target.last.sources.to_a)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
def test_forward_source
|
229
|
+
common_test_source_setup(true) { |e, target| e.forward_to target }
|
230
|
+
end
|
231
|
+
def test_forward_in_handler_source
|
232
|
+
common_test_source_setup(true) { |e, target| e.on { target.emit } }
|
233
|
+
end
|
234
|
+
def test_forward_in_command_source
|
235
|
+
common_test_source_setup(false) { |e, target| e.command = lambda { |_| target.emit; e.emit } }
|
236
|
+
end
|
237
|
+
def test_signal_source
|
238
|
+
common_test_source_setup(false) { |e, target| e.signals target }
|
239
|
+
end
|
240
|
+
def test_signal_in_handler_source
|
241
|
+
common_test_source_setup(false) { |e, target| e.on { target.call } }
|
242
|
+
end
|
243
|
+
def test_signal_in_command_source
|
244
|
+
common_test_source_setup(false) { |e, target| e.command = lambda { |_| target.call; e.emit } }
|
169
245
|
end
|
170
246
|
|
171
247
|
def test_simple_signal_handler_ordering
|
172
248
|
e1, e2, e3 = (1..3).map { EventGenerator.new(true) }.
|
173
|
-
each { |e| plan.
|
174
|
-
e1.
|
249
|
+
each { |e| plan.add(e) }
|
250
|
+
e1.signals(e2)
|
175
251
|
e1.on { e2.remove_signal(e3) }
|
176
|
-
e2.
|
252
|
+
e2.signals(e3)
|
177
253
|
|
178
254
|
e1.call(nil)
|
179
255
|
assert( e2.happened? )
|
@@ -194,7 +270,7 @@ class TC_Event < Test::Unit::TestCase
|
|
194
270
|
generator = Class.new(EventGenerator) do
|
195
271
|
include mod
|
196
272
|
end.new(true)
|
197
|
-
plan.
|
273
|
+
plan.add(generator)
|
198
274
|
|
199
275
|
hooks.each do |name|
|
200
276
|
mock.should_receive(name).once.with(generator).ordered
|
@@ -206,7 +282,7 @@ class TC_Event < Test::Unit::TestCase
|
|
206
282
|
def test_postpone
|
207
283
|
wait_for = EventGenerator.new(true)
|
208
284
|
event = EventGenerator.new(true)
|
209
|
-
plan.
|
285
|
+
plan.add([wait_for, event])
|
210
286
|
event.singleton_class.class_eval do
|
211
287
|
define_method(:calling) do |context|
|
212
288
|
super if defined? super
|
@@ -228,7 +304,7 @@ class TC_Event < Test::Unit::TestCase
|
|
228
304
|
FlexMock.use do |mock|
|
229
305
|
wait_for = EventGenerator.new(true)
|
230
306
|
event = EventGenerator.new(true)
|
231
|
-
plan.
|
307
|
+
plan.add([wait_for, event])
|
232
308
|
event.singleton_class.class_eval do
|
233
309
|
define_method(:calling) do |context|
|
234
310
|
super if defined? super
|
@@ -251,31 +327,18 @@ class TC_Event < Test::Unit::TestCase
|
|
251
327
|
|
252
328
|
def test_can_signal
|
253
329
|
a, b = EventGenerator.new(true), EventGenerator.new
|
254
|
-
plan.
|
255
|
-
assert_raises(EventNotControlable) { a.
|
256
|
-
assert_nothing_raised { a.
|
330
|
+
plan.add([a, b])
|
331
|
+
assert_raises(EventNotControlable) { a.signals b }
|
332
|
+
assert_nothing_raised { a.forward_to b }
|
257
333
|
|
258
334
|
a, b = EventGenerator.new(true), EventGenerator.new(true)
|
259
|
-
plan.
|
260
|
-
a.
|
335
|
+
plan.add([a, b])
|
336
|
+
a.signals b
|
261
337
|
def b.controlable?; false end
|
262
338
|
|
263
339
|
assert_raise(EmissionFailed) { a.call(nil) }
|
264
340
|
end
|
265
341
|
|
266
|
-
def test_emit_on
|
267
|
-
e1, e2 = (1..2).map { EventGenerator.new(true) }.
|
268
|
-
each { |e| plan.discover(e) }
|
269
|
-
e1.emit_on e2
|
270
|
-
FlexMock.use do |mock|
|
271
|
-
e1.on { mock.e1 }
|
272
|
-
e2.on { mock.e2 }
|
273
|
-
mock.should_receive(:e2).once.ordered
|
274
|
-
mock.should_receive(:e1).once.ordered
|
275
|
-
e2.call(nil)
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
342
|
def test_and_generator
|
280
343
|
and_event = AndGenerator.new
|
281
344
|
FlexMock.use do |mock|
|
@@ -283,7 +346,7 @@ class TC_Event < Test::Unit::TestCase
|
|
283
346
|
mock.should_receive(:called).once
|
284
347
|
|
285
348
|
events = 5.enum_for(:times).map { EventGenerator.new(true) }
|
286
|
-
plan.
|
349
|
+
plan.add(events)
|
287
350
|
events.each { |ev| and_event << ev }
|
288
351
|
|
289
352
|
events.each do |ev|
|
@@ -304,7 +367,7 @@ class TC_Event < Test::Unit::TestCase
|
|
304
367
|
|
305
368
|
# Check the behavior of the & operator
|
306
369
|
e1, e2, e3, e4 = (1..4).map { EventGenerator.new(true) }.
|
307
|
-
each { |e| plan.
|
370
|
+
each { |e| plan.add(e) }
|
308
371
|
and_event = e1 & e2
|
309
372
|
and_and = and_event & e3
|
310
373
|
assert_equal([e1, e2].to_set, and_event.waiting.to_set)
|
@@ -313,10 +376,10 @@ class TC_Event < Test::Unit::TestCase
|
|
313
376
|
|
314
377
|
# Check dynamic behaviour
|
315
378
|
a, b, c, d = (1..4).map { EventGenerator.new(true) }.
|
316
|
-
each { |e| plan.
|
379
|
+
each { |e| plan.add(e) }
|
317
380
|
and1 = a & b
|
318
381
|
and2 = and1 & c
|
319
|
-
and2.
|
382
|
+
and2.signals d
|
320
383
|
assert_equal([and1], a.enum_for(:each_signal).to_a)
|
321
384
|
assert_equal([and1], b.enum_for(:each_signal).to_a)
|
322
385
|
assert_equal([and2], and1.enum_for(:each_signal).to_a)
|
@@ -341,7 +404,7 @@ class TC_Event < Test::Unit::TestCase
|
|
341
404
|
end
|
342
405
|
|
343
406
|
def test_and_empty
|
344
|
-
plan.
|
407
|
+
plan.add(and_event = AndGenerator.new)
|
345
408
|
|
346
409
|
assert(and_event.empty?)
|
347
410
|
and_event << EventGenerator.new(true)
|
@@ -351,7 +414,7 @@ class TC_Event < Test::Unit::TestCase
|
|
351
414
|
|
352
415
|
def test_and_unreachability
|
353
416
|
a, b = (1..2).map { EventGenerator.new(true) }.
|
354
|
-
each { |e| plan.
|
417
|
+
each { |e| plan.add(e) }
|
355
418
|
|
356
419
|
# Test unreachability
|
357
420
|
## it is unreachable once emitted, but if_unreachable(true) blocks
|
@@ -379,7 +442,7 @@ class TC_Event < Test::Unit::TestCase
|
|
379
442
|
|
380
443
|
def test_and_reset
|
381
444
|
a, b = (1..2).map { EventGenerator.new(true) }.
|
382
|
-
each { |e| plan.
|
445
|
+
each { |e| plan.add(e) }
|
383
446
|
and_event = (a & b)
|
384
447
|
a.emit(nil)
|
385
448
|
|
@@ -406,10 +469,10 @@ class TC_Event < Test::Unit::TestCase
|
|
406
469
|
|
407
470
|
def setup_aggregation(mock)
|
408
471
|
e1, e2, m1, m2, m3 = 5.enum_for(:times).map { EventGenerator.new(true) }
|
409
|
-
plan.
|
410
|
-
e1.
|
411
|
-
m1.
|
412
|
-
m2.
|
472
|
+
plan.add([e1, e2, m1, m2, m3])
|
473
|
+
e1.signals e2
|
474
|
+
m1.signals m2
|
475
|
+
m2.signals m3
|
413
476
|
|
414
477
|
(e1 & e2 & m2).on { mock.and }
|
415
478
|
(e2 | m1).on { mock.or }
|
@@ -422,7 +485,7 @@ class TC_Event < Test::Unit::TestCase
|
|
422
485
|
def test_aggregator
|
423
486
|
FlexMock.use do |mock|
|
424
487
|
e1, e2, m1, *_ = setup_aggregation(mock)
|
425
|
-
e2.
|
488
|
+
e2.signals m1
|
426
489
|
mock.should_receive(:or).once
|
427
490
|
mock.should_receive(:and).once
|
428
491
|
mock.should_receive(:and_or).once
|
@@ -451,7 +514,7 @@ class TC_Event < Test::Unit::TestCase
|
|
451
514
|
|
452
515
|
def test_or_generator
|
453
516
|
a, b, c = (1..3).map { EventGenerator.new(true) }.
|
454
|
-
each { |e| plan.
|
517
|
+
each { |e| plan.add(e) }
|
455
518
|
|
456
519
|
or_event = OrGenerator.new
|
457
520
|
assert(or_event.empty?)
|
@@ -459,7 +522,7 @@ class TC_Event < Test::Unit::TestCase
|
|
459
522
|
assert(!or_event.empty?)
|
460
523
|
|
461
524
|
or_event = (a | b)
|
462
|
-
or_event.
|
525
|
+
or_event.signals c
|
463
526
|
assert( a.enum_for(:each_causal_link).find { |ev| ev == or_event } )
|
464
527
|
assert( or_event.enum_for(:each_causal_link).find { |ev| ev == c } )
|
465
528
|
a.call(nil)
|
@@ -468,7 +531,7 @@ class TC_Event < Test::Unit::TestCase
|
|
468
531
|
end
|
469
532
|
|
470
533
|
def test_or_emission
|
471
|
-
plan.
|
534
|
+
plan.add(or_event = OrGenerator.new)
|
472
535
|
events = (1..4).map { EventGenerator.new(true) }.
|
473
536
|
each { |e| or_event << e }
|
474
537
|
|
@@ -483,7 +546,7 @@ class TC_Event < Test::Unit::TestCase
|
|
483
546
|
end
|
484
547
|
|
485
548
|
def test_or_reset
|
486
|
-
plan.
|
549
|
+
plan.add(or_event = OrGenerator.new)
|
487
550
|
events = (1..4).map { EventGenerator.new(true) }.
|
488
551
|
each { |e| or_event << e }
|
489
552
|
|
@@ -499,7 +562,7 @@ class TC_Event < Test::Unit::TestCase
|
|
499
562
|
def test_or_unreachability
|
500
563
|
# Test unreachability properties
|
501
564
|
a, b = (1..3).map { EventGenerator.new(true) }.
|
502
|
-
each { |e| plan.
|
565
|
+
each { |e| plan.add(e) }
|
503
566
|
or_event = (a | b)
|
504
567
|
|
505
568
|
## must be unreachable once emitted, but if_unreachable(true) blocks
|
@@ -526,10 +589,10 @@ class TC_Event < Test::Unit::TestCase
|
|
526
589
|
|
527
590
|
def test_until
|
528
591
|
source, sink, filter, limit = 4.enum_for(:times).map { EventGenerator.new(true) }
|
529
|
-
plan.
|
592
|
+
plan.add [source, sink, filter, limit]
|
530
593
|
|
531
|
-
source.
|
532
|
-
filter.until(limit).
|
594
|
+
source.signals(filter)
|
595
|
+
filter.until(limit).signals(sink)
|
533
596
|
|
534
597
|
FlexMock.use do |mock|
|
535
598
|
sink.on { mock.passed }
|
@@ -544,19 +607,19 @@ class TC_Event < Test::Unit::TestCase
|
|
544
607
|
def test_event_creation
|
545
608
|
# Test for validation of the return value of #event
|
546
609
|
generator = Class.new(EventGenerator) do
|
547
|
-
def new(context); [
|
610
|
+
def new(context); [] end
|
548
611
|
end.new(true)
|
549
|
-
plan.
|
612
|
+
plan.add(generator)
|
550
613
|
|
551
614
|
assert_raises(EmissionFailed) { generator.emit(nil) }
|
552
615
|
|
553
616
|
generator = Class.new(EventGenerator) do
|
554
617
|
def new(context);
|
555
618
|
event_klass = Struct.new :propagation_id, :context, :generator, :sources
|
556
|
-
event_klass.new(
|
619
|
+
event_klass.new(plan.engine.propagation_id, context, self)
|
557
620
|
end
|
558
621
|
end.new(true)
|
559
|
-
plan.
|
622
|
+
plan.add(generator)
|
560
623
|
assert_nothing_raised { generator.call(nil) }
|
561
624
|
end
|
562
625
|
|
@@ -564,10 +627,10 @@ class TC_Event < Test::Unit::TestCase
|
|
564
627
|
FlexMock.use do |mock|
|
565
628
|
e1 = EventGenerator.new { |context| mock.e1_cmd(context); e1.emit(*context) }
|
566
629
|
e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
|
567
|
-
e1.
|
630
|
+
e1.signals e2
|
568
631
|
e1.on { |event| mock.e1(event.context) }
|
569
632
|
e2.on { |event| mock.e2(event.context) }
|
570
|
-
plan.
|
633
|
+
plan.add([e1, e2])
|
571
634
|
|
572
635
|
mock.should_receive(:e1_cmd).with([mock]).once
|
573
636
|
mock.should_receive(:e2_cmd).with([mock]).once
|
@@ -579,10 +642,10 @@ class TC_Event < Test::Unit::TestCase
|
|
579
642
|
FlexMock.use do |mock|
|
580
643
|
pass_through = EventGenerator.new(true)
|
581
644
|
e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
|
582
|
-
pass_through.
|
645
|
+
pass_through.signals e2
|
583
646
|
pass_through.on { |event| mock.e1(event.context) }
|
584
647
|
e2.on { |event| mock.e2(event.context) }
|
585
|
-
plan.
|
648
|
+
plan.add([pass_through, e2])
|
586
649
|
|
587
650
|
mock.should_receive(:e2_cmd).with([mock]).once
|
588
651
|
mock.should_receive(:e1).with([mock]).once
|
@@ -593,10 +656,10 @@ class TC_Event < Test::Unit::TestCase
|
|
593
656
|
FlexMock.use do |mock|
|
594
657
|
e1 = EventGenerator.new { |context| mock.e1_cmd(context); e1.emit(*context) }
|
595
658
|
e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
|
596
|
-
e1.
|
659
|
+
e1.signals e2
|
597
660
|
e1.on { |event| mock.e1(event.context) }
|
598
661
|
e2.on { |event| mock.e2(event.context) }
|
599
|
-
plan.
|
662
|
+
plan.add([e1, e2])
|
600
663
|
|
601
664
|
mock.should_receive(:e1_cmd).with(nil).once
|
602
665
|
mock.should_receive(:e2_cmd).with(nil).once
|
@@ -607,7 +670,7 @@ class TC_Event < Test::Unit::TestCase
|
|
607
670
|
end
|
608
671
|
|
609
672
|
def test_preconditions
|
610
|
-
plan.
|
673
|
+
plan.add(e1 = EventGenerator.new(true))
|
611
674
|
e1.precondition("context must be non-nil") do |generator, context|
|
612
675
|
context
|
613
676
|
end
|
@@ -622,27 +685,27 @@ class TC_Event < Test::Unit::TestCase
|
|
622
685
|
cancel("testing cancel method")
|
623
686
|
end
|
624
687
|
end.new(true)
|
625
|
-
plan.
|
688
|
+
plan.add(e1)
|
626
689
|
assert_raises(EventCanceled) { e1.call(nil) }
|
627
690
|
end
|
628
691
|
|
629
692
|
def test_related_events
|
630
693
|
e1, e2 = (1..2).map { EventGenerator.new(true) }.
|
631
|
-
each { |ev| plan.
|
694
|
+
each { |ev| plan.add(ev) }
|
632
695
|
|
633
696
|
assert_equal([].to_value_set, e1.related_events)
|
634
|
-
e1.
|
697
|
+
e1.signals e2
|
635
698
|
assert_equal([e2].to_value_set, e1.related_events)
|
636
699
|
assert_equal([e1].to_value_set, e2.related_events)
|
637
700
|
end
|
638
701
|
|
639
702
|
def test_related_tasks
|
640
703
|
e1, e2 = (1..2).map { EventGenerator.new(true) }.
|
641
|
-
each { |ev| plan.
|
704
|
+
each { |ev| plan.add(ev) }
|
642
705
|
t1 = SimpleTask.new
|
643
706
|
|
644
707
|
assert_equal([].to_value_set, e1.related_tasks)
|
645
|
-
e1.
|
708
|
+
e1.signals t1.event(:start)
|
646
709
|
assert_equal([t1].to_value_set, e1.related_tasks)
|
647
710
|
end
|
648
711
|
|
@@ -652,7 +715,7 @@ class TC_Event < Test::Unit::TestCase
|
|
652
715
|
ev.emit(*context)
|
653
716
|
mock.called(*context)
|
654
717
|
end
|
655
|
-
plan.
|
718
|
+
plan.add(ev)
|
656
719
|
|
657
720
|
mock.should_receive(:called).with(42).once
|
658
721
|
ev.call(42)
|
@@ -666,7 +729,7 @@ class TC_Event < Test::Unit::TestCase
|
|
666
729
|
def test_set_command
|
667
730
|
FlexMock.use do |mock|
|
668
731
|
ev = EventGenerator.new
|
669
|
-
plan.
|
732
|
+
plan.add(ev)
|
670
733
|
assert(!ev.controlable?)
|
671
734
|
|
672
735
|
ev.command = lambda { mock.first }
|
@@ -685,19 +748,25 @@ class TC_Event < Test::Unit::TestCase
|
|
685
748
|
end
|
686
749
|
|
687
750
|
def test_once
|
688
|
-
|
689
|
-
|
751
|
+
plan.add(ev = EventGenerator.new(true))
|
752
|
+
FlexMock.use do |mock|
|
753
|
+
ev.once { mock.called_once }
|
754
|
+
mock.should_receive(:called_once).once
|
755
|
+
|
756
|
+
ev.call
|
757
|
+
ev.call
|
758
|
+
end
|
759
|
+
end
|
690
760
|
|
761
|
+
def test_signal_once
|
762
|
+
ev1, ev2 = EventGenerator.new(true), EventGenerator.new(true)
|
763
|
+
plan.add([ev1, ev2])
|
691
764
|
|
692
765
|
FlexMock.use do |mock|
|
693
|
-
ev1.
|
694
|
-
mock.called_once
|
695
|
-
end
|
696
|
-
|
766
|
+
ev1.signals_once(ev2)
|
697
767
|
ev2.on { mock.called }
|
698
768
|
|
699
769
|
mock.should_receive(:called).once
|
700
|
-
mock.should_receive(:called_once).once
|
701
770
|
|
702
771
|
ev1.call
|
703
772
|
ev1.call
|
@@ -706,10 +775,10 @@ class TC_Event < Test::Unit::TestCase
|
|
706
775
|
|
707
776
|
def test_forward_once
|
708
777
|
ev1, ev2 = EventGenerator.new(true), EventGenerator.new(true)
|
709
|
-
plan.
|
778
|
+
plan.add([ev1, ev2])
|
710
779
|
|
711
780
|
FlexMock.use do |mock|
|
712
|
-
ev1.
|
781
|
+
ev1.forward_to_once(ev2)
|
713
782
|
ev2.on { mock.called }
|
714
783
|
|
715
784
|
mock.should_receive(:called).once
|
@@ -721,16 +790,16 @@ class TC_Event < Test::Unit::TestCase
|
|
721
790
|
|
722
791
|
def test_filter
|
723
792
|
ev1, ev_block, ev_value, ev_nil = (1..4).map { EventGenerator.new(true) }.
|
724
|
-
each { |e| plan.
|
793
|
+
each { |e| plan.add(e) }
|
725
794
|
|
726
795
|
FlexMock.use do |mock|
|
727
|
-
ev1.filter { |v| mock.filtering(v); v*2 }.
|
796
|
+
ev1.filter { |v| mock.filtering(v); v*2 }.signals ev_block
|
728
797
|
ev_block.on { |ev| mock.block_filter(ev.context) }
|
729
798
|
|
730
|
-
ev1.filter(42).
|
799
|
+
ev1.filter(42).signals ev_value
|
731
800
|
ev_value.on { |ev| mock.value_filter(ev.context) }
|
732
801
|
|
733
|
-
ev1.filter.
|
802
|
+
ev1.filter.signals ev_nil
|
734
803
|
ev_nil.on { |ev| mock.nil_filter(ev.context) }
|
735
804
|
|
736
805
|
mock.should_receive(:filtering).with(21).once
|
@@ -743,7 +812,7 @@ class TC_Event < Test::Unit::TestCase
|
|
743
812
|
|
744
813
|
def test_gather_events
|
745
814
|
e1, e2 = (1..2).map { EventGenerator.new(true) }.
|
746
|
-
each { |e| plan.
|
815
|
+
each { |e| plan.add(e) }
|
747
816
|
|
748
817
|
collection = []
|
749
818
|
|
@@ -774,7 +843,7 @@ class TC_Event < Test::Unit::TestCase
|
|
774
843
|
master = EventGenerator.new do
|
775
844
|
master.achieve_with slave
|
776
845
|
end
|
777
|
-
plan.
|
846
|
+
plan.add([master, slave])
|
778
847
|
|
779
848
|
master.call
|
780
849
|
assert(!master.happened?)
|
@@ -786,7 +855,7 @@ class TC_Event < Test::Unit::TestCase
|
|
786
855
|
master = EventGenerator.new do
|
787
856
|
master.achieve_with slave
|
788
857
|
end
|
789
|
-
plan.
|
858
|
+
plan.add([master, slave])
|
790
859
|
|
791
860
|
master.call
|
792
861
|
assert(!master.happened?)
|
@@ -797,7 +866,7 @@ class TC_Event < Test::Unit::TestCase
|
|
797
866
|
master = EventGenerator.new do
|
798
867
|
master.achieve_with(slave) { [21, 42] }
|
799
868
|
end
|
800
|
-
plan.
|
869
|
+
plan.add([master, slave])
|
801
870
|
|
802
871
|
master.call
|
803
872
|
slave.emit
|
@@ -808,28 +877,28 @@ class TC_Event < Test::Unit::TestCase
|
|
808
877
|
|
809
878
|
def test_if_unreachable
|
810
879
|
FlexMock.use do |mock|
|
811
|
-
plan.
|
880
|
+
plan.add(ev = EventGenerator.new(true))
|
812
881
|
ev.if_unreachable(false) { mock.called }
|
813
882
|
ev.if_unreachable(true) { mock.canceled_called }
|
814
883
|
ev.call
|
815
884
|
|
816
885
|
mock.should_receive(:called).once
|
817
886
|
mock.should_receive(:canceled_called).never
|
818
|
-
|
887
|
+
engine.garbage_collect
|
819
888
|
end
|
820
889
|
end
|
821
890
|
|
822
891
|
def test_when_unreachable
|
823
|
-
plan.
|
892
|
+
plan.add(ev = EventGenerator.new(true))
|
824
893
|
ev.when_unreachable.on { |ev| mock.unreachable_fired }
|
825
894
|
ev.call
|
826
|
-
|
895
|
+
engine.garbage_collect
|
827
896
|
assert(ev.happened?)
|
828
897
|
end
|
829
898
|
|
830
899
|
def test_or_if_unreachable
|
831
|
-
plan.
|
832
|
-
plan.
|
900
|
+
plan.add(e1 = EventGenerator.new(true))
|
901
|
+
plan.add(e2 = EventGenerator.new(true))
|
833
902
|
a = e1 | e2
|
834
903
|
FlexMock.use do |mock|
|
835
904
|
a.if_unreachable(false) { mock.called }
|
@@ -846,8 +915,8 @@ class TC_Event < Test::Unit::TestCase
|
|
846
915
|
|
847
916
|
def test_and_if_unreachable
|
848
917
|
FlexMock.use do |mock|
|
849
|
-
plan.
|
850
|
-
plan.
|
918
|
+
plan.add(e1 = EventGenerator.new(true))
|
919
|
+
plan.add(e2 = EventGenerator.new(true))
|
851
920
|
a = e1 & e2
|
852
921
|
|
853
922
|
a.if_unreachable(false) { mock.called }
|
@@ -858,8 +927,8 @@ class TC_Event < Test::Unit::TestCase
|
|
858
927
|
end
|
859
928
|
|
860
929
|
FlexMock.use do |mock|
|
861
|
-
plan.
|
862
|
-
plan.
|
930
|
+
plan.add(e1 = EventGenerator.new(true))
|
931
|
+
plan.add(e2 = EventGenerator.new(true))
|
863
932
|
a = e1 & e2
|
864
933
|
|
865
934
|
a.if_unreachable(false) { mock.called }
|
@@ -871,7 +940,7 @@ class TC_Event < Test::Unit::TestCase
|
|
871
940
|
end
|
872
941
|
|
873
942
|
def test_dup
|
874
|
-
plan.
|
943
|
+
plan.add(e = EventGenerator.new(true))
|
875
944
|
|
876
945
|
e.call
|
877
946
|
new = e.dup
|
@@ -881,15 +950,20 @@ class TC_Event < Test::Unit::TestCase
|
|
881
950
|
end
|
882
951
|
|
883
952
|
def test_event_after
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
953
|
+
FlexMock.use(Time) do |time_proxy|
|
954
|
+
current_time = Time.now + 5
|
955
|
+
time_proxy.should_receive(:now).and_return { current_time }
|
956
|
+
|
957
|
+
plan.add(e = EventGenerator.new(true))
|
958
|
+
e.call
|
959
|
+
current_time += 0.5
|
960
|
+
plan.add(delayed = e.last.after(1))
|
961
|
+
delayed.poll
|
962
|
+
assert(!delayed.happened?)
|
963
|
+
current_time += 0.5
|
964
|
+
delayed.poll
|
965
|
+
assert(delayed.happened?)
|
966
|
+
end
|
893
967
|
end
|
894
968
|
end
|
895
969
|
|