fileutils2 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.index +57 -0
- data/HISTORY.md +21 -0
- data/LICENSE.txt +26 -0
- data/README.md +198 -0
- data/lib/fileutils2.rb +1750 -0
- data/lib/fileutils2/override.rb +10 -0
- data/test/fileutils2/clobber.rb +91 -0
- data/test/fileutils2/fileasserts.rb +72 -0
- data/test/fileutils2/test_dryrun.rb +19 -0
- data/test/fileutils2/test_fileutils.rb +1252 -0
- data/test/fileutils2/test_inclusion.rb +24 -0
- data/test/fileutils2/test_nowrite.rb +19 -0
- data/test/fileutils2/test_verbose.rb +17 -0
- data/test/fileutils2/visibility_tests.rb +41 -0
- data/test/runner.rb +16 -0
- metadata +108 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'fileutils2'
|
2
|
+
require 'fileutils2/fileasserts'
|
3
|
+
require 'tmpdir'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class TestFileUtils2 < Test::Unit::TestCase
|
7
|
+
end
|
8
|
+
|
9
|
+
module TestFileUtils2::Clobber
|
10
|
+
include Test::Unit::FileAssertions
|
11
|
+
|
12
|
+
def my_rm_rf(path)
|
13
|
+
if File.exist?('/bin/rm')
|
14
|
+
system %Q[/bin/rm -rf "#{path}"]
|
15
|
+
else
|
16
|
+
FileUtils.rm_rf path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
SRC = 'data/src'
|
21
|
+
COPY = 'data/copy'
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@prevdir = Dir.pwd
|
25
|
+
class << (@fileutils_output = "")
|
26
|
+
alias puts <<
|
27
|
+
end
|
28
|
+
tmproot = "#{Dir.tmpdir}/fileutils.rb.#{$$}"
|
29
|
+
Dir.mkdir tmproot unless File.directory?(tmproot)
|
30
|
+
Dir.chdir tmproot
|
31
|
+
my_rm_rf 'data'; Dir.mkdir 'data'
|
32
|
+
my_rm_rf 'tmp'; Dir.mkdir 'tmp'
|
33
|
+
File.open(SRC, 'w') {|f| f.puts 'dummy' }
|
34
|
+
File.open(COPY, 'w') {|f| f.puts 'dummy' }
|
35
|
+
end
|
36
|
+
|
37
|
+
def teardown
|
38
|
+
tmproot = Dir.pwd
|
39
|
+
Dir.chdir @prevdir
|
40
|
+
my_rm_rf tmproot
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_cp
|
44
|
+
cp SRC, 'tmp/cp'
|
45
|
+
check 'tmp/cp'
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_mv
|
49
|
+
mv SRC, 'tmp/mv'
|
50
|
+
check 'tmp/mv'
|
51
|
+
end
|
52
|
+
|
53
|
+
def check(dest, message=nil)
|
54
|
+
assert_file_not_exist dest, message
|
55
|
+
assert_file_exist SRC, message
|
56
|
+
assert_same_file SRC, COPY, message
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_rm
|
60
|
+
rm SRC
|
61
|
+
assert_file_exist SRC
|
62
|
+
assert_same_file SRC, COPY
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_rm_f
|
66
|
+
rm_f SRC
|
67
|
+
assert_file_exist SRC
|
68
|
+
assert_same_file SRC, COPY
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_rm_rf
|
72
|
+
rm_rf SRC
|
73
|
+
assert_file_exist SRC
|
74
|
+
assert_same_file SRC, COPY
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_mkdir
|
78
|
+
mkdir 'dir'
|
79
|
+
assert_file_not_exist 'dir'
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_mkdir_p
|
83
|
+
mkdir 'dir/dir/dir'
|
84
|
+
assert_file_not_exist 'dir'
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_copy_entry
|
88
|
+
copy_entry SRC, 'tmp/copy_entry'
|
89
|
+
check 'tmp/copy_entry', bug4331 = '[ruby-dev:43129]'
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
module Test
|
4
|
+
module Unit
|
5
|
+
module FileAssertions
|
6
|
+
def assert_same_file(from, to, message=nil)
|
7
|
+
assert_equal(File.read(from), File.read(to), "file #{from} != #{to}#{message&&': '}#{message||''}")
|
8
|
+
end
|
9
|
+
|
10
|
+
def assert_same_entry(from, to, message=nil)
|
11
|
+
a = File.stat(from)
|
12
|
+
b = File.stat(to)
|
13
|
+
msg = "#{message&&': '}#{message||''}"
|
14
|
+
assert_equal a.mode, b.mode, "mode #{a.mode} != #{b.mode}#{msg}"
|
15
|
+
#assert_equal a.atime, b.atime
|
16
|
+
assert_equal_timestamp a.mtime, b.mtime, "mtime #{a.mtime} != #{b.mtime}#{msg}"
|
17
|
+
assert_equal a.uid, b.uid, "uid #{a.uid} != #{b.uid}#{msg}"
|
18
|
+
assert_equal a.gid, b.gid, "gid #{a.gid} != #{b.gid}#{msg}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def assert_file_exist(path, message=nil)
|
22
|
+
assert(File.exist?(path), "file not exist: #{path}#{message&&': '}#{message||''}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_file_not_exist(path, message=nil)
|
26
|
+
assert(!File.exist?(path), "file exist: #{path}#{message&&': '}#{message||''}")
|
27
|
+
end
|
28
|
+
|
29
|
+
def assert_directory(path, message=nil)
|
30
|
+
assert(File.directory?(path), "is not directory: #{path}#{message&&': '}#{message||''}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def assert_symlink(path, message=nil)
|
34
|
+
assert(File.symlink?(path), "is not a symlink: #{path}#{message&&': '}#{message||''}")
|
35
|
+
end
|
36
|
+
|
37
|
+
def assert_not_symlink(path)
|
38
|
+
assert(!File.symlink?(path), "is a symlink: #{path}#{message&&': '}#{message||''}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def assert_equal_time(expected, actual, message=nil)
|
42
|
+
expected_str = expected.to_s
|
43
|
+
actual_str = actual.to_s
|
44
|
+
if expected_str == actual_str
|
45
|
+
expected_str << " (nsec=#{expected.nsec})"
|
46
|
+
actual_str << " (nsec=#{actual.nsec})"
|
47
|
+
end
|
48
|
+
full_message = build_message(message, <<EOT)
|
49
|
+
<#{expected_str}> expected but was
|
50
|
+
<#{actual_str}>.
|
51
|
+
EOT
|
52
|
+
assert_equal(expected, actual, full_message)
|
53
|
+
end
|
54
|
+
|
55
|
+
def assert_equal_timestamp(expected, actual, message=nil)
|
56
|
+
expected_str = expected.to_s
|
57
|
+
actual_str = actual.to_s
|
58
|
+
if expected_str == actual_str
|
59
|
+
expected_str << " (nsec=#{expected.nsec})"
|
60
|
+
actual_str << " (nsec=#{actual.nsec})"
|
61
|
+
end
|
62
|
+
full_message = build_message(message, <<EOT)
|
63
|
+
<#{expected_str}> expected but was
|
64
|
+
<#{actual_str}>.
|
65
|
+
EOT
|
66
|
+
# subsecond timestamp is not portable.
|
67
|
+
assert_equal(expected.tv_sec, actual.tv_sec, full_message)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require 'fileutils2'
|
4
|
+
require 'fileutils2/visibility_tests'
|
5
|
+
require 'fileutils2/clobber'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
class TestFileUtils2DryRun < Test::Unit::TestCase
|
9
|
+
|
10
|
+
include FileUtils2::DryRun
|
11
|
+
include TestFileUtils2::Clobber
|
12
|
+
include TestFileUtils2::Visibility
|
13
|
+
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
@fu_module = FileUtils2::DryRun
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,1252 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require 'fileutils2'
|
4
|
+
require 'fileutils2/fileasserts'
|
5
|
+
|
6
|
+
require 'pathname'
|
7
|
+
require 'tmpdir'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
class TestFileUtils2 < Test::Unit::TestCase
|
11
|
+
TMPROOT = "#{Dir.tmpdir}/fileutils.rb.#{$$}"
|
12
|
+
include Test::Unit::FileAssertions
|
13
|
+
end
|
14
|
+
|
15
|
+
prevdir = Dir.pwd
|
16
|
+
tmproot = TestFileUtils2::TMPROOT
|
17
|
+
Dir.mkdir tmproot unless File.directory?(tmproot)
|
18
|
+
Dir.chdir tmproot
|
19
|
+
|
20
|
+
def have_drive_letter?
|
21
|
+
/mswin(?!ce)|mingw|bcc|emx/ =~ RUBY_PLATFORM
|
22
|
+
end
|
23
|
+
|
24
|
+
def have_file_perm?
|
25
|
+
/mswin|mingw|bcc|emx/ !~ RUBY_PLATFORM
|
26
|
+
end
|
27
|
+
|
28
|
+
$fileutils_rb_have_symlink = nil
|
29
|
+
|
30
|
+
def have_symlink?
|
31
|
+
if $fileutils_rb_have_symlink == nil
|
32
|
+
$fileutils_rb_have_symlink = check_have_symlink?
|
33
|
+
end
|
34
|
+
$fileutils_rb_have_symlink
|
35
|
+
end
|
36
|
+
|
37
|
+
def check_have_symlink?
|
38
|
+
File.symlink nil, nil
|
39
|
+
rescue NotImplementedError
|
40
|
+
return false
|
41
|
+
rescue
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
$fileutils_rb_have_hardlink = nil
|
46
|
+
|
47
|
+
def have_hardlink?
|
48
|
+
if $fileutils_rb_have_hardlink == nil
|
49
|
+
$fileutils_rb_have_hardlink = check_have_hardlink?
|
50
|
+
end
|
51
|
+
$fileutils_rb_have_hardlink
|
52
|
+
end
|
53
|
+
|
54
|
+
def check_have_hardlink?
|
55
|
+
File.link nil, nil
|
56
|
+
rescue NotImplementedError
|
57
|
+
return false
|
58
|
+
rescue
|
59
|
+
return true
|
60
|
+
end
|
61
|
+
|
62
|
+
begin
|
63
|
+
Dir.mkdir("\n")
|
64
|
+
Dir.rmdir("\n")
|
65
|
+
def lf_in_path_allowed?
|
66
|
+
true
|
67
|
+
end
|
68
|
+
rescue
|
69
|
+
def lf_in_path_allowed?
|
70
|
+
false
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
Dir.chdir prevdir
|
75
|
+
Dir.rmdir tmproot
|
76
|
+
|
77
|
+
class TestFileUtils2
|
78
|
+
|
79
|
+
include FileUtils2
|
80
|
+
|
81
|
+
def check_singleton(name)
|
82
|
+
assert_respond_to ::FileUtils2, name
|
83
|
+
end
|
84
|
+
|
85
|
+
def my_rm_rf(path)
|
86
|
+
if File.exist?('/bin/rm')
|
87
|
+
system %Q[/bin/rm -rf "#{path}"]
|
88
|
+
else
|
89
|
+
FileUtils2.rm_rf path
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def mymkdir(path)
|
94
|
+
Dir.mkdir path
|
95
|
+
File.chown nil, Process.gid, path if have_file_perm?
|
96
|
+
end
|
97
|
+
|
98
|
+
def setup
|
99
|
+
@prevdir = Dir.pwd
|
100
|
+
tmproot = TMPROOT
|
101
|
+
mymkdir tmproot unless File.directory?(tmproot)
|
102
|
+
Dir.chdir tmproot
|
103
|
+
my_rm_rf 'data'; mymkdir 'data'
|
104
|
+
my_rm_rf 'tmp'; mymkdir 'tmp'
|
105
|
+
prepare_data_file
|
106
|
+
end
|
107
|
+
|
108
|
+
def teardown
|
109
|
+
Dir.chdir @prevdir
|
110
|
+
my_rm_rf TMPROOT
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
TARGETS = %w( data/a data/all data/random data/zero )
|
115
|
+
|
116
|
+
def prepare_data_file
|
117
|
+
File.open('data/a', 'w') {|f|
|
118
|
+
32.times do
|
119
|
+
f.puts 'a' * 50
|
120
|
+
end
|
121
|
+
}
|
122
|
+
|
123
|
+
all_chars = (0..255).map {|n| n.chr }.join('')
|
124
|
+
File.open('data/all', 'w') {|f|
|
125
|
+
32.times do
|
126
|
+
f.puts all_chars
|
127
|
+
end
|
128
|
+
}
|
129
|
+
|
130
|
+
random_chars = (0...50).map { rand(256).chr }.join('')
|
131
|
+
File.open('data/random', 'w') {|f|
|
132
|
+
32.times do
|
133
|
+
f.puts random_chars
|
134
|
+
end
|
135
|
+
}
|
136
|
+
|
137
|
+
File.open('data/zero', 'w') {|f|
|
138
|
+
;
|
139
|
+
}
|
140
|
+
end
|
141
|
+
|
142
|
+
BIGFILE = 'data/big'
|
143
|
+
|
144
|
+
def prepare_big_file
|
145
|
+
File.open('data/big', 'w') {|f|
|
146
|
+
(4 * 1024 * 1024 / 256).times do # 4MB
|
147
|
+
f.print "aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa\n"
|
148
|
+
end
|
149
|
+
}
|
150
|
+
end
|
151
|
+
|
152
|
+
def prepare_time_data
|
153
|
+
File.open('data/old', 'w') {|f| f.puts 'dummy' }
|
154
|
+
File.open('data/newer', 'w') {|f| f.puts 'dummy' }
|
155
|
+
File.open('data/newest', 'w') {|f| f.puts 'dummy' }
|
156
|
+
t = Time.now
|
157
|
+
File.utime t-8, t-8, 'data/old'
|
158
|
+
File.utime t-4, t-4, 'data/newer'
|
159
|
+
end
|
160
|
+
|
161
|
+
def each_srcdest
|
162
|
+
TARGETS.each do |path|
|
163
|
+
yield path, "tmp/#{File.basename(path)}"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Test Cases
|
169
|
+
#
|
170
|
+
|
171
|
+
def test_pwd
|
172
|
+
check_singleton :pwd
|
173
|
+
|
174
|
+
assert_equal Dir.pwd, pwd()
|
175
|
+
|
176
|
+
cwd = Dir.pwd
|
177
|
+
root = have_drive_letter? ? 'C:/' : '/'
|
178
|
+
cd(root) {
|
179
|
+
assert_equal root, pwd()
|
180
|
+
}
|
181
|
+
assert_equal cwd, pwd()
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_cmp
|
185
|
+
check_singleton :cmp
|
186
|
+
|
187
|
+
TARGETS.each do |fname|
|
188
|
+
assert cmp(fname, fname), 'not same?'
|
189
|
+
end
|
190
|
+
assert_raise(ArgumentError) {
|
191
|
+
cmp TARGETS[0], TARGETS[0], :undefinedoption => true
|
192
|
+
}
|
193
|
+
|
194
|
+
# pathname
|
195
|
+
touch 'tmp/cmptmp'
|
196
|
+
assert_nothing_raised {
|
197
|
+
cmp Pathname.new('tmp/cmptmp'), 'tmp/cmptmp'
|
198
|
+
cmp 'tmp/cmptmp', Pathname.new('tmp/cmptmp')
|
199
|
+
cmp Pathname.new('tmp/cmptmp'), Pathname.new('tmp/cmptmp')
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_cp
|
204
|
+
check_singleton :cp
|
205
|
+
|
206
|
+
each_srcdest do |srcpath, destpath|
|
207
|
+
cp srcpath, destpath
|
208
|
+
assert_same_file srcpath, destpath
|
209
|
+
|
210
|
+
cp srcpath, File.dirname(destpath)
|
211
|
+
assert_same_file srcpath, destpath
|
212
|
+
|
213
|
+
cp srcpath, File.dirname(destpath) + '/'
|
214
|
+
assert_same_file srcpath, destpath
|
215
|
+
|
216
|
+
cp srcpath, destpath, :preserve => true
|
217
|
+
assert_same_file srcpath, destpath
|
218
|
+
assert_same_entry srcpath, destpath
|
219
|
+
end
|
220
|
+
|
221
|
+
assert_raise(Errno::ENOENT) {
|
222
|
+
cp 'tmp/cptmp', 'tmp/cptmp_new'
|
223
|
+
}
|
224
|
+
assert_file_not_exist('tmp/cptmp_new')
|
225
|
+
|
226
|
+
# src==dest (1) same path
|
227
|
+
touch 'tmp/cptmp'
|
228
|
+
assert_raise(ArgumentError) {
|
229
|
+
cp 'tmp/cptmp', 'tmp/cptmp'
|
230
|
+
}
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_cp_preserve_permissions
|
234
|
+
bug4507 = '[ruby-core:35518]'
|
235
|
+
touch 'tmp/cptmp'
|
236
|
+
chmod 0755, 'tmp/cptmp'
|
237
|
+
cp 'tmp/cptmp', 'tmp/cptmp2'
|
238
|
+
assert_equal(File.stat('tmp/cptmp').mode,
|
239
|
+
File.stat('tmp/cptmp2').mode,
|
240
|
+
bug4507)
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_cp_preserve_permissions_dir
|
244
|
+
bug7246 = '[ruby-core:48603]'
|
245
|
+
mkdir 'tmp/cptmp'
|
246
|
+
mkdir 'tmp/cptmp/d1'
|
247
|
+
chmod 0745, 'tmp/cptmp/d1'
|
248
|
+
mkdir 'tmp/cptmp/d2'
|
249
|
+
chmod 0700, 'tmp/cptmp/d2'
|
250
|
+
cp_r 'tmp/cptmp', 'tmp/cptmp2', :preserve => true
|
251
|
+
assert_equal(File.stat('tmp/cptmp/d1').mode,
|
252
|
+
File.stat('tmp/cptmp2/d1').mode,
|
253
|
+
bug7246)
|
254
|
+
assert_equal(File.stat('tmp/cptmp/d2').mode,
|
255
|
+
File.stat('tmp/cptmp2/d2').mode,
|
256
|
+
bug7246)
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_cp_symlink
|
260
|
+
touch 'tmp/cptmp'
|
261
|
+
# src==dest (2) symlink and its target
|
262
|
+
File.symlink 'cptmp', 'tmp/cptmp_symlink'
|
263
|
+
assert_raise(ArgumentError) {
|
264
|
+
cp 'tmp/cptmp', 'tmp/cptmp_symlink'
|
265
|
+
}
|
266
|
+
assert_raise(ArgumentError) {
|
267
|
+
cp 'tmp/cptmp_symlink', 'tmp/cptmp'
|
268
|
+
}
|
269
|
+
# src==dest (3) looped symlink
|
270
|
+
File.symlink 'symlink', 'tmp/symlink'
|
271
|
+
assert_raise(Errno::ELOOP) {
|
272
|
+
cp 'tmp/symlink', 'tmp/symlink'
|
273
|
+
}
|
274
|
+
end if have_symlink?
|
275
|
+
|
276
|
+
def test_cp_pathname
|
277
|
+
# pathname
|
278
|
+
touch 'tmp/cptmp'
|
279
|
+
assert_nothing_raised {
|
280
|
+
cp 'tmp/cptmp', Pathname.new('tmp/tmpdest')
|
281
|
+
cp Pathname.new('tmp/cptmp'), 'tmp/tmpdest'
|
282
|
+
cp Pathname.new('tmp/cptmp'), Pathname.new('tmp/tmpdest')
|
283
|
+
mkdir 'tmp/tmpdir'
|
284
|
+
cp ['tmp/cptmp', 'tmp/tmpdest'], Pathname.new('tmp/tmpdir')
|
285
|
+
}
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_cp_r
|
289
|
+
check_singleton :cp_r
|
290
|
+
|
291
|
+
cp_r 'data', 'tmp'
|
292
|
+
TARGETS.each do |fname|
|
293
|
+
assert_same_file fname, "tmp/#{fname}"
|
294
|
+
end
|
295
|
+
|
296
|
+
cp_r 'data', 'tmp2', :preserve => true
|
297
|
+
TARGETS.each do |fname|
|
298
|
+
assert_same_entry fname, "tmp2/#{File.basename(fname)}"
|
299
|
+
assert_same_file fname, "tmp2/#{File.basename(fname)}"
|
300
|
+
end
|
301
|
+
|
302
|
+
# a/* -> b/*
|
303
|
+
mkdir 'tmp/cpr_src'
|
304
|
+
mkdir 'tmp/cpr_dest'
|
305
|
+
File.open('tmp/cpr_src/a', 'w') {|f| f.puts 'a' }
|
306
|
+
File.open('tmp/cpr_src/b', 'w') {|f| f.puts 'b' }
|
307
|
+
File.open('tmp/cpr_src/c', 'w') {|f| f.puts 'c' }
|
308
|
+
mkdir 'tmp/cpr_src/d'
|
309
|
+
cp_r 'tmp/cpr_src/.', 'tmp/cpr_dest'
|
310
|
+
assert_same_file 'tmp/cpr_src/a', 'tmp/cpr_dest/a'
|
311
|
+
assert_same_file 'tmp/cpr_src/b', 'tmp/cpr_dest/b'
|
312
|
+
assert_same_file 'tmp/cpr_src/c', 'tmp/cpr_dest/c'
|
313
|
+
assert_directory 'tmp/cpr_dest/d'
|
314
|
+
my_rm_rf 'tmp/cpr_src'
|
315
|
+
my_rm_rf 'tmp/cpr_dest'
|
316
|
+
|
317
|
+
bug3588 = '[ruby-core:31360]'
|
318
|
+
assert_nothing_raised(ArgumentError, bug3588) do
|
319
|
+
cp_r 'tmp', 'tmp2'
|
320
|
+
end
|
321
|
+
assert_directory 'tmp2/tmp'
|
322
|
+
assert_raise(ArgumentError, bug3588) do
|
323
|
+
cp_r 'tmp2', 'tmp2/new_tmp2'
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_cp_r_symlink
|
328
|
+
# symlink in a directory
|
329
|
+
mkdir 'tmp/cpr_src'
|
330
|
+
ln_s 'SLdest', 'tmp/cpr_src/symlink'
|
331
|
+
cp_r 'tmp/cpr_src', 'tmp/cpr_dest'
|
332
|
+
assert_symlink 'tmp/cpr_dest/symlink'
|
333
|
+
assert_equal 'SLdest', File.readlink('tmp/cpr_dest/symlink')
|
334
|
+
|
335
|
+
# root is a symlink
|
336
|
+
ln_s 'cpr_src', 'tmp/cpr_src2'
|
337
|
+
cp_r 'tmp/cpr_src2', 'tmp/cpr_dest2'
|
338
|
+
assert_directory 'tmp/cpr_dest2'
|
339
|
+
assert_not_symlink 'tmp/cpr_dest2'
|
340
|
+
assert_symlink 'tmp/cpr_dest2/symlink'
|
341
|
+
assert_equal 'SLdest', File.readlink('tmp/cpr_dest2/symlink')
|
342
|
+
end if have_symlink?
|
343
|
+
|
344
|
+
def test_cp_r_symlink_preserve
|
345
|
+
mkdir 'tmp/cross'
|
346
|
+
mkdir 'tmp/cross/a'
|
347
|
+
mkdir 'tmp/cross/b'
|
348
|
+
touch 'tmp/cross/a/f'
|
349
|
+
touch 'tmp/cross/b/f'
|
350
|
+
ln_s '../a/f', 'tmp/cross/b/l'
|
351
|
+
ln_s '../b/f', 'tmp/cross/a/l'
|
352
|
+
assert_nothing_raised {
|
353
|
+
cp_r 'tmp/cross', 'tmp/cross2', :preserve => true
|
354
|
+
}
|
355
|
+
end if have_symlink?
|
356
|
+
|
357
|
+
def test_cp_r_pathname
|
358
|
+
# pathname
|
359
|
+
touch 'tmp/cprtmp'
|
360
|
+
assert_nothing_raised {
|
361
|
+
cp_r Pathname.new('tmp/cprtmp'), 'tmp/tmpdest'
|
362
|
+
cp_r 'tmp/cprtmp', Pathname.new('tmp/tmpdest')
|
363
|
+
cp_r Pathname.new('tmp/cprtmp'), Pathname.new('tmp/tmpdest')
|
364
|
+
}
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_mv
|
368
|
+
check_singleton :mv
|
369
|
+
|
370
|
+
mkdir 'tmp/dest'
|
371
|
+
TARGETS.each do |fname|
|
372
|
+
cp fname, 'tmp/mvsrc'
|
373
|
+
mv 'tmp/mvsrc', 'tmp/mvdest'
|
374
|
+
assert_same_file fname, 'tmp/mvdest'
|
375
|
+
|
376
|
+
mv 'tmp/mvdest', 'tmp/dest/'
|
377
|
+
assert_same_file fname, 'tmp/dest/mvdest'
|
378
|
+
|
379
|
+
mv 'tmp/dest/mvdest', 'tmp'
|
380
|
+
assert_same_file fname, 'tmp/mvdest'
|
381
|
+
end
|
382
|
+
|
383
|
+
mkdir 'tmp/tmpdir'
|
384
|
+
mkdir_p 'tmp/dest2/tmpdir'
|
385
|
+
assert_raise(Errno::EEXIST) {
|
386
|
+
mv 'tmp/tmpdir', 'tmp/dest2'
|
387
|
+
}
|
388
|
+
mkdir 'tmp/dest2/tmpdir/junk'
|
389
|
+
assert_raise(Errno::EEXIST, "[ruby-talk:124368]") {
|
390
|
+
mv 'tmp/tmpdir', 'tmp/dest2'
|
391
|
+
}
|
392
|
+
|
393
|
+
# src==dest (1) same path
|
394
|
+
touch 'tmp/cptmp'
|
395
|
+
assert_raise(ArgumentError) {
|
396
|
+
mv 'tmp/cptmp', 'tmp/cptmp'
|
397
|
+
}
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_mv_symlink
|
401
|
+
touch 'tmp/cptmp'
|
402
|
+
# src==dest (2) symlink and its target
|
403
|
+
File.symlink 'cptmp', 'tmp/cptmp_symlink'
|
404
|
+
assert_raise(ArgumentError) {
|
405
|
+
mv 'tmp/cptmp', 'tmp/cptmp_symlink'
|
406
|
+
}
|
407
|
+
assert_raise(ArgumentError) {
|
408
|
+
mv 'tmp/cptmp_symlink', 'tmp/cptmp'
|
409
|
+
}
|
410
|
+
# src==dest (3) looped symlink
|
411
|
+
File.symlink 'symlink', 'tmp/symlink'
|
412
|
+
assert_raise(Errno::ELOOP) {
|
413
|
+
mv 'tmp/symlink', 'tmp/symlink'
|
414
|
+
}
|
415
|
+
end if have_symlink?
|
416
|
+
|
417
|
+
def test_mv_pathname
|
418
|
+
# pathname
|
419
|
+
assert_nothing_raised {
|
420
|
+
touch 'tmp/mvtmpsrc'
|
421
|
+
mv Pathname.new('tmp/mvtmpsrc'), 'tmp/mvtmpdest'
|
422
|
+
touch 'tmp/mvtmpsrc'
|
423
|
+
mv 'tmp/mvtmpsrc', Pathname.new('tmp/mvtmpdest')
|
424
|
+
touch 'tmp/mvtmpsrc'
|
425
|
+
mv Pathname.new('tmp/mvtmpsrc'), Pathname.new('tmp/mvtmpdest')
|
426
|
+
}
|
427
|
+
end
|
428
|
+
|
429
|
+
def test_rm
|
430
|
+
check_singleton :rm
|
431
|
+
|
432
|
+
TARGETS.each do |fname|
|
433
|
+
cp fname, 'tmp/rmsrc'
|
434
|
+
rm 'tmp/rmsrc'
|
435
|
+
assert_file_not_exist 'tmp/rmsrc'
|
436
|
+
end
|
437
|
+
|
438
|
+
# pathname
|
439
|
+
touch 'tmp/rmtmp1'
|
440
|
+
touch 'tmp/rmtmp2'
|
441
|
+
touch 'tmp/rmtmp3'
|
442
|
+
assert_nothing_raised {
|
443
|
+
rm Pathname.new('tmp/rmtmp1')
|
444
|
+
rm [Pathname.new('tmp/rmtmp2'), Pathname.new('tmp/rmtmp3')]
|
445
|
+
}
|
446
|
+
assert_file_not_exist 'tmp/rmtmp1'
|
447
|
+
assert_file_not_exist 'tmp/rmtmp2'
|
448
|
+
assert_file_not_exist 'tmp/rmtmp3'
|
449
|
+
end
|
450
|
+
|
451
|
+
def test_rm_f
|
452
|
+
check_singleton :rm_f
|
453
|
+
|
454
|
+
TARGETS.each do |fname|
|
455
|
+
cp fname, 'tmp/rmsrc'
|
456
|
+
rm_f 'tmp/rmsrc'
|
457
|
+
assert_file_not_exist 'tmp/rmsrc'
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
def test_rm_symlink
|
462
|
+
File.open('tmp/lnf_symlink_src', 'w') {|f| f.puts 'dummy' }
|
463
|
+
File.symlink 'tmp/lnf_symlink_src', 'tmp/lnf_symlink_dest'
|
464
|
+
rm_f 'tmp/lnf_symlink_dest'
|
465
|
+
assert_file_not_exist 'tmp/lnf_symlink_dest'
|
466
|
+
assert_file_exist 'tmp/lnf_symlink_src'
|
467
|
+
|
468
|
+
rm_f 'notexistdatafile'
|
469
|
+
rm_f 'tmp/notexistdatafile'
|
470
|
+
my_rm_rf 'tmpdatadir'
|
471
|
+
Dir.mkdir 'tmpdatadir'
|
472
|
+
# rm_f 'tmpdatadir'
|
473
|
+
Dir.rmdir 'tmpdatadir'
|
474
|
+
end if have_symlink?
|
475
|
+
|
476
|
+
def test_rm_f_2
|
477
|
+
Dir.mkdir 'tmp/tmpdir'
|
478
|
+
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
479
|
+
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
480
|
+
rm_f ['tmp/tmpdir/a', 'tmp/tmpdir/b', 'tmp/tmpdir/c']
|
481
|
+
assert_file_not_exist 'tmp/tmpdir/a'
|
482
|
+
assert_file_not_exist 'tmp/tmpdir/c'
|
483
|
+
Dir.rmdir 'tmp/tmpdir'
|
484
|
+
end
|
485
|
+
|
486
|
+
def test_rm_pathname
|
487
|
+
# pathname
|
488
|
+
touch 'tmp/rmtmp1'
|
489
|
+
touch 'tmp/rmtmp2'
|
490
|
+
touch 'tmp/rmtmp3'
|
491
|
+
touch 'tmp/rmtmp4'
|
492
|
+
assert_nothing_raised {
|
493
|
+
rm_f Pathname.new('tmp/rmtmp1')
|
494
|
+
rm_f [Pathname.new('tmp/rmtmp2'), Pathname.new('tmp/rmtmp3')]
|
495
|
+
}
|
496
|
+
assert_file_not_exist 'tmp/rmtmp1'
|
497
|
+
assert_file_not_exist 'tmp/rmtmp2'
|
498
|
+
assert_file_not_exist 'tmp/rmtmp3'
|
499
|
+
assert_file_exist 'tmp/rmtmp4'
|
500
|
+
|
501
|
+
# [ruby-dev:39345]
|
502
|
+
touch 'tmp/[rmtmp]'
|
503
|
+
FileUtils2.rm_f 'tmp/[rmtmp]'
|
504
|
+
assert_file_not_exist 'tmp/[rmtmp]'
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_rm_r
|
508
|
+
check_singleton :rm_r
|
509
|
+
|
510
|
+
my_rm_rf 'tmpdatadir'
|
511
|
+
|
512
|
+
Dir.mkdir 'tmpdatadir'
|
513
|
+
rm_r 'tmpdatadir'
|
514
|
+
assert_file_not_exist 'tmpdatadir'
|
515
|
+
|
516
|
+
Dir.mkdir 'tmpdatadir'
|
517
|
+
rm_r 'tmpdatadir/'
|
518
|
+
assert_file_not_exist 'tmpdatadir'
|
519
|
+
|
520
|
+
Dir.mkdir 'tmp/tmpdir'
|
521
|
+
rm_r 'tmp/tmpdir/'
|
522
|
+
assert_file_not_exist 'tmp/tmpdir'
|
523
|
+
assert_file_exist 'tmp'
|
524
|
+
|
525
|
+
Dir.mkdir 'tmp/tmpdir'
|
526
|
+
rm_r 'tmp/tmpdir'
|
527
|
+
assert_file_not_exist 'tmp/tmpdir'
|
528
|
+
assert_file_exist 'tmp'
|
529
|
+
|
530
|
+
Dir.mkdir 'tmp/tmpdir'
|
531
|
+
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
532
|
+
File.open('tmp/tmpdir/b', 'w') {|f| f.puts 'dummy' }
|
533
|
+
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
534
|
+
rm_r 'tmp/tmpdir'
|
535
|
+
assert_file_not_exist 'tmp/tmpdir'
|
536
|
+
assert_file_exist 'tmp'
|
537
|
+
|
538
|
+
Dir.mkdir 'tmp/tmpdir'
|
539
|
+
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
540
|
+
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
541
|
+
rm_r ['tmp/tmpdir/a', 'tmp/tmpdir/b', 'tmp/tmpdir/c'], :force => true
|
542
|
+
assert_file_not_exist 'tmp/tmpdir/a'
|
543
|
+
assert_file_not_exist 'tmp/tmpdir/c'
|
544
|
+
Dir.rmdir 'tmp/tmpdir'
|
545
|
+
end
|
546
|
+
|
547
|
+
def test_rm_r_symlink
|
548
|
+
# [ruby-talk:94635] a symlink to the directory
|
549
|
+
Dir.mkdir 'tmp/tmpdir'
|
550
|
+
File.symlink '..', 'tmp/tmpdir/symlink_to_dir'
|
551
|
+
rm_r 'tmp/tmpdir'
|
552
|
+
assert_file_not_exist 'tmp/tmpdir'
|
553
|
+
assert_file_exist 'tmp'
|
554
|
+
end if have_symlink?
|
555
|
+
|
556
|
+
def test_rm_r_pathname
|
557
|
+
# pathname
|
558
|
+
Dir.mkdir 'tmp/tmpdir1'; touch 'tmp/tmpdir1/tmp'
|
559
|
+
Dir.mkdir 'tmp/tmpdir2'; touch 'tmp/tmpdir2/tmp'
|
560
|
+
Dir.mkdir 'tmp/tmpdir3'; touch 'tmp/tmpdir3/tmp'
|
561
|
+
assert_nothing_raised {
|
562
|
+
rm_r Pathname.new('tmp/tmpdir1')
|
563
|
+
rm_r [Pathname.new('tmp/tmpdir2'), Pathname.new('tmp/tmpdir3')]
|
564
|
+
}
|
565
|
+
assert_file_not_exist 'tmp/tmpdir1'
|
566
|
+
assert_file_not_exist 'tmp/tmpdir2'
|
567
|
+
assert_file_not_exist 'tmp/tmpdir3'
|
568
|
+
end
|
569
|
+
|
570
|
+
def test_remove_entry_secure
|
571
|
+
check_singleton :remove_entry_secure
|
572
|
+
|
573
|
+
my_rm_rf 'tmpdatadir'
|
574
|
+
|
575
|
+
Dir.mkdir 'tmpdatadir'
|
576
|
+
remove_entry_secure 'tmpdatadir'
|
577
|
+
assert_file_not_exist 'tmpdatadir'
|
578
|
+
|
579
|
+
Dir.mkdir 'tmpdatadir'
|
580
|
+
remove_entry_secure 'tmpdatadir/'
|
581
|
+
assert_file_not_exist 'tmpdatadir'
|
582
|
+
|
583
|
+
Dir.mkdir 'tmp/tmpdir'
|
584
|
+
remove_entry_secure 'tmp/tmpdir/'
|
585
|
+
assert_file_not_exist 'tmp/tmpdir'
|
586
|
+
assert_file_exist 'tmp'
|
587
|
+
|
588
|
+
Dir.mkdir 'tmp/tmpdir'
|
589
|
+
remove_entry_secure 'tmp/tmpdir'
|
590
|
+
assert_file_not_exist 'tmp/tmpdir'
|
591
|
+
assert_file_exist 'tmp'
|
592
|
+
|
593
|
+
Dir.mkdir 'tmp/tmpdir'
|
594
|
+
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
595
|
+
File.open('tmp/tmpdir/b', 'w') {|f| f.puts 'dummy' }
|
596
|
+
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
597
|
+
remove_entry_secure 'tmp/tmpdir'
|
598
|
+
assert_file_not_exist 'tmp/tmpdir'
|
599
|
+
assert_file_exist 'tmp'
|
600
|
+
|
601
|
+
Dir.mkdir 'tmp/tmpdir'
|
602
|
+
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
603
|
+
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
604
|
+
remove_entry_secure 'tmp/tmpdir/a', true
|
605
|
+
remove_entry_secure 'tmp/tmpdir/b', true
|
606
|
+
remove_entry_secure 'tmp/tmpdir/c', true
|
607
|
+
assert_file_not_exist 'tmp/tmpdir/a'
|
608
|
+
assert_file_not_exist 'tmp/tmpdir/c'
|
609
|
+
Dir.rmdir 'tmp/tmpdir'
|
610
|
+
end
|
611
|
+
|
612
|
+
def test_remove_entry_secure_symlink
|
613
|
+
# [ruby-talk:94635] a symlink to the directory
|
614
|
+
Dir.mkdir 'tmp/tmpdir'
|
615
|
+
File.symlink '..', 'tmp/tmpdir/symlink_to_dir'
|
616
|
+
remove_entry_secure 'tmp/tmpdir'
|
617
|
+
assert_file_not_exist 'tmp/tmpdir'
|
618
|
+
assert_file_exist 'tmp'
|
619
|
+
end if have_symlink?
|
620
|
+
|
621
|
+
def test_remove_entry_secure_pathname
|
622
|
+
# pathname
|
623
|
+
Dir.mkdir 'tmp/tmpdir1'; touch 'tmp/tmpdir1/tmp'
|
624
|
+
assert_nothing_raised {
|
625
|
+
remove_entry_secure Pathname.new('tmp/tmpdir1')
|
626
|
+
}
|
627
|
+
assert_file_not_exist 'tmp/tmpdir1'
|
628
|
+
end
|
629
|
+
|
630
|
+
def test_with_big_file
|
631
|
+
prepare_big_file
|
632
|
+
|
633
|
+
cp BIGFILE, 'tmp/cpdest'
|
634
|
+
assert_same_file BIGFILE, 'tmp/cpdest'
|
635
|
+
assert cmp(BIGFILE, 'tmp/cpdest'), 'orig != copied'
|
636
|
+
|
637
|
+
mv 'tmp/cpdest', 'tmp/mvdest'
|
638
|
+
assert_same_file BIGFILE, 'tmp/mvdest'
|
639
|
+
assert_file_not_exist 'tmp/cpdest'
|
640
|
+
|
641
|
+
rm 'tmp/mvdest'
|
642
|
+
assert_file_not_exist 'tmp/mvdest'
|
643
|
+
end
|
644
|
+
|
645
|
+
def test_ln
|
646
|
+
TARGETS.each do |fname|
|
647
|
+
ln fname, 'tmp/lndest'
|
648
|
+
assert_same_file fname, 'tmp/lndest'
|
649
|
+
File.unlink 'tmp/lndest'
|
650
|
+
end
|
651
|
+
|
652
|
+
ln TARGETS, 'tmp'
|
653
|
+
TARGETS.each do |fname|
|
654
|
+
assert_same_file fname, 'tmp/' + File.basename(fname)
|
655
|
+
end
|
656
|
+
TARGETS.each do |fname|
|
657
|
+
File.unlink 'tmp/' + File.basename(fname)
|
658
|
+
end
|
659
|
+
|
660
|
+
# src==dest (1) same path
|
661
|
+
touch 'tmp/cptmp'
|
662
|
+
assert_raise(Errno::EEXIST) {
|
663
|
+
ln 'tmp/cptmp', 'tmp/cptmp'
|
664
|
+
}
|
665
|
+
end if have_hardlink?
|
666
|
+
|
667
|
+
def test_ln_symlink
|
668
|
+
touch 'tmp/cptmp'
|
669
|
+
# src==dest (2) symlink and its target
|
670
|
+
File.symlink 'cptmp', 'tmp/symlink'
|
671
|
+
assert_raise(Errno::EEXIST) {
|
672
|
+
ln 'tmp/cptmp', 'tmp/symlink' # normal file -> symlink
|
673
|
+
}
|
674
|
+
assert_raise(Errno::EEXIST) {
|
675
|
+
ln 'tmp/symlink', 'tmp/cptmp' # symlink -> normal file
|
676
|
+
}
|
677
|
+
# src==dest (3) looped symlink
|
678
|
+
File.symlink 'cptmp_symlink', 'tmp/cptmp_symlink'
|
679
|
+
begin
|
680
|
+
ln 'tmp/cptmp_symlink', 'tmp/cptmp_symlink'
|
681
|
+
rescue => err
|
682
|
+
assert_kind_of SystemCallError, err
|
683
|
+
end
|
684
|
+
end if have_symlink?
|
685
|
+
|
686
|
+
def test_ln_pathname
|
687
|
+
# pathname
|
688
|
+
touch 'tmp/lntmp'
|
689
|
+
assert_nothing_raised {
|
690
|
+
ln Pathname.new('tmp/lntmp'), 'tmp/lndesttmp1'
|
691
|
+
ln 'tmp/lntmp', Pathname.new('tmp/lndesttmp2')
|
692
|
+
ln Pathname.new('tmp/lntmp'), Pathname.new('tmp/lndesttmp3')
|
693
|
+
}
|
694
|
+
end if have_hardlink?
|
695
|
+
|
696
|
+
def test_ln_s
|
697
|
+
check_singleton :ln_s
|
698
|
+
|
699
|
+
TARGETS.each do |fname|
|
700
|
+
ln_s fname, 'tmp/lnsdest'
|
701
|
+
assert FileTest.symlink?('tmp/lnsdest'), 'not symlink'
|
702
|
+
assert_equal fname, File.readlink('tmp/lnsdest')
|
703
|
+
rm_f 'tmp/lnsdest'
|
704
|
+
end
|
705
|
+
assert_nothing_raised {
|
706
|
+
ln_s 'symlink', 'tmp/symlink'
|
707
|
+
}
|
708
|
+
assert_symlink 'tmp/symlink'
|
709
|
+
|
710
|
+
# pathname
|
711
|
+
touch 'tmp/lnsdest'
|
712
|
+
assert_nothing_raised {
|
713
|
+
ln_s Pathname.new('lnsdest'), 'tmp/symlink_tmp1'
|
714
|
+
ln_s 'lnsdest', Pathname.new('tmp/symlink_tmp2')
|
715
|
+
ln_s Pathname.new('lnsdest'), Pathname.new('tmp/symlink_tmp3')
|
716
|
+
}
|
717
|
+
end if have_symlink?
|
718
|
+
|
719
|
+
def test_ln_sf
|
720
|
+
check_singleton :ln_sf
|
721
|
+
|
722
|
+
TARGETS.each do |fname|
|
723
|
+
ln_sf fname, 'tmp/lnsdest'
|
724
|
+
assert FileTest.symlink?('tmp/lnsdest'), 'not symlink'
|
725
|
+
assert_equal fname, File.readlink('tmp/lnsdest')
|
726
|
+
ln_sf fname, 'tmp/lnsdest'
|
727
|
+
ln_sf fname, 'tmp/lnsdest'
|
728
|
+
end
|
729
|
+
assert_nothing_raised {
|
730
|
+
ln_sf 'symlink', 'tmp/symlink'
|
731
|
+
}
|
732
|
+
|
733
|
+
# pathname
|
734
|
+
touch 'tmp/lns_dest'
|
735
|
+
assert_nothing_raised {
|
736
|
+
ln_sf Pathname.new('lns_dest'), 'tmp/symlink_tmp1'
|
737
|
+
ln_sf 'lns_dest', Pathname.new('tmp/symlink_tmp2')
|
738
|
+
ln_sf Pathname.new('lns_dest'), Pathname.new('tmp/symlink_tmp3')
|
739
|
+
}
|
740
|
+
end if have_symlink?
|
741
|
+
|
742
|
+
def test_mkdir
|
743
|
+
check_singleton :mkdir
|
744
|
+
|
745
|
+
my_rm_rf 'tmpdatadir'
|
746
|
+
mkdir 'tmpdatadir'
|
747
|
+
assert_directory 'tmpdatadir'
|
748
|
+
Dir.rmdir 'tmpdatadir'
|
749
|
+
|
750
|
+
mkdir 'tmpdatadir/'
|
751
|
+
assert_directory 'tmpdatadir'
|
752
|
+
Dir.rmdir 'tmpdatadir'
|
753
|
+
|
754
|
+
mkdir 'tmp/mkdirdest'
|
755
|
+
assert_directory 'tmp/mkdirdest'
|
756
|
+
Dir.rmdir 'tmp/mkdirdest'
|
757
|
+
|
758
|
+
mkdir 'tmp/tmp', :mode => 0700
|
759
|
+
assert_directory 'tmp/tmp'
|
760
|
+
assert_equal 0700, (File.stat('tmp/tmp').mode & 0777) if have_file_perm?
|
761
|
+
Dir.rmdir 'tmp/tmp'
|
762
|
+
end
|
763
|
+
|
764
|
+
def test_mkdir_file_perm
|
765
|
+
mkdir 'tmp/tmp', :mode => 07777
|
766
|
+
assert_directory 'tmp/tmp'
|
767
|
+
assert_equal 07777, (File.stat('tmp/tmp').mode & 07777)
|
768
|
+
Dir.rmdir 'tmp/tmp'
|
769
|
+
end if have_file_perm?
|
770
|
+
|
771
|
+
def test_mkdir_lf_in_path
|
772
|
+
mkdir "tmp-first-line\ntmp-second-line"
|
773
|
+
assert_directory "tmp-first-line\ntmp-second-line"
|
774
|
+
Dir.rmdir "tmp-first-line\ntmp-second-line"
|
775
|
+
end if lf_in_path_allowed?
|
776
|
+
|
777
|
+
def test_mkdir_pathname
|
778
|
+
# pathname
|
779
|
+
assert_nothing_raised {
|
780
|
+
mkdir Pathname.new('tmp/tmpdirtmp')
|
781
|
+
mkdir [Pathname.new('tmp/tmpdirtmp2'), Pathname.new('tmp/tmpdirtmp3')]
|
782
|
+
}
|
783
|
+
end
|
784
|
+
|
785
|
+
def test_mkdir_p
|
786
|
+
check_singleton :mkdir_p
|
787
|
+
|
788
|
+
dirs = %w(
|
789
|
+
tmpdir/dir/
|
790
|
+
tmpdir/dir/./
|
791
|
+
tmpdir/dir/./.././dir/
|
792
|
+
tmpdir/a
|
793
|
+
tmpdir/a/
|
794
|
+
tmpdir/a/b
|
795
|
+
tmpdir/a/b/
|
796
|
+
tmpdir/a/b/c/
|
797
|
+
tmpdir/a/b/c
|
798
|
+
tmpdir/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
|
799
|
+
tmpdir/a/a
|
800
|
+
)
|
801
|
+
my_rm_rf 'tmpdir'
|
802
|
+
dirs.each do |d|
|
803
|
+
mkdir_p d
|
804
|
+
assert_directory d
|
805
|
+
assert_file_not_exist "#{d}/a"
|
806
|
+
assert_file_not_exist "#{d}/b"
|
807
|
+
assert_file_not_exist "#{d}/c"
|
808
|
+
my_rm_rf 'tmpdir'
|
809
|
+
end
|
810
|
+
dirs.each do |d|
|
811
|
+
mkdir_p d
|
812
|
+
assert_directory d
|
813
|
+
end
|
814
|
+
rm_rf 'tmpdir'
|
815
|
+
dirs.each do |d|
|
816
|
+
mkdir_p "#{Dir.pwd}/#{d}"
|
817
|
+
assert_directory d
|
818
|
+
end
|
819
|
+
rm_rf 'tmpdir'
|
820
|
+
|
821
|
+
mkdir_p 'tmp/tmp/tmp', :mode => 0700
|
822
|
+
assert_directory 'tmp/tmp'
|
823
|
+
assert_directory 'tmp/tmp/tmp'
|
824
|
+
assert_equal 0700, (File.stat('tmp/tmp').mode & 0777) if have_file_perm?
|
825
|
+
assert_equal 0700, (File.stat('tmp/tmp/tmp').mode & 0777) if have_file_perm?
|
826
|
+
rm_rf 'tmp/tmp'
|
827
|
+
|
828
|
+
mkdir_p 'tmp/tmp', :mode => 0
|
829
|
+
assert_directory 'tmp/tmp'
|
830
|
+
assert_equal 0, (File.stat('tmp/tmp').mode & 0777) if have_file_perm?
|
831
|
+
# DO NOT USE rm_rf here.
|
832
|
+
# (rm(1) try to chdir to parent directory, it fails to remove directory.)
|
833
|
+
Dir.rmdir 'tmp/tmp'
|
834
|
+
Dir.rmdir 'tmp'
|
835
|
+
end
|
836
|
+
|
837
|
+
def test_mkdir_p_file_perm
|
838
|
+
mkdir_p 'tmp/tmp/tmp', :mode => 07777
|
839
|
+
assert_directory 'tmp/tmp/tmp'
|
840
|
+
assert_equal 07777, (File.stat('tmp/tmp/tmp').mode & 07777)
|
841
|
+
Dir.rmdir 'tmp/tmp/tmp'
|
842
|
+
Dir.rmdir 'tmp/tmp'
|
843
|
+
end if have_file_perm?
|
844
|
+
|
845
|
+
def test_mkdir_p_pathname
|
846
|
+
# pathname
|
847
|
+
assert_nothing_raised {
|
848
|
+
mkdir_p Pathname.new('tmp/tmp/tmp')
|
849
|
+
}
|
850
|
+
end
|
851
|
+
|
852
|
+
def test_install
|
853
|
+
check_singleton :install
|
854
|
+
|
855
|
+
File.open('tmp/aaa', 'w') {|f| f.puts 'aaa' }
|
856
|
+
File.open('tmp/bbb', 'w') {|f| f.puts 'bbb' }
|
857
|
+
install 'tmp/aaa', 'tmp/bbb', :mode => 0600
|
858
|
+
assert_equal "aaa\n", File.read('tmp/bbb')
|
859
|
+
assert_equal 0600, (File.stat('tmp/bbb').mode & 0777) if have_file_perm?
|
860
|
+
|
861
|
+
t = File.mtime('tmp/bbb')
|
862
|
+
install 'tmp/aaa', 'tmp/bbb'
|
863
|
+
assert_equal "aaa\n", File.read('tmp/bbb')
|
864
|
+
assert_equal 0600, (File.stat('tmp/bbb').mode & 0777) if have_file_perm?
|
865
|
+
assert_equal_time t, File.mtime('tmp/bbb')
|
866
|
+
|
867
|
+
File.unlink 'tmp/aaa'
|
868
|
+
File.unlink 'tmp/bbb'
|
869
|
+
|
870
|
+
# src==dest (1) same path
|
871
|
+
touch 'tmp/cptmp'
|
872
|
+
assert_raise(ArgumentError) {
|
873
|
+
install 'tmp/cptmp', 'tmp/cptmp'
|
874
|
+
}
|
875
|
+
end
|
876
|
+
|
877
|
+
def test_install_symlink
|
878
|
+
touch 'tmp/cptmp'
|
879
|
+
# src==dest (2) symlink and its target
|
880
|
+
File.symlink 'cptmp', 'tmp/cptmp_symlink'
|
881
|
+
assert_raise(ArgumentError) {
|
882
|
+
install 'tmp/cptmp', 'tmp/cptmp_symlink'
|
883
|
+
}
|
884
|
+
assert_raise(ArgumentError) {
|
885
|
+
install 'tmp/cptmp_symlink', 'tmp/cptmp'
|
886
|
+
}
|
887
|
+
# src==dest (3) looped symlink
|
888
|
+
File.symlink 'symlink', 'tmp/symlink'
|
889
|
+
assert_raise(Errno::ELOOP) {
|
890
|
+
# File#install invokes open(2), always ELOOP must be raised
|
891
|
+
install 'tmp/symlink', 'tmp/symlink'
|
892
|
+
}
|
893
|
+
end if have_symlink?
|
894
|
+
|
895
|
+
def test_install_pathname
|
896
|
+
# pathname
|
897
|
+
assert_nothing_raised {
|
898
|
+
rm_f 'tmp/a'; touch 'tmp/a'
|
899
|
+
install 'tmp/a', Pathname.new('tmp/b')
|
900
|
+
rm_f 'tmp/a'; touch 'tmp/a'
|
901
|
+
install Pathname.new('tmp/a'), 'tmp/b'
|
902
|
+
rm_f 'tmp/a'; touch 'tmp/a'
|
903
|
+
install Pathname.new('tmp/a'), Pathname.new('tmp/b')
|
904
|
+
rm_f 'tmp/a'
|
905
|
+
touch 'tmp/a'
|
906
|
+
touch 'tmp/b'
|
907
|
+
mkdir 'tmp/dest'
|
908
|
+
install [Pathname.new('tmp/a'), Pathname.new('tmp/b')], 'tmp/dest'
|
909
|
+
my_rm_rf 'tmp/dest'
|
910
|
+
mkdir 'tmp/dest'
|
911
|
+
install [Pathname.new('tmp/a'), Pathname.new('tmp/b')], Pathname.new('tmp/dest')
|
912
|
+
}
|
913
|
+
end
|
914
|
+
|
915
|
+
def test_chmod
|
916
|
+
check_singleton :chmod
|
917
|
+
|
918
|
+
touch 'tmp/a'
|
919
|
+
chmod 0700, 'tmp/a'
|
920
|
+
assert_equal 0700, File.stat('tmp/a').mode & 0777
|
921
|
+
chmod 0500, 'tmp/a'
|
922
|
+
assert_equal 0500, File.stat('tmp/a').mode & 0777
|
923
|
+
end if have_file_perm?
|
924
|
+
|
925
|
+
def test_chmod_symbol_mode
|
926
|
+
check_singleton :chmod
|
927
|
+
|
928
|
+
touch 'tmp/a'
|
929
|
+
chmod "u=wrx,g=,o=", 'tmp/a'
|
930
|
+
assert_equal 0700, File.stat('tmp/a').mode & 0777
|
931
|
+
chmod "u=rx,go=", 'tmp/a'
|
932
|
+
assert_equal 0500, File.stat('tmp/a').mode & 0777
|
933
|
+
chmod "+wrx", 'tmp/a'
|
934
|
+
assert_equal 0777, File.stat('tmp/a').mode & 0777
|
935
|
+
chmod "u+s,o=s", 'tmp/a'
|
936
|
+
assert_equal 04770, File.stat('tmp/a').mode & 07777
|
937
|
+
chmod "u-w,go-wrx", 'tmp/a'
|
938
|
+
assert_equal 04500, File.stat('tmp/a').mode & 07777
|
939
|
+
chmod "+s", 'tmp/a'
|
940
|
+
assert_equal 06500, File.stat('tmp/a').mode & 07777
|
941
|
+
|
942
|
+
# FreeBSD ufs and tmpfs don't allow to change sticky bit against
|
943
|
+
# regular file. It's slightly strange. Anyway it's no effect bit.
|
944
|
+
# see /usr/src/sys/ufs/ufs/ufs_chmod()
|
945
|
+
# NetBSD, OpenBSD and Solaris also denies it.
|
946
|
+
if /freebsd|netbsd|openbsd|solaris/ !~ RUBY_PLATFORM
|
947
|
+
chmod "u+t,o+t", 'tmp/a'
|
948
|
+
assert_equal 07500, File.stat('tmp/a').mode & 07777
|
949
|
+
chmod "a-t,a-s", 'tmp/a'
|
950
|
+
assert_equal 0500, File.stat('tmp/a').mode & 07777
|
951
|
+
end
|
952
|
+
|
953
|
+
end if have_file_perm?
|
954
|
+
|
955
|
+
|
956
|
+
def test_chmod_R
|
957
|
+
check_singleton :chmod_R
|
958
|
+
|
959
|
+
mkdir_p 'tmp/dir/dir'
|
960
|
+
touch %w( tmp/dir/file tmp/dir/dir/file )
|
961
|
+
chmod_R 0700, 'tmp/dir'
|
962
|
+
assert_equal 0700, File.stat('tmp/dir').mode & 0777
|
963
|
+
assert_equal 0700, File.stat('tmp/dir/file').mode & 0777
|
964
|
+
assert_equal 0700, File.stat('tmp/dir/dir').mode & 0777
|
965
|
+
assert_equal 0700, File.stat('tmp/dir/dir/file').mode & 0777
|
966
|
+
chmod_R 0500, 'tmp/dir'
|
967
|
+
assert_equal 0500, File.stat('tmp/dir').mode & 0777
|
968
|
+
assert_equal 0500, File.stat('tmp/dir/file').mode & 0777
|
969
|
+
assert_equal 0500, File.stat('tmp/dir/dir').mode & 0777
|
970
|
+
assert_equal 0500, File.stat('tmp/dir/dir/file').mode & 0777
|
971
|
+
chmod_R 0700, 'tmp/dir' # to remove
|
972
|
+
end if have_file_perm?
|
973
|
+
|
974
|
+
def test_chmod_symbol_mode_R
|
975
|
+
check_singleton :chmod_R
|
976
|
+
|
977
|
+
mkdir_p 'tmp/dir/dir'
|
978
|
+
touch %w( tmp/dir/file tmp/dir/dir/file )
|
979
|
+
chmod_R "u=wrx,g=,o=", 'tmp/dir'
|
980
|
+
assert_equal 0700, File.stat('tmp/dir').mode & 0777
|
981
|
+
assert_equal 0700, File.stat('tmp/dir/file').mode & 0777
|
982
|
+
assert_equal 0700, File.stat('tmp/dir/dir').mode & 0777
|
983
|
+
assert_equal 0700, File.stat('tmp/dir/dir/file').mode & 0777
|
984
|
+
chmod_R "u=xr,g+X,o=", 'tmp/dir'
|
985
|
+
assert_equal 0510, File.stat('tmp/dir').mode & 0777
|
986
|
+
assert_equal 0500, File.stat('tmp/dir/file').mode & 0777
|
987
|
+
assert_equal 0510, File.stat('tmp/dir/dir').mode & 0777
|
988
|
+
assert_equal 0500, File.stat('tmp/dir/dir/file').mode & 0777
|
989
|
+
chmod_R 0700, 'tmp/dir' # to remove
|
990
|
+
end if have_file_perm?
|
991
|
+
|
992
|
+
def test_chmod_verbose
|
993
|
+
check_singleton :chmod
|
994
|
+
|
995
|
+
r, w = IO.pipe
|
996
|
+
stderr_back = $stderr
|
997
|
+
read, $stderr = IO.pipe
|
998
|
+
th = Thread.new { read.read }
|
999
|
+
|
1000
|
+
touch 'tmp/a'
|
1001
|
+
chmod 0700, 'tmp/a', :verbose => true
|
1002
|
+
assert_equal 0700, File.stat('tmp/a').mode & 0777
|
1003
|
+
chmod 0500, 'tmp/a', :verbose => true
|
1004
|
+
assert_equal 0500, File.stat('tmp/a').mode & 0777
|
1005
|
+
|
1006
|
+
$stderr.close
|
1007
|
+
lines = th.value.lines.map {|l| l.chomp }
|
1008
|
+
assert_equal(["chmod 700 tmp/a", "chmod 500 tmp/a"], lines)
|
1009
|
+
ensure
|
1010
|
+
$stderr = stderr_back if stderr_back
|
1011
|
+
end if have_file_perm?
|
1012
|
+
|
1013
|
+
# FIXME: How can I test this method?
|
1014
|
+
def test_chown
|
1015
|
+
check_singleton :chown
|
1016
|
+
end if have_file_perm?
|
1017
|
+
|
1018
|
+
# FIXME: How can I test this method?
|
1019
|
+
def test_chown_R
|
1020
|
+
check_singleton :chown_R
|
1021
|
+
end if have_file_perm?
|
1022
|
+
|
1023
|
+
def test_copy_entry
|
1024
|
+
check_singleton :copy_entry
|
1025
|
+
|
1026
|
+
each_srcdest do |srcpath, destpath|
|
1027
|
+
copy_entry srcpath, destpath
|
1028
|
+
assert_same_file srcpath, destpath
|
1029
|
+
assert_equal File.stat(srcpath).ftype, File.stat(destpath).ftype
|
1030
|
+
end
|
1031
|
+
end
|
1032
|
+
|
1033
|
+
def test_copy_entry_symlink
|
1034
|
+
# root is a symlink
|
1035
|
+
File.symlink 'somewhere', 'tmp/symsrc'
|
1036
|
+
copy_entry 'tmp/symsrc', 'tmp/symdest'
|
1037
|
+
assert_symlink 'tmp/symdest'
|
1038
|
+
assert_equal 'somewhere', File.readlink('tmp/symdest')
|
1039
|
+
|
1040
|
+
# content is a symlink
|
1041
|
+
mkdir 'tmp/dir'
|
1042
|
+
File.symlink 'somewhere', 'tmp/dir/sym'
|
1043
|
+
copy_entry 'tmp/dir', 'tmp/dirdest'
|
1044
|
+
assert_directory 'tmp/dirdest'
|
1045
|
+
assert_not_symlink 'tmp/dirdest'
|
1046
|
+
assert_symlink 'tmp/dirdest/sym'
|
1047
|
+
assert_equal 'somewhere', File.readlink('tmp/dirdest/sym')
|
1048
|
+
end if have_symlink?
|
1049
|
+
|
1050
|
+
def test_copy_file
|
1051
|
+
check_singleton :copy_file
|
1052
|
+
|
1053
|
+
each_srcdest do |srcpath, destpath|
|
1054
|
+
copy_file srcpath, destpath
|
1055
|
+
assert_same_file srcpath, destpath
|
1056
|
+
end
|
1057
|
+
end
|
1058
|
+
|
1059
|
+
def test_copy_stream
|
1060
|
+
check_singleton :copy_stream
|
1061
|
+
# IO
|
1062
|
+
each_srcdest do |srcpath, destpath|
|
1063
|
+
File.open(srcpath, 'rb') {|src|
|
1064
|
+
File.open(destpath, 'wb') {|dest|
|
1065
|
+
copy_stream src, dest
|
1066
|
+
}
|
1067
|
+
}
|
1068
|
+
assert_same_file srcpath, destpath
|
1069
|
+
end
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
def test_copy_stream_duck
|
1073
|
+
check_singleton :copy_stream
|
1074
|
+
# duck typing test [ruby-dev:25369]
|
1075
|
+
each_srcdest do |srcpath, destpath|
|
1076
|
+
File.open(srcpath, 'rb') {|src|
|
1077
|
+
File.open(destpath, 'wb') {|dest|
|
1078
|
+
copy_stream Stream.new(src), Stream.new(dest)
|
1079
|
+
}
|
1080
|
+
}
|
1081
|
+
assert_same_file srcpath, destpath
|
1082
|
+
end
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
def test_remove_file
|
1086
|
+
check_singleton :remove_file
|
1087
|
+
File.open('data/tmp', 'w') {|f| f.puts 'dummy' }
|
1088
|
+
remove_file 'data/tmp'
|
1089
|
+
assert_file_not_exist 'data/tmp'
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
def test_remove_file_file_perm
|
1093
|
+
File.open('data/tmp', 'w') {|f| f.puts 'dummy' }
|
1094
|
+
File.chmod 0, 'data/tmp'
|
1095
|
+
remove_file 'data/tmp'
|
1096
|
+
assert_file_not_exist 'data/tmp'
|
1097
|
+
end if have_file_perm?
|
1098
|
+
|
1099
|
+
def test_remove_dir
|
1100
|
+
check_singleton :remove_dir
|
1101
|
+
Dir.mkdir 'data/tmpdir'
|
1102
|
+
File.open('data/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
1103
|
+
remove_dir 'data/tmpdir'
|
1104
|
+
assert_file_not_exist 'data/tmpdir'
|
1105
|
+
end
|
1106
|
+
|
1107
|
+
def test_remove_dir_file_perm
|
1108
|
+
Dir.mkdir 'data/tmpdir'
|
1109
|
+
File.chmod 0555, 'data/tmpdir'
|
1110
|
+
remove_dir 'data/tmpdir'
|
1111
|
+
assert_file_not_exist 'data/tmpdir'
|
1112
|
+
end if have_file_perm?
|
1113
|
+
|
1114
|
+
def test_compare_file
|
1115
|
+
check_singleton :compare_file
|
1116
|
+
# FIXME
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
def test_compare_stream
|
1120
|
+
check_singleton :compare_stream
|
1121
|
+
# FIXME
|
1122
|
+
end
|
1123
|
+
|
1124
|
+
class Stream
|
1125
|
+
def initialize(f)
|
1126
|
+
@f = f
|
1127
|
+
end
|
1128
|
+
|
1129
|
+
def read(*args)
|
1130
|
+
@f.read(*args)
|
1131
|
+
end
|
1132
|
+
|
1133
|
+
def write(str)
|
1134
|
+
@f.write str
|
1135
|
+
end
|
1136
|
+
end
|
1137
|
+
|
1138
|
+
def test_uptodate?
|
1139
|
+
check_singleton :uptodate?
|
1140
|
+
prepare_time_data
|
1141
|
+
Dir.chdir('data') {
|
1142
|
+
assert( uptodate?('newest', %w(old newer notexist)) )
|
1143
|
+
assert( ! uptodate?('newer', %w(old newest notexist)) )
|
1144
|
+
assert( ! uptodate?('notexist', %w(old newest newer)) )
|
1145
|
+
}
|
1146
|
+
|
1147
|
+
# pathname
|
1148
|
+
touch 'tmp/a'
|
1149
|
+
touch 'tmp/b'
|
1150
|
+
touch 'tmp/c'
|
1151
|
+
assert_nothing_raised {
|
1152
|
+
uptodate? Pathname.new('tmp/a'), ['tmp/b', 'tmp/c']
|
1153
|
+
uptodate? 'tmp/a', [Pathname.new('tmp/b'), 'tmp/c']
|
1154
|
+
uptodate? 'tmp/a', ['tmp/b', Pathname.new('tmp/c')]
|
1155
|
+
uptodate? Pathname.new('tmp/a'), [Pathname.new('tmp/b'), Pathname.new('tmp/c')]
|
1156
|
+
}
|
1157
|
+
# [Bug #6708] [ruby-core:46256]
|
1158
|
+
assert_raises_with_message(ArgumentError, "wrong number of arguments (3 for 2)") {
|
1159
|
+
uptodate?('new',['old', 'oldest'], {})
|
1160
|
+
}
|
1161
|
+
end
|
1162
|
+
|
1163
|
+
def assert_raises_with_message(klass, message)
|
1164
|
+
begin
|
1165
|
+
yield
|
1166
|
+
flunk("Expected Exception #{klass} didn't raise")
|
1167
|
+
rescue klass => ex
|
1168
|
+
if message.kind_of? String
|
1169
|
+
flag = !!(ex.message == message)
|
1170
|
+
assert(flag, "Expected Exception(#{klass}) was raised, but the message doesn't match")
|
1171
|
+
elsif message.kind_of? Regexp
|
1172
|
+
flag = !!(ex.message =~ message)
|
1173
|
+
assert(flag, "Expected Exception(#{klass}) was raised, but the message doesn't match")
|
1174
|
+
else
|
1175
|
+
raise
|
1176
|
+
end
|
1177
|
+
end
|
1178
|
+
end
|
1179
|
+
private :assert_raises_with_message
|
1180
|
+
|
1181
|
+
def test_cd
|
1182
|
+
check_singleton :cd
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
def test_chdir
|
1186
|
+
check_singleton :chdir
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
def test_getwd
|
1190
|
+
check_singleton :getwd
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
def test_identical?
|
1194
|
+
check_singleton :identical?
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
def test_link
|
1198
|
+
check_singleton :link
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
def test_makedirs
|
1202
|
+
check_singleton :makedirs
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
def test_mkpath
|
1206
|
+
check_singleton :mkpath
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
def test_move
|
1210
|
+
check_singleton :move
|
1211
|
+
end
|
1212
|
+
|
1213
|
+
def test_rm_rf
|
1214
|
+
check_singleton :rm_rf
|
1215
|
+
end
|
1216
|
+
|
1217
|
+
def test_rmdir
|
1218
|
+
check_singleton :rmdir
|
1219
|
+
end
|
1220
|
+
|
1221
|
+
def test_rmtree
|
1222
|
+
check_singleton :rmtree
|
1223
|
+
end
|
1224
|
+
|
1225
|
+
def test_safe_unlink
|
1226
|
+
check_singleton :safe_unlink
|
1227
|
+
end
|
1228
|
+
|
1229
|
+
def test_symlink
|
1230
|
+
check_singleton :symlink
|
1231
|
+
end
|
1232
|
+
|
1233
|
+
def test_touch
|
1234
|
+
check_singleton :touch
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
def test_collect_methods
|
1238
|
+
end
|
1239
|
+
|
1240
|
+
def test_commands
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
def test_have_option?
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
def test_options
|
1247
|
+
end
|
1248
|
+
|
1249
|
+
def test_options_of
|
1250
|
+
end
|
1251
|
+
|
1252
|
+
end
|