maven-shared-utils icon indicating copy to clipboard operation
maven-shared-utils copied to clipboard

[MSHARED-1176] Test case for NoSuchFileException while copying symbolic

Open kwin opened this issue 3 years ago • 9 comments

link with relative non-existing target

kwin avatar Jul 26 '22 17:07 kwin

@slawekjaranowski This depends on #109 being merged first otherwise the build breaks even before executing the unit test.

Update: Done and rebased this PR.

kwin avatar Jul 26 '22 17:07 kwin

Without testing your PR, here is what I see on FreeBSD (FreeBSD bsd1srv.fritz.box 12.3-STABLE FreeBSD 12.3-STABLE GENERIC amd64) where chmod -h works as expected:

mosipov@bsd1srv:/usr/home/mosipov/var/Projekte/maven-shared-utils (master =)
$ grep chmod /tmp/out
fchmod(188,0100644)                              = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/org/apache/maven/shared/utils/annotations.xml",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/org/apache/maven/shared/utils/annotations.xml",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/LICENSE",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/LICENSE",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/DEPENDENCIES",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/DEPENDENCIES",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/NOTICE",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/classes/META-INF/NOTICE",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory1/file1.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory1/file1.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory2/directory21/file21.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory2/directory21/file21.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory2/file2.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/directory2/file2.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/file.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/directorywalker/file.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/expand/expand_test.zip",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/expand/expand_test.zip",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/targetDir/targetFile.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/targetDir/targetFile.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/fileR.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/fileR.txt",0644) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",0644) ERR#2 'No such file or directory'

and

mosipov@bsd1srv:/usr/home/mosipov/var/Projekte/maven-shared-utils (master =)
$ grep symLinkToFileOnTheOutside /tmp/out
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",0x7fffdfffc1f0,0x0) ERR#2 'No such file or directory'
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",{ mode=lrwxr-xr-x ,inode=91832,size=19,blksize=131072 },AT_SYMLINK_NOFOLLOW) = 0 (0x0)
unlink("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside") = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",0x7fffdfffc460,0x0) ERR#2 'No such file or directory'
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=lrwxr-xr-x ,inode=91158,size=19,blksize=131072 },AT_SYMLINK_NOFOLLOW) = 0 (0x0)
readlink("/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside","../onTheOutside.txt",1025) = 19 (0x13)
access("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",F_OK) ERR#2 'No such file or directory'
symlink("../onTheOutside.txt","/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside") = 0 (0x0)
fstatat(AT_FDCWD,"/var/mosipov/Projekte/maven-shared-utils/src/test/resources/symlinks/src/symLinkToFileOnTheOutside",{ mode=-rw-r--r-- ,inode=91148,size=839,blksize=4096 },0x0) = 0 (0x0)
chmod("/var/mosipov/Projekte/maven-shared-utils/target/test-classes/symlinks/src/symLinkToFileOnTheOutside",0644) ERR#2 'No such file or directory'

The symlink or its target does not exist.

michael-o avatar Jul 26 '22 17:07 michael-o

Yes, exactly. In this case the target does not (yet) exist. The question is how FileUtils.copyFile(...) should behave in that case.

kwin avatar Jul 26 '22 17:07 kwin

I'll try to look into this this month.

michael-o avatar Jul 26 '22 18:07 michael-o

IMHO copy should also not fail in case the source symlink is broken (which it currently does)

kwin avatar Jul 26 '22 18:07 kwin

IMHO copy should also not fail in case the source symlink is broken (which it currently does)

I agree with that. If source leads to nowhere then dest should do too. Fully valid with POSIX.

michael-o avatar Jul 26 '22 18:07 michael-o

IMHO copy should also not fail in case the source symlink is broken (which it currently does)

I added another (failing) test case for this scenario in https://github.com/apache/maven-shared-utils/pull/110/commits/8ff14a538e13399fbc307c6c3d8cf98437104364

kwin avatar Jul 27 '22 06:07 kwin

From my PoV, it should mimic cp(1).

michael-o avatar Jul 27 '22 08:07 michael-o