Bug 573409 - test for [performance] Avoid File.getCanonicalPath

additional tests for case insensitive edge cases of copy and move

Change-Id: Iaca9da595f1eaf5072cd9af61c5540f68a4471d1
Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.resources/+/180307
Tested-by: Lars Vogel <Lars.Vogel@vogella.com>
Reviewed-by: Lars Vogel <Lars.Vogel@vogella.com>
Reviewed-by: Sebastian Ratz <sebastian.ratz@sap.com>
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
index 4a050ce..a1ac0c3 100755
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
@@ -22,12 +22,14 @@
 import java.util.stream.Stream;
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.filesystem.provider.FileSystem;
+import org.eclipse.core.internal.filesystem.Messages;
 import org.eclipse.core.internal.filesystem.NullFileSystem;
 import org.eclipse.core.internal.filesystem.local.LocalFile;
 import org.eclipse.core.internal.filesystem.local.LocalFileSystem;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.tests.internal.localstore.LocalStoreTest;
+import org.eclipse.osgi.util.NLS;
 
 /**
  * Basic tests for the IFileStore API
@@ -49,8 +51,8 @@
 	}
 
 	/**
-	 * Tests behavior of IFileStore#fetchInfo when underlying file system
-	 * throws exceptions.
+	 * Tests behavior of IFileStore#fetchInfo when underlying file system throws
+	 * exceptions.
 	 */
 	public void testBrokenFetchInfo() {
 		IFileStore broken = null;
@@ -61,16 +63,16 @@
 		} catch (URISyntaxException e) {
 			fail("0.99", e);
 		}
-		//no-arg fetch info should return non-existent file
+		// no-arg fetch info should return non-existent file
 		IFileInfo info = broken.fetchInfo();
 		assertTrue("1.0", !info.exists());
 
-		//two-arg fetchInfo should throw exception
+		// two-arg fetchInfo should throw exception
 		try {
 			info = broken.fetchInfo(EFS.NONE, getMonitor());
 			fail("2.0");
 		} catch (CoreException e) {
-			//expected
+			// expected
 		}
 	}
 
@@ -83,7 +85,7 @@
 	private IFileStore[] getFileStoresOnTwoVolumes() {
 		IFileStore[] tempDirs = new IFileStore[2];
 
-		for (int i = 99/*c*/; i < 123/*z*/; i++) {
+		for (int i = 99/* c */; i < 123/* z */; i++) {
 			char c = (char) i;
 			try {
 				IFileStore store = getDirFileStore(c + ":/temp");
@@ -93,10 +95,10 @@
 						tempDirs[0] = store;
 					} else {
 						tempDirs[1] = store;
-						break; //both temp dirs have been created
+						break; // both temp dirs have been created
 					}
 				}
-			} catch (CoreException e) {//ignore and go to next volume
+			} catch (CoreException e) {// ignore and go to next volume
 				continue;
 			}
 		}
@@ -110,7 +112,8 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null
+				|| tempDirectories[1] == null) {
 			return;
 		}
 
@@ -145,7 +148,7 @@
 			target.copy(destination, EFS.NONE, null);
 			fail("5.2");
 		} catch (CoreException e) {
-			//should fail
+			// should fail
 		}
 		assertTrue("5.3", !verifyTree(getTree(destination)));
 		destination.delete(EFS.NONE, null);
@@ -163,7 +166,8 @@
 
 	public void testCopyDirectory() throws Throwable {
 		/* build scenario */
-		IFileStore temp = EFS.getFileSystem(EFS.SCHEME_FILE).getStore(getWorkspace().getRoot().getLocation().append("temp"));
+		IFileStore temp = EFS.getFileSystem(EFS.SCHEME_FILE)
+				.getStore(getWorkspace().getRoot().getLocation().append("temp"));
 		temp.mkdir(EFS.NONE, null);
 		assertTrue("1.1", temp.fetchInfo().isDirectory());
 		// create tree
@@ -186,17 +190,57 @@
 		IFileStore child = parent.getChild("child");
 		IFileStore existing = getTempStore();
 		createFile(existing, getRandomString());
-		//try to copy when parent of destination does not exist
+		// try to copy when parent of destination does not exist
 		try {
 			existing.copy(child, EFS.NONE, getMonitor());
 			fail("1.0");
 		} catch (CoreException e) {
-			//should fail
+			// should fail
 		}
-		//destination should not exist
+		// destination should not exist
 		assertTrue("1.1", !child.fetchInfo().exists());
 	}
 
