Rakefile in rvm-1.7.0 vs Rakefile in rvm-1.8.1

- old
+ new

@@ -55,5 +55,77 @@ end task :test do exec "bash -l -c \"./test/suite\"" end + +# +# VirtualBox Helpers +# + +# Matches a host declaration in a ssh config file. +HOST_REGEXP = /^\s*Host\s+([^\s#*]+)/ +SNAPSHOT = (ENV['SNAPSHOT'] || 'CURRENT').upcase +SSH_CONFIG_FILE = ENV['SSH_CONFIG_FILE'] || File.expand_path('../config/ssh', __FILE__) + +def shell(cmd) + puts "$ #{cmd}" + system(cmd) +end + +def hosts + @hosts ||= begin + hosts = [] + + File.open(SSH_CONFIG_FILE) do |io| + io.each_line do |line| + next unless line =~ HOST_REGEXP + hosts << $1 + end + end + + hosts + end +end + +namespace :vbox do + desc "start each vm" + task :start => :stop do + hosts.each do |host| + shell "VBoxManage -q snapshot #{host} restore #{SNAPSHOT}" + shell "VBoxManage -q startvm #{host} --type headless" + shell "ssh -MNf -F '#{SSH_CONFIG_FILE}' '#{host}' >/dev/null 2>&1 </dev/null" + end + end + + desc "stop each vm" + task :stop do + hosts.each do |host| + if `VBoxManage -q list runningvms`.include?(host) + shell "VBoxManage -q controlvm #{host} poweroff" + end + end + end + + desc 'Run the tests remotely on each VM' + task :test do + begin + Rake::Task["vbox:start"].invoke + Rake::Task["vbox:remote_test"].invoke + ensure + Rake::Task["vbox:stop"].execute(nil) + end + end + + desc 'Run the tests remotely (assuming each VM is running)' + task :remote_test do + local_dir = File.expand_path("..", __FILE__) + remote_dir = "$(pwd)/rvm" + remote_script = "vboxtest/test_suite.sh" + sh "'#{File.expand_path("../vboxtest.sh", __FILE__)}' -L '#{local_dir}' -R '#{remote_dir}' -S '#{remote_script}' #{hosts.join(' ')}" + end + + desc 'Run the tests locally' + task :local_test do + sh File.expand_path("../vboxtest/test_suite.sh", __FILE__) + end +end