Package org.locationtech.geogig.test.integration

Source Code of org.locationtech.geogig.test.integration.RevParseIntegrationTest

/* Copyright (c) 2012-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:
* Gabriel Roldan (Boundless) - initial implementation
*/
package org.locationtech.geogig.test.integration;

import org.junit.Test;
import org.locationtech.geogig.api.CommitBuilder;
import org.locationtech.geogig.api.ObjectId;
import org.locationtech.geogig.api.Ref;
import org.locationtech.geogig.api.RevCommit;
import org.locationtech.geogig.api.plumbing.RevParse;
import org.locationtech.geogig.api.plumbing.UpdateRef;
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.InitOp;

import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;

public class RevParseIntegrationTest extends RepositoryTestCase {

    RevCommit masterCommit1, masterCommit2, masterCommit3, masterCommit4;

    RevCommit branchCommit1, branchCommit2;

    RevCommit mergeCommit;

    /**
     * <pre>
     * <code>
     *                                                                         HEAD
     *                                                                          /                                                                            
     * masterCommit1    masterCommit2   masterCommit3   mergeCommit   masterCommit4
     *    o----------------o----------------o-------------o--------------o
     *                      \                            /
     *                       \                          /
     *                        o------------------------o
     *                 branchCommit1                 branchCommit2
     *                                                        \
     *                                                        BRANCH
     * </code>
     * </pre>
     */
    @Override
    protected void setUpInternal() throws Exception {
        geogig.command(InitOp.class).call();

        masterCommit1 = commit("masterCommit1");
        masterCommit2 = commit("masterCommit2");

        Ref branch = geogig.command(BranchCreateOp.class).setName("BRANCH")
                .setSource(masterCommit2.getId().toString()).setAutoCheckout(true).call();
        assertEquals(masterCommit2.getId(), branch.getObjectId());

        branchCommit1 = commit("branchCommit1");
        branchCommit2 = commit("branchCommit2");

        geogig.command(CheckoutOp.class).setSource("master").call();

        masterCommit3 = commit("masterCommit3");

        // fake a merge until we have the merge op in place

        CommitBuilder cb = new CommitBuilder();
        cb.setParentIds(ImmutableList.of(masterCommit3.getId(), branchCommit2.getId()));
        cb.setMessage("mergeCommit");
        cb.setAuthor("groldan");
        cb.setCommitter("groldan");
        cb.setTreeId(masterCommit3.getTreeId());
        long now = System.currentTimeMillis();
        cb.setAuthorTimestamp(now);
        cb.setCommitterTimestamp(now);
        mergeCommit = cb.build();

        getRepository().objectDatabase().put(mergeCommit);

        geogig.command(UpdateRef.class).setName("refs/heads/master")
                .setOldValue(masterCommit3.getId()).setNewValue(mergeCommit.getId()).call();
        // end faking up merge op

        masterCommit4 = commit("masterCommit4");
    }

    private RevCommit commit(String message) {
        return geogig.command(CommitOp.class).setAllowEmpty(true).call();
    }

    private Optional<ObjectId> revParse(String refSpec) {
        return geogig.command(RevParse.class).setRefSpec(refSpec).call();
    }

    private void assertParsed(RevCommit expected, Optional<ObjectId> parsed) {
        assertParsed(expected.getId(), parsed);
    }

    private void assertParsed(ObjectId expected, Optional<ObjectId> parsed) {
        assertTrue("expected " + expected + " got absent", parsed.isPresent());
        assertEquals(expected, parsed.get());
    }

    private void assertAbsent(Optional<ObjectId> parsed) {
        assertFalse("expected absent, got " + parsed, parsed.isPresent());
    }

    private String partialId(RevCommit commit, int length) {
        return commit.getId().toString().substring(0, length);
    }

    @Test
    public void testPrecondition() {
        try {
            revParse(null);
            fail("Expected IllegalStateException");
        } catch (IllegalStateException expected) {
            assertTrue(expected.getMessage(), expected.getMessage().contains("refSpec"));
        }
    }

    @Test
    public void testParseHeadNames() {
        assertParsed(masterCommit4, revParse(Ref.HEAD));
        assertParsed(masterCommit4, revParse("master"));
        assertParsed(masterCommit4, revParse("heads/master"));
        assertParsed(masterCommit4, revParse("refs/heads/master"));

        assertParsed(branchCommit2, revParse("BRANCH"));
        assertParsed(branchCommit2, revParse("heads/BRANCH"));
        assertParsed(branchCommit2, revParse("refs/heads/BRANCH"));
    }

    @Test
    public void testParseCommitIds() {
        assertParsed(masterCommit1, revParse(masterCommit1.getId().toString()));
        assertParsed(masterCommit2, revParse(masterCommit2.getId().toString()));
        assertParsed(masterCommit3, revParse(masterCommit3.getId().toString()));
        assertParsed(masterCommit4, revParse(masterCommit4.getId().toString()));

        assertParsed(branchCommit1, revParse(branchCommit1.getId().toString()));
        assertParsed(branchCommit2, revParse(branchCommit2.getId().toString()));

        assertParsed(mergeCommit.getId(), revParse(mergeCommit.getId().toString()));
    }

