org.eclipse.egit.core.synchronize.GitResourceVariantTreeTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.core.synchronize.GitResourceVariantTreeTest.java

Source

/*******************************************************************************
 * Copyright (C) 2010, Dariusz Luksza <dariusz@luksza.org>
 *
 * 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
 *******************************************************************************/
package org.eclipse.egit.core.synchronize;

import static org.eclipse.jgit.lib.Constants.HEAD;
import static org.eclipse.jgit.lib.Constants.MASTER;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Comparator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.egit.core.op.ConnectProviderOperation;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.core.synchronize.dto.GitSynchronizeData;
import org.eclipse.egit.core.synchronize.dto.GitSynchronizeDataSet;
import org.eclipse.egit.core.test.GitTestCase;
import org.eclipse.egit.core.test.TestProject;
import org.eclipse.egit.core.test.TestRepository;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.team.core.variants.IResourceVariant;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class GitResourceVariantTreeTest extends GitTestCase {

    private Repository repo;

    private IProject iProject;

    private TestRepository testRepo;

    @Before
    public void createGitRepository() throws Exception {
        iProject = project.project;
        testRepo = new TestRepository(gitDir);
        testRepo.connect(iProject);
        repo = RepositoryMapping.getMapping(iProject).getRepository();
    }

    @After
    public void clearGitResources() throws Exception {
        testRepo.disconnect(iProject);
        testRepo.dispose();
        repo = null;
        super.tearDown();
    }

    /**
     * roots() method should return list of projects that are associated with
     * given repository. In this case there is only one project associated with
     * this repository therefore only one root should be returned.
     *
     * @throws Exception
     */
    @Test
    public void shouldReturnOneRoot() throws Exception {
        // when
        new Git(repo).commit().setAuthor("JUnit", "junit@egit.org").setMessage("Initial commit").call();
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, HEAD, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitTestResourceVariantTree(dataSet, null);

        // then
        assertEquals(1, grvt.roots().length);
        IResource actualProject = grvt.roots()[0];
        assertEquals(this.project.getProject(), actualProject);
    }

    /**
     * When we have two or more project associated with repository, roots()
     * method should return list of project. In this case we have two project
     * associated with particular repository, therefore '2' value is expected.
     *
     * @throws Exception
     */
    @Test
    public void shouldReturnTwoRoots() throws Exception {
        // when
        // create second project
        TestProject secondProject = new TestProject(true, "Project-2");
        IProject secondIProject = secondProject.project;
        // add connect project with repository
        new ConnectProviderOperation(secondIProject, gitDir).execute(null);
        new Git(repo).commit().setAuthor("JUnit", "junit@egit.org").setMessage("Initial commit").call();
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, HEAD, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitTestResourceVariantTree(dataSet, null);

        // then
        IResource[] roots = grvt.roots();
        // sort in order to be able to assert the project instances
        Arrays.sort(roots, new Comparator<IResource>() {
            public int compare(IResource r1, IResource r2) {
                String path1 = r1.getFullPath().toString();
                String path2 = r2.getFullPath().toString();
                return path1.compareTo(path2);
            }
        });
        assertEquals(2, roots.length);
        IResource actualProject = roots[0];
        assertEquals(this.project.project, actualProject);
        IResource actualProject1 = roots[1];
        assertEquals(secondIProject, actualProject1);
    }

    /**
     * Checks that getResourceVariant will not throw NPE for null argument. This
     * method is called with null argument when local or remote resource does
     * not exist.
     *
     * @throws Exception
     */
    @Test
    public void shouldReturnNullResourceVariant() throws Exception {
        // when
        new Git(repo).commit().setAuthor("JUnit", "junit@egit.org").setMessage("Initial commit").call();
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, MASTER, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitRemoteResourceVariantTree(dataSet);

        // then
        assertNull(grvt.getResourceVariant(null));
    }

    /**
     * getResourceVariant() should return null when given resource doesn't exist
     * in repository.
     *
     * @throws Exception
     */
    @Test
    public void shouldReturnNullResourceVariant2() throws Exception {
        // when
        IPackageFragment iPackage = project.createPackage("org.egit.test");
        IType mainJava = project.createType(iPackage, "Main.java", "class Main {}");
        new Git(repo).commit().setAuthor("JUnit", "junit@egit.org").setMessage("Initial commit").call();
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, MASTER, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitRemoteResourceVariantTree(dataSet);

        // then
        assertNull(grvt.getResourceVariant(mainJava.getResource()));
    }

    /**
     * Check if getResourceVariant() does return the same resource that was
     * committed. Passes only when it is run as a single test, not as a part of
     * largest test suite
     *
     * @throws Exception
     */
    @Test
    public void shoulReturnSameResourceVariant() throws Exception {
        // when
        String fileName = "Main.java";
        File file = testRepo.createFile(iProject, fileName);
        testRepo.appendContentAndCommit(iProject, file, "class Main {}", "initial commit");
        IFile mainJava = testRepo.getIFile(iProject, file);
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, MASTER, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitRemoteResourceVariantTree(dataSet);

        // then
        IResourceVariant actual = grvt.getResourceVariant(mainJava);
        assertNotNull(actual);
        assertEquals(fileName, actual.getName());

        InputStream actualIn = actual.getStorage(new NullProgressMonitor()).getContents();
        byte[] actualByte = getBytesAndCloseStream(actualIn);
        InputStream expectedIn = mainJava.getContents();
        byte[] expectedByte = getBytesAndCloseStream(expectedIn);
        assertArrayEquals(expectedByte, actualByte);
    }

    /**
     * Create and commit Main.java file in master branch, then create branch
     * "test" checkout nearly created branch and modify Main.java file.
     * getResourceVariant() should obtain Main.java file content from "master"
     * branch. Passes only when it is run as a single test, not as a part of
     * largest test suite
     *
     * @throws Exception
     */
    @Test
    public void shouldReturnDifferentResourceVariant() throws Exception {
        // when
        String fileName = "Main.java";
        File file = testRepo.createFile(iProject, fileName);
        testRepo.appendContentAndCommit(iProject, file, "class Main {}", "initial commit");
        IFile mainJava = testRepo.getIFile(iProject, file);

        testRepo.createAndCheckoutBranch(Constants.R_HEADS + Constants.MASTER, Constants.R_HEADS + "test");
        testRepo.appendContentAndCommit(iProject, file, "// test", "first commit");
        GitSynchronizeData data = new GitSynchronizeData(repo, HEAD, MASTER, false);
        GitSynchronizeDataSet dataSet = new GitSynchronizeDataSet(data);

        // given
        GitResourceVariantTree grvt = new GitRemoteResourceVariantTree(dataSet);

        // then
        IResourceVariant actual = grvt.getResourceVariant(mainJava);
        assertNotNull(actual);
        assertEquals(fileName, actual.getName());

        InputStream actualIn = actual.getStorage(new NullProgressMonitor()).getContents();
        byte[] actualByte = getBytesAndCloseStream(actualIn);
        InputStream expectedIn = mainJava.getContents();
        byte[] expectedByte = getBytesAndCloseStream(expectedIn);

        // assert arrays not equals
        if (Arrays.equals(expectedByte, actualByte))
            fail();
        else
            assertTrue(true);
    }

    private byte[] getBytesAndCloseStream(InputStream stream) throws Exception {
        try {
            byte[] actualByte = new byte[stream.available()];
            stream.read(actualByte);
            return actualByte;
        } finally {
            stream.close();
        }
    }
}