From 0cf6a71f7b197b486b4e05a30bd8d701888637e8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 10 May 2013 15:13:13 +0200 Subject: [PATCH] added unit test for git outgoing command --- ...actGitIncomingOutgoingCommandTestBase.java | 184 ++++++++++++++++++ .../spi/GitIncomingCommandTest.java | 132 +------------ .../spi/GitOutgoingCommandTest.java | 127 ++++++++++++ 3 files changed, 312 insertions(+), 131 deletions(-) create mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommandTestBase.java create mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommandTestBase.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommandTestBase.java new file mode 100644 index 0000000000..76d1da4598 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommandTestBase.java @@ -0,0 +1,184 @@ +/** + * 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.rules.TemporaryFolder; + +import sonia.scm.repository.Changeset; +import sonia.scm.repository.GitRepositoryHandler; +import sonia.scm.repository.Repository; +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 AbstractGitIncomingOutgoingCommandTestBase +{ + + /** + * 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 + * + * + * @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(); + } + + //~--- 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 */ + protected GitRepositoryHandler handler; +} 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 index c08ac1c66e..a176eb7715 100644 --- 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 @@ -33,34 +33,18 @@ 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; /** @@ -68,36 +52,9 @@ import java.io.IOException; * @author Sebastian Sdorra */ public class GitIncomingCommandTest + extends AbstractGitIncomingOutgoingCommandTestBase { - /** - * 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 * @@ -187,66 +144,6 @@ public class GitIncomingCommandTest 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 * @@ -258,31 +155,4 @@ public class GitIncomingCommandTest 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; } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java new file mode 100644 index 0000000000..76a02703d7 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java @@ -0,0 +1,127 @@ +/** + * 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 org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.revwalk.RevCommit; + +import org.junit.Test; + +import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.RepositoryException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class GitOutgoingCommandTest + extends AbstractGitIncomingOutgoingCommandTestBase +{ + + /** + * Method description + * + * + * @throws GitAPIException + * @throws IOException + * @throws RepositoryException + */ + @Test + public void testGetOutgoingChangesets() + 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"); + + GitOutgoingCommand cmd = createCommand(); + OutgoingCommandRequest request = new OutgoingCommandRequest(); + + request.setRemoteRepository(incomgingRepository); + + ChangesetPagingResult cpr = cmd.getOutgoingChangesets(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 testGetOutgoingChangesetsWithEmptyRepository() + throws IOException, RepositoryException + { + GitOutgoingCommand cmd = createCommand(); + OutgoingCommandRequest request = new OutgoingCommandRequest(); + + request.setRemoteRepository(incomgingRepository); + + ChangesetPagingResult cpr = cmd.getOutgoingChangesets(request); + + assertNotNull(cpr); + + assertEquals(0, cpr.getTotal()); + } + + /** + * Method description + * + * + * @return + */ + private GitOutgoingCommand createCommand() + { + return new GitOutgoingCommand(handler, new GitContext(outgoingDirectory), + outgoingRepository); + } +}