/*******************************************************************************
* Copyright (C) 2013, François Rey <eclipse.org_@_francois_._rey_._name>
*
* 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:
* François Rey - First implementation as part of handling linked resources
******************************************************************************/
package org.eclipse.egit.ui.internal.actions;
import static org.eclipse.jgit.junit.JGitTestUtil.write;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.common.LocalRepositoryTestCase;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FileUtils;
import org.junit.Before;
import org.junit.Test;
public class LinkedResourcesTest extends LocalRepositoryTestCase {
// the standalone temporary directory
private File standaloneDirectory;
private static final String LINKED_FILE = "LinkedFile";
private static final String STANDALONE_FOLDER = "StandaloneFolder";
private IProject project;
@Before
public void setUp() throws Exception {
createProjectAndCommitToRepository();
project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJ1);
// create standalone temporary directory
standaloneDirectory = testUtils.createTempDir(STANDALONE_FOLDER);
if (standaloneDirectory.exists())
FileUtils.delete(standaloneDirectory, FileUtils.RECURSIVE
| FileUtils.RETRY);
if (!standaloneDirectory.exists())
FileUtils.mkdir(standaloneDirectory, true);
}
private List<RepositoryActionHandler> getRepositoryActionHandlerList()
throws CoreException {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint point = registry.getExtensionPoint("org.eclipse.ui.commands");
IConfigurationElement[] elements = point.getConfigurationElements();
ArrayList<RepositoryActionHandler> result = new ArrayList<RepositoryActionHandler>();
for (IConfigurationElement e: elements) {
String categoryId = e.getAttribute("categoryId");
if ("org.eclipse.egit.ui.commandCategory".equals(categoryId)) {
if (e.getAttribute("defaultHandler") != null) {
Object o = e.createExecutableExtension("defaultHandler");
if (o instanceof RepositoryActionHandler)
result.add((RepositoryActionHandler) o);
}
}
}
return result;
}
@Test
public void testSomeActionsWithoutLinkedResources() throws Exception {
List<RepositoryActionHandler> handlers = getRepositoryActionHandlerList();
int count = 0;
IFile selection = project.getFile(FILE1);
for (RepositoryActionHandler handler: handlers) {
handler.setSelection(new StructuredSelection(selection));
if (handler.isEnabled())
count++;
}
// This sorts of test this test case: if no action is enabled,
// there's something wrong in our testing approach.
assertTrue(
"Some EGit action should be enabled, please review this test.",
count > 0);
}
@Test
public void testNoActionOnLinkedResources() throws Exception {
List<RepositoryActionHandler> handlers = getRepositoryActionHandlerList();
// Create a file outside any project or repository
File standaloneFile = new File(standaloneDirectory, LINKED_FILE);
write(standaloneFile, "Something");
// Create linked file in project that points the file above
IFile linkedFile = project.getFile(LINKED_FILE);
assertFalse(linkedFile.exists());
linkedFile.createLink(standaloneFile.toURI(),
IResource.ALLOW_MISSING_LOCAL, null);
// Prepare a mixed selection
Object[] mixedSelection = { linkedFile,
project.getFile(FILE1), project.getFile(FILE2) };
for (RepositoryActionHandler handler : handlers) {
String handlerClass = handler.getClass().getSimpleName();
assertTrue(linkedFile.exists());
assertTrue(linkedFile.isLinked(IResource.CHECK_ANCESTORS));
IPath location = linkedFile.getLocation();
assertNotNull(location);
assertNotNull(
RepositoryMapping.getMapping(linkedFile.getProject()));
assertNull(RepositoryMapping.getMapping(linkedFile));
assertNull(RepositoryMapping.getMapping(location));
assertFalse(handler.isEnabled());
Repository[] repositories = handler.getRepositories();
assertEquals(handlerClass
+ " found (unexpected) repository mapping for " + location,
"[]", Arrays.toString(repositories));
handler.setSelection(new StructuredSelection(linkedFile));
assertEquals(handlerClass
+ " found (unexpected) repository mapping for " + location,
"[]", Arrays.toString(repositories));
assertFalse(handlerClass
+ " is enabled on a linked resource pointing outside any project and repository: "
+ location, handler.isEnabled());
handler.setSelection(new StructuredSelection(mixedSelection));
assertFalse(handler.getClass().getSimpleName()
+ " is enabled when selection contains a linked resource pointing outside any project and repository: "
+ location, handler.isEnabled());
}
}
}