blob: a9e88e172c018f3c5bcaf9d2cb79c50373628b33 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 SAP AG 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:
* Mathias Kinzler (SAP AG) - initial implementation
* Chris Aniszczyk <caniszczyk@gmail.com> - tag API changes
*******************************************************************************/
package org.eclipse.egit.ui.test.team.actions;
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.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.core.op.CommitOperation;
import org.eclipse.egit.core.op.TagOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.common.LocalRepositoryTestCase;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.repository.RepositoriesViewLabelProvider;
import org.eclipse.egit.ui.internal.repository.tree.LocalNode;
import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode;
import org.eclipse.egit.ui.internal.repository.tree.TagsNode;
import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTestUtils;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.util.FileUtils;
import org.eclipse.jgit.util.RawParseUtils;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.utils.TableCollection;
import org.eclipse.swtbot.swt.finder.waits.ICondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.swtbot.swt.finder.widgets.TimeoutException;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE.SharedImages;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests for the Team->Branch action
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class BranchAndResetActionTest extends LocalRepositoryTestCase {
private static String LOCAL_BRANCHES;
private static String TAGS;
private File repositoryFile;
@Before
public void setup() throws Exception {
repositoryFile = createProjectAndCommitToRepository();
Repository repo = lookupRepository(repositoryFile);
TagBuilder tag = new TagBuilder();
tag.setTag("SomeTag");
tag.setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR));
tag.setMessage("I'm just a little tag");
tag.setObjectId(repo.resolve(repo.getFullBranch()),
Constants.OBJ_COMMIT);
TagOperation top = new TagOperation(repo, tag, false);
top.execute(null);
touchAndSubmit(null);
RepositoriesViewLabelProvider provider = GitRepositoriesViewTestUtils
.createLabelProvider();
LOCAL_BRANCHES = provider.getText(new LocalNode(new RepositoryNode(
null, repo), repo));
TAGS = provider.getText(new TagsNode(new RepositoryNode(null, repo),
repo));
}
@Test
public void testCheckoutLocalBranches() throws Exception {
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "stable" });
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "master" });
}
@Test
public void testCheckoutWithConflicts() throws Exception {
String charset = ResourcesPlugin.getWorkspace().getRoot().getProject(
PROJ1).getDefaultCharset();
try {
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "stable" });
ResourcesPlugin.getWorkspace().getRoot().getProject(PROJ1)
.getFolder(FOLDER).getFile(FILE1).setContents(
new ByteArrayInputStream("New content"
.getBytes(charset)), IResource.NONE, null);
checkout(new String[] { LOCAL_BRANCHES, "master" });
SWTBotShell showConflicts = bot
.shell(UIText.BranchResultDialog_CheckoutConflictsTitle);
assertEquals(FILE1, showConflicts.bot().tree().getAllItems()[0]
.getItems()[0].getItems()[0].getText());
showConflicts.close();
} finally {
ResourcesPlugin.getWorkspace().getRoot().getProject(PROJ1)
.getFolder(FOLDER).getFile(FILE1).setContents(
new ByteArrayInputStream("Hello, world"
.getBytes(charset)), IResource.NONE, null);
}
}
@Test
public void testCheckoutWithNonDeleted() throws Exception {
// we need to check if this file system has problems to
// delete a file with an open FileInputStrem
IFile test = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJ1)
.getFolder(FOLDER).getFile("temp.txt");
test.create(new ByteArrayInputStream(new byte[0]), false, null);
File testFile = new File(test.getLocation().toString());
assertTrue(testFile.exists());
FileInputStream fis = new FileInputStream(testFile);
try {
FileUtils.delete(testFile);
return;
} catch (IOException e) {
// the test makes sense only if deletion of
// a file with open stream fails
} finally {
fis.close();
if (testFile.exists())
FileUtils.delete(testFile);
}
final Image folderImage = PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FOLDER);
final Image projectImage = PlatformUI.getWorkbench().getSharedImages()
.getImage(SharedImages.IMG_OBJ_PROJECT);
// checkout stable
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "stable" });
// add a file
IFile toBeDeleted = ResourcesPlugin.getWorkspace().getRoot()
.getProject(PROJ1).getFolder(FOLDER).getFile("ToBeDeleted");
toBeDeleted.create(new ByteArrayInputStream(new byte[0]), false, null);
ArrayList<IFile> untracked = new ArrayList<IFile>();
untracked.add(toBeDeleted);
// commit to stable
CommitOperation op = new CommitOperation(new IFile[] { toBeDeleted },
untracked, TestUtil.TESTAUTHOR, TestUtil.TESTCOMMITTER,
"Add to stable");
op.execute(null);
InputStream is = toBeDeleted.getContents();
try {
checkout(new String[] { LOCAL_BRANCHES, "master" });
final SWTBotShell showUndeleted = bot
.shell(UIText.NonDeletedFilesDialog_NonDeletedFilesTitle);
// repo relative path
assertEquals("ToBeDeleted", showUndeleted.bot().tree()
.getAllItems()[0].getItems()[0].getItems()[0].getText());
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
assertSame(folderImage, showUndeleted.bot().tree()
.getAllItems()[0].widget.getImage());
}
});
SWTBotToolbarDropDownButton pathButton = showUndeleted.bot().toolbarDropDownButton();
pathButton.menuItem(UIText.NonDeletedFilesTree_FileSystemPathsButton).click();
// see http://www.eclipse.org/forums/index.php/t/159133/ why we need this
pathButton.pressShortcut(KeyStroke.getInstance("ESC"));
// fs path
IPath path = new Path(lookupRepository(repositoryFile)
.getWorkTree().getPath()).append(PROJ1).append(FOLDER)
.append("ToBeDeleted");
SWTBotTreeItem[] items = showUndeleted.bot().tree().getAllItems();
for (int i = 0; i < path.segmentCount(); i++) {
boolean found = false;
String segment = path.segment(i);
for (SWTBotTreeItem item : items)
if (item.getText().equals(segment)) {
found = true;
items = item.getItems();
}
assertTrue(found);
}
pathButton.menuItem(UIText.NonDeletedFilesTree_ResourcePathsButton).click();
// see http://www.eclipse.org/forums/index.php/t/159133/ why we need this
pathButton.pressShortcut(KeyStroke.getInstance("ESC"));
// resource path
assertEquals("ToBeDeleted", showUndeleted.bot().tree()
.getAllItems()[0].getItems()[0].getItems()[0].getText());
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
assertSame(projectImage, showUndeleted.bot().tree()
.getAllItems()[0].widget.getImage());
}
});
ICondition treeEmpty = new ICondition() {
@Override
public boolean test() throws Exception {
return showUndeleted.bot().tree().getAllItems().length == 0;
}
@Override
public void init(SWTBot actBot) {
// nothing
}
@Override
public String getFailureMessage() {
return "Not deleted";
}
};
showUndeleted.bot().button(
UIText.NonDeletedFilesDialog_RetryDeleteButton).click();
try {
showUndeleted.bot().waitUntil(treeEmpty, 1000, 100);
fail("Should have failed");
} catch (TimeoutException e) {
// expected
}
is.close();
showUndeleted.bot().button(
UIText.NonDeletedFilesDialog_RetryDeleteButton).click();
showUndeleted.bot().waitUntil(treeEmpty, 1000, 100);
showUndeleted.close();
} finally {
is.close();
}
}
@Test
public void testResetToLocalBranch() throws Exception {
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "stable" });
String stable = getTestFileContent();
checkoutAndVerify(new String[] { LOCAL_BRANCHES, "master" });
String master = getTestFileContent();
assertFalse(stable.equals(master));
SWTBotShell resetDialog = openResetDialog();
SWTBotTreeItem localBranches = TestUtil.expandAndWait(
resetDialog.bot().tree().getTreeItem(LOCAL_BRANCHES));
TestUtil.getChildNode(localBranches, "stable").select();
resetDialog.bot().radio(
UIText.ResetTargetSelectionDialog_ResetTypeHardButton).click();
resetDialog.bot().button(UIText.ResetTargetSelectionDialog_ResetButton)
.click();
bot.shell(UIText.ResetTargetSelectionDialog_ResetQuestion).bot()
.button(IDialogConstants.YES_LABEL).click();
Job.getJobManager().join(JobFamilies.RESET, null);
String reset = getTestFileContent();
assertEquals("Wrong content after reset", stable, reset);
}
@Test
public void testCreateDeleteBranch() throws Exception {
assertNull(lookupRepository(repositoryFile).resolve("newBranch"));
SWTBotShell newBranchDialog = openCreateBranchDialog();
newBranchDialog.bot().textWithId("BranchName").setText("newBranch");
newBranchDialog.bot().checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
newBranchDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
assertNotNull(lookupRepository(repositoryFile).resolve("newBranch"));
SWTBotShell deleteBranchDialog = openDeleteBranchDialog();
SWTBotTreeItem localBranches = TestUtil.expandAndWait(
deleteBranchDialog.bot().tree().getTreeItem(LOCAL_BRANCHES));
TestUtil.getChildNode(localBranches, "newBranch").select();
deleteBranchDialog.bot().button(IDialogConstants.OK_LABEL).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
assertNull(lookupRepository(repositoryFile).resolve("newBranch"));
}
@Test
public void testCreateBranchSelectSource() throws Exception {
Repository repo = lookupRepository(repositoryFile);
assertNull(repo.resolve("branch-from-tag"));
SWTBotShell createBranchDialog = openCreateBranchDialog();
createBranchDialog.bot()
.button(UIText.CreateBranchPage_SourceSelectButton).click();
SWTBotShell sourceSelectionDialog = bot
.shell(UIText.CreateBranchPage_SourceSelectionDialogTitle);
SWTBotTree tree = sourceSelectionDialog.bot().tree();
SWTBotTreeItem tags = tree
.expandNode(UIText.RepositoriesViewLabelProvider_TagsNodeText);
TestUtil.getChildNode(tags, "SomeTag").select();
sourceSelectionDialog.bot().button(IDialogConstants.OK_LABEL).click();
SWTBotStyledText sourceLabel = createBranchDialog.bot().styledText(0);
assertEquals("SomeTag", sourceLabel.getText());
createBranchDialog.bot().textWithId("BranchName")
.setText("branch-from-tag");
createBranchDialog.bot()
.checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
createBranchDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
TestUtil.waitForJobs(100, 5000);
ObjectId resolvedBranch = repo.resolve("branch-from-tag");
ObjectId resolvedTagCommit = repo.resolve("SomeTag^{commit}");
assertNotNull(resolvedBranch);
assertEquals(resolvedTagCommit, resolvedBranch);
}
private SWTBotShell openCheckoutBranchDialog() {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String[] menuPath = new String[] {
util.getPluginLocalizedValue("TeamMenu.label"),
util.getPluginLocalizedValue("SwitchToMenu.label"),
UIText.SwitchToMenu_OtherMenuLabel };
ContextMenuHelper.clickContextMenu(projectExplorerTree, menuPath);
SWTBotShell dialog = bot
.shell(UIText.BranchSelectionAndEditDialog_WindowTitle);
return dialog;
}
private SWTBotShell openCreateBranchDialog() {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String[] menuPath = new String[] {
util.getPluginLocalizedValue("TeamMenu.label"),
util.getPluginLocalizedValue("SwitchToMenu.label"),
UIText.SwitchToMenu_NewBranchMenuLabel };
ContextMenuHelper.clickContextMenu(projectExplorerTree, menuPath);
SWTBotShell dialog = bot
.shell(UIText.CreateBranchWizard_NewBranchTitle);
return dialog;
}
private SWTBotShell openRenameBranchDialog() {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String[] menuPath = new String[] {
util.getPluginLocalizedValue("TeamMenu.label"),
util.getPluginLocalizedValue("AdvancedMenu.label"),
util.getPluginLocalizedValue("RenameBranchMenu.label") };
ContextMenuHelper.clickContextMenu(projectExplorerTree, menuPath);
SWTBotShell dialog = bot.shell(UIText.RenameBranchDialog_WindowTitle);
return dialog;
}
private SWTBotShell openDeleteBranchDialog() {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String[] menuPath = new String[] {
util.getPluginLocalizedValue("TeamMenu.label"),
util.getPluginLocalizedValue("AdvancedMenu.label"),
util.getPluginLocalizedValue("DeleteBranchMenu.label") };
ContextMenuHelper.clickContextMenu(projectExplorerTree, menuPath);
SWTBotShell dialog = bot.shell(UIText.DeleteBranchDialog_WindowTitle);
return dialog;
}
private SWTBotShell openResetDialog() {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String menuString = util.getPluginLocalizedValue("ResetAction_label");
ContextMenuHelper.clickContextMenu(projectExplorerTree, util
.getPluginLocalizedValue("TeamMenu.label"), menuString);
SWTBotShell dialog = bot
.shell(UIText.ResetTargetSelectionDialog_WindowTitle);
return dialog;
}
@Test
public void testRenameBranch() throws Exception {
SWTBotShell dialog = openRenameBranchDialog();
SWTBotTreeItem localBranches = TestUtil
.expandAndWait(dialog.bot().tree().getTreeItem(LOCAL_BRANCHES));
TestUtil.getChildNode(localBranches, "stable").select();
dialog.bot().button(UIText.RenameBranchDialog_RenameButtonLabel)
.click();
// rename stable to renamed
SWTBotShell newNameDialog = bot.shell(UIText.BranchRenameDialog_Title);
newNameDialog.bot().text().setText("master");
assertFalse(newNameDialog.bot().button(IDialogConstants.OK_LABEL)
.isEnabled());
newNameDialog.bot().text().setText("renamed");
newNameDialog.bot().button(IDialogConstants.OK_LABEL).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
dialog = openRenameBranchDialog();
SWTBotTreeItem localBranches2 = TestUtil
.expandAndWait(dialog.bot().tree().getTreeItem(LOCAL_BRANCHES));
TestUtil.getChildNode(localBranches2, "renamed").select();
dialog.bot().button(UIText.RenameBranchDialog_RenameButtonLabel)
.click();
// rename renamed to stable
newNameDialog = bot.shell(UIText.BranchRenameDialog_Title);
newNameDialog.bot().text().setText("stable");
newNameDialog.bot().button(IDialogConstants.OK_LABEL).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
dialog = openRenameBranchDialog();
SWTBotTreeItem localBranches3 = TestUtil
.expandAndWait(dialog.bot().tree().getTreeItem(LOCAL_BRANCHES));
TestUtil.getChildNode(localBranches3, "stable").select();
dialog.close();
}
@Test
public void testCheckoutTags() throws Exception {
checkoutAndVerify(new String[] { TAGS, "SomeTag" });
}
private void checkoutAndVerify(String[] nodeTexts)
throws IOException, Exception {
SWTBotShell dialog = openCheckoutBranchDialog();
TableCollection tc = dialog.bot().tree().selection();
assertEquals("Wrong selection count", 0, tc.rowCount());
TestUtil.navigateTo(dialog.bot().tree(), nodeTexts).select();
tc = dialog.bot().tree().selection();
assertEquals("Wrong selection count", 1, tc.rowCount());
assertTrue("Wrong item selected", tc.get(0, 0).startsWith(nodeTexts[1]));
Repository repo = lookupRepository(repositoryFile);
dialog.bot().button(UIText.CheckoutDialog_OkCheckout).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
if (ObjectId.isId(repo.getBranch())) {
String mapped = Activator.getDefault().getRepositoryUtil()
.mapCommitToRef(repo, repo.getBranch(), false);
assertEquals("Wrong branch", nodeTexts[1],
mapped.substring(mapped
.lastIndexOf('/') + 1));
} else
assertEquals("Wrong branch", nodeTexts[1], repo.getBranch());
}
private void checkout(String[] nodeTexts) throws Exception {
SWTBotShell dialog = openCheckoutBranchDialog();
TestUtil.navigateTo(dialog.bot().tree(), nodeTexts).select();
TableCollection tc = dialog.bot().tree().selection();
assertEquals("Wrong selection count", 1, tc.rowCount());
assertTrue("Wrong item selected", tc.get(0, 0).startsWith(nodeTexts[1]));
dialog.bot().button(UIText.CheckoutDialog_OkCheckout).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
}
}