lib/dtr/raketasks.rb in dtr-0.0.4 vs lib/dtr/raketasks.rb in dtr-1.0.0
- old
+ new
@@ -1,6 +1,6 @@
-# Copyright (c) 2007-2008 Li Xiao
+# Copyright (c) 2007-2008 Li Xiao <iam@li-xiao.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
@@ -11,25 +11,83 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "rubygems"
-require 'dtr'
+require 'rake'
require 'rake/testtask'
+require 'rake/tasklib'
+require 'dtr'
+require 'dtr/shared/ruby_ext'
+require 'dtr/shared/utils'
+require 'dtr/shared/sync_codebase/package'
+
module DTR
- class MPTask < Rake::TestTask
- attr_accessor :processes, :runner_options, :start_server
-
+ # Create tasks that run a set of tests with DTR injected.
+ # The TestTask will create the following targets:
+ #
+ # [<b>:dtr</b>]:
+ # Create a task that runs a set of tests by DTR master.
+ #
+ # [DTR::PackageTask]:
+ # Create a packaging task that will package the project into
+ # distributable files for running test on remote machine.
+ # All test files should be included.
+ #
+ # Example:
+ # require 'dtr/raketasks'
+ #
+ # DTR::TestTask.new do |t|
+ # t.libs << "test"
+ # t.test_files = FileList['test/test*.rb']
+ # t.verbose = true
+ # t.processes = 1 # default is 1
+ # t.package_files.include("lib/**/*") # default is FileList["**/*"]
+ # t.package_files.include("test/**/*")
+ # end
+ #
+ # This task inherits from Rake::TestTask, and adds 2 DTR specific
+ # options: processes and package_files.
+ #
+ class TestTask < Rake::TestTask
+
+ #
+ # The option processes is used to start an DTR agent in same directory
+ # with master process. The number of processes is the size of runners
+ # launched by agent for running tests. If processes is set to 0,
+ # then there is no agent started locally.
+ # Default is 1.
+ attr_accessor :processes
+
+ # List of files to be included in the package for running tests on
+ # remote agent.
+ # The agent, which starts in same directory on same machine with
+ # master process, would skip copying codebase.
+ # The default package files is Rake::FileList["**/*"].
+ attr_accessor :package_files
+
+ def initialize(name=:dtr)
+ @processes = 1
+ @package_files = Rake::FileList.new
+ super(name)
+ end
+
def define
+ PackageTask.new do |p|
+ p.package_files = package_files
+ if p.package_files.empty?
+ p.package_files.include("**/*")
+ end
+ end
+
@libs.unshift DTR.lib_path
lib_path = @libs.join(File::PATH_SEPARATOR)
- desc "Run tests" + (@name==:test ? "" : " for #{@name}")
+ desc "Run tests with DTR injected"
task @name do
- DTR.start_server_daemon_mode if start_server?
- start_runners
+ @agent = start_agent
run_code = ''
begin
RakeFileUtils.verbose(@verbose) do
run_code = rake_loader
@ruby_opts.unshift( "-I#{lib_path}" )
@@ -39,31 +97,106 @@
" \"#{run_code}\" " +
file_list.unshift('dtr/test_unit_injection.rb').collect { |fn| "\"#{fn}\"" }.join(' ') +
" #{option_list}"
end
ensure
- DTR.stop_runners_daemon_mode rescue nil
- if start_server?
- DTR.stop_server_daemon_mode rescue nil
+ if defined?(@agent)
+ DTR.kill_process @agent
end
end
end
self
end
-
- def processes
- @processes ? @processes.to_i : 2
- end
-
- def start_server?
- defined?(@start_server) ? @start_server : true
- end
-
+
private
- def start_runners
+ def start_agent
return if self.processes.to_i <= 0
runner_names = []
self.processes.to_i.times {|i| runner_names << "runner#{i}"}
- %x[dtr -r #{runner_names.join(',')} -D #{runner_options}]
+
+ DTR.fork_process do
+ DTR_AGENT_OPTIONS[:runners] = runner_names if DTR_AGENT_OPTIONS[:runners].empty?
+ DTR.start_agent
+ end
+ end
+ end
+
+ # Create a packaging task that will package the project into
+ # distributable files for running test on remote machine.
+ # It uses zip and unzip to package and unpackage files.
+ # All test files should be included.
+ #
+ # The PackageTask will create the following targets:
+ #
+ # [<b>:dtr_package</b>]
+ # Create all the requested package files.
+ #
+ # [<b>:dtr_clobber_package</b>]
+ # Delete all the package files. This target is automatically
+ # added to the main clobber target.
+ #
+ # [<b>:dtr_repackage</b>]
+ # Rebuild the package files from scratch, even if they are not out
+ # of date.
+ #
+ # Example:
+ #
+ # DTR::PackageTask.new do |p|
+ # p.package_files.include("lib/**/*.rb")
+ # p.package_files.include("test/**/*.rb")
+ # end
+ #
+ class PackageTask < Rake::TaskLib
+ include SyncCodebase::Package
+ # List of files to be included in the package.
+ attr_accessor :package_files
+
+ # Create a Package Task with the given name and version.
+ def initialize
+ @package_files = Rake::FileList.new
+ yield self if block_given?
+ define
+ end
+
+ # Create the tasks defined by this task library.
+ def define
+ desc "Build packages for dtr task"
+ task :dtr_package
+
+ desc "Force a rebuild of the package files for dtr task"
+ task :dtr_repackage => [:dtr_clobber_package, :dtr_package]
+
+ desc "Remove package for dtr task"
+ task :dtr_clobber_package do
+ rm_r package_dir rescue nil
+ end
+
+ file, flag = package_file, 'j'
+ task :dtr_package => ["#{package_dir}/#{file}"]
+
+ file "#{package_dir}/#{file}" => [package_dir_path] do
+ chdir(package_dir) do
+ do_work(package_cmd)
+ end
+ end
+
+ directory package_dir
+
+ file package_dir_path do
+ mkdir_p package_dir rescue nil
+ @package_files.exclude(package_dir)
+ @package_files.each do |fn|
+ f = File.join(package_dir_path, fn)
+ fdir = File.dirname(f)
+ mkdir_p(fdir) if !File.exist?(fdir)
+ if File.directory?(fn)
+ mkdir_p(f)
+ else
+ rm_f f
+ safe_ln(fn, f)
+ end
+ end
+ end
+ self
end
end
end