blob: 38ebe79161401ff512211987c74b99f89bf9c238 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* 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:
******************************************************************************/
package org.eclipse.emf.emfstore.server.test;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.addElement;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.branch;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.checkout;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.commit;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.getMergedVersion;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.mergeWithBranch;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.nullProgressMonitor;
import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.share;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.Callable;
import org.eclipse.emf.emfstore.client.ESLocalProject;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTestWithLoggedInUserMock;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.client.test.common.dsl.TestElementFeatures;
import org.eclipse.emf.emfstore.client.test.common.dsl.Update;
import org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil;
import org.eclipse.emf.emfstore.client.util.RunESCommand;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.exceptions.InvalidVersionSpecException;
import org.eclipse.emf.emfstore.internal.server.model.ProjectHistory;
import org.eclipse.emf.emfstore.internal.server.model.impl.api.versionspec.ESVersionSpecImpl;
import org.eclipse.emf.emfstore.internal.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.internal.server.model.versioning.Version;
import org.eclipse.emf.emfstore.internal.server.model.versioning.Versions;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.eclipse.emf.emfstore.server.model.versionspec.ESPrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versionspec.ESVersionSpec;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class BranchTests extends ESTestWithLoggedInUserMock {
private static final String JERRY = "Jerry"; //$NON-NLS-1$
private static final String GUENTHER = "Guenther"; //$NON-NLS-1$
private static final String TOM = "Tom"; //$NON-NLS-1$
private static final String MYTAG = "mytag"; //$NON-NLS-1$
private static final String TEST = "test"; //$NON-NLS-1$
private static final String JUERGEN = "Juergen"; //$NON-NLS-1$
private static final String TRUNK = "trunk"; //$NON-NLS-1$
private static final String HORST = "Horst"; //$NON-NLS-1$
private static final String B1 = "b1"; //$NON-NLS-1$
private static final String B2 = "b2"; //$NON-NLS-1$
@BeforeClass
public static void beforeClass() {
startEMFStore();
}
@AfterClass
public static void afterClass() {
stopEMFStore();
}
@Override
@Before
public void before() {
super.before();
}
@Override
@After
public void after() {
super.after();
}
@Test
public void createBranchFromTrunk() throws ESException {
addElement(getLocalProject(), Create.testElement(HORST));
share(getUsersession(), getLocalProject());
branch(getLocalProject(), B1);
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(2, history.getVersions().size());
final Version initialVersion = history.getVersions().get(0);
final Version branchedVersion = history.getVersions().get(1);
assertEquals(TRUNK, initialVersion.getPrimarySpec().getBranch());
assertEquals(B1, branchedVersion.getPrimarySpec().getBranch());
assertTrue(branchedVersion.getAncestorVersion() == initialVersion);
assertNull(branchedVersion.getNextVersion());
assertNull(branchedVersion.getPreviousVersion());
assertNull(initialVersion.getNextVersion());
assertNull(initialVersion.getPreviousVersion());
}
@Test
public void createBranchFromTrunkWithChanges() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
branch(getLocalProject(), B1);
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(2, history.getVersions().size());
final Version initialVersion = history.getVersions().get(0);
final Version branchedVersion = history.getVersions().get(1);
assertEquals(TRUNK, initialVersion.getPrimarySpec().getBranch());
assertEquals(B1, branchedVersion.getPrimarySpec().getBranch());
assertTrue(branchedVersion.getAncestorVersion() == initialVersion);
assertNull(branchedVersion.getNextVersion());
}
@Test
public void createBranchFromBranch() throws ESException {
addElement(getLocalProject(), Create.testElement(HORST));
share(getUsersession(), getLocalProject());
branch(getLocalProject(), B1);
branch(getLocalProject(), B2);
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(3, history.getVersions().size());
final Version initialVersion = history.getVersions().get(0);
final Version branchedVersion = history.getVersions().get(1);
final Version branchOfBranch = history.getVersions().get(2);
assertEquals(TRUNK, initialVersion.getPrimarySpec().getBranch());
assertEquals(B1, branchedVersion.getPrimarySpec().getBranch());
assertEquals(B2, branchOfBranch.getPrimarySpec().getBranch());
assertTrue(branchedVersion.getAncestorVersion() == initialVersion);
assertTrue(branchOfBranch.getAncestorVersion() == branchedVersion);
assertNull(branchedVersion.getNextVersion());
assertNull(branchOfBranch.getNextVersion());
}
@Test
public void commitToBranch() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
branch(getLocalProject(), B1);
// FIXME: update class?
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setName(JUERGEN);
return null;
}
});
commit(getLocalProject());
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(3, history.getVersions().size());
final Version initialVersion = history.getVersions().get(0);
final Version branchedVersion = history.getVersions().get(1);
final Version commit = history.getVersions().get(2);
assertEquals(TRUNK, initialVersion.getPrimarySpec().getBranch());
assertEquals(B1, branchedVersion.getPrimarySpec().getBranch());
assertEquals(B1, commit.getPrimarySpec().getBranch());
assertTrue(branchedVersion.getAncestorVersion() == initialVersion);
assertTrue(branchedVersion.getNextVersion() == commit);
assertTrue(commit.getAncestorVersion() == null);
assertTrue(commit.getPreviousVersion() == branchedVersion);
}
@SuppressWarnings("unchecked")
@Test
public void updateFromBranch() throws InvalidVersionSpecException, ESException {
final ESLocalProject project = Create.project(TEST);
final TestElement testElement = Create.testElement(HORST);
addElement(project, testElement);
share(getUsersession(), project);
branch(project, B1);
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
commit(project);
final ProjectHistory history = getHistory(project);
assertEquals(3, history.getVersions().size());
final Version commit = history.getVersions().get(2);
// create version
final PrimaryVersionSpec newVersion = ModelUtil.clone(getEMFStore().createVersion(
ModelUtil.clone(
ESLocalProjectImpl.class.cast(project).toInternalAPI().getUsersession().getSessionId()),
ModelUtil.clone(ESLocalProjectImpl.class.cast(project).toInternalAPI().getProjectId()),
ModelUtil.clone(commit.getPrimarySpec()), ModelUtil.clone(commit.getChanges()), null, null,
ModelUtil.clone(commit.getLogMessage())));
assertEquals(4, history.getVersions().size());
assertFalse(newVersion.equals(project.getBaseVersion()));
ProjectUtil.update(project);
assertEquals(newVersion,
((ESVersionSpecImpl<ESPrimaryVersionSpec, PrimaryVersionSpec>) project.getBaseVersion()).toInternalAPI());
}
@Test
public void tagBranch() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
final ESPrimaryVersionSpec branch = branch(getLocalProject(), B1).getBaseVersion();
getLocalProject().addTag(branch,
ESVersionSpec.FACTORY.createTAG(MYTAG, branch.getBranch()),
nullProgressMonitor());
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(2, history.getVersions().size());
final Version initialVersion = history.getVersions().get(0);
final Version branchedVersion = history.getVersions().get(1);
assertEquals(TRUNK, initialVersion.getPrimarySpec().getBranch());
assertEquals(B1, branchedVersion.getPrimarySpec().getBranch());
assertEquals(1, branchedVersion.getTagSpecs().size());
assertEquals(MYTAG, branchedVersion.getTagSpecs().get(0).getName());
}
@Test
public void untagBranch() throws ESException {
final TestElement testElement = Create.testElement(HORST);
share(getUsersession(), getLocalProject());
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
final ESLocalProject branch = branch(getLocalProject(), B1);
final ProjectHistory history = getHistory(getLocalProject());
assertEquals(2, history.getVersions().size());
final Version branchedVersion = history.getVersions().get(1);
branchedVersion.getTagSpecs().add(Versions.createTAG(MYTAG, B1));
assertEquals(1, branchedVersion.getTagSpecs().size());
assertEquals(MYTAG, branchedVersion.getTagSpecs().get(0).getName());
getLocalProject().removeTag(branch.getBaseVersion(),
ESVersionSpec.FACTORY.createTAG(MYTAG, B1), nullProgressMonitor());
assertEquals(0, branchedVersion.getTagSpecs().size());
}
@Test
public void backmerge() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
// checkout second trunk project
final ESLocalProject trunk = checkout(getLocalProject());
branch(getLocalProject(), B1);
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
final ESPrimaryVersionSpec latestOnBranch = commit(getLocalProject()).getBaseVersion();
final TestElement test1 = (TestElement) trunk.getModelElement(
getLocalProject().getModelElementId(testElement));
assertTrue(test1 != null);
assertEquals(HORST, test1.getName());
// merge
mergeWithBranch(trunk, latestOnBranch, 1);
final TestElement test2 = (TestElement) trunk.getModelElement(
getLocalProject().getModelElementId(testElement));
assertTrue(test2 != null);
assertEquals(JUERGEN, test2.getName());
}
@Test
public void backmergeMultipleCP() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
// checkout second trunk project
final ESLocalProject trunk = checkout(getLocalProject());
branch(getLocalProject(), B1);
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
commit(getLocalProject());
Update.testElement(TestElementFeatures.name(), testElement, TOM);
final ESPrimaryVersionSpec latestOnBranch = commit(getLocalProject()).getBaseVersion();
final TestElement test1 = (TestElement) trunk.getModelElement(
getLocalProject().getModelElementId(testElement));
assertTrue(test1 != null);
assertEquals(HORST, test1.getName());
// merge
mergeWithBranch(trunk, latestOnBranch, 1);
final TestElement test2 = (TestElement) trunk.getModelElement(
getLocalProject().getModelElementId(testElement));
assertTrue(test2 != null);
assertEquals(TOM, test2.getName());
}
@Test
public void backmergeWithShortCut() throws ESException {
final TestElement branchElement = Create.testElement(HORST);
addElement(getLocalProject(), branchElement);
share(getUsersession(), getLocalProject());
// checkout second trunk project
final ESLocalProject trunk = checkout(getLocalProject());
final TestElement trunkElement = (TestElement) trunk.getModelElement(
getLocalProject().getModelElementId(branchElement));
Update.testElement(TestElementFeatures.name(), branchElement, JUERGEN);
ESPrimaryVersionSpec latestOnBranch = branch(getLocalProject(), B1).getBaseVersion();
Update.testElement(TestElementFeatures.name(), trunkElement, GUENTHER);
commit(trunk);
ProjectUtil.mergeWithBranch(trunk, latestOnBranch, 1);
mergeWithBranch(trunk, latestOnBranch, 1);
assertEquals(latestOnBranch, getMergedVersion(trunk));
assertEquals(JUERGEN, trunkElement.getName());
// commit merged changes
final ESPrimaryVersionSpec mergedToVersion = commit(trunk).getBaseVersion();
final ProjectHistory projectHistory = getHistory(trunk);
final Version version = projectHistory.getVersions().get(mergedToVersion.getIdentifier());
assertEquals(1, version.getMergedFromVersion().size());
assertTrue(getMergedVersion(trunk) == null);
Update.testElement(TestElementFeatures.name(), branchElement, TOM);
latestOnBranch = commit(getLocalProject()).getBaseVersion();
// because of the shortcut there should be no conflict. Due to missing canonization however, there is a
// conflict.
mergeWithBranch(trunk, latestOnBranch, 1);
assertEquals(TOM, trunkElement.getName());
}
// disabled, Otto please fix: @Test
public void backmergeWithShortCutMultipleCp() throws ESException {
final ESLocalProject branch = Create.project(TEST);
final TestElement branchElement = Create.testElement(HORST);
share(getUsersession(), branch);
// checkout second trunk project
final ESLocalProject trunk = checkout(branch);
final TestElement trunkElement = (TestElement) trunk.getModelElement(
branch.getModelElementId(branchElement));
Update.testElement(TestElementFeatures.name(), branchElement, JUERGEN);
ESPrimaryVersionSpec latestOnBranch = branch(branch, B1).getBaseVersion();
Update.testElement(TestElementFeatures.name(), trunkElement, GUENTHER);
commit(trunk);
mergeWithBranch(trunk, latestOnBranch, 1);
// commit merge
commit(trunk);
Update.testElement(TestElementFeatures.name(), branchElement, JERRY);
latestOnBranch = commit(branch).getBaseVersion();
Update.testElement(TestElementFeatures.name(), branchElement, TOM);
latestOnBranch = commit(branch).getBaseVersion();
// because of the shortcut there should be no conflict. Due to missing canonization however, there is a
// conflict.
mergeWithBranch(trunk, latestOnBranch, 1);
assertEquals(TOM, trunkElement.getName());
}
@Test
public void backmergeBranchToBranch() throws ESException {
final ESLocalProject outterBranch = Create.project(TEST);
final TestElement outterBranchElement = Create.testElement(HORST);
addElement(outterBranch, outterBranchElement);
share(getUsersession(), outterBranch);
branch(outterBranch, B1);
// checkout second trunk project
final ESLocalProject innerBranch = checkout(outterBranch);
final TestElement innerBranchElement = (TestElement) innerBranch.getModelElement(
outterBranch.getModelElementId(outterBranchElement));
Update.testElement(TestElementFeatures.name(), outterBranchElement, JUERGEN);
final ESPrimaryVersionSpec latestOnBranch = branch(outterBranch, B2).getBaseVersion();
Update.testElement(TestElementFeatures.name(), innerBranchElement, JERRY);
commit(innerBranch);
// merge
mergeWithBranch(innerBranch, latestOnBranch, 1);
assertEquals(JUERGEN, innerBranchElement.getName());
}
@Test
public void checkoutBranch() throws ESException {
final TestElement testElement = Create.testElement(HORST);
addElement(getLocalProject(), testElement);
share(getUsersession(), getLocalProject());
branch(getLocalProject(), B1);
Update.testElement(TestElementFeatures.name(), testElement, JUERGEN);
final ESLocalProject lastFromBranch = commit(getLocalProject());
final ESLocalProject secondProjectSpace = checkout(getLocalProject());
final TestElement test = (TestElement) secondProjectSpace.getModelElement(
getLocalProject().getModelElementId(testElement));
assertTrue(test != null);
assertEquals(JUERGEN, test.getName());
assertEquals(secondProjectSpace.getBaseVersion(), lastFromBranch.getBaseVersion());
}
}