blob: de5c97c8cce5ec34592539bc3b960c9b406e765b [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
*******************************************************************************/
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.assertTrue;
import java.io.File;
import java.util.concurrent.TimeUnit;
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.RemoteTrackingNode;
import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode;
import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.JobJoiner;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTestUtils;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests for the Team->Fetch and Team->Merge actions
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class FetchAndMergeActionTest extends LocalRepositoryTestCase {
private File repositoryFile;
private File childRepositoryFile;
private String REMOTE_BRANCHES;
private String LOCAL_BRANCHES;
private String initialCommitId;
@Before
public void setup() throws Exception {
repositoryFile = createProjectAndCommitToRepository();
childRepositoryFile = createChildRepository(repositoryFile);
RepositoriesViewLabelProvider provider = GitRepositoriesViewTestUtils
.createLabelProvider();
Repository repo = lookupRepository(childRepositoryFile);
REMOTE_BRANCHES = provider.getText(new RemoteTrackingNode(
new RepositoryNode(null, repo), repo));
LOCAL_BRANCHES = provider.getText(new LocalNode(new RepositoryNode(
null, repo), repo));
ObjectId id = repo.resolve(repo.getFullBranch());
initialCommitId = id.name();
}
@Test
public void testFetchFromOriginThenMerge() throws Exception {
touchAndSubmit(null);
deleteAllProjects();
shareProjects(childRepositoryFile);
String oldContent = getTestFileContent();
fetch();
String uri = lookupRepository(childRepositoryFile).getConfig()
.getString(ConfigConstants.CONFIG_REMOTE_SECTION, "origin",
ConfigConstants.CONFIG_KEY_URL);
SWTBotShell confirm = bot.shell(NLS.bind(
UIText.FetchResultDialog_title, uri));
SWTBotTree tree = confirm.bot().tree();
String branch = tree.getAllItems()[0].getText();
assertTrue("Wrong result",
branch.contains(initialCommitId.substring(0, 7)));
confirm.close();
String newContent = getTestFileContent();
assertEquals(oldContent, newContent);
fetch();
confirm = bot.shell(NLS.bind(UIText.FetchResultDialog_title, uri));
int count = confirm.bot().tree().rowCount();
confirm.close();
assertEquals("Wrong result count", 0, count);
newContent = getTestFileContent();
assertEquals(oldContent, newContent);
SWTBotShell mergeDialog = openMergeDialog();
SWTBotTreeItem remoteBranches = TestUtil.expandAndWait(
mergeDialog.bot().tree().getTreeItem(REMOTE_BRANCHES));
TestUtil.getChildNode(remoteBranches, "origin/master").select();
mergeDialog.bot().button(UIText.MergeTargetSelectionDialog_ButtonMerge)
.click();
bot.shell(UIText.MergeAction_MergeResultTitle).close();
newContent = getTestFileContent();
assertFalse(oldContent.equals(newContent));
}
@Test
public void testMergeSquash() throws Exception {
String oldContent = getTestFileContent();
RevCommit oldCommit = getCommitForHead();
createNewBranch("newBranch", true);
touchAndSubmit("branch commit #1");
touchAndSubmit("branch commit #2");
String branchContent = getTestFileContent();
checkoutBranch(Constants.MASTER);
assertEquals(oldContent, getTestFileContent());
mergeBranch("newBranch", true);
assertEquals(oldCommit, getCommitForHead());
assertEquals(branchContent, getTestFileContent());
}
private RevCommit getCommitForHead() throws Exception {
Repository repo = lookupRepository(repositoryFile);
try (RevWalk rw = new RevWalk(repo)) {
ObjectId id = repo.resolve(repo.getFullBranch());
return rw.parseCommit(id);
}
}
private void mergeBranch(String branchToMerge, boolean squash) throws Exception {
SWTBotShell mergeDialog = openMergeDialog();
TestUtil.navigateTo(mergeDialog.bot().tree(),
new String[] { LOCAL_BRANCHES, branchToMerge }).select();
if (squash)
mergeDialog.bot().radio(UIText.MergeTargetSelectionDialog_MergeTypeSquashButton).click();
mergeDialog.bot().button(UIText.MergeTargetSelectionDialog_ButtonMerge).click();
bot.shell(UIText.MergeAction_MergeResultTitle).close();
}
private void createNewBranch(String newBranch, boolean checkout) {
SWTBotShell newBranchDialog = openCreateBranchDialog();
newBranchDialog.bot().textWithId("BranchName").setText(newBranch);
if (!checkout)
newBranchDialog.bot().checkBox(UIText.CreateBranchPage_CheckoutButton).deselect();
newBranchDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
}
private void fetch() throws Exception {
SWTBotShell fetchDialog = openFetchDialog();
fetchDialog.bot().button(IDialogConstants.NEXT_LABEL).click();
JobJoiner jobJoiner = JobJoiner.startListening(JobFamilies.FETCH, 20, TimeUnit.SECONDS);
fetchDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
jobJoiner.join();
}
private SWTBotShell openFetchDialog() throws Exception {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String menuString = util.getPluginLocalizedValue("FetchAction_label");
String submenuString = util
.getPluginLocalizedValue("RemoteSubMenu.label");
ContextMenuHelper.clickContextMenu(projectExplorerTree, "Team",
submenuString, menuString);
SWTBotShell dialog = bot.shell(UIText.FetchWizard_windowTitleDefault);
return dialog;
}
private SWTBotShell openMergeDialog() throws Exception {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String menuString = util.getPluginLocalizedValue("MergeAction_label");
ContextMenuHelper.clickContextMenu(projectExplorerTree, "Team",
menuString);
Repository repo = lookupRepository(childRepositoryFile);
SWTBotShell dialog = bot.shell(NLS.bind(
UIText.MergeTargetSelectionDialog_TitleMergeWithBranch,
repo.getBranch()));
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 void checkoutBranch(String branchToCheckout) {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
getProjectItem(projectExplorerTree, PROJ1).select();
String[] menuPath = new String[] {
util.getPluginLocalizedValue("TeamMenu.label"),
util.getPluginLocalizedValue("SwitchToMenu.label"),
branchToCheckout };
JobJoiner jobJoiner = JobJoiner.startListening(JobFamilies.CHECKOUT, 60, TimeUnit.SECONDS);
ContextMenuHelper.clickContextMenuSync(projectExplorerTree, menuPath);
jobJoiner.join();
}
}