]>
git.proxmox.com Git - cargo.git/blob - vendor/walkdir/src/tests/recursive.rs
2 use std
::path
::PathBuf
;
4 use crate::tests
::util
::Dir
;
8 fn send_sync_traits() {
9 use crate::{FilterEntry, IntoIter}
;
11 fn assert_send
<T
: Send
>() {}
12 fn assert_sync
<T
: Sync
>() {}
14 assert_send
::<WalkDir
>();
15 assert_sync
::<WalkDir
>();
16 assert_send
::<IntoIter
>();
17 assert_sync
::<IntoIter
>();
18 assert_send
::<FilterEntry
<IntoIter
, u8>>();
19 assert_sync
::<FilterEntry
<IntoIter
, u8>>();
25 let wd
= WalkDir
::new(dir
.path());
26 let r
= dir
.run_recursive(wd
);
29 assert_eq
!(1, r
.ents().len());
30 let ent
= &r
.ents()[0];
31 assert
!(ent
.file_type().is_dir());
32 assert
!(!ent
.path_is_symlink());
33 assert_eq
!(0, ent
.depth());
34 assert_eq
!(dir
.path(), ent
.path());
35 assert_eq
!(dir
.path().file_name().unwrap(), ent
.file_name());
41 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
42 let r
= dir
.run_recursive(wd
);
45 assert_eq
!(1, r
.ents().len());
46 let ent
= &r
.ents()[0];
47 assert
!(ent
.file_type().is_dir());
48 assert
!(!ent
.path_is_symlink());
49 assert_eq
!(0, ent
.depth());
50 assert_eq
!(dir
.path(), ent
.path());
51 assert_eq
!(dir
.path().file_name().unwrap(), ent
.file_name());
59 let wd
= WalkDir
::new(dir
.path().join("a"));
60 let r
= dir
.run_recursive(wd
);
63 assert_eq
!(1, r
.ents().len());
64 let ent
= &r
.ents()[0];
65 assert
!(ent
.file_type().is_file());
66 assert
!(!ent
.path_is_symlink());
67 assert_eq
!(0, ent
.depth());
68 assert_eq
!(dir
.join("a"), ent
.path());
69 assert_eq
!("a", ent
.file_name());
73 fn empty_file_follow() {
77 let wd
= WalkDir
::new(dir
.path().join("a")).follow_links(true);
78 let r
= dir
.run_recursive(wd
);
81 assert_eq
!(1, r
.ents().len());
82 let ent
= &r
.ents()[0];
83 assert
!(ent
.file_type().is_file());
84 assert
!(!ent
.path_is_symlink());
85 assert_eq
!(0, ent
.depth());
86 assert_eq
!(dir
.join("a"), ent
.path());
87 assert_eq
!("a", ent
.file_name());
95 let wd
= WalkDir
::new(dir
.path());
96 let r
= dir
.run_recursive(wd
);
100 assert_eq
!(2, ents
.len());
102 assert_eq
!(dir
.join("a"), ent
.path());
103 assert_eq
!(1, ent
.depth());
104 assert_eq
!("a", ent
.file_name());
105 assert
!(ent
.file_type().is_dir());
110 let dir
= Dir
::tmp();
113 let wd
= WalkDir
::new(dir
.path());
114 let r
= dir
.run_recursive(wd
);
115 r
.assert_no_errors();
118 assert_eq
!(2, ents
.len());
120 assert_eq
!(dir
.join("a"), ent
.path());
121 assert_eq
!(1, ent
.depth());
122 assert_eq
!("a", ent
.file_name());
123 assert
!(ent
.file_type().is_file());
127 fn one_dir_one_file() {
128 let dir
= Dir
::tmp();
132 let wd
= WalkDir
::new(dir
.path());
133 let r
= dir
.run_recursive(wd
);
134 r
.assert_no_errors();
137 dir
.path().to_path_buf(),
139 dir
.join("foo").join("a"),
141 assert_eq
!(expected
, r
.sorted_paths());
146 let dir
= Dir
::tmp();
148 dir
.touch_all(&["foo/a", "foo/b", "foo/c"]);
150 let wd
= WalkDir
::new(dir
.path());
151 let r
= dir
.run_recursive(wd
);
152 r
.assert_no_errors();
155 dir
.path().to_path_buf(),
157 dir
.join("foo").join("a"),
158 dir
.join("foo").join("b"),
159 dir
.join("foo").join("c"),
161 assert_eq
!(expected
, r
.sorted_paths());
166 let dir
= Dir
::tmp();
171 let wd
= WalkDir
::new(dir
.path());
172 let r
= dir
.run_recursive(wd
);
173 r
.assert_no_errors();
176 dir
.path().to_path_buf(),
178 dir
.join("foo").join("a"),
179 dir
.join("foo").join("b"),
180 dir
.join("foo").join("c"),
182 assert_eq
!(expected
, r
.sorted_paths());
187 let dir
= Dir
::tmp();
191 dir
.touch_all(&["foo/b", "foo/d", "foo/f"]);
193 let wd
= WalkDir
::new(dir
.path());
194 let r
= dir
.run_recursive(wd
);
195 r
.assert_no_errors();
198 dir
.path().to_path_buf(),
200 dir
.join("foo").join("a"),
201 dir
.join("foo").join("b"),
202 dir
.join("foo").join("c"),
203 dir
.join("foo").join("d"),
204 dir
.join("foo").join("e"),
205 dir
.join("foo").join("f"),
207 assert_eq
!(expected
, r
.sorted_paths());
213 PathBuf
::from("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z");
214 let dir
= Dir
::tmp();
216 dir
.touch(nested
.join("A"));
218 let wd
= WalkDir
::new(dir
.path());
219 let r
= dir
.run_recursive(wd
);
220 r
.assert_no_errors();
223 dir
.path().to_path_buf(),
228 dir
.join("a/b/c/d/e"),
229 dir
.join("a/b/c/d/e/f"),
230 dir
.join("a/b/c/d/e/f/g"),
231 dir
.join("a/b/c/d/e/f/g/h"),
232 dir
.join("a/b/c/d/e/f/g/h/i"),
233 dir
.join("a/b/c/d/e/f/g/h/i/j"),
234 dir
.join("a/b/c/d/e/f/g/h/i/j/k"),
235 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l"),
236 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m"),
237 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n"),
238 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o"),
239 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p"),
240 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q"),
241 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r"),
242 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s"),
243 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t"),
244 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u"),
245 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v"),
246 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w"),
247 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x"),
248 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y"),
249 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z"),
250 dir
.join(&nested
).join("A"),
252 assert_eq
!(expected
, r
.sorted_paths());
256 fn nested_small_max_open() {
258 PathBuf
::from("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z");
259 let dir
= Dir
::tmp();
261 dir
.touch(nested
.join("A"));
263 let wd
= WalkDir
::new(dir
.path()).max_open(1);
264 let r
= dir
.run_recursive(wd
);
265 r
.assert_no_errors();
268 dir
.path().to_path_buf(),
273 dir
.join("a/b/c/d/e"),
274 dir
.join("a/b/c/d/e/f"),
275 dir
.join("a/b/c/d/e/f/g"),
276 dir
.join("a/b/c/d/e/f/g/h"),
277 dir
.join("a/b/c/d/e/f/g/h/i"),
278 dir
.join("a/b/c/d/e/f/g/h/i/j"),
279 dir
.join("a/b/c/d/e/f/g/h/i/j/k"),
280 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l"),
281 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m"),
282 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n"),
283 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o"),
284 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p"),
285 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q"),
286 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r"),
287 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s"),
288 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t"),
289 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u"),
290 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v"),
291 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w"),
292 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x"),
293 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y"),
294 dir
.join("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z"),
295 dir
.join(&nested
).join("A"),
297 assert_eq
!(expected
, r
.sorted_paths());
302 let dir
= Dir
::tmp();
305 dir
.touch_all(&["foo/a", "foo/b"]);
306 dir
.touch_all(&["bar/a", "bar/b"]);
308 let wd
= WalkDir
::new(dir
.path());
309 let r
= dir
.run_recursive(wd
);
310 r
.assert_no_errors();
313 dir
.path().to_path_buf(),
315 dir
.join("bar").join("a"),
316 dir
.join("bar").join("b"),
318 dir
.join("foo").join("a"),
319 dir
.join("foo").join("b"),
321 assert_eq
!(expected
, r
.sorted_paths());
325 fn sym_root_file_nofollow() {
326 let dir
= Dir
::tmp();
328 dir
.symlink_file("a", "a-link");
330 let wd
= WalkDir
::new(dir
.join("a-link"));
331 let r
= dir
.run_recursive(wd
);
332 r
.assert_no_errors();
334 let ents
= r
.sorted_ents();
335 assert_eq
!(1, ents
.len());
338 assert_eq
!(dir
.join("a-link"), link
.path());
340 assert
!(link
.path_is_symlink());
342 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
344 assert_eq
!(0, link
.depth());
346 assert
!(link
.file_type().is_symlink());
347 assert
!(!link
.file_type().is_file());
348 assert
!(!link
.file_type().is_dir());
350 assert
!(link
.metadata().unwrap().file_type().is_symlink());
351 assert
!(!link
.metadata().unwrap().is_file());
352 assert
!(!link
.metadata().unwrap().is_dir());
356 fn sym_root_file_follow() {
357 let dir
= Dir
::tmp();
359 dir
.symlink_file("a", "a-link");
361 let wd
= WalkDir
::new(dir
.join("a-link")).follow_links(true);
362 let r
= dir
.run_recursive(wd
);
363 r
.assert_no_errors();
365 let ents
= r
.sorted_ents();
368 assert_eq
!(dir
.join("a-link"), link
.path());
370 assert
!(link
.path_is_symlink());
372 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
374 assert_eq
!(0, link
.depth());
376 assert
!(!link
.file_type().is_symlink());
377 assert
!(link
.file_type().is_file());
378 assert
!(!link
.file_type().is_dir());
380 assert
!(!link
.metadata().unwrap().file_type().is_symlink());
381 assert
!(link
.metadata().unwrap().is_file());
382 assert
!(!link
.metadata().unwrap().is_dir());
386 fn sym_root_dir_nofollow() {
387 let dir
= Dir
::tmp();
389 dir
.symlink_dir("a", "a-link");
392 let wd
= WalkDir
::new(dir
.join("a-link"));
393 let r
= dir
.run_recursive(wd
);
394 r
.assert_no_errors();
396 let ents
= r
.sorted_ents();
397 assert_eq
!(2, ents
.len());
400 assert_eq
!(dir
.join("a-link"), link
.path());
402 assert
!(link
.path_is_symlink());
404 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
406 assert_eq
!(0, link
.depth());
408 assert
!(link
.file_type().is_symlink());
409 assert
!(!link
.file_type().is_file());
410 assert
!(!link
.file_type().is_dir());
412 assert
!(link
.metadata().unwrap().file_type().is_symlink());
413 assert
!(!link
.metadata().unwrap().is_file());
414 assert
!(!link
.metadata().unwrap().is_dir());
416 let link_zzz
= &ents
[1];
417 assert_eq
!(dir
.join("a-link").join("zzz"), link_zzz
.path());
418 assert
!(!link_zzz
.path_is_symlink());
422 fn sym_root_dir_follow() {
423 let dir
= Dir
::tmp();
425 dir
.symlink_dir("a", "a-link");
428 let wd
= WalkDir
::new(dir
.join("a-link")).follow_links(true);
429 let r
= dir
.run_recursive(wd
);
430 r
.assert_no_errors();
432 let ents
= r
.sorted_ents();
433 assert_eq
!(2, ents
.len());
436 assert_eq
!(dir
.join("a-link"), link
.path());
438 assert
!(link
.path_is_symlink());
440 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
442 assert_eq
!(0, link
.depth());
444 assert
!(!link
.file_type().is_symlink());
445 assert
!(!link
.file_type().is_file());
446 assert
!(link
.file_type().is_dir());
448 assert
!(!link
.metadata().unwrap().file_type().is_symlink());
449 assert
!(!link
.metadata().unwrap().is_file());
450 assert
!(link
.metadata().unwrap().is_dir());
452 let link_zzz
= &ents
[1];
453 assert_eq
!(dir
.join("a-link").join("zzz"), link_zzz
.path());
454 assert
!(!link_zzz
.path_is_symlink());
458 fn sym_file_nofollow() {
459 let dir
= Dir
::tmp();
461 dir
.symlink_file("a", "a-link");
463 let wd
= WalkDir
::new(dir
.path());
464 let r
= dir
.run_recursive(wd
);
465 r
.assert_no_errors();
467 let ents
= r
.sorted_ents();
468 assert_eq
!(3, ents
.len());
469 let (src
, link
) = (&ents
[1], &ents
[2]);
471 assert_eq
!(dir
.join("a"), src
.path());
472 assert_eq
!(dir
.join("a-link"), link
.path());
474 assert
!(!src
.path_is_symlink());
475 assert
!(link
.path_is_symlink());
477 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
479 assert_eq
!(1, src
.depth());
480 assert_eq
!(1, link
.depth());
482 assert
!(src
.file_type().is_file());
483 assert
!(link
.file_type().is_symlink());
484 assert
!(!link
.file_type().is_file());
485 assert
!(!link
.file_type().is_dir());
487 assert
!(src
.metadata().unwrap().is_file());
488 assert
!(link
.metadata().unwrap().file_type().is_symlink());
489 assert
!(!link
.metadata().unwrap().is_file());
490 assert
!(!link
.metadata().unwrap().is_dir());
494 fn sym_file_follow() {
495 let dir
= Dir
::tmp();
497 dir
.symlink_file("a", "a-link");
499 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
500 let r
= dir
.run_recursive(wd
);
501 r
.assert_no_errors();
503 let ents
= r
.sorted_ents();
504 assert_eq
!(3, ents
.len());
505 let (src
, link
) = (&ents
[1], &ents
[2]);
507 assert_eq
!(dir
.join("a"), src
.path());
508 assert_eq
!(dir
.join("a-link"), link
.path());
510 assert
!(!src
.path_is_symlink());
511 assert
!(link
.path_is_symlink());
513 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
515 assert_eq
!(1, src
.depth());
516 assert_eq
!(1, link
.depth());
518 assert
!(src
.file_type().is_file());
519 assert
!(!link
.file_type().is_symlink());
520 assert
!(link
.file_type().is_file());
521 assert
!(!link
.file_type().is_dir());
523 assert
!(src
.metadata().unwrap().is_file());
524 assert
!(!link
.metadata().unwrap().file_type().is_symlink());
525 assert
!(link
.metadata().unwrap().is_file());
526 assert
!(!link
.metadata().unwrap().is_dir());
530 fn sym_dir_nofollow() {
531 let dir
= Dir
::tmp();
533 dir
.symlink_dir("a", "a-link");
536 let wd
= WalkDir
::new(dir
.path());
537 let r
= dir
.run_recursive(wd
);
538 r
.assert_no_errors();
540 let ents
= r
.sorted_ents();
541 assert_eq
!(4, ents
.len());
542 let (src
, link
) = (&ents
[1], &ents
[3]);
544 assert_eq
!(dir
.join("a"), src
.path());
545 assert_eq
!(dir
.join("a-link"), link
.path());
547 assert
!(!src
.path_is_symlink());
548 assert
!(link
.path_is_symlink());
550 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
552 assert_eq
!(1, src
.depth());
553 assert_eq
!(1, link
.depth());
555 assert
!(src
.file_type().is_dir());
556 assert
!(link
.file_type().is_symlink());
557 assert
!(!link
.file_type().is_file());
558 assert
!(!link
.file_type().is_dir());
560 assert
!(src
.metadata().unwrap().is_dir());
561 assert
!(link
.metadata().unwrap().file_type().is_symlink());
562 assert
!(!link
.metadata().unwrap().is_file());
563 assert
!(!link
.metadata().unwrap().is_dir());
567 fn sym_dir_follow() {
568 let dir
= Dir
::tmp();
570 dir
.symlink_dir("a", "a-link");
573 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
574 let r
= dir
.run_recursive(wd
);
575 r
.assert_no_errors();
577 let ents
= r
.sorted_ents();
578 assert_eq
!(5, ents
.len());
579 let (src
, link
) = (&ents
[1], &ents
[3]);
581 assert_eq
!(dir
.join("a"), src
.path());
582 assert_eq
!(dir
.join("a-link"), link
.path());
584 assert
!(!src
.path_is_symlink());
585 assert
!(link
.path_is_symlink());
587 assert_eq
!(dir
.join("a"), fs
::read_link(link
.path()).unwrap());
589 assert_eq
!(1, src
.depth());
590 assert_eq
!(1, link
.depth());
592 assert
!(src
.file_type().is_dir());
593 assert
!(!link
.file_type().is_symlink());
594 assert
!(!link
.file_type().is_file());
595 assert
!(link
.file_type().is_dir());
597 assert
!(src
.metadata().unwrap().is_dir());
598 assert
!(!link
.metadata().unwrap().file_type().is_symlink());
599 assert
!(!link
.metadata().unwrap().is_file());
600 assert
!(link
.metadata().unwrap().is_dir());
602 let (src_zzz
, link_zzz
) = (&ents
[2], &ents
[4]);
603 assert_eq
!(dir
.join("a").join("zzz"), src_zzz
.path());
604 assert_eq
!(dir
.join("a-link").join("zzz"), link_zzz
.path());
605 assert
!(!src_zzz
.path_is_symlink());
606 assert
!(!link_zzz
.path_is_symlink());
611 let dir
= Dir
::tmp();
613 dir
.symlink_dir("a", "a/b/c/a-link");
615 let wd
= WalkDir
::new(dir
.path());
616 let r
= dir
.run_recursive(wd
);
617 // There's no loop if we aren't following symlinks.
618 r
.assert_no_errors();
620 assert_eq
!(5, r
.ents().len());
624 fn sym_loop_detect() {
625 let dir
= Dir
::tmp();
627 dir
.symlink_dir("a", "a/b/c/a-link");
629 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
630 let r
= dir
.run_recursive(wd
);
632 let (ents
, errs
) = (r
.sorted_ents(), r
.errs());
633 assert_eq
!(4, ents
.len());
634 assert_eq
!(1, errs
.len());
638 let expected
= dir
.join("a/b/c/a-link");
639 assert_eq
!(Some(&*expected
), err
.path());
641 let expected
= dir
.join("a");
642 assert_eq
!(Some(&*expected
), err
.loop_ancestor());
644 assert_eq
!(4, err
.depth());
645 assert
!(err
.io_error().is_none());
649 fn sym_self_loop_no_error() {
650 let dir
= Dir
::tmp();
651 dir
.symlink_file("a", "a");
653 let wd
= WalkDir
::new(dir
.path());
654 let r
= dir
.run_recursive(wd
);
655 // No errors occur because even though the symlink points to nowhere, it
656 // is never followed, and thus no error occurs.
657 r
.assert_no_errors();
658 assert_eq
!(2, r
.ents().len());
660 let ent
= &r
.ents()[1];
661 assert_eq
!(dir
.join("a"), ent
.path());
662 assert
!(ent
.path_is_symlink());
664 assert
!(ent
.file_type().is_symlink());
665 assert
!(!ent
.file_type().is_file());
666 assert
!(!ent
.file_type().is_dir());
668 assert
!(ent
.metadata().unwrap().file_type().is_symlink());
669 assert
!(!ent
.metadata().unwrap().file_type().is_file());
670 assert
!(!ent
.metadata().unwrap().file_type().is_dir());
674 fn sym_file_self_loop_io_error() {
675 let dir
= Dir
::tmp();
676 dir
.symlink_file("a", "a");
678 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
679 let r
= dir
.run_recursive(wd
);
681 let (ents
, errs
) = (r
.sorted_ents(), r
.errs());
682 assert_eq
!(1, ents
.len());
683 assert_eq
!(1, errs
.len());
687 let expected
= dir
.join("a");
688 assert_eq
!(Some(&*expected
), err
.path());
689 assert_eq
!(1, err
.depth());
690 assert
!(err
.loop_ancestor().is_none());
691 assert
!(err
.io_error().is_some());
695 fn sym_dir_self_loop_io_error() {
696 let dir
= Dir
::tmp();
697 dir
.symlink_dir("a", "a");
699 let wd
= WalkDir
::new(dir
.path()).follow_links(true);
700 let r
= dir
.run_recursive(wd
);
702 let (ents
, errs
) = (r
.sorted_ents(), r
.errs());
703 assert_eq
!(1, ents
.len());
704 assert_eq
!(1, errs
.len());
708 let expected
= dir
.join("a");
709 assert_eq
!(Some(&*expected
), err
.path());
710 assert_eq
!(1, err
.depth());
711 assert
!(err
.loop_ancestor().is_none());
712 assert
!(err
.io_error().is_some());
717 let dir
= Dir
::tmp();
720 let wd
= WalkDir
::new(dir
.path()).min_depth(1);
721 let r
= dir
.run_recursive(wd
);
722 r
.assert_no_errors();
724 let expected
= vec
![dir
.join("a"), dir
.join("a").join("b")];
725 assert_eq
!(expected
, r
.sorted_paths());
730 let dir
= Dir
::tmp();
733 let wd
= WalkDir
::new(dir
.path()).min_depth(2);
734 let r
= dir
.run_recursive(wd
);
735 r
.assert_no_errors();
737 let expected
= vec
![dir
.join("a").join("b")];
738 assert_eq
!(expected
, r
.sorted_paths());
743 let dir
= Dir
::tmp();
746 let wd
= WalkDir
::new(dir
.path()).max_depth(0);
747 let r
= dir
.run_recursive(wd
);
748 r
.assert_no_errors();
750 let expected
= vec
![dir
.path().to_path_buf()];
751 assert_eq
!(expected
, r
.sorted_paths());
756 let dir
= Dir
::tmp();
759 let wd
= WalkDir
::new(dir
.path()).max_depth(1);
760 let r
= dir
.run_recursive(wd
);
761 r
.assert_no_errors();
763 let expected
= vec
![dir
.path().to_path_buf(), dir
.join("a")];
764 assert_eq
!(expected
, r
.sorted_paths());
769 let dir
= Dir
::tmp();
772 let wd
= WalkDir
::new(dir
.path()).max_depth(2);
773 let r
= dir
.run_recursive(wd
);
774 r
.assert_no_errors();
777 vec
![dir
.path().to_path_buf(), dir
.join("a"), dir
.join("a").join("b")];
778 assert_eq
!(expected
, r
.sorted_paths());
781 // FIXME: This test seems wrong. It should return nothing!
783 fn min_max_depth_diff_nada() {
784 let dir
= Dir
::tmp();
787 let wd
= WalkDir
::new(dir
.path()).min_depth(3).max_depth(2);
788 let r
= dir
.run_recursive(wd
);
789 r
.assert_no_errors();
791 let expected
= vec
![dir
.join("a").join("b").join("c")];
792 assert_eq
!(expected
, r
.sorted_paths());
796 fn min_max_depth_diff_0() {
797 let dir
= Dir
::tmp();
800 let wd
= WalkDir
::new(dir
.path()).min_depth(2).max_depth(2);
801 let r
= dir
.run_recursive(wd
);
802 r
.assert_no_errors();
804 let expected
= vec
![dir
.join("a").join("b")];
805 assert_eq
!(expected
, r
.sorted_paths());
809 fn min_max_depth_diff_1() {
810 let dir
= Dir
::tmp();
813 let wd
= WalkDir
::new(dir
.path()).min_depth(1).max_depth(2);
814 let r
= dir
.run_recursive(wd
);
815 r
.assert_no_errors();
817 let expected
= vec
![dir
.join("a"), dir
.join("a").join("b")];
818 assert_eq
!(expected
, r
.sorted_paths());
822 fn contents_first() {
823 let dir
= Dir
::tmp();
826 let wd
= WalkDir
::new(dir
.path()).contents_first(true);
827 let r
= dir
.run_recursive(wd
);
828 r
.assert_no_errors();
830 let expected
= vec
![dir
.join("a"), dir
.path().to_path_buf()];
831 assert_eq
!(expected
, r
.paths());
835 fn skip_current_dir() {
836 let dir
= Dir
::tmp();
837 dir
.mkdirp("foo/bar/baz");
840 let mut paths
= vec
![];
841 let mut it
= WalkDir
::new(dir
.path()).into_iter();
842 while let Some(result
) = it
.next() {
843 let ent
= result
.unwrap();
844 paths
.push(ent
.path().to_path_buf());
845 if ent
.file_name() == "bar" {
846 it
.skip_current_dir();
852 dir
.path().to_path_buf(),
854 dir
.join("foo").join("bar"),
857 assert_eq
!(expected
, paths
);
862 let dir
= Dir
::tmp();
863 dir
.mkdirp("foo/bar/baz/abc");
866 let wd
= WalkDir
::new(dir
.path())
868 .filter_entry(|ent
| ent
.file_name() != "baz");
869 let r
= dir
.run_recursive(wd
);
870 r
.assert_no_errors();
873 dir
.path().to_path_buf(),
875 dir
.join("foo").join("bar"),
878 assert_eq
!(expected
, r
.sorted_paths());
883 let dir
= Dir
::tmp();
884 dir
.mkdirp("foo/bar/baz/abc");
887 let wd
= WalkDir
::new(dir
.path())
888 .sort_by(|a
, b
| a
.file_name().cmp(b
.file_name()).reverse());
889 let r
= dir
.run_recursive(wd
);
890 r
.assert_no_errors();
893 dir
.path().to_path_buf(),
896 dir
.join("foo").join("bar"),
897 dir
.join("foo").join("bar").join("baz"),
898 dir
.join("foo").join("bar").join("baz").join("abc"),
900 assert_eq
!(expected
, r
.paths());
905 let dir
= Dir
::tmp();
906 dir
.mkdirp("foo/bar/baz/abc");
909 let wd
= WalkDir
::new(dir
.path())
911 .sort_by(|a
, b
| a
.file_name().cmp(b
.file_name()).reverse());
912 let r
= dir
.run_recursive(wd
);
913 r
.assert_no_errors();
916 dir
.path().to_path_buf(),
919 dir
.join("foo").join("bar"),
920 dir
.join("foo").join("bar").join("baz"),
921 dir
.join("foo").join("bar").join("baz").join("abc"),
923 assert_eq
!(expected
, r
.paths());
926 #[cfg(target_os = "linux")]
928 fn same_file_system() {
931 // This test is a little weird since it's not clear whether it's a good
932 // idea to setup a distinct mounted volume in these tests. Instead, we
933 // probe for an existing one.
934 if !Path
::new("/sys").is_dir() {
938 let dir
= Dir
::tmp();
940 dir
.symlink_dir("/sys", "sys-link");
942 // First, do a sanity check that things work without following symlinks.
943 let wd
= WalkDir
::new(dir
.path());
944 let r
= dir
.run_recursive(wd
);
945 r
.assert_no_errors();
948 vec
![dir
.path().to_path_buf(), dir
.join("a"), dir
.join("sys-link")];
949 assert_eq
!(expected
, r
.sorted_paths());
951 // ... now follow symlinks and ensure we don't descend into /sys.
953 WalkDir
::new(dir
.path()).same_file_system(true).follow_links(true);
954 let r
= dir
.run_recursive(wd
);
955 r
.assert_no_errors();
958 vec
![dir
.path().to_path_buf(), dir
.join("a"), dir
.join("sys-link")];
959 assert_eq
!(expected
, r
.sorted_paths());
962 // Tests that skip_current_dir doesn't destroy internal invariants.
964 // See: https://github.com/BurntSushi/walkdir/issues/118
966 fn regression_skip_current_dir() {
967 let dir
= Dir
::tmp();
968 dir
.mkdirp("foo/a/b");
969 dir
.mkdirp("foo/1/2");
971 let mut wd
= WalkDir
::new(dir
.path()).max_open(1).into_iter();
977 wd
.skip_current_dir();
978 wd
.skip_current_dir();