/* Copyright (c) 2013-2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Victor Olaya (Boundless) - initial implementation
*/
package org.locationtech.geogig.test.integration;
import org.geotools.data.DataUtilities;
import org.junit.Test;
import org.locationtech.geogig.api.RevCommit;
import org.locationtech.geogig.api.plumbing.merge.CheckMergeScenarioOp;
import org.locationtech.geogig.api.plumbing.merge.MergeScenarioReport;
import org.locationtech.geogig.api.plumbing.merge.ReportMergeScenarioOp;
import org.locationtech.geogig.api.porcelain.AddOp;
import org.locationtech.geogig.api.porcelain.BranchCreateOp;
import org.locationtech.geogig.api.porcelain.CheckoutOp;
import org.locationtech.geogig.api.porcelain.CommitOp;
import org.locationtech.geogig.api.porcelain.RemoveOp;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.google.common.collect.Lists;
public class ReportMergeConflictsOpTest extends RepositoryTestCase {
@Override
protected void setUpInternal() throws Exception {
}
@Test
public void testAddedSameFeature() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insertAndAdd(points2);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insertAndAdd(points2);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertFalse(hasConflicts.booleanValue());
}
@Test
public void testRemovedSameFeature() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
deleteAndAdd(points1);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
deleteAndAdd(points1);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertFalse(hasConflicts.booleanValue());
}
@Test
public void testModifiedSameFeatureCompatible() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
Feature points1Modified = feature(pointsType, idP1, "StringProp1_2", new Integer(1000),
"POINT(1 1)");
insertAndAdd(points1Modified);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
Feature points1ModifiedB = feature(pointsType, idP1, "StringProp1_1", new Integer(2000),
"POINT(1 1)");
insertAndAdd(points1ModifiedB);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
assertEquals(1, conflicts.getMerged().size());
Feature pointsMerged = feature(pointsType, idP1, "StringProp1_2", new Integer(2000),
"POINT(1 1)");
assertEquals(pointsMerged, conflicts.getMerged().get(0).getFeature());
Boolean hasConflictsOrAutomerge = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflictsOrAutomerge.booleanValue());
}
@Test
public void testModifiedSameAttributeCompatible() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
Feature points1Modified = feature(pointsType, idP1, "StringProp1_2", new Integer(1000),
"POINT(1 1)");
insertAndAdd(points1Modified);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
Feature points1ModifiedB = feature(pointsType, idP1, "StringProp1_2", new Integer(2000),
"POINT(1 1)");
insertAndAdd(points1ModifiedB);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(1, conflicts.getUnconflicted().size());
Boolean hasConflictsOrAutomerge = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflictsOrAutomerge.booleanValue());
}
@Test
public void testModifiedSameFeatureIncompatible() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
Feature points1Modified = feature(pointsType, idP1, "StringProp1_2", new Integer(1000),
"POINT(1 1)");
insertAndAdd(points1Modified);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
Feature points1ModifiedB = feature(pointsType, idP1, "StringProp1_3", new Integer(1000),
"POINT(1 1)");
insertAndAdd(points1ModifiedB);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testModifiedAndRemoved() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
Feature points1Modified = feature(pointsType, idP1, "StringProp1_2", new Integer(1000),
"POINT(1 1)");
insertAndAdd(points1Modified);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
deleteAndAdd(points1);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testRemovedTreeOnlyInOneBranch() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insertAndAdd(points2);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
geogig.command(RemoveOp.class).addPathToRemove(pointsName).call();
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size());
assertEquals(1, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testAddedDifferentFeatures() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insertAndAdd(points2);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insertAndAdd(points3);
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(1, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertFalse(hasConflicts.booleanValue());
}
@Test
public void testAddedSameFeatureType() throws Exception {
insertAndAdd(lines1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insert(points2);
delete(points2);
geogig.command(AddOp.class).call();
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insert(points2);
delete(points2);
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertFalse(hasConflicts.booleanValue());
}
@Test
public void testAddedDifferentFeatureType() throws Exception {
insertAndAdd(lines1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insert(points2);
delete(points2);
geogig.command(AddOp.class).call();
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insert(points1B);
delete(points1B);
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size());
assertEquals(0, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testModifiedDefaultFeatureTypeInBothBranches() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
geogig.getRepository().workingTree().updateTypeTree(pointsName, modifiedPointsType);
insert(points1B);
geogig.command(AddOp.class).call();
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
String modifiedPointsTypeSpecB = "sp:String,ip:Integer,pp:Point:srid=4326,extraB:String";
SimpleFeatureType modifiedPointsTypeB = DataUtilities.createType(pointsNs, pointsName,
modifiedPointsTypeSpecB);
geogig.getRepository().workingTree().updateTypeTree(pointsName, modifiedPointsTypeB);
insert(points1B);
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size()); // the conflict in the feature type
assertEquals(0, conflicts.getUnconflicted().size()); // the change in the feature is the
// same, so no conflict
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testModifiedFeatureTypeInOneBranchEditedAttributeValueInTheOther() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insertAndAdd(points1_modified);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insert(points1B);
insert(points2);
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(1, conflicts.getConflicts().size());
assertEquals(1, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertTrue(hasConflicts.booleanValue());
}
@Test
public void testModifiedFeatureTypeInOneBranch() throws Exception {
insertAndAdd(points1);
geogig.command(CommitOp.class).call();
geogig.command(BranchCreateOp.class).setName("TestBranch").call();
insertAndAdd(points3);
RevCommit masterCommit = geogig.command(CommitOp.class).call();
geogig.command(CheckoutOp.class).setSource("TestBranch").call();
insert(points1B);
insert(points2);
geogig.command(AddOp.class).call();
RevCommit branchCommit = geogig.command(CommitOp.class).call();
MergeScenarioReport conflicts = geogig.command(ReportMergeScenarioOp.class)
.setMergeIntoCommit(masterCommit).setToMergeCommit(branchCommit).call();
assertEquals(0, conflicts.getConflicts().size());
assertEquals(2, conflicts.getUnconflicted().size());
Boolean hasConflicts = geogig.command(CheckMergeScenarioOp.class)
.setCommits(Lists.newArrayList(masterCommit, branchCommit)).call();
assertFalse(hasConflicts.booleanValue());
}
}