    @Test
    public void testParseHeadParentIndex() {
        // sanity check first
        assertEquals(mergeCommit.getId(), masterCommit4.getParentIds().get(0));

        ObjectId expected;

        expected = masterCommit4.parentN(0).get();
        assertParsed(expected, revParse("HEAD^"));
        assertParsed(expected, revParse("HEAD^1"));
        assertAbsent(revParse("HEAD^2"));
        assertParsed(masterCommit4, revParse("HEAD^0"));

        expected = mergeCommit.parentN(0).get();
        assertParsed(expected, revParse("HEAD^^"));
        assertParsed(expected, revParse("HEAD^1^"));
        assertParsed(expected, revParse("HEAD^1^1"));

        expected = mergeCommit.parentN(1).get();
        assertParsed(expected, revParse("HEAD^^2"));
        assertParsed(expected, revParse("HEAD^1^2"));

        assertParsed(branchCommit2, revParse("BRANCH"));
        assertParsed(branchCommit2, revParse("heads/BRANCH"));
        assertParsed(branchCommit2, revParse("refs/heads/BRANCH"));

        assertParsed(branchCommit1, revParse("BRANCH^"));
        assertParsed(branchCommit1, revParse("heads/BRANCH^"));
        assertParsed(branchCommit1, revParse("refs/heads/BRANCH^"));
        assertParsed(branchCommit1, revParse("BRANCH^1"));
        assertParsed(branchCommit1, revParse("heads/BRANCH^1"));
        assertParsed(branchCommit1, revParse("refs/heads/BRANCH^1"));
    }

    @Test
    public void testParseObjectIdParentIndex() {
        assertAbsent(revParse(ObjectId.NULL.toString() + "^1"));

        assertParsed(mergeCommit, revParse(masterCommit4.getId() + "^"));
        assertParsed(mergeCommit, revParse(masterCommit4.getId() + "^1"));
        assertAbsent(revParse(masterCommit4.getId() + "^2"));

        assertParsed(masterCommit3, revParse(mergeCommit.getId() + "^"));
        assertParsed(masterCommit3, revParse(mergeCommit.getId() + "^1"));

        assertParsed(branchCommit2, revParse(mergeCommit.getId() + "^2"));
        assertParsed(branchCommit1, revParse(mergeCommit.getId() + "^2^"));
        assertParsed(branchCommit1, revParse(mergeCommit.getId() + "^2^1"));
        assertParsed(masterCommit2, revParse(mergeCommit.getId() + "^2^^"));
        assertParsed(masterCommit2, revParse(mergeCommit.getId() + "^2^^1"));
        assertAbsent(revParse(mergeCommit.getId() + "^3"));
        assertAbsent(revParse(mergeCommit.getId() + "^33"));
        assertAbsent(revParse(mergeCommit.getId() + "^2^^2"));

        assertParsed(masterCommit2, revParse(masterCommit3.getId() + "^"));
        assertParsed(masterCommit2, revParse(masterCommit3.getId() + "^1"));

        assertParsed(masterCommit1, revParse(masterCommit2.getId() + "^"));
        assertParsed(masterCommit1, revParse(masterCommit2.getId() + "^1"));

        assertAbsent(revParse(masterCommit1.getId() + "^"));
        assertAbsent(revParse(masterCommit1.getId() + "^1"));
        assertAbsent(revParse(masterCommit1.getId() + "^2"));
    }

    @Test
    public void testParsePartialObjectIdParentIndex() {
        assertParsed(mergeCommit, revParse(partialId(masterCommit4, 5) + "^"));
        assertParsed(mergeCommit, revParse(partialId(masterCommit4, 7) + "^1"));
        assertAbsent(revParse(partialId(masterCommit4, 9) + "^2"));

        assertParsed(masterCommit3, revParse(partialId(mergeCommit, 7) + "^"));
        assertParsed(masterCommit3, revParse(partialId(mergeCommit, 5) + "^1"));

        assertParsed(branchCommit2, revParse(partialId(mergeCommit, 5) + "^2"));
        assertParsed(branchCommit1, revParse(partialId(mergeCommit, 6) + "^2^"));
        assertParsed(branchCommit1, revParse(partialId(mergeCommit, 7) + "^2^1"));
        assertParsed(masterCommit2, revParse(partialId(mergeCommit, 8) + "^2^^"));
        assertParsed(masterCommit2, revParse(partialId(mergeCommit, 9) + "^2^^1"));
        assertAbsent(revParse(partialId(mergeCommit, 10) + "^3"));
        assertAbsent(revParse(partialId(mergeCommit, 9) + "^33"));
        assertAbsent(revParse(partialId(mergeCommit, 8) + "^2^^2"));
    }

    @Test
    public void testParseAncestors() {
        assertParsed(masterCommit4, revParse(Ref.HEAD + "~0"));
        assertParsed(mergeCommit, revParse(Ref.HEAD + "~1"));
        assertParsed(masterCommit3, revParse(Ref.HEAD + "~2"));
        assertParsed(masterCommit2, revParse(Ref.HEAD + "~3"));
        assertParsed(masterCommit1, revParse(Ref.HEAD + "~4"));
        assertAbsent(revParse(Ref.HEAD + "~5"));

        assertParsed(branchCommit2, revParse("BRANCH~0"));
        assertParsed(branchCommit1, revParse("BRANCH~1"));
        assertParsed(masterCommit2, revParse("BRANCH~2"));
        assertParsed(masterCommit1, revParse("BRANCH~3"));
        assertAbsent(revParse("BRANCH~4"));
        assertAbsent(revParse("BRANCH~10"));
    }
}
TOP

Related Classes of org.locationtech.geogig.test.integration.RevParseIntegrationTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.