Skip to content

Add characterization test for copying a symlinked directory#570

Merged
garydgregory merged 4 commits into
apache:masterfrom
elharo:copy
Jan 27, 2024
Merged

Add characterization test for copying a symlinked directory#570
garydgregory merged 4 commits into
apache:masterfrom
elharo:copy

Conversation

@elharo

@elharo elharo commented Jan 27, 2024

Copy link
Copy Markdown
Contributor

See what happens when copyDirectory copies a directory that is a symlink to another directory containing non-symlinked files. This is a characterization test to explore current behavior, and arguably represents a bug. This behavior, and the test, is likely to change and should not be relied on.

FYI the second test added here that creates a symlink cycle would have exposed a bug that exists in the most recent release. (I rolled back a couple of months and the test failed then but not now) That bug was fixed by copying symlinks as symlinks rather than by following the links. If we decide to revert to the old follow links behavior, we will need to figure out what we want to do about symlink cycles like this.

@garydgregory @eamonnmcmanus

This is from the test as it fails in the release. At least it doesn't infinitely loop. It's a little worrisome that I can't explain why it loops for a while and then stops. It might be hitting an OS level MAXSYMLINKS limit or a maximum path length.

java.io.FileNotFoundException: Source '/var/folders/nj/33bhgzxj5zb8xtzb5tfh_9y40000gn/T/junit4465446543506135552/FileUtilsTest5790156993778646647/topDirectory/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top/child_directory/link_to_top' does not exist at org.apache.commons.io.FileUtils.checkFileExists(FileUtils.java:300) at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:829) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1333) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1331) at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:713) at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:644) at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:545) at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:516) at org.apache.commons.io.FileUtilsTest.testCopyDir_symLinkCycle(FileUtilsTest.java:433) at java.lang.reflect.Method.invoke(Method.java:498) at java.util.ArrayList.forEach(ArrayList.java:1257) at java.util.ArrayList.forEach(ArrayList.java:1257)

@codecov-commenter

codecov-commenter commented Jan 27, 2024

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 85.99%. Comparing base (546a4d2) to head (ba15dfa).
Report is 962 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff            @@
##             master     #570   +/-   ##
=========================================
  Coverage     85.99%   85.99%           
  Complexity     3497     3497           
=========================================
  Files           231      231           
  Lines          8253     8253           
  Branches        964      964           
=========================================
  Hits           7097     7097           
  Misses          866      866           
  Partials        290      290           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@garydgregory

Copy link
Copy Markdown
Member

Interesting: Adding these two tests add 4 seconds to running FileUtilsTest with mvn test -Dtest=FileUtilsTest.

@garydgregory garydgregory merged commit 278ca07 into apache:master Jan 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants