xli-dtr 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,373 @@
1
+ # Rakefile for DTR -*- ruby -*-
2
+
3
+ # Copyright 2007 by Li Xiao (iam@li-xiao.com)
4
+ # All rights reserved.
5
+
6
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
7
+ require 'dtr'
8
+
9
+ require 'rake/clean'
10
+ require 'rake/testtask'
11
+ require 'rake/rdoctask'
12
+
13
+ begin
14
+ require 'rubygems'
15
+ require 'rake/gempackagetask'
16
+ rescue Exception
17
+ nil
18
+ end
19
+ CLEAN.include('**/*.o', '*.dot')
20
+ CLOBBER.include('TAGS')
21
+ CLOBBER.include('coverage', 'rcov_aggregate')
22
+
23
+ def announce(msg='')
24
+ STDERR.puts msg
25
+ end
26
+
27
+ if `ruby -Ilib ./bin/dtr --version` =~ /dtr, version ([0-9.]+)$/
28
+ CURRENT_VERSION = $1
29
+ else
30
+ CURRENT_VERSION = "0.0.0"
31
+ end
32
+
33
+ $package_version = CURRENT_VERSION
34
+
35
+ SRC_RB = FileList['lib/**/*.rb', 'lib/**/*.rake']
36
+
37
+ # The default task is run if rake is given no explicit arguments.
38
+
39
+ desc "Default Task"
40
+ task :default => :test_all
41
+
42
+ # Test Tasks ---------------------------------------------------------
43
+ task :dbg do |t|
44
+ puts "Arguments are: #{t.args.join(', ')}"
45
+ end
46
+
47
+ # Common Abbreviations ...
48
+
49
+ task :test_all => [:test_units, :tf]
50
+ task :tu => :test_units
51
+ task :tf => [:start_dtr_server, :start_dtr_runners, :test_functionals, :stop_dtr_runners, :stop_dtr_server]
52
+ task :test => :test_units
53
+
54
+ Rake::TestTask.new(:test_units) do |t|
55
+ t.test_files = FileList['test/*test.rb']
56
+ t.warning = true
57
+ t.verbose = false
58
+ end
59
+
60
+ Rake::TestTask.new(:test_functionals) do |t|
61
+ t.test_files = FileList['test/scenario*.rb']
62
+ t.warning = true
63
+ t.verbose = false
64
+ end
65
+
66
+ task :start_dtr_server do
67
+ ruby "-I#{File.dirname(__FILE__) + "/lib"} #{File.dirname(__FILE__) + "/bin/dtr"} -s -D"
68
+ end
69
+
70
+ task :start_dtr_runners do
71
+ ruby "-I#{File.dirname(__FILE__) + "/lib"} #{File.dirname(__FILE__) + "/bin/dtr"} -r r1,r2,r3 -D"
72
+ end
73
+
74
+ task :stop_dtr_runners do
75
+ ruby "-I#{File.dirname(__FILE__) + "/lib"} #{File.dirname(__FILE__) + "/bin/dtr"} -R"
76
+ end
77
+
78
+ task :stop_dtr_server do
79
+ ruby "-I#{File.dirname(__FILE__) + "/lib"} #{File.dirname(__FILE__) + "/bin/dtr"} -S"
80
+ end
81
+
82
+ begin
83
+ require 'rcov/rcovtask'
84
+
85
+ Rcov::RcovTask.new do |t|
86
+ t.libs << "test"
87
+ t.rcov_opts = [
88
+ '-xRakefile', '-xrakefile', '-xpublish.rf', '--text-report',
89
+ ]
90
+ t.test_files = FileList[
91
+ 'test/*test.rb'
92
+ ]
93
+ t.output_dir = 'coverage'
94
+ t.verbose = true
95
+ end
96
+ rescue LoadError
97
+ # No rcov available
98
+ end
99
+
100
+ directory 'testdata'
101
+ [:test_units].each do |t|
102
+ task t => ['testdata']
103
+ end
104
+
105
+ # CVS Tasks ----------------------------------------------------------
106
+
107
+ # Install DTR using the standard install.rb script.
108
+
109
+ desc "Install the application"
110
+ task :install do
111
+ ruby "install.rb"
112
+ end
113
+
114
+ # Create a task to build the RDOC documentation tree.
115
+
116
+ rd = Rake::RDocTask.new("rdoc") { |rdoc|
117
+ rdoc.rdoc_dir = 'html'
118
+ # rdoc.template = 'kilmer'
119
+ # rdoc.template = 'css2'
120
+ rdoc.template = 'doc/jamis.rb'
121
+ rdoc.title = "DTR -- Distributed Test Runner"
122
+ rdoc.options << '--line-numbers' << '--inline-source' <<
123
+ '--main' << 'README' <<
124
+ '--title' << '"DTR -- Distributed Test Runner'
125
+ rdoc.rdoc_files.include('README', 'LICENSE.txt', 'TODO', 'CHANGES')
126
+ rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc')
127
+ }
128
+
129
+ # ====================================================================
130
+ # Create a task that will package the DTR software into distributable
131
+ # tar, zip and gem files.
132
+
133
+ if ! defined?(Gem)
134
+ puts "Package Target requires RubyGEMs"
135
+ else
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
142
+ end
143
+ end
144
+
145
+ # Misc tasks =========================================================
146
+
147
+ def count_lines(filename)
148
+ lines = 0
149
+ codelines = 0
150
+ open(filename) { |f|
151
+ f.each do |line|
152
+ lines += 1
153
+ next if line =~ /^\s*$/
154
+ next if line =~ /^\s*#/
155
+ codelines += 1
156
+ end
157
+ }
158
+ [lines, codelines]
159
+ end
160
+
161
+ def show_line(msg, lines, loc)
162
+ printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg
163
+ end
164
+
165
+ desc "Count lines in the main DTR file"
166
+ task :lines do
167
+ total_lines = 0
168
+ total_code = 0
169
+ show_line("File Name", "LINES", "LOC")
170
+ SRC_RB.each do |fn|
171
+ lines, codelines = count_lines(fn)
172
+ show_line(fn, lines, codelines)
173
+ total_lines += lines
174
+ total_code += codelines
175
+ end
176
+ show_line("TOTAL", total_lines, total_code)
177
+ end
178
+
179
+ # Define an optional publish target in an external file. If the
180
+ # publish.rf file is not found, the publish targets won't be defined.
181
+
182
+ load "publish.rf" if File.exist? "publish.rf"
183
+
184
+ # Support Tasks ------------------------------------------------------
185
+
186
+ RUBY_FILES = FileList['**/*.rb'].exclude('pkg')
187
+
188
+ desc "Look for TODO and FIXME tags in the code"
189
+ task :todo do
190
+ RUBY_FILES.egrep(/#.*(FIXME|TODO|TBD)/)
191
+ end
192
+
193
+ desc "Look for Debugging print lines"
194
+ task :dbg do
195
+ RUBY_FILES.egrep(/\bDBG|\bbreakpoint\b/)
196
+ end
197
+
198
+ desc "List all ruby files"
199
+ task :rubyfiles do
200
+ puts RUBY_FILES
201
+ puts FileList['bin/*'].exclude('bin/*.rb')
202
+ end
203
+ task :rf => :rubyfiles
204
+
205
+ desc "Create a TAGS file"
206
+ task :tags => "TAGS"
207
+
208
+ TAGS = 'xctags -e'
209
+
210
+ file "TAGS" => RUBY_FILES do
211
+ puts "Makings TAGS"
212
+ sh "#{TAGS} #{RUBY_FILES}", :verbose => false
213
+ end
214
+
215
+ # --------------------------------------------------------------------
216
+ # Creating a release
217
+
218
+ task :update_site do
219
+ puts %x[scp -r html/* lixiao@rubyforge.org:/var/www/gforge-projects/dtr/]
220
+ end
221
+
222
+ task :noop
223
+
224
+ desc "[rel, reuse, reltest] Make a new release"
225
+ task :release => [
226
+ :prerelease,
227
+ :clobber,
228
+ :test_all,
229
+ :update_version,
230
+ :package,
231
+ :tag] do
232
+
233
+ announce
234
+ announce "**************************************************************"
235
+ announce "* Release #{$package_version} Complete."
236
+ announce "* Packages ready to upload."
237
+ announce "**************************************************************"
238
+ announce
239
+ end
240
+
241
+ # Validate that everything is ready to go for a release.
242
+ desc "[rel, reuse, reltest]"
243
+ task :prerelease do |t, rel, reuse, reltest|
244
+ $package_version = rel
245
+ announce
246
+ announce "**************************************************************"
247
+ announce "* Making RubyGem Release #{$package_version}"
248
+ announce "* (current version #{CURRENT_VERSION})"
249
+ announce "**************************************************************"
250
+ announce
251
+
252
+ # Is a release number supplied?
253
+ unless rel
254
+ fail "Usage: rake release[X.Y.Z] [REUSE=tag_suffix]"
255
+ end
256
+
257
+ # Is the release different than the current release.
258
+ # (or is REUSE set?)
259
+ if $package_version == CURRENT_VERSION && ! reuse
260
+ fail "Current version is #{$package_version}, must specify REUSE=tag_suffix to reuse version"
261
+ end
262
+
263
+ # Are all source files checked in?
264
+ if reltest
265
+ announce "Release Task Testing, skipping checked-in file test"
266
+ else
267
+ announce "Checking for unchecked-in files..."
268
+ data = `svn st`
269
+ unless data =~ /^$/
270
+ abort "svn status is not clean ... do you have unchecked-in files?"
271
+ end
272
+ announce "No outstanding checkins found ... OK"
273
+ end
274
+ end
275
+
276
+ desc "[rel, reuse, reltest]"
277
+ task :update_version => [:prerelease] do |t, rel, reuse, reltest|
278
+ if rel == CURRENT_VERSION
279
+ announce "No version change ... skipping version update"
280
+ else
281
+ announce "Updating DTR version to #{rel}"
282
+ open("lib/dtr.rb") do |dtrin|
283
+ open("lib/dtr.rb.new", "w") do |dtrout|
284
+ dtrin.each do |line|
285
+ if line =~ /^DTRVERSION\s*=\s*/
286
+ dtrout.puts "DTRVERSION = '#{rel}'"
287
+ else
288
+ dtrout.puts line
289
+ end
290
+ end
291
+ end
292
+ end
293
+ mv "lib/dtr.rb.new", "lib/dtr.rb"
294
+ if reltest
295
+ announce "Release Task Testing, skipping commiting of new version"
296
+ else
297
+ sh %{svn commit -m "Updated to version #{rel}" lib/dtr.rb} # "
298
+ end
299
+ end
300
+ end
301
+
302
+ desc "[rel, reuse, reltest] Tag all the CVS files with the latest release number (REL=x.y.z)"
303
+ task :tag => [:prerelease] do |t, rel, reuse, reltest|
304
+ reltag = "REL_#{rel.gsub(/\./, '_')}"
305
+ reltag << reuse.gsub(/\./, '_') if reuse
306
+ announce "Tagging Repository with [#{reltag}]"
307
+ if reltest
308
+ announce "Release Task Testing, skipping CVS tagging"
309
+ else
310
+ sh %{svn copy svn+ssh://rubyforge.org/var/svn/dtr/trunk svn+ssh://rubyforge.org/var/svn/dtr/tags/#{reltag} -m 'Commiting release #{reltag}'}
311
+ end
312
+ end
313
+
314
+ desc "Install the jamis RDoc template"
315
+ task :install_jamis_template do
316
+ require 'rbconfig'
317
+ dest_dir = File.join(Config::CONFIG['rubylibdir'], "rdoc/generators/template/html")
318
+ fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir)
319
+ install "doc/jamis.rb", dest_dir, :verbose => true
320
+ end
321
+
322
+ task :c1 do
323
+ Dir.chdir('testdata') do
324
+ DTR.launch_runners(['c1'], nil)
325
+ end
326
+ end
327
+
328
+ task :c3 do
329
+ Dir.chdir('testdata') do
330
+ DTR.launch_runners(['c1', 'c2', 'c3'], nil)
331
+ end
332
+ end
333
+ task :c10 do
334
+ Dir.chdir('testdata') do
335
+ DTR.launch_runners(['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'c10'], nil)
336
+ end
337
+ end
338
+
339
+ task :runners do
340
+ runners = DTR.runners
341
+ if runners.empty?
342
+ puts "No runner available!"
343
+ else
344
+ puts runners.collect{|r| r.name}.join(", ")
345
+ end
346
+ end
347
+
348
+ task :c2 do
349
+ DTROPTIONS[:names] = ['c1', 'c2']
350
+ DTROPTIONS[:setup] = nil
351
+ Dir.chdir('testdata') do
352
+ DTR.start_runners
353
+ end
354
+ end
355
+
356
+ task :server do
357
+ DTR.start_server
358
+ end
359
+
360
+ Rake::TestTask.new(:dtr) do |t|
361
+ t.libs << DTR.lib_path
362
+ t.test_files = FileList['dtr/inject_with_svn.rb', 'testdata/*.rb']
363
+ t.warning = true
364
+ t.verbose = false
365
+ end
366
+
367
+ require 'dtr/raketasks'
368
+
369
+ DTR::MPTask.new :mt do |t|
370
+ t.test_files = FileList['testdata/*.rb']
371
+ t.processes = 2
372
+ end
373
+
data/TODO ADDED
@@ -0,0 +1,8 @@
1
+ = DTR Project -- To Do List
2
+
3
+ Send suggestions for this list to iam@li-xiao.com
4
+
5
+ === To Do
6
+ 39. class doc(ri)?
7
+
8
+ (moved DONE list to CHANGES file)
data/bin/dtr ADDED
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+ require 'logger'
4
+ begin
5
+ require 'dtr'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'dtr'
9
+ end
10
+
11
+ NOTES = <<-NOTES
12
+ ----------------
13
+ Notes:
14
+ * The default value of server address is 'localhost'. If DTR Server start with 'localhost', it would not be found by remote machine. If you run the runner agent on remote machine, you should start the server and runner agent with same server address specified, e.g. dtr -s -a 10.18.1.1, dtr -r r1,r2 -a 10.18.1.1
15
+ * Runners specified by -r option will be started in different processes by the runner agent.
16
+ * You need install gem daemons to use -D option.
17
+ * When specify -D option, dtr_runners.pid/dtr_server.pid will be created in the directory to store the daemon process pid. And the output of the process will be print into *.output file.
18
+
19
+ DTR is a distributed test runner program for decreasing time of running ruby tests based on ruby 'test/unit' package.
20
+ For additional information, see http://dtr.rubyforge.org/
21
+ NOTES
22
+
23
+ opts = OptionParser.new do |opts|
24
+ opts.banner = "DTR usage: #{$0} [options]"
25
+ opts.separator ""
26
+ opts.separator "Synopsis:"
27
+ opts.separator "dtr -s"
28
+ opts.separator "dtr -r runner1_name,runner2_name"
29
+ opts.separator "dtr -a dtr_server_ip -m"
30
+ opts.separator ""
31
+ opts.separator "Options:"
32
+
33
+ opts.on_tail("-m", "--monitor", "Monitor the status of the dtr rinda server, e.g. dtr -a 10.11.1.2 -m") do
34
+ DTROPTIONS[:monitor] = true
35
+ end
36
+
37
+ opts.on_tail("-c", "--clean_server", "Clean server environment, shutdown all runners registered.") do
38
+ DTR.clean_server
39
+ end
40
+
41
+ opts.on_tail("-b", "--be_silent", "Only show error messages") do
42
+ DTROPTIONS[:log_level] = Logger::ERROR
43
+ end
44
+
45
+ opts.on_tail("-s", "--server", "Start DTR service server. There must be a DTR server running.") do
46
+ DTROPTIONS[:start_server] = true
47
+ end
48
+
49
+ opts.on("-p", "--port PORT", "Port number DTR will listen to. Default is 3344.") do |port|
50
+ DTR.port = port
51
+ end
52
+
53
+ opts.on("-r runner1_name,runner2_name", Array, "Start DTR test runner agent with unique runner names.") do |names|
54
+ DTROPTIONS[:names] = names.collect{|name| name.untaint}
55
+ end
56
+
57
+ opts.on("-a", "--server_address ADDRESS", "Specify dtr server address, domain name or ip address, e.g. 192.168.0.1. Default is 'localhost'.") do |address|
58
+ if (!address.nil?) && (!address.empty?)
59
+ DTR.broadcast_list = [address]
60
+ end
61
+ end
62
+
63
+ opts.on("-i", "--setup COMMAND", "Set command for initializing test runner test environment, e.g. 'rake db:test:prepare'. Default is do nothing.") do |command|
64
+ DTROPTIONS[:setup] = command.untaint
65
+ end
66
+
67
+ opts.on_tail("-D", "--daemon", "Start server/runners in daemon mode. Gem 'daemons' must be installed") do
68
+ DTROPTIONS[:daemon] = true
69
+ end
70
+
71
+ opts.on_tail("-S", "--stop_server", "Stop server run in daemon mode.") do
72
+ DTR.stop_server_daemon_mode
73
+ end
74
+
75
+ opts.on_tail("-R", "--stop_runners", "Stop runners run in daemon mode.") do
76
+ DTR.stop_runners_daemon_mode
77
+ end
78
+
79
+ opts.on_tail("-d", "--debug", "output debug log") do
80
+ DTROPTIONS[:log_level] = Logger::DEBUG
81
+ end
82
+
83
+ opts.on_tail("-v", "--version", "Show version") do
84
+ puts "dtr, version " + DTRVERSION
85
+ end
86
+
87
+ opts.on_tail("-h", "--help", "Show this help doc") do
88
+ puts opts
89
+ puts NOTES
90
+ end
91
+ end
92
+
93
+ no_argv = ARGV.empty?
94
+
95
+ opts.parse!
96
+
97
+ if no_argv
98
+ puts opts
99
+ puts NOTES
100
+ end
101
+
102
+ if DTROPTIONS[:names]
103
+ if DTROPTIONS[:daemon]
104
+ DTR.start_runners_daemon_mode
105
+ else
106
+ DTR.start_runners
107
+ end
108
+ end
109
+
110
+ if DTROPTIONS[:start_server]
111
+ if DTROPTIONS[:daemon]
112
+ DTR.start_server_daemon_mode
113
+ else
114
+ DTR.start_server
115
+ end
116
+ end
117
+
118
+ if DTROPTIONS[:monitor]
119
+ if DTROPTIONS[:daemon]
120
+ puts "Can't start monitor with daemon mode."
121
+ else
122
+ DTR.monitor
123
+ end
124
+ end
data/dtr.gemspec ADDED
@@ -0,0 +1,33 @@
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 = ["lib/dtr/base.rb", "lib/dtr/raketasks.rb", "lib/dtr/runner.rb", "lib/dtr/service_provider.rb", "lib/dtr/test_unit.rb", "lib/dtr/test_unit_injection.rb", "lib/dtr.rb", "bin/dtr", "bin", "CHANGES", "doc", "dtr.gemspec", "install.rb", "lib", "LICENSE.TXT", "Rakefile", "README", "TODO"]
14
+
15
+ #### Load-time details: library and application (you will need one or both).
16
+
17
+ spec.require_path = 'lib' # Use these for libraries.
18
+
19
+ spec.bindir = "bin" # Use these for applications.
20
+ spec.executables = ["dtr"]
21
+ spec.default_executable = "dtr"
22
+
23
+ #### Documentation and testing.
24
+
25
+ spec.has_rdoc = false
26
+
27
+ #### Author and project details.
28
+
29
+ spec.author = "Li Xiao"
30
+ spec.email = "iam@li-xiao.com"
31
+ spec.homepage = "http://github.com/xli/dtr/tree/master"
32
+ spec.rubyforge_project = "dtr"
33
+ end
data/install.rb ADDED
@@ -0,0 +1,88 @@
1
+ require 'rbconfig'
2
+ require 'find'
3
+ require 'ftools'
4
+
5
+ include Config
6
+
7
+ $ruby = CONFIG['ruby_install_name']
8
+
9
+ ##
10
+ # Install a binary file. We patch in on the way through to
11
+ # insert a #! line. If this is a Unix install, we name
12
+ # the command (for example) 'dtr' and let the shebang line
13
+ # handle running it. Under windows, we add a '.rb' extension
14
+ # and let file associations to their stuff
15
+ #
16
+
17
+ def installBIN(from, opfile)
18
+
19
+ tmp_dir = nil
20
+ for t in [".", "/tmp", "c:/temp", $bindir]
21
+ stat = File.stat(t) rescue next
22
+ if stat.directory? and stat.writable?
23
+ tmp_dir = t
24
+ break
25
+ end
26
+ end
27
+
28
+ fail "Cannot find a temporary directory" unless tmp_dir
29
+ tmp_file = File.join(tmp_dir, "_tmp")
30
+
31
+ File.open(from) do |ip|
32
+ File.open(tmp_file, "w") do |op|
33
+ ruby = File.join($realbindir, $ruby)
34
+ op.puts "#!#{ruby}"
35
+ op.write ip.read
36
+ end
37
+ end
38
+
39
+ opfile += ".rb" if CONFIG["target_os"] =~ /mswin/i
40
+ File::install(tmp_file, File.join($bindir, opfile), 0755, true)
41
+ File::unlink(tmp_file)
42
+ end
43
+
44
+ $sitedir = CONFIG["sitelibdir"]
45
+ unless $sitedir
46
+ version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
47
+ $libdir = File.join(CONFIG["libdir"], "ruby", version)
48
+ $sitedir = $:.find {|x| x =~ /site_ruby/}
49
+ if !$sitedir
50
+ $sitedir = File.join($libdir, "site_ruby")
51
+ elsif $sitedir !~ Regexp.quote(version)
52
+ $sitedir = File.join($sitedir, version)
53
+ end
54
+ end
55
+
56
+ $bindir = CONFIG["bindir"]
57
+
58
+ $realbindir = $bindir
59
+
60
+ bindir = CONFIG["bindir"]
61
+ if (destdir = ENV['DESTDIR'])
62
+ $bindir = destdir + $bindir
63
+ $sitedir = destdir + $sitedir
64
+
65
+ File::makedirs($bindir)
66
+ File::makedirs($sitedir)
67
+ end
68
+
69
+ dtr_dest = File.join($sitedir, "dtr")
70
+ File::makedirs(dtr_dest, true)
71
+ File::chmod(0755, dtr_dest)
72
+
73
+ # The library files
74
+
75
+ files = Dir.chdir('lib') { Dir['**/*.rb', '**/*.rake'] }
76
+
77
+ for fn in files
78
+ fn_dir = File.dirname(fn)
79
+ target_dir = File.join($sitedir, fn_dir)
80
+ if ! File.exist?(target_dir)
81
+ File.makedirs(target_dir)
82
+ end
83
+ File::install(File.join('lib', fn), File.join($sitedir, fn), 0644, true)
84
+ end
85
+
86
+ # and the executable
87
+
88
+ installBIN("bin/dtr", "dtr")