xli-dtr 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/README +6 -115
  2. data/Rakefile +22 -154
  3. data/TODO +16 -1
  4. data/bin/dtr +22 -61
  5. data/dtr.gemspec +7 -6
  6. data/lib/dtr/agent/brain.rb +66 -0
  7. data/lib/dtr/agent/herald.rb +50 -0
  8. data/lib/dtr/agent/runner.rb +100 -0
  9. data/lib/dtr/agent/sync_codebase.rb +44 -0
  10. data/lib/dtr/agent/sync_logger.rb +40 -0
  11. data/lib/dtr/agent/test_unit.rb +42 -0
  12. data/lib/dtr/agent/worker.rb +92 -0
  13. data/lib/dtr/agent/working_env_ext.rb +45 -0
  14. data/lib/dtr/agent.rb +37 -0
  15. data/lib/dtr/master.rb +40 -0
  16. data/lib/dtr/monitor.rb +37 -0
  17. data/lib/dtr/raketasks.rb +74 -13
  18. data/lib/dtr/shared/adapter.rb +112 -0
  19. data/lib/dtr/shared/configuration.rb +76 -0
  20. data/lib/dtr/shared/message_decorator.rb +28 -0
  21. data/lib/dtr/shared/ruby_ext.rb +153 -0
  22. data/lib/dtr/shared/service/agent.rb +33 -0
  23. data/lib/dtr/shared/service/file.rb +28 -0
  24. data/lib/dtr/shared/service/rinda.rb +40 -0
  25. data/lib/dtr/shared/service/runner.rb +33 -0
  26. data/lib/dtr/shared/service/working_env.rb +28 -0
  27. data/lib/dtr/shared/service.rb +19 -0
  28. data/lib/dtr/shared/sync_codebase/codebase.rb +32 -0
  29. data/lib/dtr/shared/sync_codebase/master_ext.rb +52 -0
  30. data/lib/dtr/shared/sync_codebase/package.rb +39 -0
  31. data/lib/dtr/shared/sync_codebase/sync_service.rb +41 -0
  32. data/lib/dtr/shared/sync_codebase.rb +18 -0
  33. data/lib/dtr/shared/sync_logger.rb +72 -0
  34. data/lib/dtr/shared/utils/cmd.rb +30 -0
  35. data/lib/dtr/shared/utils/env_store.rb +60 -0
  36. data/lib/dtr/shared/utils/logger.rb +71 -0
  37. data/lib/dtr/shared/utils.rb +17 -0
  38. data/lib/dtr/shared/working_env.rb +38 -0
  39. data/lib/dtr/shared.rb +24 -0
  40. data/lib/dtr/test_unit/drb_test_runner.rb +57 -0
  41. data/lib/dtr/test_unit/injection.rb +30 -0
  42. data/lib/dtr/test_unit/test_case_injection.rb +37 -0
  43. data/lib/dtr/test_unit/testrunnermediator_injection.rb +72 -0
  44. data/lib/dtr/test_unit/thread_safe_test_result.rb +40 -0
  45. data/lib/dtr/test_unit/worker_club.rb +72 -0
  46. data/lib/dtr/test_unit.rb +8 -275
  47. data/lib/dtr/test_unit_injection.rb +0 -1
  48. data/lib/dtr.rb +23 -81
  49. data/test/acceptance/agent_working_env_test.rb +92 -0
  50. data/test/acceptance/dtr_package_task_test.rb +26 -0
  51. data/test/acceptance/general_test.rb +275 -0
  52. data/test/acceptance/sync_codebase_test.rb +67 -0
  53. data/test/acceptance/sync_logger_test.rb +41 -0
  54. data/test/agent_helper.rb +39 -0
  55. data/test/logger_stub.rb +30 -0
  56. data/test/test_helper.rb +43 -0
  57. data/test/unit/adapter_test.rb +107 -0
  58. data/test/unit/test_unit_test.rb +47 -0
  59. data/test/unit/working_env_test.rb +71 -0
  60. data/testdata/Rakefile +15 -0
  61. data/testdata/a_failed_test_case.rb +8 -0
  62. data/testdata/a_file_system_test_case.rb +8 -0
  63. data/testdata/a_test_case.rb +13 -0
  64. data/testdata/a_test_case2.rb +6 -0
  65. data/testdata/an_error_test_case.rb +9 -0
  66. data/testdata/another_project/Rakefile +6 -0
  67. data/testdata/another_project/passed_test_case.rb +7 -0
  68. data/testdata/is_required_by_a_test.rb +9 -0
  69. data/testdata/lib/lib_test_case.rb +7 -0
  70. data/testdata/package_task_test_rakefile +8 -0
  71. data/testdata/scenario_test_case.rb +34 -0
  72. data/testdata/setup_agent_env_test_case.rb +9 -0
  73. data/testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/Rakefile +6 -0
  74. data/testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/verify_dir_pwd_test_case.rb +10 -0
  75. metadata +72 -18
  76. data/lib/dtr/base.rb +0 -172
  77. data/lib/dtr/runner.rb +0 -270
  78. data/lib/dtr/service_provider.rb +0 -160
