diff options
Diffstat (limited to 'tests')
4 files changed, 339 insertions, 4 deletions
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderBic.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderBic.java index 3db32af1b..0ef738c9c 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderBic.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderBic.java @@ -1,6 +1,7 @@ package org.eclipse.team.tests.core; -import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IFileModificationValidator; +import org.eclipse.core.resources.team.IMoveDeleteHook; import org.eclipse.core.runtime.CoreException; import org.eclipse.team.core.RepositoryProvider; @@ -8,6 +9,9 @@ public class RepositoryProviderBic extends RepositoryProvider { final public static String NATURE_ID = "org.eclipse.team.tests.core.bic-provider"; + private IMoveDeleteHook mdh; + private IFileModificationValidator mv; + /* * @see RepositoryProvider#configureProject() */ @@ -25,4 +29,26 @@ public class RepositoryProviderBic extends RepositoryProvider { */ public void deconfigure() throws CoreException { } + + /* + * @see RepositoryProvider#getFileModificationValidator() + */ + public IFileModificationValidator getFileModificationValidator() { + return mv; + } + + /* + * @see RepositoryProvider#getMoveDeleteHook() + */ + public IMoveDeleteHook getMoveDeleteHook() { + return mdh; + } + + public void setModificationValidator(IFileModificationValidator mv) { + this.mv = mv; + } + + public void setMoveDeleteHook(IMoveDeleteHook mdh) { + this.mdh = mdh; + } }
\ No newline at end of file diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderNaish.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderNaish.java index d1e08e095..570c3387b 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderNaish.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderNaish.java @@ -1,13 +1,15 @@ package org.eclipse.team.tests.core; -import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IFileModificationValidator; +import org.eclipse.core.resources.team.IMoveDeleteHook; import org.eclipse.core.runtime.CoreException; import org.eclipse.team.core.RepositoryProvider; public class RepositoryProviderNaish extends RepositoryProvider { final public static String NATURE_ID = "org.eclipse.team.tests.core.naish-provider"; - + private IMoveDeleteHook mdh; + private IFileModificationValidator mv; /* * @see RepositoryProvider#configureProject() */ @@ -25,4 +27,25 @@ public class RepositoryProviderNaish extends RepositoryProvider { */ public void deconfigure() throws CoreException { } + + public void setModificationValidator(IFileModificationValidator mv) { + this.mv = mv; + } + + public void setMoveDeleteHook(IMoveDeleteHook mdh) { + this.mdh = mdh; + } + /* + * @see RepositoryProvider#getFileModificationValidator() + */ + public IFileModificationValidator getFileModificationValidator() { + return mv; + } + + /* + * @see RepositoryProvider#getMoveDeleteHook() + */ + public IMoveDeleteHook getMoveDeleteHook() { + return mdh; + } }
\ No newline at end of file diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTests.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTests.java index b81990a64..df5693d23 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTests.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTests.java @@ -1,5 +1,6 @@ package org.eclipse.team.tests.core; +import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -7,8 +8,19 @@ import java.util.List; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestSuite; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFileModificationValidator; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.team.IMoveDeleteHook; +import org.eclipse.core.resources.team.IResourceTree; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.core.TeamException; @@ -36,12 +48,280 @@ public class RepositoryProviderTests extends TeamTest { public void testGetProviderGeneric() throws CoreException, TeamException { IProject project = getUniqueTestProject("testGetProviderGeneric"); + IProject project2 = getUniqueTestProject("testGetProviderGeneric"); // test that adding a non-team nature will not return a provider RepositoryProvider.addNatureToProject(project, RepositoryProviderOtherSport.NATURE_ID, null); assertTrue(RepositoryProvider.getProvider(project) == null); // adding a valid team provider should be fine - //RepositoryProvider.addNatureToProject(project, RepositoryProvider); + RepositoryProvider.addNatureToProject(project, RepositoryProviderBic.NATURE_ID, null); + RepositoryProvider.addNatureToProject(project2, RepositoryProviderNaish.NATURE_ID, null); + RepositoryProvider provider1 = RepositoryProvider.getProvider(project); + RepositoryProvider provider2 = RepositoryProvider.getProvider(project2); + assertTrue(provider1 != null && provider1.getID().equals(RepositoryProviderBic.NATURE_ID)); + assertTrue(provider2 != null && provider2.getID().equals(RepositoryProviderNaish.NATURE_ID)); + assertTrue(provider1.getProject().equals(project) && provider2.getProject().equals(project2)); + + // adding another provider should be prohibited by core + try { + RepositoryProvider.addNatureToProject(project, RepositoryProviderNaish.NATURE_ID, null); + fail("cannot add two team providers to the same project"); + } catch(TeamException e) { + provider1 = RepositoryProvider.getProvider(project); + assertTrue(provider1 != null && provider1.getID().equals(RepositoryProviderBic.NATURE_ID)); + } + + // closed or non-existant projects cannot be associated with a provider + IProject closedProject = getUniqueTestProject("testGetProviderGenericClosed"); + IProject nonExistantProject = ResourcesPlugin.getWorkspace().getRoot().getProject("nonExistant"); + closedProject.close(null); + assertTrue(RepositoryProvider.getProvider(closedProject) == null); + assertTrue(RepositoryProvider.getProvider(nonExistantProject) == null); + + // removing the nature removes the provider association + RepositoryProvider.removeNatureFromProject(project, RepositoryProviderBic.NATURE_ID, null); + RepositoryProvider.removeNatureFromProject(project2, RepositoryProviderNaish.NATURE_ID, null); + assertTrue(RepositoryProvider.getProvider(project)==null); + assertTrue(RepositoryProvider.getProvider(project2)==null); + } + + public void testGetProviderById() throws CoreException, TeamException { + IProject project1 = getUniqueTestProject("testGetProviderById_1"); + IProject project2 = getUniqueTestProject("testGetProviderById_2"); + + // test that adding a non-team nature will not return a provider + RepositoryProvider.addNatureToProject(project1, RepositoryProviderOtherSport.NATURE_ID, null); + assertTrue(RepositoryProvider.getProvider(project1, RepositoryProviderOtherSport.NATURE_ID) == null); + + // adding a valid team provider should be fine + RepositoryProvider.addNatureToProject(project1, RepositoryProviderBic.NATURE_ID, null); + RepositoryProvider.addNatureToProject(project2, RepositoryProviderNaish.NATURE_ID, null); + assertTrue(RepositoryProvider.getProvider(project1, RepositoryProviderBic.NATURE_ID)!=null); + assertTrue(RepositoryProvider.getProvider(project2, RepositoryProviderNaish.NATURE_ID)!=null); + + // adding another provider should be prohibited by core + try { + RepositoryProvider.addNatureToProject(project1, RepositoryProviderNaish.NATURE_ID, null); + fail("cannot add two team providers to the same project"); + } catch(TeamException e) { + assertTrue(RepositoryProvider.getProvider(project1, RepositoryProviderBic.NATURE_ID)!=null); + } + + // closed or non-existant projects cannot be associated with a provider + IProject closedProject = getUniqueTestProject("testGetProviderGenericClosed"); + IProject nonExistantProject = ResourcesPlugin.getWorkspace().getRoot().getProject("nonExistant"); + closedProject.close(null); + assertTrue(RepositoryProvider.getProvider(closedProject, "id") == null); + assertTrue(RepositoryProvider.getProvider(nonExistantProject, "id") == null); + + // removing the nature removes the provider association + RepositoryProvider.removeNatureFromProject(project1, RepositoryProviderBic.NATURE_ID, null); + RepositoryProvider.removeNatureFromProject(project2, RepositoryProviderNaish.NATURE_ID, null); + assertTrue(RepositoryProvider.getProvider(project1, RepositoryProviderBic.NATURE_ID)==null); + assertTrue(RepositoryProvider.getProvider(project2, RepositoryProviderNaish.NATURE_ID)==null); + } + + public void testFileModificationValidator() throws CoreException, TeamException { + IProject project = getUniqueTestProject("testFileModificationValidator"); + + // adding a valid team provider should be fine + RepositoryProvider.addNatureToProject(project, RepositoryProviderBic.NATURE_ID, null); + RepositoryProviderBic bicProvider = (RepositoryProviderBic)RepositoryProvider.getProvider(project, RepositoryProviderBic.NATURE_ID); + assertTrue(bicProvider!=null); + + // test that validator gets called by team core dispatching + final boolean[] called = new boolean[] {false}; + bicProvider.setModificationValidator(new IFileModificationValidator() { + // can't test validate edit here because it is only called from editors + public IStatus validateEdit(IFile[] files, Object context) { + return null; + } + public IStatus validateSave(IFile file) { + called[0] = true; + return getTeamTestStatus(IStatus.OK); + } + }); + IFile file = project.getFile("test.txt"); + file.create(new ByteArrayInputStream("test".getBytes()), true, null); + file.setContents(new ByteArrayInputStream("test2".getBytes()), true, false, null); + assertTrue(called[0] == true); + + // test that validator can veto a setContents + called[0] = false; + bicProvider.setModificationValidator(new IFileModificationValidator() { + // can't test validate edit here because it is only called from editors + public IStatus validateEdit(IFile[] files, Object context) { + return null; + } + public IStatus validateSave(IFile file) { + called[0] = true; + return getTeamTestStatus(IStatus.ERROR); + } + }); + try { + file.setContents(new ByteArrayInputStream("test3".getBytes()), true, false, null); + fail("validate hook should veto this setContents"); + } catch(CoreException e) { + assertTrue(called[0] == true); + } + + // test that default validator allows the modification + bicProvider.setModificationValidator(null); + file.setContents(new ByteArrayInputStream("test4".getBytes()), true, false, null); + } + + public void testMoveDeleteHook() throws CoreException, TeamException { + final IProject project = getUniqueTestProject("testMoveDeleteHook"); + + // adding a valid team provider should be fine + RepositoryProvider.addNatureToProject(project, RepositoryProviderBic.NATURE_ID, null); + RepositoryProviderBic bicProvider = (RepositoryProviderBic)RepositoryProvider.getProvider(project, RepositoryProviderBic.NATURE_ID); + assertTrue(bicProvider!=null); + + // only testing that dispatching works, resources plugin is testing the rest of the API + final boolean[] called = new boolean[] {false, false, false, false, false, false}; + IMoveDeleteHook hook = new IMoveDeleteHook() { + public boolean deleteFile(IResourceTree tree, IFile file, int updateFlags, IProgressMonitor monitor) { + called[0] = true; + return false; + } + public boolean deleteFolder(IResourceTree tree, IFolder folder, int updateFlags, IProgressMonitor monitor) { + called[1] = true; + return false; + } + public boolean deleteProject(IResourceTree tree, IProject project, int updateFlags, IProgressMonitor monitor) { + called[2] = true; + return false; + } + public boolean moveFile(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) { + called[3] = true; + return false; + } + public boolean moveFolder(IResourceTree tree, IFolder source, IFolder destination, int updateFlags, IProgressMonitor monitor) { + called[4] = true; + return false; + } + public boolean moveProject(IResourceTree tree, IProject source, IProjectDescription description, int updateFlags, IProgressMonitor monitor) { + called[5] = true; + return false; + } + }; + bicProvider.setMoveDeleteHook(hook); + + IResource[] resources = buildResources(project, new String[] {"deleteFile.txt", "moveFile.txt", "deletedFolder/", "moveFolder/"}); + ensureExistsInWorkspace(resources, true); + resources[0].delete(false, null); + resources[1].move(resources[1].getFullPath().removeLastSegments(1).append("movedFile_NEW"), false, null); + resources[2].delete(false, null); + resources[3].move(resources[3].getFullPath().removeLastSegments(1).append("movedFolder"), false, null); + // moving using the description allows the moved project to have natures ids or origination + IProjectDescription desc = project.getDescription(); + desc.setName("movedProject"); + project.move(desc, false, null); + IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject("movedProject"); + bicProvider = (RepositoryProviderBic)RepositoryProvider.getProvider(newProject); + bicProvider.setMoveDeleteHook(hook); + newProject.delete(true, null); + for (int i = 0; i < called.length; i++) { + assertTrue(called[i]); + } + } + + public void testMoveDeleteHookBetweenProjects() throws CoreException, TeamException { + final IProject projectA = getUniqueTestProject("testMoveDeleteHookBetweenProjects_A"); + final IProject projectB = getUniqueTestProject("testMoveDeleteHookBetweenProjects_B"); + + // adding a valid team provider should be fine + RepositoryProvider.addNatureToProject(projectA, RepositoryProviderBic.NATURE_ID, null); + final RepositoryProviderBic bicProvider = (RepositoryProviderBic)RepositoryProvider.getProvider(projectA, RepositoryProviderBic.NATURE_ID); + RepositoryProvider.addNatureToProject(projectB, RepositoryProviderNaish.NATURE_ID, null); + final RepositoryProviderNaish naishProvider = (RepositoryProviderNaish)RepositoryProvider.getProvider(projectB, RepositoryProviderNaish.NATURE_ID); + assertTrue(bicProvider!=null && naishProvider!=null); + + // only testing that dispatching works, resources plugin is testing the rest of the API + final boolean[] calledProjectA = new boolean[] {false, false}; + bicProvider.setMoveDeleteHook(new IMoveDeleteHook() { + public boolean deleteFile(IResourceTree tree, IFile file, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean deleteFolder(IResourceTree tree, IFolder folder, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean deleteProject(IResourceTree tree, IProject project, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean moveFile(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) { + assertTrue(bicProvider.getProject().equals(source.getProject())); + calledProjectA[0] = true; + return false; + } + public boolean moveFolder(IResourceTree tree, IFolder source, IFolder destination, int updateFlags, IProgressMonitor monitor) { + assertTrue(bicProvider.getProject().equals(source.getProject())); + calledProjectA[1] = true; + return false; + } + public boolean moveProject(IResourceTree tree, IProject source, IProjectDescription description, int updateFlags, IProgressMonitor monitor) { + return false; + } + }); + + final boolean[] calledProjectB = new boolean[] {false, false}; + naishProvider.setMoveDeleteHook(new IMoveDeleteHook() { + public boolean deleteFile(IResourceTree tree, IFile file, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean deleteFolder(IResourceTree tree, IFolder folder, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean deleteProject(IResourceTree tree, IProject project, int updateFlags, IProgressMonitor monitor) { + return false; + } + public boolean moveFile(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) { + assertTrue(bicProvider.getProject().equals(destination.getProject())); + calledProjectB[0] = true; + return false; + } + public boolean moveFolder(IResourceTree tree, IFolder source, IFolder destination, int updateFlags, IProgressMonitor monitor) { + assertTrue(bicProvider.getProject().equals(destination.getProject())); + calledProjectB[1] = true; + return false; + } + public boolean moveProject(IResourceTree tree, IProject source, IProjectDescription description, int updateFlags, IProgressMonitor monitor) { + return false; + } + }); + + IResource[] resources = buildResources(projectA, new String[] {"moveFile.txt", "moveFolder/"}); + ensureExistsInWorkspace(resources, true); + resources[0].move(projectB.getFullPath().append("moveFile_new.txt"), false, null); + resources[1].move(projectB.getFullPath().append("movedFolder"), false, null); + for (int i = 0; i < calledProjectA.length; i++) { + assertTrue(calledProjectA[i] && calledProjectB[i]); + } + + // test that moving files/folders from a project without a provider to a project with a provider calls the + // move hooks for the destination + calledProjectA[0] = false; calledProjectA[1] = false; + calledProjectB[0] = false; calledProjectB[1] = false; + IProject projectC = getUniqueTestProject("testMoveDeleteHookBetweenProjects_B"); + resources = buildResources(projectC, new String[] {"moveFile.txt", "moveFolder/"}); + resources[0].move(projectB.getFullPath().append("moveFile_new.txt"), false, null); + resources[1].move(projectB.getFullPath().append("movedFolder"), false, null); + for (int i = 0; i < calledProjectA.length; i++) { + assertTrue(calledProjectA[i]==false && calledProjectB[i]); + } + + // test that moving files/folders from a project with a provider to a project without a provider calls the + // hooks for the source + calledProjectA[0] = false; calledProjectA[1] = false; + calledProjectB[0] = false; calledProjectB[1] = false; + resources = buildResources(projectA, new String[] {"anotherMovedFiled.txt", "anotherMovedFolder/"}); + ensureExistsInWorkspace(resources, true); + resources[0].move(projectC.getFullPath().append("moveFileOther_new.txt"), false, null); + resources[1].move(projectC.getFullPath().append("movedFolderOther"), false, null); + for (int i = 0; i < calledProjectA.length; i++) { + assertTrue(calledProjectA[i] && calledProjectB[i]==false); + } } } diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java index 7f64727fe..feb37bffa 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java @@ -2,6 +2,8 @@ package org.eclipse.team.tests.core; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.core.tests.harness.EclipseWorkspaceTest; public class TeamTest extends EclipseWorkspaceTest { @@ -26,4 +28,8 @@ public class TeamTest extends EclipseWorkspaceTest { // manage and share with the default stream create by this class return getNamedTestProject(prefix + "-" + Long.toString(System.currentTimeMillis())); } + + protected IStatus getTeamTestStatus(int severity) { + return new Status(severity, "org.eclipse.team.tests.core", 0, "team status", null); + } } |