From d18005b69a5f2a768e4839150db770392f4e7e4c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 1 Mar 2019 02:58:44 +0300 Subject: [PATCH] tests must not crash when run under windows without enough privileges to create symlinks --- .../ProjectRootUtilSymlinkedFilesTest.java | 2 +- .../vfs/impl/local/CanonicalPathMapTest.java | 1 + .../openapi/vfs/local/FileWatcherTest.kt | 12 +++++---- .../vfs/local/LocalFileSystemTest.java | 4 +-- .../vfs/local/SymlinkHandlingTest.java | 4 +-- .../intellij/openapi/util/io/IoTestUtil.java | 6 +++++ .../com/intellij/openapi/util/SystemInfo.java | 25 +++++++++++++++++++ .../util/io/FileAttributesReadingTest.java | 14 +++++------ .../openapi/util/io/FileUtilHeavyTest.java | 4 +-- 9 files changed, 53 insertions(+), 19 deletions(-) diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/roots/ProjectRootUtilSymlinkedFilesTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/roots/ProjectRootUtilSymlinkedFilesTest.java index e0eb9d97895b..1e60c7897ff8 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/roots/ProjectRootUtilSymlinkedFilesTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/roots/ProjectRootUtilSymlinkedFilesTest.java @@ -24,7 +24,7 @@ public class ProjectRootUtilSymlinkedFilesTest extends PlatformTestCase { @Override protected boolean shouldRunTest() { - return super.shouldRunTest() && SystemInfo.areSymLinksSupported; + return super.shouldRunTest() && SystemInfo.isSymLinkCreationSupported; } @Override diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/local/CanonicalPathMapTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/local/CanonicalPathMapTest.java index 91aa353de56a..65e420f10f80 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/local/CanonicalPathMapTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/local/CanonicalPathMapTest.java @@ -140,6 +140,7 @@ public class CanonicalPathMapTest { @Test public void remappedSymLinkReportsOriginalWatchedPath() throws IOException { + IoTestUtil.assumeSymLinkCreationIsSupported(); // Tests the situation where the watch root is a symlink AND REMAPPED by the native file watcher. File realDir = myTempDir.newFolder("real"); File symLink = IoTestUtil.createSymLink(realDir.getPath(), myTempDir.getRoot() + "/link"); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.kt index 9685bfecd260..de587b1406ad 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.kt @@ -32,12 +32,9 @@ import com.intellij.util.Alarm import com.intellij.util.TimeoutUtil import com.intellij.util.concurrency.Semaphore import org.assertj.core.api.Assertions.assertThat -import org.junit.After +import org.junit.* import org.junit.Assume.assumeFalse import org.junit.Assume.assumeTrue -import org.junit.Before -import org.junit.Rule -import org.junit.Test import java.io.File import java.nio.file.Files import java.nio.file.Paths @@ -228,6 +225,7 @@ class FileWatcherTest : BareTestFixtureTestCase() { // ensure that flat roots set via symbolic paths behave correctly and do not report dirty files returned from other recursive roots @Test fun testSymbolicLinkIntoFlatRoot() { + IoTestUtil.assumeSymLinkCreationIsSupported() val root = tempDir.newFolder("root") val cDir = tempDir.newFolder("root/A/B/C") val aLink = File(root, "aLink") @@ -243,6 +241,8 @@ class FileWatcherTest : BareTestFixtureTestCase() { } @Test fun testMultipleSymbolicLinkPathsToFile() { + IoTestUtil.assumeSymLinkCreationIsSupported() + val root = tempDir.newFolder("root") val file = tempDir.newFile("root/A/B/C/test.txt") val bLink = File(root, "bLink") @@ -261,6 +261,7 @@ class FileWatcherTest : BareTestFixtureTestCase() { } @Test fun testSymbolicLinkWatchRoot() { + IoTestUtil.assumeSymLinkCreationIsSupported() val top = tempDir.newFolder("top") val file = tempDir.newFile("top/dir1/dir2/dir3/test.txt") val link = Files.createSymbolicLink(Paths.get(top.path, "link"), Paths.get("${top.path}/dir1/dir2")).toFile() @@ -274,6 +275,7 @@ class FileWatcherTest : BareTestFixtureTestCase() { } @Test fun testSymbolicLinkAboveWatchRoot() { + IoTestUtil.assumeSymLinkCreationIsSupported() val top = tempDir.newFolder("top") val file = tempDir.newFile("top/dir1/dir2/dir3/test.txt") val link = Files.createSymbolicLink(Paths.get(top.path, "link"), Paths.get("${top.path}/dir1/dir2")).toFile() @@ -474,7 +476,7 @@ class FileWatcherTest : BareTestFixtureTestCase() { } @Test fun testLineBreaksInName() { - assumeTrue(SystemInfo.isUnix) + assumeTrue("Expected Unix", SystemInfo.isUnix) val root = tempDir.newFolder("root") val file = tempDir.newFile("root/weird\ndir\nname/weird\nfile\nname") diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java index e84048a9417d..02faea374372 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java @@ -571,7 +571,7 @@ public class LocalFileSystemTest extends BareTestFixtureTestCase { @Test public void testSymlinkTargetBlink() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File target = tempDir.newFolder("target"); File link = new File(tempDir.getRoot(), "link"); @@ -700,7 +700,7 @@ public class LocalFileSystemTest extends BareTestFixtureTestCase { @Test public void testBrokenSymlinkMove() { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); runInEdtAndWait(() -> { File srcDir = tempDir.newFolder("src"); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java index 80efe5877de8..9e26fbedd778 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymlinkHandlingTest.java @@ -4,6 +4,7 @@ package com.intellij.openapi.vfs.local; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.IoTestUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.testFramework.fixtures.BareTestFixtureTestCase; @@ -21,14 +22,13 @@ import java.util.Set; import static com.intellij.openapi.util.io.IoTestUtil.*; import static com.intellij.testFramework.PlatformTestUtil.assertPathsEqual; -import static org.junit.Assume.assumeTrue; public class SymlinkHandlingTest extends BareTestFixtureTestCase { @Rule public TempDirectory myTempDir = new TempDirectory(); @Before public void setUp() { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); } @Test diff --git a/platform/testFramework/src/com/intellij/openapi/util/io/IoTestUtil.java b/platform/testFramework/src/com/intellij/openapi/util/io/IoTestUtil.java index f778f9b21bad..4e0a58efc0fb 100644 --- a/platform/testFramework/src/com/intellij/openapi/util/io/IoTestUtil.java +++ b/platform/testFramework/src/com/intellij/openapi/util/io/IoTestUtil.java @@ -10,6 +10,8 @@ import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.junit.Assume; +import org.junit.AssumptionViolatedException; import java.io.*; import java.nio.charset.Charset; @@ -82,6 +84,10 @@ public class IoTestUtil { return linkFile; } + public static void assumeSymLinkCreationIsSupported() throws AssumptionViolatedException { + Assume.assumeTrue("Expected can create symlinks", SystemInfo.isSymLinkCreationSupported); + } + @NotNull public static File createJunction(@NotNull String target, @NotNull String junction) { assertTrue(SystemInfo.isWindows); diff --git a/platform/util/src/com/intellij/openapi/util/SystemInfo.java b/platform/util/src/com/intellij/openapi/util/SystemInfo.java index 9ce99a59b782..24b01d889aa0 100644 --- a/platform/util/src/com/intellij/openapi/util/SystemInfo.java +++ b/platform/util/src/com/intellij/openapi/util/SystemInfo.java @@ -6,6 +6,9 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.lang.JavaVersion; import org.jetbrains.annotations.NotNull; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.List; import java.util.Locale; @@ -87,6 +90,28 @@ public class SystemInfo extends SystemInfoRt { public static final boolean isFileSystemCaseSensitive = SystemInfoRt.isFileSystemCaseSensitive; public static final boolean areSymLinksSupported = isUnix || isWinVistaOrNewer; + public static final boolean isSymLinkCreationSupported = isUnix || isWinVistaOrNewer && holdsEnoughPrivilegesToCreateSymlinks(); + + private static boolean holdsEnoughPrivilegesToCreateSymlinks() { + try { + File src = File.createTempFile("tempSrc", ".txt"); + src.delete(); + File dest = File.createTempFile("tempDst", ".txt"); + try { + Files.createSymbolicLink(src.toPath(), dest.toPath()); + } + catch (IOException e) { + return false; + } + finally { + dest.delete(); + } + } + catch (IOException e) { + return false; + } + return true; + } public static final boolean is32Bit = SystemInfoRt.is32Bit; public static final boolean is64Bit = SystemInfoRt.is64Bit; diff --git a/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java b/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java index 10264227a0ec..3e955fecfbf0 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/io/FileAttributesReadingTest.java @@ -195,7 +195,7 @@ public abstract class FileAttributesReadingTest { @Test public void linkToFile() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File file = tempDir.newFile("file.txt"); FileUtil.writeToFile(file, myTestData); @@ -217,7 +217,7 @@ public abstract class FileAttributesReadingTest { @Test public void doubleLink() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File file = tempDir.newFile("file.txt"); FileUtil.writeToFile(file, myTestData); @@ -241,7 +241,7 @@ public abstract class FileAttributesReadingTest { @Test public void linkToDirectory() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File dir = tempDir.newFolder("dir"); if (SystemInfo.isUnix) assertTrue(dir.setWritable(false, false)); @@ -262,7 +262,7 @@ public abstract class FileAttributesReadingTest { @Test public void missingLink() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File file = new File(tempDir.getRoot(), "file.txt"); File link = new File(tempDir.getRoot(), "link"); @@ -279,7 +279,7 @@ public abstract class FileAttributesReadingTest { @Test public void selfLink() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File dir = tempDir.newFolder("dir"); File link = new File(dir, "link"); @@ -470,7 +470,7 @@ public abstract class FileAttributesReadingTest { File link = new File(tempDir.getRoot(), "link"); Files.createLink(link.toPath(), target.toPath()); - FileAttributes attributes = getAttributes(link, SystemInfo.areSymLinksSupported); // ignore XP + FileAttributes attributes = getAttributes(link, SystemInfo.isSymLinkCreationSupported); // ignore XP assertEquals(FileAttributes.Type.FILE, attributes.type); assertEquals(target.length(), attributes.length); assertTimestampsEqual(target.lastModified(), attributes.lastModified); @@ -485,7 +485,7 @@ public abstract class FileAttributesReadingTest { assertEquals(myTestData.length, bytes.length); } - attributes = getAttributes(link, SystemInfo.areSymLinksSupported); // ignore XP + attributes = getAttributes(link, SystemInfo.isSymLinkCreationSupported); // ignore XP assertEquals(FileAttributes.Type.FILE, attributes.type); assertEquals(target.length(), attributes.length); assertTimestampsEqual(target.lastModified(), attributes.lastModified); diff --git a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilHeavyTest.java b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilHeavyTest.java index 58bf38f95aac..6c5865744c18 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilHeavyTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilHeavyTest.java @@ -223,7 +223,7 @@ public class FileUtilHeavyTest { @Test public void testSymlinkDeletion() { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File targetDir = IoTestUtil.createTestDir(myTempDirectory, "lnk_del_test_1"); IoTestUtil.createTestFile(targetDir, "file"); @@ -255,7 +255,7 @@ public class FileUtilHeavyTest { @Test public void testToCanonicalPathSymLinksAware() throws IOException { - assumeTrue(SystemInfo.areSymLinksSupported); + IoTestUtil.assumeSymLinkCreationIsSupported(); File rootDir = IoTestUtil.createTestDir(myTempDirectory, "root"); assertTrue(new File(rootDir, "dir1/dir2/dir3/dir4").mkdirs());