@@ -0,0 +1,275 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ include DTR::AgentHelper
4
+
5
+ class GeneralTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ #start_agents first for test files loaded would be copied into sub processes
9
+ start_agents
10
+ # put these here for we don't want run them in current process
11
+ @pwd = Dir.pwd
12
+ Dir.chdir(File.expand_path(File.dirname(__FILE__) + "/../../testdata/"))
13
+ require 'a_test_case'
14
+ require 'a_test_case2'
15
+ require 'a_failed_test_case'
16
+ require 'an_error_test_case'
17
+ require 'a_file_system_test_case'
18
+ require 'scenario_test_case'
19
+ require 'setup_agent_env_test_case'
20
+
21
+ DTR.inject
22
+ end
23
+
24
+ def teardown
25
+ DTR.reject
26
+ Dir.chdir(@pwd)
27
+ stop_agents
28
+ $argv_dup = nil
29
+ end
30
+
31
+ def test_run_test_passed
32
+ $argv_dup = ['a_test_case.rb', 'a_test_case2.rb', 'a_file_system_test_case.rb']
33
+ suite = Test::Unit::TestSuite.new('run_test_passed')
34
+ suite << ATestCase.suite
35
+ suite << ATestCase2.suite
36
+ suite << AFileSystemTestCase.suite
37
+
38
+ assert_fork_process_exits_ok do
39
+ @result = runit(suite)
40
+
41
+ assert @result.passed?
42
+ assert_equal 3, @result.run_count
43
+ assert_equal 0, @result.failure_count
44
+ assert_equal 0, @result.error_count
45
+ end
46
+ end
47
+
48
+ def test_run_test_failed
49
+ $argv_dup = ['a_test_case.rb', 'a_failed_test_case.rb']
50
+ suite = Test::Unit::TestSuite.new('test_run_test_failed')
51
+ suite << ATestCase.suite
52
+ suite << AFailedTestCase.suite
53
+
54
+ assert_fork_process_exits_ok do
55
+ @result = runit(suite)
56
+
57
+ assert !@result.passed?
58
+ assert_equal 2, @result.run_count
59
+ assert_equal 1, @result.failure_count
60
+ assert_equal 0, @result.error_count
61
+ end
62
+ end
63
+
64
+ def test_run_test_error
65
+ $argv_dup = ['a_test_case.rb', 'an_error_test_case.rb']
66
+ suite = Test::Unit::TestSuite.new('test_run_test_error')
67
+ suite << ATestCase.suite
68
+ suite << AnErrorTestCase.suite
69
+
70
+ assert_fork_process_exits_ok do
71
+ @result = runit(suite)
72
+
73
+ assert_false @result.passed?
74
+ assert_equal 2, @result.run_count
75
+ assert_equal 0, @result.failure_count
76
+ assert_equal 1, @result.error_count
77
+ end
78
+ end
79
+
80
+ def test_run_suite_should_be_independence
81
+ $argv_dup = ['an_error_test_case.rb']
82
+ suite = Test::Unit::TestSuite.new('test_run_suite_should_be_independence 1')
83
+ suite << AnErrorTestCase.suite
84
+
85
+ assert_fork_process_exits_ok do
86
+ @result = runit(suite)
87
+
88
+ assert_false @result.passed?
89
+ assert_equal 1, @result.run_count
90
+ assert_equal 0, @result.failure_count
91
+ assert_equal 1, @result.error_count
92
+ end
93
+
94
+ $argv_dup = ['a_test_case.rb']
95
+ suite = Test::Unit::TestSuite.new('test_run_suite_should_be_independence 2')
96
+ suite << ATestCase.suite
97
+
98
+ assert_fork_process_exits_ok do
99
+ @result = runit(suite)
100
+
101
+ assert @result.passed?
102
+ assert_equal 1, @result.run_count
103
+ assert_equal 0, @result.failure_count
104
+ assert_equal 0, @result.error_count
105
+ end
106
+ end
107
+
108
+ def test_should_ignore_environment_file_not_exists
109
+ $argv_dup = ['a_test_case.rb', 'test_file_not_exists.rb']
110
+ suite = Test::Unit::TestSuite.new('test_run_test_file_not_exist')
111
+ suite << ATestCase.suite
112
+
113
+ assert_fork_process_exits_ok do
114
+ @result = runit(suite)
115
+
116
+ assert @result.passed?
117
+ assert_equal 1, @result.run_count
118
+ assert_equal 0, @result.failure_count
119
+ assert_equal 0, @result.error_count
120
+ end
121
+ end
122
+
123
+ def test_run_empty_test_suite_and_no_test_files_in_environment
124
+ $argv_dup = []
125
+ suite = Test::Unit::TestSuite.new('test_run_without_test_files')
126
+
127
+ assert_fork_process_exits_ok do
128
+ @result = runit(suite)
129
+
130
+ assert @result.passed?
131
+ assert_equal 0, @result.run_count
132
+ assert_equal 0, @result.failure_count
133
+ assert_equal 0, @result.error_count
134
+ end
135
+ end
136
+
137
+ def test_run_empty_test_suite_should_not_crash_agent
138
+ $argv_dup = []
139
+ suite = Test::Unit::TestSuite.new('test_run_empty_test_suite_should_not_crash_agent')
140
+
141
+ assert_fork_process_exits_ok do
142
+ @result = runit(suite)
143
+
144
+ assert @result.passed?
145
+ assert_equal 0, @result.run_count
146
+ assert_equal 0, @result.failure_count
147
+ assert_equal 0, @result.error_count
148
+ end
149
+
150
+ $argv_dup = ['a_test_case.rb']
151
+ suite << ATestCase.suite
152
+ assert_fork_process_exits_ok do
153
+ @result = runit(suite)
154
+
155
+ assert @result.passed?
156
+ assert_equal 1, @result.run_count
157
+ assert_equal 0, @result.failure_count
158
+ assert_equal 0, @result.error_count
159
+ end
160
+ end
161
+
162
+ def test_run_empty_test_suite_and_test_files_not_exist_in_environment
163
+ $argv_dup = ['test_file_not_exists.rb']
164
+ suite = Test::Unit::TestSuite.new('test_run_empty_test_suite_and_test_files_not_exist_in_environment')
165
+
166
+ assert_fork_process_exits_ok do
167
+ @result = runit(suite)
168
+
169
+ assert @result.passed?
170
+ assert_equal 0, @result.run_count
171
+ assert_equal 0, @result.failure_count
172
+ assert_equal 0, @result.error_count
173
+ end
174
+ end
175
+
176
+ def test_run_test_specified_by_load_path
177
+ lib_path = File.expand_path(File.dirname(__FILE__) + '/../../testdata/lib')
178
+ $LOAD_PATH.unshift lib_path
179
+ require 'lib_test_case'
180
+ $argv_dup = ['lib_test_case.rb']
181
+ suite = Test::Unit::TestSuite.new('test_run_test_specified_by_load_path')
182
+ suite << LibTestCase.suite
183
+
184
+ assert_fork_process_exits_ok do
185
+ @result = runit(suite)
186
+
187
+ assert @result.passed?
188
+ assert_equal 1, @result.run_count
189
+ assert_equal 0, @result.failure_count
190
+ assert_equal 0, @result.error_count
191
+ end
192
+ ensure
193
+ $LOAD_PATH.delete lib_path
194
+ end
195
+
196
+ def test_message_of_errors_and_failures_should_include_runner_host_name
197
+ $argv_dup = ['scenario_test_case.rb']
198
+ suite = Test::Unit::TestSuite.new('test_should_wrapper_errors_by_dtr_remote_exception')
199
+ suite << ScenarioTestCase.suite
200
+
201
+ assert_fork_process_exits_ok do
202
+ @result = runit(suite)
203
+
204
+ assert !@result.passed?
205
+ assert_equal 8, @result.run_count
206
+ assert_equal 3, @result.failure_count
207
+ assert_equal 4, @result.error_count
208
+
209
+ @result.errors.each do |e|
210
+ assert e.message.include?("from #{Socket.gethostname}")
211
+ end
212
+ @result.failures.each do |e|
213
+ assert e.message.include?("from #{Socket.gethostname}")
214
+ end
215
+ end
216
+ end
217
+
218
+ def test_setup_agent_env_from_master_process
219
+ $argv_dup = ['setup_agent_env_test_case.rb']
220
+ suite = Test::Unit::TestSuite.new('setup_agent_env_from_master_process')
221
+ suite << SetupAgentEnvTestCase.suite
222
+ ENV['DTR_AGENT_ENV_SETUP_CMD'] = 'touch /tmp/test_setup_agent_env_from_master_process'
223
+ assert_fork_process_exits_ok do
224
+ @result = runit(suite)
225
+ assert @result.passed?
226
+ assert_equal 1, @result.run_count
227
+ assert_equal 0, @result.failure_count
228
+ assert_equal 0, @result.error_count
229
+ end
230
+ ensure
231
+ File.delete('/tmp/test_setup_agent_env_from_master_process') rescue nil
232
+ ENV['DTR_AGENT_ENV_SETUP_CMD'] = nil
233
+ end
234
+
235
+ def test_multi_dtr_tasks_should_be_queued_and_processed_one_by_one
236
+ testdata_dir = File.expand_path('./../testdata')
237
+ $argv_dup = ['a_test_case.rb', 'a_test_case2.rb', 'a_file_system_test_case.rb']
238
+ suite = Test::Unit::TestSuite.new('run_test_passed')
239
+ suite << ATestCase.suite
240
+ suite << ATestCase2.suite
241
+ suite << AFileSystemTestCase.suite
242
+ process_assertion = Proc.new do |master_dir|
243
+ FileUtils.cp_r testdata_dir, master_dir
244
+ begin
245
+ Dir.chdir(master_dir) do
246
+ result = runit(suite)
247
+ assert result.passed?
248
+ assert_equal 3, result.run_count
249
+ end
250
+ ensure
251
+ FileUtils.rm_rf master_dir
252
+ end
253
+ end
254
+
255
+ @test_processes = []
256
+ 4.times do |index|
257
+ @test_processes << Process.fork do
258
+ process_assertion.call("#{testdata_dir}_copy#{index}")
259
+ end
260
+ end
261
+
262
+ Process.waitpid @test_processes[0]
263
+ assert_equal 0, $?.exitstatus
264
+ Process.waitpid @test_processes[1]
265
+ assert_equal 0, $?.exitstatus
266
+ Process.waitpid @test_processes[2]
267
+ assert_equal 0, $?.exitstatus
268
+ Process.waitpid @test_processes[3]
269
+ assert_equal 0, $?.exitstatus
270
+ ensure
271
+ @test_processes.each do |pid|
272
+ Process.kill 'TERM', pid rescue nil
273
+ end
274
+ end
275
+ end
@@ -0,0 +1,67 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ include DTR::AgentHelper
3
+
4
+ class SyncCodebaseTest < Test::Unit::TestCase
5
+ include DTR::Service::File
6
+ include DTR::SyncCodebase::SyncService
7
+
8
+ def test_sync_codebase
9
+ testdata_dir = File.expand_path(File.dirname(__FILE__) + '/../../testdata')
10
+
11
+ master = Process.fork do
12
+ DTR.configuration.with_rinda_server do
13
+ Dir.chdir(testdata_dir) do
14
+ DTR::Cmd.execute('rake dtr_repackage')
15
+ provide_file DTR::SyncCodebase::Codebase.new
16
+ DRb.thread.join
17
+ end
18
+ end
19
+ end
20
+ #sleep for waiting rinda server start
21
+ sleep(1)
22
+ client = Process.fork do
23
+ start_service
24
+ Dir.mkdir("test_sync_codebase")
25
+ Dir.chdir("test_sync_codebase") do
26
+ sync_codebase
27
+ end
28
+ end
29
+ Process.waitpid client
30
+ assert File.directory?("test_sync_codebase/#{package_name}")
31
+ assert !File.exists?("test_sync_codebase/#{package_copy_file}")
32
+ ensure
33
+ stop_service rescue nil
34
+ Process.kill 'TERM', master rescue nil
35
+ Process.kill 'TERM', client rescue nil
36
+ FileUtils.rm_rf("test_sync_codebase")
37
+ Dir.chdir(testdata_dir) do
38
+ DTR::Cmd.execute('rake dtr_clobber_package')
39
+ end
40
+ end
41
+
42
+ def test_should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process
43
+ @master_dir = File.expand_path(File.dirname(__FILE__) + '/../../testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process')
44
+ Dir.chdir(@master_dir) do
45
+ require 'verify_dir_pwd_test_case'
46
+ end
47
+ $argv_dup = ['verify_dir_pwd_test_case.rb']
48
+ suite = Test::Unit::TestSuite.new('test_should_not_sync_codebase_and_setup_working_dir')
49
+ suite << VerifyDirPwdTestCase.suite
50
+ @agent = start_agent_at @master_dir, 2, false
51
+ begin
52
+ DTR.inject
53
+ assert_fork_process_exits_ok do
54
+ Dir.chdir(@master_dir) do
55
+ result = runit(suite)
56
+ assert result.passed?
57
+ assert_equal 1, result.run_count
58
+ end
59
+ end
60
+ ensure
61
+ DTR.reject
62
+ Process.kill 'TERM', @agent rescue nil
63
+ Process.waitall
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ include DTR::AgentHelper
4
+
5
+ class SyncLoggerTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ start_agents
9
+ # put these here for we don't want run them in current process
10
+ @pwd = Dir.pwd
11
+ Dir.chdir(File.expand_path(File.dirname(__FILE__) + "/../../testdata/"))
12
+ require 'a_test_case'
13
+ @logger = LoggerStub.new
14
+ DTR.logger = @logger
15
+ DTR.inject
16
+ end
17
+
18
+ def teardown
19
+ DTR.reject
20
+ Dir.chdir(@pwd)
21
+ stop_agents
22
+ $argv_dup = nil
23
+ DTR.logger = nil
24
+ @logger.clear
25
+ end
26
+
27
+ #todo fix random failure
28
+ def test_master_process_should_get_log_of_agents
29
+ $argv_dup = ['a_test_case.rb']
30
+ suite = Test::Unit::TestSuite.new('test_master_process_should_get_log_of_agents')
31
+ suite << ATestCase.suite
32
+ assert_fork_process_exits_ok do
33
+ runit(suite)
34
+ end
35
+ logs = @logger.logs.flatten.join("\n")
36
+ assert(/From #{Socket.gethostname}: => Herald starts off\.\.\./ =~ logs)
37
+ assert(/From #{Socket.gethostname}: runner0: test files loaded/ =~ logs)
38
+ #when use Delegator to implement UndumpedLogger, there are lots of 'nil' in the log
39
+ assert(/nil/ !~ logs)
40
+ end
41
+ end
@@ -0,0 +1,39 @@
1
+ require 'fileutils'
2
+ module DTR
3
+ module AgentHelper
4
+ def start_agents
5
+ @agents_dir = File.join(Dir.pwd, 'agents')
6
+ @agents = []
7
+ @agents << start_agent_at(File.join(@agents_dir, 'agent1'), 3)
8
+ # @agents << start_agent_at(File.join(@agents_dir, 'agent2'), 1)
9
+ end
10
+
11
+ def start_agent_at(agent_dir, size, clean_dir=true)
12
+ FileUtils.rm_rf(agent_dir) if clean_dir
13
+ FileUtils.mkdir_p(agent_dir)
14
+ runner_names = []
15
+ size.times {|i| runner_names << "runner#{i}"}
16
+ Process.fork do
17
+ begin
18
+ Dir.chdir(agent_dir) do
19
+ DTR.launch_agent(runner_names, nil)
20
+ end
21
+ rescue Exception => e
22
+ puts e.message
23
+ puts e.backtrace.join("\n")
24
+ end
25
+ end
26
+ end
27
+
28
+ def stop_agents
29
+ if @agents
30
+ @agents.each do |agent|
31
+ Process.kill 'TERM', agent rescue nil
32
+ end
33
+ Process.waitall
34
+ end
35
+ ensure
36
+ FileUtils.rm_rf(@agents_dir) rescue nil
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,30 @@
1
+ class LoggerStub
2
+ def initialize
3
+ @store = DTR::EnvStore.new
4
+ clear
5
+ end
6
+ def debug(message=nil, &block)
7
+ output(:debug, message, &block)
8
+ end
9
+
10
+ def info(message=nil, &block)
11
+ output(:info, message, &block)
12
+ end
13
+
14
+ def error(message=nil, &block)
15
+ output(:error, message, &block)
16
+ end
17
+
18
+ def output(level, msg=nil, &block)
19
+ message = block_given? ? block.call : msg.to_s
20
+ @store << [:logs, [level, message]]
21
+ end
22
+
23
+ def logs
24
+ @store[:logs]
25
+ end
26
+
27
+ def clear
28
+ @store[:logs] = []
29
+ end
30
+ end
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+ require 'test/unit/ui/console/testrunner'
3
+
4
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
5
+
6
+ require 'rubygems'
7
+ # require 'growling_test'
8
+ require 'dtr'
9
+ require 'dtr/test_unit'
10
+ # DTR.configuration.master_yell_interval = 2
11
+ # DTR.configuration.follower_listen_sleep_timeout = 3
12
+
13
+ require File.dirname(__FILE__) + '/agent_helper'
14
+ require File.dirname(__FILE__) + '/logger_stub'
15
+
16
+ ENV['DTR_ENV'] = 'test'
17
+
18
+ module Test
19
+ module Unit
20
+ class TestCase
21
+ def assert_false(o)
22
+ assert !o
23
+ end
24
+ def assert_fork_process_exits_ok(&block)
25
+ pid = Process.fork do
26
+ block.call
27
+ exit 0
28
+ end
29
+ Process.waitpid pid
30
+ assert_equal 0, $?.exitstatus
31
+ ensure
32
+ Process.kill 'TERM', pid rescue nil
33
+ end
34
+ def runit(suite)
35
+ Test::Unit::UI::Console::TestRunner.run(suite, Test::Unit::UI::SILENT)
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ class Test::Unit::TestResult
42
+ attr_reader :failures, :errors
43
+ end
@@ -0,0 +1,107 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ include DTR::AgentHelper
4
+
5
+ class AdapterTests < Test::Unit::TestCase
6
+ include DTR::Adapter::Master
7
+ include DTR::Adapter::Follower
8
+
9
+ def setup
10
+ @timeout = false
11
+ @messages = []
12
+ DTR.configuration.follower_listen_sleep_timeout = 1
13
+ end
14
+
15
+ def teardown
16
+ DTR.configuration.follower_listen_sleep_timeout = 15
17
+ end
18
+
19
+ def test_should_be_sleep_if_never_wakeup
20
+ assert sleep?
21
+ assert !wakeup?
22
+ assert sleep?
23
+ do_wakeup_agents
24
+ assert wakeup?
25
+ do_wakeup_agents
26
+ assert !sleep?
27
+ end
28
+
29
+ def test_wakeup_by_broadcast_message
30
+ assert !wakeup?
31
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} #{Socket.gethostname}:4567")
32
+ assert wakeup?
33
+ end
34
+
35
+ def test_should_be_sleep_after_hypnotized_waked_up_agents
36
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} #{Socket.gethostname}:4567")
37
+ assert wakeup?
38
+ hypnotize_agents
39
+ assert sleep?
40
+ end
41
+
42
+ def test_do_wakeup_agents
43
+ assert !wakeup?
44
+ do_wakeup_agents
45
+ assert wakeup?
46
+
47
+ do_wakeup_agents
48
+ assert !sleep?
49
+ end
50
+
51
+ def test_hypnotize_agents_after_did_waked_up_agents
52
+ do_wakeup_agents
53
+ assert wakeup?
54
+ hypnotize_agents
55
+ assert sleep?
56
+ end
57
+
58
+ def test_should_not_be_sleep_when_sleep_message_is_sent_from_different_port_with_wakeup_message
59
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} hostname:1234")
60
+ assert wakeup?
61
+ #sleep message should be ignored
62
+ broadcast('address', "#{DTR::Adapter::SLEEP_MESSAGE} hostname:4567")
63
+ #wakup message for keep it wakeup
64
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} hostname:1234")
65
+ assert !sleep?
66
+ end
67
+
68
+ def test_should_not_be_sleep_when_sleep_message_is_sent_from_different_hostname_with_wakeup_message
69
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} xli.local:1234")
70
+ assert wakeup?
71
+ #sleep message should be ignored
72
+ broadcast('address', "#{DTR::Adapter::SLEEP_MESSAGE} dtr.remote:1234")
73
+ #wakup message for keep it wakeup
74
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} xli.local:1234")
75
+ assert !sleep?
76
+ end
77
+
78
+ def test_should_update_rinda_server_port_parsed_from_wakeup_message
79
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} hostname:4567")
80
+ assert wakeup?
81
+ assert_equal 4567, DTR.configuration.rinda_server_port
82
+ end
83
+
84
+ def test_should_be_sleep_when_timeout_on_listen
85
+ do_wakeup_agents
86
+ assert wakeup?
87
+ @timeout = true
88
+ assert sleep?
89
+ end
90
+
91
+ def test_should_be_sleep_when_timeout_on_listen_to_host_sending_wakeup_message
92
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} xli.local:1234")
93
+ assert wakeup?
94
+ broadcast('address', "#{DTR::Adapter::WAKEUP_MESSAGE} dtr.remote:1234")
95
+ sleep(2)
96
+ assert sleep?
97
+ end
98
+
99
+ def listen
100
+ raise Timeout::Error.new('timeout') if @timeout
101
+ @messages.shift.to_s.split
102
+ end
103
+
104
+ def broadcast(it, msg)
105
+ @messages << msg
106
+ end
107
+ end
@@ -0,0 +1,47 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class TestUnitTest < Test::Unit::TestCase
4
+
5
+ def teardown
6
+ DTR.reject
7
+ end
8
+
9
+ # inject testcase as late as possible, for in ruby world there is lots hacks added to TestCase#run method,
10
+ # DTR should be the last one to add dtr injection chain into run method
11
+ def test_should_only_inject_test_runner_mediator_for_lauching_dtr
12
+ DTR.inject
13
+ assert Test::Unit::UI::TestRunnerMediator.respond_to?(:reject_dtr)
14
+ assert Test::Unit::UI::TestRunnerMediator.method_defined?(:run_suite_without_dtr_injection)
15
+ assert Test::Unit::UI::TestRunnerMediator.private_method_defined?(:create_result_without_thread_safe)
16
+ assert !Test::Unit::TestCase.respond_to?(:reject_dtr)
17
+ assert !Test::Unit::TestCase.method_defined?(:run_without_dtr_injection)
18
+ end
19
+
20
+ def test_inject_testcase
21
+ Test::Unit::TestCase.send(:include, DTR::TestUnit::TestCaseInjection)
22
+ begin
23
+ assert Test::Unit::TestCase.respond_to?(:reject_dtr)
24
+ assert Test::Unit::TestCase.method_defined?(:run_without_dtr_injection)
25
+ ensure
26
+ Test::Unit::TestCase.reject_dtr
27
+ end
28
+ assert !Test::Unit::TestCase.respond_to?(:reject_dtr)
29
+ assert !Test::Unit::TestCase.method_defined?(:run_without_dtr_injection)
30
+ end
31
+
32
+ def test_reject
33
+ DTR.inject
34
+ DTR.reject
35
+ test_case = Test::Unit::TestCase.new('name')
36
+ assert_false test_case.respond_to?(:run_without_dtr_injection)
37
+ assert test_case.respond_to?(:run)
38
+
39
+ assert !Test::Unit::TestCase.respond_to?(:reject_dtr)
40
+ assert !Test::Unit::UI::TestRunnerMediator.respond_to?(:reject_dtr)
41
+
42
+ assert !Test::Unit::TestCase.method_defined?(:run_without_dtr_injection)
43
+ assert !Test::Unit::UI::TestRunnerMediator.method_defined?(:run_suite_without_dtr_injection)
44
+ assert !Test::Unit::UI::TestRunnerMediator.private_method_defined?(:create_result_without_thread_safe)
45
+ end
46
+
47
+ end