dtr 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|