file-find 0.4.4 → 0.5.1

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.
@@ -1,589 +0,0 @@
1
- ######################################################################
2
- # test_file_find.rb
3
- #
4
- # Test case for the File::Find package. You should run this via the
5
- # 'rake test' task.
6
- ######################################################################
7
- require 'test-unit'
8
- require 'fileutils'
9
- require 'file/find'
10
- require 'sys/admin'
11
- require 'tmpdir'
12
-
13
- if File::ALT_SEPARATOR
14
- require 'win32/file'
15
- require 'win32/security'
16
- end
17
-
18
- include FileUtils
19
-
20
- class TC_File_Find < Test::Unit::TestCase
21
- def self.startup
22
- Dir.chdir(File.dirname(File.expand_path(__FILE__)))
23
-
24
- @@windows = File::ALT_SEPARATOR
25
- @@jruby = RUBY_PLATFORM.match('java')
26
-
27
- if @@windows
28
- @@elevated = Win32::Security.elevated_security?
29
- if @@elevated
30
- @@loguser = Sys::Admin.get_group("Administrators", :LocalAccount => true)
31
- else
32
- @@loguser = Sys::Admin.get_user(Sys::Admin.get_login, :LocalAccount => true)
33
- end
34
- else
35
- @@loguser = Sys::Admin.get_user(Sys::Admin.get_login)
36
- @@logroup = Sys::Admin.get_group(@@loguser.gid)
37
- end
38
- end
39
-
40
- def setup
41
- @file_rb = 'test1.rb'
42
- @file_txt1 = 'test1.txt'
43
- @file_txt2 = 'foo.txt'
44
- @file_doc = 'foo.doc'
45
- @directory1 = 'dir1'
46
- @directory2 = 'dir2'
47
-
48
- File.open(@file_rb, 'w'){}
49
- File.open(@file_txt1, 'w'){}
50
- File.open(@file_txt2, 'w'){}
51
- File.open(@file_doc, 'w'){}
52
-
53
- @link1 = 'link1'
54
-
55
- if @@windows
56
- File.symlink(@file_rb, @link1) if @@elevated
57
- else
58
- File.symlink(@file_rb, @link1)
59
- end
60
-
61
- Dir.mkdir(@directory1) unless File.exist?(@directory1)
62
- Dir.mkdir(@directory2) unless File.exist?(@directory2)
63
-
64
- File.open(File.join(@directory1, 'bar.txt'), 'w'){}
65
- File.open(File.join(@directory2, 'baz.txt'), 'w'){}
66
-
67
- @rule1 = File::Find.new(:name => '*.txt')
68
- @rule2 = File::Find.new
69
- end
70
-
71
- test "version constant is set to expected value" do
72
- assert_equal('0.4.4', File::Find::VERSION)
73
- assert_true(File::Find::VERSION.frozen?)
74
- end
75
-
76
- test "path accessor basic functionality" do
77
- assert_respond_to(@rule1, :path)
78
- assert_respond_to(@rule1, :path=)
79
- end
80
-
81
- test "path method returns expected value" do
82
- assert_equal(Dir.pwd, @rule1.path)
83
- end
84
-
85
- test "options accessor basic functionality" do
86
- assert_respond_to(@rule1, :options)
87
- assert_respond_to(@rule1, :options=)
88
- end
89
-
90
- test "options method returns expected value" do
91
- assert_equal({:name => '*.txt'}, @rule1.options)
92
- end
93
-
94
- test "atime accessor basic functionality" do
95
- assert_respond_to(@rule1, :atime)
96
- assert_respond_to(@rule1, :atime=)
97
- end
98
-
99
- test "atime method returns expected default value" do
100
- assert_nil(@rule1.atime)
101
- end
102
-
103
- test "find with atime option works as expected" do
104
- rule1 = File::Find.new(:name => "*.rb", :atime => 0)
105
- rule2 = File::Find.new(:name => "*.rb", :atime => 1)
106
-
107
- assert_false(rule1.find.empty?)
108
- assert_true(rule2.find.empty?)
109
- end
110
-
111
- test "ctime accessor basic functionality" do
112
- assert_respond_to(@rule1, :ctime)
113
- assert_respond_to(@rule1, :ctime=)
114
- end
115
-
116
- test "ctime method returns expected default value" do
117
- assert_nil(@rule1.ctime)
118
- end
119
-
120
- test "find with ctime option works as expected" do
121
- rule1 = File::Find.new(:name => "*.rb", :ctime => 0)
122
- rule2 = File::Find.new(:name => "*.rb", :ctime => 1)
123
-
124
- assert_false(rule1.find.empty?)
125
- assert_true(rule2.find.empty?)
126
- end
127
-
128
- test "find method basic functionality" do
129
- assert_respond_to(@rule1, :find)
130
- assert_nothing_raised{ @rule1.find }
131
- end
132
-
133
- test "find method returns expected value" do
134
- assert_kind_of(Array, @rule1.find)
135
- assert_nil(@rule1.find{})
136
- end
137
-
138
- test "filetest accessor basic functionality" do
139
- assert_respond_to(@rule1, :filetest)
140
- assert_respond_to(@rule1, :filetest=)
141
- assert_nothing_raised{ @rule1.filetest }
142
- end
143
-
144
- test "filetest method returns expected value" do
145
- assert_kind_of(Array, @rule1.filetest)
146
- end
147
-
148
- test "valid filetest options work as expected" do
149
- assert_nothing_raised{ File::Find.new(:readable? => true) }
150
- assert_nothing_raised{ File::Find.new(:writable? => true) }
151
- end
152
-
153
- test "find method works with filetest option" do
154
- rule = File::Find.new(:name => "*.doc", :writable? => true)
155
- File.chmod(0644, @file_doc)
156
-
157
- assert_equal([@file_doc], rule.find.map{ |f| File.basename(f) })
158
-
159
- File.chmod(0444, @file_doc)
160
-
161
- assert_equal([], rule.find)
162
- end
163
-
164
- test "mtime accessor basic functionality" do
165
- assert_respond_to(@rule1, :mtime)
166
- assert_respond_to(@rule1, :mtime=)
167
- end
168
-
169
- test "mtime method returns expected default value" do
170
- assert_nil(@rule1.mtime)
171
- end
172
-
173
- test "find with mtime option works as expected" do
174
- rule1 = File::Find.new(:name => "*.rb", :mtime => 0)
175
- rule2 = File::Find.new(:name => "*.rb", :mtime => 1)
176
-
177
- assert_false(rule1.find.empty?)
178
- assert_true(rule2.find.empty?)
179
- end
180
-
181
- test "ftype accessor basic functionality" do
182
- assert_respond_to(@rule1, :ftype)
183
- assert_respond_to(@rule1, :ftype=)
184
- end
185
-
186
- test "ftype method returns expected default value" do
187
- assert_nil(@rule1.ftype)
188
- end
189
-
190
- test "ftype method works as expected" do
191
- rule1 = File::Find.new(:name => "*.rb", :ftype => "file")
192
- rule2 = File::Find.new(:name => "*.rb", :ftype => "characterSpecial")
193
-
194
- assert_false(rule1.find.empty?)
195
- assert_true(rule2.find.empty?)
196
- end
197
-
198
- test "group accessor basic functionality" do
199
- assert_respond_to(@rule1, :group)
200
- assert_respond_to(@rule1, :group=)
201
- end
202
-
203
- test "group method returns expected default value" do
204
- assert_nil(@rule1.group)
205
- end
206
-
207
- # TODO: Update test for Windows
208
- test "find with numeric group id works as expected" do
209
- omit_if(@@windows, 'group test skipped on MS Windows')
210
- @rule1 = File::Find.new(:name => '*.doc', :group => @@loguser.gid)
211
- assert_equal([File.expand_path(@file_doc)], @rule1.find)
212
- end
213
-
214
- # TODO: Update test for Windows
215
- test "find with string group id works as expected" do
216
- omit_if(@@windows, 'group test skipped on MS Windows')
217
- @rule1 = File::Find.new(:name => '*.doc', :group => @@logroup.name)
218
- assert_equal([File.expand_path(@file_doc)], @rule1.find)
219
- end
220
-
221
- test "find with bogus group returns empty results" do
222
- omit_if(@@windows, 'group test skipped on MS Windows')
223
- @rule1 = File::Find.new(:name => '*.doc', :group => 'totallybogus')
224
- @rule2 = File::Find.new(:name => '*.doc', :group => 99999999)
225
- assert_equal([], @rule1.find)
226
- assert_equal([], @rule2.find)
227
- end
228
-
229
- test "inum accessor basic functionality" do
230
- assert_respond_to(@rule1, :inum)
231
- assert_respond_to(@rule1, :inum=)
232
- end
233
-
234
- test "inum method returns expected default value" do
235
- assert_nil(@rule1.inum)
236
- end
237
-
238
- test "follow accessor basic functionality" do
239
- assert_respond_to(@rule1, :follow)
240
- assert_respond_to(@rule1, :follow=)
241
- end
242
-
243
- test "follow method returns expected default value" do
244
- assert_true(@rule1.follow)
245
- end
246
-
247
- test "links accessor basic functionality" do
248
- assert_respond_to(@rule1, :links)
249
- assert_respond_to(@rule1, :links=)
250
- end
251
-
252
- test "links method returns expected default value" do
253
- assert_nil(@rule1.links)
254
- end
255
-
256
- test "links method returns expected result" do
257
- omit_if(@@windows && !@@elevated)
258
- @rule1 = File::Find.new(:name => '*.rb', :links => 2)
259
- @rule2 = File::Find.new(:name => '*.doc', :links => 1)
260
-
261
- assert_equal([], @rule1.find)
262
- assert_equal([File.expand_path(@file_doc)], @rule2.find)
263
- end
264
-
265
- def test_maxdepth_basic
266
- assert_respond_to(@rule1, :maxdepth)
267
- assert_respond_to(@rule1, :maxdepth=)
268
- assert_nil(@rule1.maxdepth)
269
- end
270
-
271
- # This test is a little uglier because we actually check to make sure
272
- # we're looking at the right subdir, not just a filename shows up.
273
- # I did this because I'm a little paranoid about the directory
274
- # not getting mangled. - jlawler.
275
- #
276
- test "find method works on dirs that contain brackets" do
277
- omit_if(@@windows, 'dirs with brackets test skipped on MS Windows')
278
-
279
- bracket_files = [ 'bracket/a[1]/a.foo', 'bracket/a [2] /b.foo', 'bracket/[a] b [c]/d.foo' ].sort
280
- bracket_paths = [ 'bracket/a[1]', 'bracket/a [2] ', 'bracket/[a] b [c]', 'bracket/[z] x' ].sort
281
-
282
- bracket_paths.each{ |e| mkpath(e) }
283
- bracket_files.each{ |e| touch(e) }
284
-
285
- @file_rule = File::Find.new(
286
- :ftype => 'file',
287
- :path => ['bracket']
288
- )
289
-
290
- @dir_rule = File::Find.new(
291
- :path => ['bracket'],
292
- :ftype => 'directory'
293
- )
294
-
295
- file_results = @file_rule.find.sort
296
-
297
- assert_equal(bracket_files.size,file_results.size)
298
- path = file_results.first.chomp(bracket_files.first)
299
-
300
- # Confirm the first thing in results is the first thing in bracket_paths
301
- assert_not_equal(path, file_results.first)
302
- assert_equal(bracket_files, file_results.map{ |e| e.sub(path,'') }.sort )
303
- assert_equal(bracket_paths, @dir_rule.find.sort )
304
- end
305
-
306
- test "find with maxdepth option returns expected results" do
307
- mkpath('a1/a2/a3')
308
- touch('a1/a.foo')
309
- touch('a1/a2/b.foo')
310
- touch('a1/a2/c.foo')
311
- touch('a1/a2/a3/d.foo')
312
- touch('a1/a2/a3/e.foo')
313
- touch('a1/a2/a3/f.foo')
314
-
315
- @rule2.pattern = "*.foo"
316
- @rule2.maxdepth = 1
317
- assert_equal([], @rule2.find)
318
-
319
- @rule2.maxdepth = 2
320
- assert_equal(['a.foo'], @rule2.find.map{ |e| File.basename(e) })
321
-
322
- @rule2.maxdepth = 3
323
- assert_equal(['a.foo', 'b.foo', 'c.foo'], @rule2.find.map{ |e| File.basename(e) }.sort)
324
-
325
- @rule2.maxdepth = nil
326
- assert_equal(
327
- ['a.foo', 'b.foo', 'c.foo', 'd.foo', 'e.foo', 'f.foo'],
328
- @rule2.find.map{ |e| File.basename(e) }.sort
329
- )
330
- end
331
-
332
- test "find with maxdepth option returns expected results for directories" do
333
- mkpath('a/b/c')
334
- @rule2.pattern = "c"
335
-
336
- @rule2.maxdepth = 1
337
- assert_equal([], @rule2.find)
338
-
339
- @rule2.maxdepth = 2
340
- assert_equal([], @rule2.find)
341
-
342
- @rule2.maxdepth = 3
343
- assert_equal(['c'], @rule2.find.map{ |e| File.basename(e) })
344
- end
345
-
346
- test "mindepth accessor basic functionality" do
347
- assert_respond_to(@rule1, :mindepth)
348
- assert_respond_to(@rule1, :mindepth=)
349
- end
350
-
351
- test "mindepth method returns expected default value" do
352
- assert_nil(@rule1.mindepth)
353
- end
354
-
355
- test "find with mindepth option returns expected results" do
356
- mkpath('a1/a2/a3')
357
- touch('z.min')
358
- touch('a1/a.min')
359
- touch('a1/a2/b.min')
360
- touch('a1/a2/c.min')
361
- touch('a1/a2/a3/d.min')
362
- touch('a1/a2/a3/e.min')
363
- touch('a1/a2/a3/f.min')
364
-
365
- @rule2.pattern = "*.min"
366
-
367
- @rule2.mindepth = 0
368
- assert_equal(
369
- ['a.min', 'b.min', 'c.min', 'd.min', 'e.min', 'f.min', 'z.min'],
370
- @rule2.find.map{ |e| File.basename(e) }.sort
371
- )
372
-
373
- @rule2.mindepth = 1
374
- assert_equal(
375
- ['a.min', 'b.min', 'c.min', 'd.min', 'e.min', 'f.min', 'z.min'],
376
- @rule2.find.map{ |e| File.basename(e) }.sort
377
- )
378
-
379
- @rule2.mindepth = 2
380
- assert_equal(
381
- ['a.min', 'b.min', 'c.min', 'd.min', 'e.min', 'f.min'],
382
- @rule2.find.map{ |e| File.basename(e) }.sort
383
- )
384
-
385
- @rule2.mindepth = 3
386
- assert_equal(
387
- ['b.min', 'c.min', 'd.min', 'e.min', 'f.min'],
388
- @rule2.find.map{ |e| File.basename(e) }.sort
389
- )
390
-
391
- @rule2.mindepth = 4
392
- assert_equal(['d.min', 'e.min', 'f.min'], @rule2.find.map{ |e| File.basename(e) }.sort)
393
-
394
- @rule2.mindepth = 5
395
- assert_equal([], @rule2.find.map{ |e| File.basename(e) })
396
- end
397
-
398
- test "find with mindepth option returns expected results for directories" do
399
- mkpath('a/b/c')
400
- @rule2.pattern = "a"
401
-
402
- @rule2.mindepth = 1
403
- assert_equal(['a'], @rule2.find.map{ |e| File.basename(e) })
404
-
405
- @rule2.mindepth = 2
406
- assert_equal([], @rule2.find)
407
-
408
- @rule2.mindepth = 3
409
- assert_equal([], @rule2.find)
410
- end
411
-
412
- test "mount accessor basic functionality" do
413
- assert_respond_to(@rule1, :mount)
414
- assert_respond_to(@rule1, :mount=)
415
- end
416
-
417
- test "mount method returns expected default value" do
418
- assert_nil(@rule1.mount)
419
- end
420
-
421
- test "name accessor basic functionality" do
422
- assert_respond_to(@rule1, :name)
423
- assert_respond_to(@rule1, :name=)
424
- end
425
-
426
- test "name method returns expected default value" do
427
- assert_equal('*.txt', @rule1.name)
428
- end
429
-
430
- test "pattern accessor basic functionality" do
431
- assert_respond_to(@rule1, :pattern)
432
- assert_respond_to(@rule1, :pattern=)
433
- end
434
-
435
- test "pattern is an alias for name" do
436
- assert_alias_method(@rule1, :name, :pattern)
437
- assert_alias_method(@rule1, :name=, :pattern=)
438
- end
439
-
440
- test "perm accessor basic functionality" do
441
- assert_respond_to(@rule1, :perm)
442
- assert_respond_to(@rule1, :perm=)
443
- end
444
-
445
- test "perm method returns expected default value" do
446
- assert_nil(@rule1.perm)
447
- end
448
-
449
- test "perm method returns expected results" do
450
- File.chmod(0444, @file_rb)
451
- File.chmod(0644, @file_txt1)
452
-
453
- results = File::Find.new(:name => "test1*", :perm => 0644).find
454
-
455
- assert_equal(1, results.length)
456
- assert_equal('test1.txt', File.basename(results.first))
457
- end
458
-
459
- test "perm method works with symbolic permissions" do
460
- omit_if(@@windows, 'symbolic perm test skipped on MS Windows')
461
-
462
- File.chmod(0664, @file_rb) # test1.rb
463
- File.chmod(0644, @file_txt1) # test1.txt
464
- results1 = File::Find.new(:name => "test1*", :perm => "g=rw").find
465
- results2 = File::Find.new(:name => "test1*", :perm => "u=rw").find
466
-
467
- assert_equal(1, results1.length)
468
- assert_equal(2, results2.length)
469
- assert_equal('test1.rb', File.basename(results1.first))
470
- assert_equal(['test1.rb', 'test1.txt'], results2.map{ |e| File.basename(e) }.sort)
471
- end
472
-
473
- test "prune accessor basic functionality" do
474
- assert_respond_to(@rule1, :prune)
475
- assert_respond_to(@rule1, :prune=)
476
- end
477
-
478
- test "prune method returns expected default value" do
479
- assert_nil(@rule1.prune)
480
- end
481
-
482
- test "find method with prune option works as expected" do
483
- rule = File::Find.new(:name => "*.txt", :prune => 'foo')
484
- assert_equal('test1.txt', File.basename(rule.find.first))
485
- end
486
-
487
- test "size accessor basic functionality" do
488
- assert_respond_to(@rule1, :size)
489
- assert_respond_to(@rule1, :size=)
490
- end
491
-
492
- test "size method returns expected default value" do
493
- assert_nil(@rule1.size)
494
- end
495
-
496
- test "user accessor basic functionality" do
497
- assert_respond_to(@rule1, :user)
498
- assert_respond_to(@rule1, :user=)
499
- end
500
-
501
- test "user method returns expected default value" do
502
- assert_nil(@rule1.user)
503
- end
504
-
505
- test "user method works with numeric id as expected" do
506
- if @@windows && @@elevated
507
- uid = @@loguser.gid # Windows assigns the group if any member is an admin
508
- else
509
- uid = @@loguser.uid
510
- end
511
-
512
- @rule1 = File::Find.new(:name => '*.doc', :user => uid)
513
- assert_equal([File.expand_path(@file_doc)], @rule1.find)
514
- end
515
-
516
- test "user method works with string as expected" do
517
- omit_if(@@windows && @@elevated)
518
- @rule1 = File::Find.new(:name => '*.doc', :user => @@loguser.name)
519
- assert_equal([File.expand_path(@file_doc)], @rule1.find)
520
- end
521
-
522
- test "find method with user option using invalid user returns expected results" do
523
- @rule1 = File::Find.new(:name => '*.doc', :user => 'totallybogus')
524
- @rule2 = File::Find.new(:name => '*.doc', :user => 99999999)
525
- assert_equal([], @rule1.find)
526
- assert_equal([], @rule2.find)
527
- end
528
-
529
- test "previous method basic functionality" do
530
- assert_respond_to(@rule1, :previous)
531
- end
532
-
533
- test "an error is raised if the path does not exist" do
534
- assert_raise(Errno::ENOENT){ File::Find.new(:path => '/bogus/dir').find }
535
- end
536
-
537
- test "an error is raised if an invalid option is passed" do
538
- assert_raise(ArgumentError){ File::Find.new(:bogus => 1) }
539
- assert_raise(ArgumentError){ File::Find.new(:bogus? => true) }
540
- end
541
-
542
- # TODO: Update test for Windows
543
- test 'eloop handling works as expected' do
544
- omit_if(@@windows, 'eloop handling test skipped on MS Windows')
545
-
546
- begin
547
- dir_eloop = ::Dir.mktmpdir
548
-
549
- Dir.chdir(dir_eloop) do
550
- File.symlink('eloop0', 'eloop1')
551
- File.symlink('eloop1', 'eloop0')
552
- expecting = ['./eloop0', './eloop1']
553
-
554
- results = File::Find.new(:path => '.', :follow => true).find
555
- assert_equal(expecting, results.sort)
556
- end
557
- ensure
558
- rm_rf(dir_eloop)
559
- end
560
- end
561
-
562
- def teardown
563
- rm_rf(@file_rb)
564
- rm_rf(@file_txt1)
565
- rm_rf(@file_txt2)
566
- rm_rf(@file_doc)
567
- rm_rf(@directory1)
568
- rm_rf(@directory2)
569
- rm_rf(@link1) #unless @@windows
570
- rm_rf('a')
571
- rm_rf('a1')
572
- rm_rf('bracket')
573
- rm_rf('z.min') if File.exist?('z.min')
574
-
575
- @rule1 = nil
576
- @rule2 = nil
577
- @file_rb = nil
578
- @file_txt1 = nil
579
- @file_txt2 = nil
580
- @file_doc = nil
581
- end
582
-
583
- def self.shutdown
584
- @@windows = nil
585
- @@jruby = nil
586
- @@elevated = nil if @@windows
587
- @@logroup = nil unless @@windows
588
- end
589
- end