dtr 0.0.3 → 0.0.4
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.
- data/CHANGES +6 -0
- data/README +2 -13
- data/Rakefile +6 -58
- data/dtr.gemspec +34 -0
- data/lib/dtr.rb +1 -1
- data/lib/dtr/base.rb +13 -1
- data/lib/dtr/raketasks.rb +1 -0
- data/lib/dtr/runner.rb +13 -8
- data/lib/dtr/test_unit.rb +20 -9
- metadata +27 -31
- data/LICENSE.txt +0 -203
- data/doc/jamis.rb +0 -591
- data/test/base_test.rb +0 -31
- data/test/logger_test.rb +0 -54
- data/test/scenario_tests.rb +0 -166
- data/test/test_helper.rb +0 -17
- data/test/test_unit_test.rb +0 -25
data/CHANGES
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
= DTR Changelog
|
2
2
|
|
3
|
+
== release 0.0.4
|
4
|
+
* added timeout for running test more stable
|
5
|
+
the default timeout is 60 sec, can be changed by environment variable 'RUN_TEST_TIMEOUT'
|
6
|
+
* output master process log into different log file with runners
|
7
|
+
|
8
|
+
|
3
9
|
== release 0.0.3
|
4
10
|
* more stable and maintainable
|
5
11
|
* added monitor command for monitoring the server status
|
data/README
CHANGED
@@ -33,7 +33,7 @@ grid".
|
|
33
33
|
|
34
34
|
The latest version of DTR can be found at
|
35
35
|
|
36
|
-
* http://
|
36
|
+
* http://github.com/xli/dtr/tree/master
|
37
37
|
|
38
38
|
== Installation
|
39
39
|
|
@@ -60,12 +60,6 @@ If you wish to run the unit and functional tests that come with DTR:
|
|
60
60
|
|
61
61
|
rake # You need a version of rake installed
|
62
62
|
|
63
|
-
== DTR References
|
64
|
-
|
65
|
-
* DTR Documentation Home: http://dtr.rubyforge.org
|
66
|
-
* DTR Project Page: http://rubyforge.org/projects/dtr
|
67
|
-
* DTR API Documents: http://dtr.rubyforge.org
|
68
|
-
|
69
63
|
== Simple Example
|
70
64
|
|
71
65
|
Once installed, you can run DTR server anywhere:
|
@@ -250,16 +244,11 @@ DTR is available under an Apache License Version 2.
|
|
250
244
|
|
251
245
|
== Support
|
252
246
|
|
253
|
-
The DTR homepage is http://dtr.rubyforge.org. You can find the DTR
|
254
|
-
RubyForge page at http://rubyforge.org/projects/dtr or Google Code
|
255
|
-
project at http://code.google.com/p/dtrunner.
|
256
|
-
|
257
247
|
Feel free to submit commits or feature requests. If you send a patch,
|
258
248
|
remember to update the corresponding unit tests. If fact, I prefer
|
259
249
|
new feature to be submitted in the form of new unit tests.
|
260
250
|
|
261
|
-
For other information, feel free to
|
262
|
-
or contact mailto:swing1979@gmail.com.
|
251
|
+
For other information, feel free to contact mailto:swing1979@gmail.com.
|
263
252
|
|
264
253
|
== Usage
|
265
254
|
|
data/Rakefile
CHANGED
@@ -130,67 +130,15 @@ rd = Rake::RDocTask.new("rdoc") { |rdoc|
|
|
130
130
|
# Create a task that will package the DTR software into distributable
|
131
131
|
# tar, zip and gem files.
|
132
132
|
|
133
|
-
PKG_FILES = FileList[
|
134
|
-
'install.rb',
|
135
|
-
'[A-Z]*',
|
136
|
-
'bin/**/*',
|
137
|
-
'lib/**/*.rb',
|
138
|
-
'lib/**/*.rake',
|
139
|
-
'test/**/*.rb',
|
140
|
-
'doc/**/*'
|
141
|
-
]
|
142
|
-
PKG_FILES.exclude('doc/example/*.o')
|
143
|
-
PKG_FILES.exclude(%r{doc/example/main$})
|
144
|
-
|
145
133
|
if ! defined?(Gem)
|
146
134
|
puts "Package Target requires RubyGEMs"
|
147
135
|
else
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
s.summary = "DTR is a distributed test runner to run tests on distributed computers for decreasing build time."
|
155
|
-
|
156
|
-
#### Dependencies and requirements.
|
157
|
-
|
158
|
-
s.add_dependency('daemons', '> 1.0.7')
|
159
|
-
#s.requirements << ""
|
160
|
-
|
161
|
-
#### Which files are to be included in this gem? Everything! (Except SVN directories.)
|
162
|
-
|
163
|
-
s.files = PKG_FILES.to_a.delete_if {|item| item.include?(".svn")}
|
164
|
-
|
165
|
-
#### Load-time details: library and application (you will need one or both).
|
166
|
-
|
167
|
-
s.require_path = 'lib' # Use these for libraries.
|
168
|
-
|
169
|
-
s.bindir = "bin" # Use these for applications.
|
170
|
-
s.executables = ["dtr"]
|
171
|
-
s.default_executable = "dtr"
|
172
|
-
|
173
|
-
#### Documentation and testing.
|
174
|
-
|
175
|
-
s.has_rdoc = true
|
176
|
-
s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
|
177
|
-
s.rdoc_options = rd.options
|
178
|
-
|
179
|
-
#### Author and project details.
|
180
|
-
|
181
|
-
s.author = "Li Xiao"
|
182
|
-
s.email = "swing1979@gmail.com"
|
183
|
-
s.homepage = "http://dtr.rubyforge.org"
|
184
|
-
s.rubyforge_project = "dtr"
|
185
|
-
# if ENV['CERT_DIR']
|
186
|
-
# s.signing_key = File.join(ENV['CERT_DIR'], 'gem-private_key.pem')
|
187
|
-
# s.cert_chain = [File.join(ENV['CERT_DIR'], 'gem-public_cert.pem')]
|
188
|
-
# end
|
189
|
-
end
|
190
|
-
|
191
|
-
package_task = Rake::GemPackageTask.new(spec) do |pkg|
|
192
|
-
#pkg.need_zip = true
|
193
|
-
#pkg.need_tar = true
|
136
|
+
File.open(File.dirname(__FILE__) + '/dtr.gemspec') do |f|
|
137
|
+
spec = eval(f.read)
|
138
|
+
package_task = Rake::GemPackageTask.new(spec) do |pkg|
|
139
|
+
#pkg.need_zip = true
|
140
|
+
#pkg.need_tar = true
|
141
|
+
end
|
194
142
|
end
|
195
143
|
end
|
196
144
|
|
data/dtr.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'dtr'
|
3
|
+
spec.version = "0.0.4"
|
4
|
+
spec.summary = "DTR is a distributed test runner to run tests on distributed computers for decreasing build time."
|
5
|
+
|
6
|
+
#### Dependencies and requirements.
|
7
|
+
|
8
|
+
spec.add_dependency('daemons', '> 1.0.7')
|
9
|
+
#s.requirements << ""
|
10
|
+
|
11
|
+
#### Which files are to be included in this gem? Everything! (Except SVN directories.)
|
12
|
+
|
13
|
+
spec.files = FileList['lib/**/*.rb', 'lib/**/*.rake', 'bin/*', '[a-zA-Z]*'].to_a
|
14
|
+
p FileList['lib/**/*.rb', 'lib/**/*.rake', 'bin/*', '[a-zA-Z]*'].to_a
|
15
|
+
|
16
|
+
#### Load-time details: library and application (you will need one or both).
|
17
|
+
|
18
|
+
spec.require_path = 'lib' # Use these for libraries.
|
19
|
+
|
20
|
+
spec.bindir = "bin" # Use these for applications.
|
21
|
+
spec.executables = ["dtr"]
|
22
|
+
spec.default_executable = "dtr"
|
23
|
+
|
24
|
+
#### Documentation and testing.
|
25
|
+
|
26
|
+
spec.has_rdoc = false
|
27
|
+
|
28
|
+
#### Author and project details.
|
29
|
+
|
30
|
+
spec.author = "Li Xiao"
|
31
|
+
spec.email = "swing1979@gmail.com"
|
32
|
+
spec.homepage = "http://github.com/xli/dtr/tree/master"
|
33
|
+
spec.rubyforge_project = "dtr"
|
34
|
+
end
|
data/lib/dtr.rb
CHANGED
data/lib/dtr/base.rb
CHANGED
@@ -16,6 +16,18 @@ require 'pstore'
|
|
16
16
|
|
17
17
|
require 'logger'
|
18
18
|
|
19
|
+
class Array
|
20
|
+
def blank?
|
21
|
+
empty?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class NilClass
|
26
|
+
def blank?
|
27
|
+
true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
19
31
|
module DTR
|
20
32
|
|
21
33
|
MESSAGE_KEY = :message
|
@@ -30,7 +42,7 @@ module DTR
|
|
30
42
|
else
|
31
43
|
DTROPTIONS[:log_file] || 'dtr.log'
|
32
44
|
end
|
33
|
-
Logger.new(log_file, 1, 5*1024*1024)
|
45
|
+
Logger.new("./#{log_file}", 1, 5*1024*1024)
|
34
46
|
end
|
35
47
|
DTROPTIONS[:logger].datetime_format = "%m-%d %H:%M:%S"
|
36
48
|
DTROPTIONS[:logger].level = DTROPTIONS[:log_level] || Logger::INFO
|
data/lib/dtr/raketasks.rb
CHANGED
data/lib/dtr/runner.rb
CHANGED
@@ -39,15 +39,15 @@ module DTR
|
|
39
39
|
|
40
40
|
class RunnerAgent
|
41
41
|
|
42
|
-
def self.start(runner_names=["Distributed Test Runner"],
|
42
|
+
def self.start(runner_names=["Distributed Test Runner"], setup_agent_env_cmd=nil)
|
43
43
|
DTR.with_monitor do
|
44
|
-
new(runner_names,
|
44
|
+
new(runner_names, setup_agent_env_cmd).launch
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def initialize(runner_names,
|
48
|
+
def initialize(runner_names, setup_agent_env_cmd)
|
49
49
|
@runner_names = runner_names.is_a?(Array) ? runner_names : [runner_names.to_s]
|
50
|
-
@
|
50
|
+
@setup_agent_env_cmd = setup_agent_env_cmd || ""
|
51
51
|
@runner_pids = []
|
52
52
|
@herald = nil
|
53
53
|
@working_env_key = :working_env
|
@@ -85,7 +85,7 @@ module DTR
|
|
85
85
|
kill_all_runners
|
86
86
|
ENV['DTR_MASTER_ENV'] = working_env[:dtr_master_env]
|
87
87
|
|
88
|
-
if Cmd.execute(@
|
88
|
+
if Cmd.execute(@setup_agent_env_cmd || working_env[:setup_agent_env_cmd])
|
89
89
|
@runner_names.each do |name|
|
90
90
|
@runner_pids << drb_fork { Runner.start name, working_env }
|
91
91
|
end
|
@@ -100,7 +100,7 @@ module DTR
|
|
100
100
|
private
|
101
101
|
|
102
102
|
def kill_all_runners
|
103
|
-
unless @runner_pids.
|
103
|
+
unless @runner_pids.blank?
|
104
104
|
@runner_pids.each{ |pid| Process.kill 'KILL', pid rescue nil }
|
105
105
|
DTR.info "=> All runners(#{@runner_pids.join(", ")}) were killed."
|
106
106
|
@runner_pids = []
|
@@ -139,7 +139,7 @@ module DTR
|
|
139
139
|
def beat
|
140
140
|
loop do
|
141
141
|
begin
|
142
|
-
if @env_store[@key].
|
142
|
+
if @env_store[@key].blank?
|
143
143
|
@provider.send_message('---/V---')
|
144
144
|
else
|
145
145
|
while message = @env_store[@key].first
|
@@ -179,7 +179,7 @@ module DTR
|
|
179
179
|
begin
|
180
180
|
working_env = @provider.working_env
|
181
181
|
DTR.debug { "working env: #{working_env.inspect}" }
|
182
|
-
if working_env[:files].
|
182
|
+
if working_env[:files].blank?
|
183
183
|
DTR.error "No test files need to load?(working env: #{working_env.inspect})"
|
184
184
|
else
|
185
185
|
@env_store[@key] = working_env if @env_store[@key].nil? || @env_store[@key][:identifier] != working_env[:identifier]
|
@@ -253,6 +253,11 @@ module DTR
|
|
253
253
|
@provider.provide(self)
|
254
254
|
end
|
255
255
|
|
256
|
+
def reboot
|
257
|
+
DTR.info "#{self} is rebooting. Ran #{@started.size} tests, finished #{@run_finished.size}."
|
258
|
+
@provider.provide(self)
|
259
|
+
end
|
260
|
+
|
256
261
|
def shutdown
|
257
262
|
DTR.info "#{self} is shutting down. Ran #{@started.size} tests, finished #{@run_finished.size}."
|
258
263
|
@provider.stop_service rescue exit!
|
data/lib/dtr/test_unit.rb
CHANGED
@@ -18,8 +18,10 @@ require 'test/unit/testcase'
|
|
18
18
|
require 'test/unit/util/observable'
|
19
19
|
require 'monitor'
|
20
20
|
require 'drb'
|
21
|
+
require 'timeout'
|
21
22
|
|
22
23
|
DTROPTIONS = {} unless defined?(DTROPTIONS)
|
24
|
+
DTROPTIONS[:log_file] = 'dtr_master_process.log' unless DTROPTIONS[:log_file]
|
23
25
|
|
24
26
|
module DTR
|
25
27
|
def reject
|
@@ -57,7 +59,7 @@ module DTR
|
|
57
59
|
def add_finish_count
|
58
60
|
synchronize do
|
59
61
|
@finish_count += 1
|
60
|
-
@complete_cond.signal
|
62
|
+
@complete_cond.signal
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
@@ -69,18 +71,18 @@ module DTR
|
|
69
71
|
|
70
72
|
def wait_until_complete
|
71
73
|
synchronize do
|
72
|
-
@complete_cond.wait_until {complete?}
|
74
|
+
@complete_cond.wait_until {complete?}
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
76
78
|
private
|
77
79
|
def complete?
|
78
|
-
DTR.
|
80
|
+
DTR.info{ "Counter status: #{status}" }
|
79
81
|
@finish_count >= @start_count
|
80
82
|
end
|
81
83
|
|
82
84
|
def status
|
83
|
-
"finish_count
|
85
|
+
"finish_count => #{@finish_count}, start_count => #{@start_count}"
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
@@ -162,6 +164,7 @@ module DTR
|
|
162
164
|
end
|
163
165
|
|
164
166
|
RUN_TEST_FINISHED = "::DRbTestRunner::RUN_TEST_FINISHED"
|
167
|
+
DEFAULT_RUN_TEST_TIMEOUT = 60 #seconds
|
165
168
|
|
166
169
|
def initialize(test, result, &progress_block)
|
167
170
|
@test = test
|
@@ -182,10 +185,17 @@ module DTR
|
|
182
185
|
def run_test_on(runner)
|
183
186
|
Thread.start do
|
184
187
|
begin
|
185
|
-
|
188
|
+
Timeout.timeout(ENV['RUN_TEST_TIMEOUT'] || DEFAULT_RUN_TEST_TIMEOUT) do
|
189
|
+
runner.run(@test, @result, &@progress_block)
|
190
|
+
end
|
186
191
|
@progress_block.call(RUN_TEST_FINISHED, @test.name)
|
192
|
+
rescue Timeout::Error => e
|
193
|
+
DTR.info {"Run test timeout(#{ENV['RUN_TEST_TIMEOUT'] || DEFAULT_RUN_TEST_TIMEOUT}), reboot runner"}
|
194
|
+
runner.reboot rescue nil
|
195
|
+
DTR.info {"rerun test: #{@test.name}"}
|
196
|
+
self.run
|
187
197
|
rescue DRb::DRbConnError => e
|
188
|
-
DTR.info{
|
198
|
+
DTR.info {"DRb::DRbConnError(#{e.message}), rerun test: #{@test.name}"}
|
189
199
|
self.run
|
190
200
|
rescue Exception => e
|
191
201
|
DTR.info{ "#{test.name}, rescue an exception: #{e.message}, add error into result." }
|
@@ -235,7 +245,7 @@ module DTR
|
|
235
245
|
alias_method :__run__, :run
|
236
246
|
|
237
247
|
def run(result, &progress_block)
|
238
|
-
DTR.
|
248
|
+
DTR.info { "start of run suite(#{name}), size: #{size};"}
|
239
249
|
|
240
250
|
if result.kind_of?(ThreadSafeTestResult)
|
241
251
|
__run__(result, &progress_block)
|
@@ -246,7 +256,8 @@ module DTR
|
|
246
256
|
|
247
257
|
DTR.service_provider.setup_working_env WorkingEnv.refresh
|
248
258
|
|
249
|
-
puts 'Refreshed dtr working environment, looking for runner service...' unless
|
259
|
+
puts 'Refreshed dtr working environment, looking for runner service...' unless ENV['DTR_ENV'] == 'test'
|
260
|
+
DTR.info {"Master process started at #{Time.now}"}
|
250
261
|
result = ThreadSafeTestResult.new(result)
|
251
262
|
__run__(result) do |channel, value|
|
252
263
|
DTR.debug { "=> channel: #{channel}, value: #{value}" }
|
@@ -259,7 +270,7 @@ module DTR
|
|
259
270
|
DTR.debug { "==> teardown" }
|
260
271
|
DTR.service_provider.teardown_working_env
|
261
272
|
end
|
262
|
-
DTR.
|
273
|
+
DTR.info { "end of run suite(#{name}), test result status: #{result}, counter status: #{DRbTestRunner.counter}"}
|
263
274
|
end
|
264
275
|
end
|
265
276
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Li Xiao
|
@@ -9,11 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-02 00:00:00 +08:00
|
13
13
|
default_executable: dtr
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: daemons
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -27,19 +28,9 @@ executables:
|
|
27
28
|
- dtr
|
28
29
|
extensions: []
|
29
30
|
|
30
|
-
extra_rdoc_files:
|
31
|
-
|
32
|
-
- LICENSE.txt
|
33
|
-
- TODO
|
34
|
-
- CHANGES
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
35
33
|
files:
|
36
|
-
- install.rb
|
37
|
-
- CHANGES
|
38
|
-
- LICENSE.TXT
|
39
|
-
- Rakefile
|
40
|
-
- README
|
41
|
-
- TODO
|
42
|
-
- bin/dtr
|
43
34
|
- lib/dtr/base.rb
|
44
35
|
- lib/dtr/raketasks.rb
|
45
36
|
- lib/dtr/runner.rb
|
@@ -47,23 +38,28 @@ files:
|
|
47
38
|
- lib/dtr/test_unit.rb
|
48
39
|
- lib/dtr/test_unit_injection.rb
|
49
40
|
- lib/dtr.rb
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
-
|
62
|
-
- --inline-source
|
63
|
-
- --main
|
41
|
+
- bin/dtr
|
42
|
+
- bin
|
43
|
+
- CHANGES
|
44
|
+
- doc
|
45
|
+
- dtr.gemspec
|
46
|
+
- html
|
47
|
+
- install.rb
|
48
|
+
- lib
|
49
|
+
- LICENSE.TXT
|
50
|
+
- log
|
51
|
+
- pkg
|
52
|
+
- Rakefile
|
64
53
|
- README
|
65
|
-
-
|
66
|
-
-
|
54
|
+
- rspec
|
55
|
+
- test
|
56
|
+
- testdata
|
57
|
+
- TODO
|
58
|
+
has_rdoc: false
|
59
|
+
homepage: http://github.com/xli/dtr/tree/master
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
|
67
63
|
require_paths:
|
68
64
|
- lib
|
69
65
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -81,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
77
|
requirements: []
|
82
78
|
|
83
79
|
rubyforge_project: dtr
|
84
|
-
rubygems_version: 1.0
|
80
|
+
rubygems_version: 1.2.0
|
85
81
|
signing_key:
|
86
82
|
specification_version: 2
|
87
83
|
summary: DTR is a distributed test runner to run tests on distributed computers for decreasing build time.
|