diff --git a/libraries/stdlib/jdk7/test/PathExtensionsTest.kt b/libraries/stdlib/jdk7/test/PathExtensionsTest.kt index 3c91a8c855e..11d881d26a5 100644 --- a/libraries/stdlib/jdk7/test/PathExtensionsTest.kt +++ b/libraries/stdlib/jdk7/test/PathExtensionsTest.kt @@ -331,6 +331,135 @@ class PathExtensionsTest : AbstractPathTest() { assertEquals(srcFile.readText(), dstFile.readText()) } + @Test + fun copyToDstLinkPointingToSrc() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val src = root.resolve("src").createFile() + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(src) ?: return + + assertTrue(src.isSameFileAs(dstLink)) + assertTrue(dstLink.isSameFileAs(src)) + assertFailsWith { + src.copyTo(dstLink, *options) + } + assertTrue(dstLink.isSymbolicLink()) + } + } + + @Test + fun copyToDstLinkPointingToSrcOverwrite() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val src = root.resolve("src").createFile() + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(src) ?: return + + src.copyTo(dstLink, StandardCopyOption.REPLACE_EXISTING, *options) + assertFalse(dstLink.isSymbolicLink()) + } + } + + @Test + fun copyToSrcLinkAndDstLinkPointingToSameFile() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val original = root.resolve("original").createFile() + val srcLink = root.resolve("srcLink").tryCreateSymbolicLinkTo(original) ?: return + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(original) ?: return + + assertTrue(srcLink.isSameFileAs(dstLink)) + assertTrue(dstLink.isSameFileAs(srcLink)) + assertFailsWith { + srcLink.copyTo(dstLink, *options) + } + assertTrue(dstLink.isSymbolicLink()) + } + } + + @Test + fun copyToSrcLinkAndDstLinkPointingToSameFileOverwrite() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val original = root.resolve("original").createFile() + val srcLink = root.resolve("srcLink").tryCreateSymbolicLinkTo(original) ?: return + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(original) ?: return + + srcLink.copyTo(dstLink, StandardCopyOption.REPLACE_EXISTING, *options) + + if (LinkOption.NOFOLLOW_LINKS in options) { + assertTrue(dstLink.isSymbolicLink()) // src symlink was copied + } else { + assertFalse(dstLink.isSymbolicLink()) // src symlink target was copied + } + } + } + + @Test + fun copyToSameLinkDifferentRoute() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val original = root.resolve("original").createFile() + val srcLink = root.resolve("srcLink").tryCreateSymbolicLinkTo(original) ?: return + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(root)?.resolve("srcLink") ?: return + + assertTrue(srcLink.isSameFileAs(dstLink)) + assertTrue(dstLink.isSameFileAs(srcLink)) + + if (LinkOption.NOFOLLOW_LINKS in options) { + srcLink.copyTo(dstLink, *options) // same file + } else { + assertFailsWith { + srcLink.copyTo(dstLink, *options) // target of srcLink copied to srcLink location + } + } + + assertTrue(dstLink.isSymbolicLink()) + } + } + + @Test + fun copyToSameLinkDifferentRouteOverwrite() { + for (options in listOf(arrayOf(), arrayOf(LinkOption.NOFOLLOW_LINKS))) { + val root = createTempDirectory().cleanupRecursively() + val original = root.resolve("original").createFile() + val srcLink = root.resolve("srcLink").tryCreateSymbolicLinkTo(original) ?: return + val dstLink = root.resolve("dstLink").tryCreateSymbolicLinkTo(root)?.resolve("srcLink") ?: return + + if (LinkOption.NOFOLLOW_LINKS in options) { + srcLink.copyTo(dstLink, StandardCopyOption.REPLACE_EXISTING, *options) // same file + } else { + // dstLink is deleted before srcLink gets copied. + // Actually srcLink gets removed because dstLink is srcLink with different path. + val error = assertFailsWith { + srcLink.copyTo(dstLink, StandardCopyOption.REPLACE_EXISTING, *options) + } + assertEquals(srcLink.toString(), error.file) + assertFalse(srcLink.exists(LinkOption.NOFOLLOW_LINKS)) + assertFalse(dstLink.exists(LinkOption.NOFOLLOW_LINKS)) + } + } + } + + @Test + fun copyToSameFileDifferentRoute() { + val root = createTempDirectory().cleanupRecursively() + val src = root.resolve("src").createFile() + val dst = root.resolve("dstLink").tryCreateSymbolicLinkTo(root)?.resolve("src") ?: return + + assertTrue(src.isSameFileAs(dst)) + assertTrue(dst.isSameFileAs(src)) + src.copyTo(dst) + } + + @Test + fun copyToSameFileDifferentRouteOverwrite() { + val root = createTempDirectory().cleanupRecursively() + val src = root.resolve("src").createFile() + val dst = root.resolve("dstLink").tryCreateSymbolicLinkTo(root)?.resolve("src") ?: return + + src.copyTo(dst, overwrite = true) + } + @Test fun moveTo() { val root = createTempDirectory("moveTo-root").cleanupRecursively()