Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

306 lines (248 sloc) 6.334 kb
require File.expand_path('../helper', __FILE__)
require 'fileutils'
require 'stringio'
class TestRakeFileUtils < Rake::TestCase
def teardown
FileUtils::LN_SUPPORTED[0] = true
RakeFileUtils.verbose_flag = Rake::FileUtilsExt::DEFAULT
super
end
def test_rm_one_file
create_file("a")
FileUtils.rm_rf "a"
refute File.exist?("a")
end
def test_rm_two_files
create_file("a")
create_file("b")
FileUtils.rm_rf ["a", "b"]
refute File.exist?("a")
refute File.exist?("b")
end
def test_rm_filelist
list = Rake::FileList.new << "a" << "b"
list.each { |fn| create_file(fn) }
FileUtils.rm_r list
refute File.exist?("a")
refute File.exist?("b")
end
def test_ln
open("a", "w") { |f| f.puts "TEST_LN" }
Rake::FileUtilsExt.safe_ln("a", "b", :verbose => false)
assert_equal "TEST_LN\n", File.read('b')
end
class BadLink
include Rake::FileUtilsExt
attr_reader :cp_args
def initialize(klass)
@failure_class = klass
end
def cp(*args)
@cp_args = args
end
def ln(*args)
fail @failure_class, "ln not supported"
end
public :safe_ln
end
def test_safe_ln_failover_to_cp_on_standard_error
FileUtils::LN_SUPPORTED[0] = true
c = BadLink.new(StandardError)
c.safe_ln "a", "b"
assert_equal ['a', 'b'], c.cp_args
c.safe_ln "x", "y"
assert_equal ['x', 'y'], c.cp_args
end
def test_safe_ln_failover_to_cp_on_not_implemented_error
FileUtils::LN_SUPPORTED[0] = true
c = BadLink.new(NotImplementedError)
c.safe_ln "a", "b"
assert_equal ['a', 'b'], c.cp_args
end
def test_safe_ln_fails_on_script_error
FileUtils::LN_SUPPORTED[0] = true
c = BadLink.new(ScriptError)
assert_raises(ScriptError) do c.safe_ln "a", "b" end
end
def test_verbose
verbose true
assert_equal true, verbose
verbose false
assert_equal false, verbose
verbose(true) {
assert_equal true, verbose
}
assert_equal false, verbose
end
def test_nowrite
nowrite true
assert_equal true, nowrite
nowrite false
assert_equal false, nowrite
nowrite(true){
assert_equal true, nowrite
}
assert_equal false, nowrite
end
def test_file_utils_methods_are_available_at_top_level
create_file("a")
capture_io do
rm_rf "a"
end
refute File.exist?("a")
end
def test_fileutils_methods_dont_leak
obj = Object.new
assert_raises(NoMethodError) { obj.copy } # from FileUtils
assert_raises(NoMethodError) { obj.ruby "-v" } # from RubyFileUtils
end
def test_sh
shellcommand
verbose(false) { sh %{#{Rake::TestCase::RUBY} shellcommand.rb} }
assert true, "should not fail"
end
def test_sh_with_a_single_string_argument
check_expansion
ENV['RAKE_TEST_SH'] = 'someval'
verbose(false) {
sh %{#{RUBY} check_expansion.rb #{env_var} someval}
}
end
def test_sh_with_multiple_arguments
check_no_expansion
ENV['RAKE_TEST_SH'] = 'someval'
verbose(false) {
sh RUBY, 'check_no_expansion.rb', env_var, 'someval'
}
end
def test_sh_failure
shellcommand
assert_raises(RuntimeError) {
verbose(false) { sh %{#{RUBY} shellcommand.rb 1} }
}
end
def test_sh_special_handling
shellcommand
count = 0
verbose(false) {
sh(%{#{RUBY} shellcommand.rb}) do |ok, res|
assert(ok)
assert_equal 0, res.exitstatus
count += 1
end
sh(%{#{RUBY} shellcommand.rb 1}) do |ok, res|
assert(!ok)
assert_equal 1, res.exitstatus
count += 1
end
}
assert_equal 2, count, "Block count should be 2"
end
def test_sh_noop
shellcommand
verbose(false) { sh %{shellcommand.rb 1}, :noop=>true }
assert true, "should not fail"
end
def test_sh_bad_option
shellcommand
ex = assert_raises(ArgumentError) {
verbose(false) { sh %{shellcommand.rb}, :bad_option=>true }
}
assert_match(/bad_option/, ex.message)
end
def test_sh_verbose
shellcommand
_, err = capture_io do
verbose(true) {
sh %{shellcommand.rb}, :noop=>true
}
end
assert_equal "shellcommand.rb\n", err
end
def test_sh_verbose_false
shellcommand
_, err = capture_io do
verbose(false) {
sh %{shellcommand.rb}, :noop=>true
}
end
assert_equal '', err
end
def test_sh_verbose_flag_nil
shellcommand
RakeFileUtils.verbose_flag = nil
assert_silent do
sh %{shellcommand.rb}, :noop=>true
end
end
def test_ruby_with_a_single_string_argument
check_expansion
ENV['RAKE_TEST_SH'] = 'someval'
verbose(false) {
replace_ruby {
ruby %{check_expansion.rb #{env_var} someval}
}
}
end
def test_ruby_with_multiple_arguments
check_no_expansion
ENV['RAKE_TEST_SH'] = 'someval'
verbose(false) {
replace_ruby {
ruby 'check_no_expansion.rb', env_var, 'someval'
}
}
end
def test_split_all
assert_equal ['a'], Rake::FileUtilsExt.split_all('a')
assert_equal ['..'], Rake::FileUtilsExt.split_all('..')
assert_equal ['/'], Rake::FileUtilsExt.split_all('/')
assert_equal ['a', 'b'], Rake::FileUtilsExt.split_all('a/b')
assert_equal ['/', 'a', 'b'], Rake::FileUtilsExt.split_all('/a/b')
assert_equal ['..', 'a', 'b'], Rake::FileUtilsExt.split_all('../a/b')
end
def command name, text
open name, 'w', 0750 do |io|
io << text
end
end
def check_no_expansion
command 'check_no_expansion.rb', <<-CHECK_EXPANSION
if ARGV[0] != ARGV[1]
exit 0
else
exit 1
end
CHECK_EXPANSION
end
def check_expansion
command 'check_expansion.rb', <<-CHECK_EXPANSION
if ARGV[0] != ARGV[1]
exit 1
else
exit 0
end
CHECK_EXPANSION
end
def replace_ruby
ruby = FileUtils::RUBY
FileUtils.send :remove_const, :RUBY
FileUtils.const_set :RUBY, RUBY
yield
ensure
FileUtils.send :remove_const, :RUBY
FileUtils.const_set:RUBY, ruby
end
def shellcommand
command 'shellcommand.rb', <<-SHELLCOMMAND
#!/usr/bin/env ruby
exit((ARGV[0] || "0").to_i)
SHELLCOMMAND
end
def env_var
windows? ? '%RAKE_TEST_SH%' : '$RAKE_TEST_SH'
end
def windows?
! File::ALT_SEPARATOR.nil?
end
end
Jump to Line
Something went wrong with that request. Please try again.