From 2345bf3a9c1633daec0018f670124d248276f028 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 10 May 2013 14:46:19 +0200 Subject: [PATCH] added unit test for git incoming command --- .../spi/GitIncomingCommandTest.java | 288 ++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java new file mode 100644 index 0000000000..c08ac1c66e --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java @@ -0,0 +1,288 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository.spi; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.base.Charsets; +import com.google.common.io.Files; + +import org.eclipse.jgit.api.CommitCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.revwalk.RevCommit; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import sonia.scm.repository.Changeset; +import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitRepositoryHandler; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; +import sonia.scm.user.User; +import sonia.scm.user.UserTestData; + +import static org.junit.Assert.*; + +import static org.mockito.Mockito.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class GitIncomingCommandTest +{ + + /** + * Method description + * + * + * @throws GitAPIException + * @throws IOException + */ + @Before + public void setup() throws IOException, GitAPIException + { + incomingDirectory = tempFolder.newFile("incoming"); + incomingDirectory.delete(); + outgoingDirectory = tempFolder.newFile("outgoing"); + outgoingDirectory.delete(); + + incomgingRepository = new Repository("1", "git", "incoming"); + outgoingRepository = new Repository("2", "git", "outgoing"); + + incoming = Git.init().setDirectory(incomingDirectory).setBare(false).call(); + outgoing = Git.init().setDirectory(outgoingDirectory).setBare(false).call(); + + handler = mock(GitRepositoryHandler.class); + when(handler.getDirectory(incomgingRepository)).thenReturn( + incomingDirectory); + when(handler.getDirectory(outgoingRepository)).thenReturn( + outgoingDirectory); + } + + /** + * Method description + * + * + * @throws GitAPIException + * @throws IOException + * @throws RepositoryException + */ + @Test + public void testGetIncomingChangesets() + throws IOException, GitAPIException, RepositoryException + { + write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); + + RevCommit c1 = commit(outgoing, "added a"); + + write(outgoing, outgoingDirectory, "b.txt", "content of b.txt"); + + RevCommit c2 = commit(outgoing, "added b"); + + GitIncomingCommand cmd = createCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + ChangesetPagingResult cpr = cmd.getIncomingChangesets(request); + + assertNotNull(cpr); + + assertEquals(2, cpr.getTotal()); + assertCommitsEquals(c1, cpr.getChangesets().get(0)); + assertCommitsEquals(c2, cpr.getChangesets().get(1)); + } + + /** + * Method description + * + * + * @throws IOException + * @throws RepositoryException + */ + @Test + public void testGetIncomingChangesetsWithEmptyRepository() + throws IOException, RepositoryException + { + GitIncomingCommand cmd = createCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + ChangesetPagingResult cpr = cmd.getIncomingChangesets(request); + + assertNotNull(cpr); + + assertEquals(0, cpr.getTotal()); + } + + /** + * Method description + * + * + * @throws GitAPIException + * @throws IOException + * @throws RepositoryException + */ + @Test + public void testGetIncomingChangesetsWithUnrelatedRepository() + throws IOException, RepositoryException, GitAPIException + { + write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); + + commit(outgoing, "added a"); + + write(incoming, incomingDirectory, "b.txt", "content of b.txt"); + + commit(incoming, "added b"); + + GitIncomingCommand cmd = createCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + ChangesetPagingResult cpr = cmd.getIncomingChangesets(request); + + assertNotNull(cpr); + + assertEquals(0, cpr.getTotal()); + } + + /** + * Method description + * + * + * @param expected + * @param actual + */ + protected void assertCommitsEquals(RevCommit expected, Changeset actual) + { + assertEquals(expected.getId().name(), actual.getId()); + assertEquals(expected.getAuthorIdent().getName(), + actual.getAuthor().getName()); + assertEquals(expected.getAuthorIdent().getEmailAddress(), + actual.getAuthor().getMail()); + assertEquals(expected.getShortMessage(), actual.getDescription()); + } + + /** + * Method description + * + * + * @param git + * @param message + * + * @return + * + * @throws GitAPIException + */ + protected RevCommit commit(Git git, String message) throws GitAPIException + { + User trillian = UserTestData.createTrillian(); + CommitCommand cc = git.commit(); + + cc.setAuthor(trillian.getDisplayName(), trillian.getMail()); + cc.setMessage(message); + + return cc.call(); + } + + /** + * Method description + * + * + * @param git + * @param parent + * @param name + * @param content + * + * @throws GitAPIException + * @throws IOException + */ + protected void write(Git git, File parent, String name, String content) + throws IOException, GitAPIException + { + File file = new File(parent, name); + + Files.write(content, file, Charsets.UTF_8); + git.add().addFilepattern(name).call(); + } + + /** + * Method description + * + * + * @return + */ + private GitIncomingCommand createCommand() + { + return new GitIncomingCommand(handler, new GitContext(incomingDirectory), + incomgingRepository); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + /** Field description */ + protected Repository incomgingRepository; + + /** Field description */ + protected Git incoming; + + /** Field description */ + protected File incomingDirectory; + + /** Field description */ + protected Git outgoing; + + /** Field description */ + protected File outgoingDirectory; + + /** Field description */ + protected Repository outgoingRepository; + + /** Field description */ + private GitRepositoryHandler handler; +}