+	public void testCaseInsensitive() throws Throwable {
+		IFileStore temp = createDir(getWorkspace().getRoot().getLocation().append("temp").toString(), true);
+		boolean isCaseSensitive = temp.getFileSystem().isCaseSensitive();
+		if (isCaseSensitive) {
+			System.out.println("Skipping copy test on caseSensitive System");
+			return;
+		}
+		// create a file
+		String content = "this is just a simple content \n to a simple file \n to test a 'simple' copy";
+		IFileStore fileWithSmallName = temp.getChild("filename");
+		fileWithSmallName.delete(EFS.NONE, null);
+		createFile(fileWithSmallName, content);
+		System.out.println(fileWithSmallName.fetchInfo().getName());
+		assertTrue("1.3", fileWithSmallName.fetchInfo().exists());
+		assertTrue("1.4", compareContent(getContents(content), fileWithSmallName.openInputStream(EFS.NONE, null)));
+
+		IFileStore fileWithOtherName = temp.getChild("FILENAME");
+		System.out.println(fileWithOtherName.fetchInfo().getName());
+		// file content is already the same for both Cases:
+		assertTrue("2.0", compareContent(getContents(content), fileWithOtherName.openInputStream(EFS.NONE, null)));
+		fileWithSmallName.copy(fileWithOtherName, IResource.DEPTH_INFINITE, null); // a NOP Operation
+		// file content is still the same for both Cases:
+		assertTrue("2.1", compareContent(getContents(content), fileWithOtherName.openInputStream(EFS.NONE, null)));
+		assertTrue("3.0", fileWithOtherName.fetchInfo().exists());
+		assertTrue("3.1", fileWithSmallName.fetchInfo().exists());
+		fileWithOtherName.delete(EFS.NONE, null);
+		assertFalse("3.2", fileWithOtherName.fetchInfo().exists());
+		assertFalse("3.3", fileWithSmallName.fetchInfo().exists());
+		try {
+			fileWithSmallName.move(fileWithOtherName, EFS.NONE, null);
+			fail("4.0");
+		} catch (CoreException e) {
+			String message = NLS.bind(Messages.couldNotMove, fileWithSmallName.toString());
+			assertEquals(message, e.getMessage());
+		}
+
+		/* take out the trash */
+		temp.delete(EFS.NONE, null);
+	}
+
 	public void testCopyFile() throws Throwable {
 		/* build scenario */
 		IFileStore temp = createDir(getWorkspace().getRoot().getLocation().append("temp").toString(), true);
@@ -241,7 +285,7 @@
 		assertTrue("7.1", bigFile.fetchInfo().exists());
 		assertTrue("7.2", compareContent(getContents(sb.toString()), bigFile.openInputStream(EFS.NONE, null)));
 		IFileStore destination = temp.getChild("copy of bigFile");
-		//IProgressMonitor monitor = new LoggingProgressMonitor(System.out);
+		// IProgressMonitor monitor = new LoggingProgressMonitor(System.out);
 		IProgressMonitor monitor = getMonitor();
 		bigFile.copy(destination, EFS.NONE, monitor);
 		assertTrue("7.3", compareContent(getContents(sb.toString()), destination.openInputStream(EFS.NONE, null)));
@@ -258,7 +302,8 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null
+				|| tempDirectories[1] == null) {
 			return;
 		}
 
@@ -432,7 +477,8 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null
+				|| tempDirectories[1] == null) {
 			return;
 		}
 
@@ -479,31 +525,32 @@
 		IFileStore child = parent.getChild("child");
 		IFileStore existing = getTempStore();
 		createFile(existing, getRandomString());
-		//try to move when parent of destination does not exist
+		// try to move when parent of destination does not exist
 		try {
 			existing.move(child, EFS.NONE, getMonitor());
 			fail("1.0");
 		} catch (CoreException e) {
-			//should fail
+			// should fail
 		}
-		//destination should not exist
+		// destination should not exist
 		assertTrue("1.1", !child.fetchInfo().exists());
 	}
 
 	/**
-	 * Tests public API method {@link IFileStore#putInfo(IFileInfo, int, IProgressMonitor)}.
+	 * Tests public API method
+	 * {@link IFileStore#putInfo(IFileInfo, int, IProgressMonitor)}.
 	 */
 	public void testPutInfo() {
 		IFileStore nonExisting = getTempStore();
 
-		//assert that modifying a non-existing store fails
+		// assert that modifying a non-existing store fails
 		IFileInfo info = nonExisting.fetchInfo();
 		info.setLastModified(System.currentTimeMillis());
 		try {
 			nonExisting.putInfo(info, EFS.SET_LAST_MODIFIED, getMonitor());
 			fail("1.0");
 		} catch (CoreException e) {
-			//expected
+			// expected
 		}
 		info = nonExisting.fetchInfo();
 		info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false);
@@ -511,7 +558,7 @@
 			nonExisting.putInfo(info, EFS.SET_ATTRIBUTES, getMonitor());
 			fail("1.1");
 		} catch (CoreException e) {
-			//expected
+			// expected
 		}
 	}