File: test_rake_clean.rb

package info (click to toggle)
rake 13.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 916 kB
  • sloc: ruby: 9,661; ansic: 19; sh: 19; makefile: 11
file content (146 lines) | stat: -rw-r--r-- 3,666 bytes parent folder | download
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
# frozen_string_literal: true
require File.expand_path("../helper", __FILE__)
require "rake/clean"

class TestRakeClean < Rake::TestCase # :nodoc:
  def test_clean
    if RUBY_ENGINE == "truffleruby" and RUBY_ENGINE_VERSION.start_with?("19.3.")
      load "rake/clean.rb" # TruffleRuby 19.3 does not set self correctly with wrap=true
    else
      load "rake/clean.rb", true
    end

    assert Rake::Task["clean"], "Should define clean"
    assert Rake::Task["clobber"], "Should define clobber"
    assert Rake::Task["clobber"].prerequisites.include?("clean"),
      "Clobber should require clean"
  end

  def test_cleanup
    file_name = create_undeletable_file

    out, _ = capture_output do
      Rake::Cleaner.cleanup(file_name, verbose: false)
    end
    assert_match(/failed to remove/i, out)

  ensure
    remove_undeletable_file
  end

  def test_cleanup_ignores_missing_files
    file_name = File.join(@tempdir, "missing_directory", "no_such_file")

    out, _ = capture_output do
      Rake::Cleaner.cleanup(file_name, verbose: false)
    end
    refute_match(/failed to remove/i, out)
  end

  def test_cleanup_trace
    file_name = create_file

    out, err = capture_output do
      with_trace true do
        Rake::Cleaner.cleanup(file_name)
      end
    end

    if err == ""
      # Current FileUtils
      assert_equal "rm -r #{file_name}\n", out
    else
      # Old FileUtils
      assert_equal "", out
      assert_equal "rm -r #{file_name}\n", err
    end
  end

  def test_cleanup_without_trace
    file_name = create_file

    out, err = capture_output do
      with_trace false do
        Rake::Cleaner.cleanup(file_name)
      end
    end
    assert_empty out
    assert_empty err
  end

  def test_cleanup_opt_overrides_trace_silent
    file_name = create_file

    out, err = capture_output do
      with_trace true do
        Rake::Cleaner.cleanup(file_name, verbose: false)
      end
    end
    assert_empty out
    assert_empty err
  end

  def test_cleanup_opt_overrides_trace_verbose
    file_name = create_file

    out, err = capture_output do
      with_trace false do
        Rake::Cleaner.cleanup(file_name, verbose: true)
      end
    end

    if err == ""
      assert_equal "rm -r #{file_name}\n", out
    else
      assert_equal "", out
      assert_equal "rm -r #{file_name}\n", err
    end
  end

  private

  def create_file
    dir_name = File.join(@tempdir, "deletedir")
    file_name = File.join(dir_name, "deleteme")
    FileUtils.mkdir(dir_name)
    FileUtils.touch(file_name)
    file_name
  end

  def create_undeletable_file
    dir_name = File.join(@tempdir, "deletedir")
    file_name = File.join(dir_name, "deleteme")
    FileUtils.mkdir(dir_name)
    FileUtils.touch(file_name)
    FileUtils.chmod(0, file_name)
    FileUtils.chmod(0, dir_name)
    begin
      FileUtils.chmod(0644, file_name)
    rescue
      file_name
    else
      omit "Permission to delete files is different on this system"
    end
  end

  def remove_undeletable_file
    dir_name = File.join(@tempdir, "deletedir")
    file_name = File.join(dir_name, "deleteme")
    FileUtils.chmod(0777, dir_name)
    FileUtils.chmod(0777, file_name)
    Rake::Cleaner.cleanup(file_name, verbose: false)
    Rake::Cleaner.cleanup(dir_name, verbose: false)
  end

  def with_trace(value)
    old, Rake.application.options.trace =
      Rake.application.options.trace, value

    # FileUtils caches the $stderr object, which breaks capture_output et. al.
    # We hack it here where it's convenient to do so.
    Rake::Cleaner.instance_variable_set :@fileutils_output, nil
    yield
  ensure
    Rake.application.options.trace = old
  end
end