blob: 332f1bb829c2308edacc5cfe0f470447eefb083c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.internal.localstore;
import java.io.File;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.resources.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
//
public class RefreshLocalTest extends LocalStoreTest implements ICoreConstants {
public static Test suite() {
return new TestSuite(RefreshLocalTest.class);
}
public RefreshLocalTest() {
super();
}
public RefreshLocalTest(String name) {
super(name);
}
/**
* Tests refreshing a folder whose case has changed on disk.
* This is a regression test for bug 79090.
*/
public void testDiscoverCaseChange() {
IProject project = projects[0];
IFolder folder = project.getFolder("A");
IFolder folderVariant = project.getFolder("a");
IFile file = folder.getFile("file");
IFile fileVariant = folderVariant.getFile(file.getName());
//create the project, folder, and file
ensureExistsInWorkspace(file, true);
//change the case of the folder on disk
project.getLocation().append("A").toFile().renameTo((project.getLocation().append("a").toFile()));
try {
//refresh the project
project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
//variant should exist but original shouldn't
assertTrue("1.1", folderVariant.exists());
assertTrue("1.2", fileVariant.exists());
assertTrue("1.3", !folder.exists());
assertTrue("1.4", !file.exists());
assertTrue("1.5", project.isSynchronized(IResource.DEPTH_INFINITE));
}
/**
* Test discovery of a linked resource on refresh.
*/
public void testDiscoverLinkedResource() {
//create a linked resource with local contents missing
// IProject project = projects[0];
// ensureExistsInWorkspace(project, true);
// IPath location = getRandomLocation();
// IFile link = project.getFile("Link");
// try {
// link.createLink(location, IResource.ALLOW_MISSING_LOCAL, getMonitor());
// } catch (CoreException e) {
// fail("0.99", e);
// }
//
// //should not be synchronized (exists in ws, but not in fs)
// assertTrue("1.0", !project.isSynchronized(IResource.DEPTH_INFINITE));
// assertTrue("1.1", !link.isSynchronized(IResource.DEPTH_ZERO));
//
// //should exist in workspace
// assertTrue("1.3", link.exists());
//
// //refreshing shouldn't get rid of the link
// try {
// link.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
// } catch (CoreException e) {
// fail("1.99", e);
// }
// assertTrue("1.4", link.exists());
//
// //create the contents in the file system
// try {
// createFileInFileSystem(location);
// } catch (CoreException e) {
// fail("2.99", e);
// }
//
// //should now be synchronized
// assertTrue("2.1", project.isSynchronized(IResource.DEPTH_INFINITE));
// assertTrue("2.2", link.isSynchronized(IResource.DEPTH_ZERO));
//
// //refresh
// try {
// link.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
// } catch (CoreException e) {
// fail("3.99", e);
// }
//
// //assert should exist in workspace
// assertTrue("2.3", link.exists());
}
/**
* Tests discovering a file via refresh local when neither the file
* nor its parent exists in the workspace.
*/
public void testFileDiscovery() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
IFolder folder = project.getFolder("Folder");
IFile file = folder.getFile("File");
IResource[] both = new IResource[] {folder, file};
ensureExistsInFileSystem(both);
ensureDoesNotExistInWorkspace(both);
assertTrue("1.0", !file.exists());
assertTrue("1.1", !folder.exists());
assertTrue("1.2", !file.isSynchronized(IResource.DEPTH_ZERO));
assertTrue("1.3", !folder.isSynchronized(IResource.DEPTH_INFINITE));
file.refreshLocal(IResource.DEPTH_ZERO, getMonitor());
assertTrue("1.4", file.exists());
assertTrue("1.5", folder.exists());
//try again with deleted project
project.delete(IResource.FORCE, getMonitor());
ensureExistsInFileSystem(both);
ensureDoesNotExistInWorkspace(both);
assertTrue("2.0", !file.exists());
assertTrue("2.1", !folder.exists());
file.refreshLocal(IResource.DEPTH_ZERO, getMonitor());
assertTrue("2.2", !file.exists());
assertTrue("2.3", !folder.exists());
}
public void testFileToFolder() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
/* */
IFile file = project.getFile("file");
file.create(null, true, null);
ensureDoesNotExistInFileSystem(file);
//
File target = file.getLocation().toFile();
target.mkdirs();
//
assertTrue("1.1", file.exists());
assertTrue("1.2", target.isDirectory());
file.refreshLocal(IResource.DEPTH_ZERO, null);
assertTrue("1.3", !file.exists());
IFolder folder = project.getFolder("file");
assertTrue("1.4", folder.exists());
}
public void testFolderToFile() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
/* test folder to file */
IFolder folder = project.getFolder("folder");
folder.create(true, true, null);
ensureDoesNotExistInFileSystem(folder);
//
IFile file = project.getFile("folder");
ensureExistsInFileSystem(file);
//
assertTrue("1.1", folder.exists());
folder.refreshLocal(IResource.DEPTH_ZERO, null);
assertTrue("1.2", !folder.exists());
assertTrue("1.3", file.exists());
}
public void testRefreshClosedProject() {
IProject project = projects[0];
try {
project.close(getMonitor());
} catch (CoreException e) {
fail("0.99", e);
}
//refreshing a closed project should not fail
try {
project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
project.refreshLocal(IResource.DEPTH_ZERO, getMonitor());
project.refreshLocal(IResource.DEPTH_ONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
}
public void testRefreshFolder() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
/* test deletion of a child */
IFile file = project.getFile("file");
final IFile hackFile = file;
final Workspace workspace = (Workspace) getWorkspace();
IWorkspaceRunnable operation = monitor -> {
workspace.createResource(hackFile, false);
((Resource) hackFile).getResourceInfo(false, true).set(M_LOCAL_EXISTS);
};
workspace.run(operation, null);
assertTrue("1.0", file.exists());
assertTrue("1.1", file.isLocal(IResource.DEPTH_ZERO));
project.refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("1.2", !file.exists());
ensureDoesNotExistInWorkspace(file);
ensureDoesNotExistInFileSystem(file);
/* test creation of a child */
file = project.getFile("file");
ensureExistsInFileSystem(file);
assertTrue("2.0", !file.exists());
project.refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("2.1", file.exists());
ensureDoesNotExistInWorkspace(file);
ensureDoesNotExistInFileSystem(file);
/* test changes of a child (child is folder) */
IFolder folder = project.getFolder("folder");
folder.create(true, true, null);
file = folder.getFile("file");
ensureExistsInFileSystem(file);
assertTrue("3.1", folder.exists());
assertTrue("3.2", folder.isLocal(IResource.DEPTH_ZERO));
assertTrue("3.3", !file.exists());
folder.refreshLocal(IResource.DEPTH_ZERO, null);
assertTrue("3.4", folder.exists());
assertTrue("3.5", folder.isLocal(IResource.DEPTH_ZERO));
assertTrue("3.6", !file.exists());
folder.refreshLocal(IResource.DEPTH_ONE, null);
assertTrue("3.7", folder.exists());
assertTrue("3.8", folder.isLocal(IResource.DEPTH_ZERO));
assertTrue("3.9", file.exists());
ensureDoesNotExistInWorkspace(folder);
ensureDoesNotExistInFileSystem(folder);
/* test changes of a child (child is file) */
file = project.getFile("file");
IFileStore fileStore = ((Resource) file).getStore();
ensureExistsInWorkspace(file, true);
assertTrue("4.1", file.exists());
assertTrue("4.2", file.isLocal(IResource.DEPTH_ZERO));
assertEquals("4.3", fileStore.fetchInfo().getLastModified(), ((Resource) file).getResourceInfo(false, false).getLocalSyncInfo());
ensureOutOfSync(file);
assertTrue("4.4", ((Resource) file).getResourceInfo(false, false).getLocalSyncInfo() != fileStore.fetchInfo().getLastModified());
project.refreshLocal(IResource.DEPTH_INFINITE, null);
assertEquals("4.5", fileStore.fetchInfo().getLastModified(), ((Resource) file).getResourceInfo(false, false).getLocalSyncInfo());
ensureDoesNotExistInWorkspace(file);
ensureDoesNotExistInFileSystem(file);
}
public void testSimpleRefresh() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
/* test root deletion */
IFile file = project.getFile("file");
ensureExistsInWorkspace(file, true);
ensureDoesNotExistInFileSystem(file);
assertTrue("1.0", file.exists());
file.refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("1.1", !file.exists());
/* test root and children creation */
IFolder folder = project.getFolder("folder");
IFileStore target = ((Resource) folder).getStore();
createTree(getTree(target));
assertTrue("2.0", !folder.exists());
folder.refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("2.1", folder.exists());
assertTrue("2.2", ((Resource) folder).countResources(IResource.DEPTH_INFINITE, false) == (getTree(target).length + 1));
}
}