Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 306 lines (248 sloc) 6.334 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
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
Something went wrong with that request. Please try again.