From f4a3bc57c350e6f67832016607a0d2c21a98ad36 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 10 May 2013 12:50:11 +0200 Subject: [PATCH] added unit test for incoming hg command --- .../java/sonia/scm/repository/HgTestUtil.java | 36 +++ .../spi/AbstractHgCommandTestBase.java | 12 +- .../repository/spi/HgIncomingCommandTest.java | 98 ++++++++ .../spi/IncomingOutgoingTestBase.java | 210 ++++++++++++++++++ 4 files changed, 345 insertions(+), 11 deletions(-) create mode 100644 scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java create mode 100644 scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java index bccdac50e3..5f3bcab580 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java @@ -37,6 +37,16 @@ package sonia.scm.repository; import org.junit.Assume; +import sonia.scm.SCMContext; +import sonia.scm.io.FileSystem; +import sonia.scm.store.MemoryStoreFactory; + +import static org.mockito.Mockito.mock; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + /** * * @author Sebastian Sdorra @@ -74,4 +84,30 @@ public final class HgTestUtil Assume.assumeTrue(false); } } + + /** + * Method description + * + * + * @param directory + * + * @return + */ + public static HgRepositoryHandler createHandler(File directory) + { + TempSCMContextProvider context = + (TempSCMContextProvider) SCMContext.getContext(); + + context.setBaseDirectory(directory); + + FileSystem fileSystem = mock(FileSystem.class); + + HgRepositoryHandler handler = + new HgRepositoryHandler(new MemoryStoreFactory(), fileSystem, + new HgContextProvider()); + + handler.init(context); + + return handler; + } } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java index a9b53faa45..db8e99725a 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java @@ -85,17 +85,7 @@ public class AbstractHgCommandTestBase extends ZippedRepositoryTestBase @Before public void initHgHandler() throws IOException { - File folder = tempFolder.newFolder(); - TempSCMContextProvider context = - (TempSCMContextProvider) SCMContext.getContext(); - - context.setBaseDirectory(folder); - - FileSystem fileSystem = mock(FileSystem.class); - - this.handler = new HgRepositoryHandler(new MemoryStoreFactory(), - fileSystem, new HgContextProvider()); - this.handler.init(context); + this.handler = HgTestUtil.createHandler(tempFolder.newFolder()); HgTestUtil.checkForSkip(handler); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java new file mode 100644 index 0000000000..1c82063bdb --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java @@ -0,0 +1,98 @@ +/** + * 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.aragost.javahg.Changeset; + +import org.junit.Test; + +import sonia.scm.repository.ChangesetPagingResult; + +import static org.junit.Assert.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class HgIncomingCommandTest extends IncomingOutgoingTestBase +{ + + /** + * Method description + * + * + * @throws IOException + */ + @Test + public void testGetIncomingChangesets() throws IOException + { + writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); + writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); + + Changeset c1 = commit(outgoing, "added a and b"); + + writeNewFile(outgoing, outgoingDirectory, "c.txt", "Content of file c.txt"); + writeNewFile(outgoing, outgoingDirectory, "d.txt", "Content of file d.txt"); + + Changeset c2 = commit(outgoing, "added c and d"); + + HgIncomingCommand cmd = createIncomingCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + ChangesetPagingResult cpr = cmd.getIncomingChangesets(request); + + assertNotNull(cpr); + assertEquals(2, cpr.getTotal()); + assertChangesetsEqual(c1, cpr.getChangesets().get(0)); + assertChangesetsEqual(c2, cpr.getChangesets().get(1)); + } + + /** + * Method description + * + * + * @return + */ + private HgIncomingCommand createIncomingCommand() + { + return new HgIncomingCommand(new HgCommandContext(handler.getConfig(), + incomingRepository, incomingDirectory), incomingRepository, handler); + } +} diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java new file mode 100644 index 0000000000..173892b29d --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java @@ -0,0 +1,210 @@ +/** + * 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; + +import com.aragost.javahg.BaseRepository; +import com.aragost.javahg.Changeset; +import com.aragost.javahg.Repository; +import com.aragost.javahg.RepositoryConfiguration; +import com.aragost.javahg.commands.AddCommand; +import com.aragost.javahg.commands.CommitCommand; +import com.google.common.base.Charsets; +import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import static org.mockito.Mockito.*; +import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.HgConfig; +import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.repository.HgTestUtil; +import sonia.scm.user.User; +import sonia.scm.user.UserTestData; + +/** + * + * @author Sebastian Sdorra + */ +public abstract class IncomingOutgoingTestBase +{ + + /** Field description */ + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @throws IOException + */ + @Before + public void initHgHandler() throws IOException + { + HgRepositoryHandler temp = HgTestUtil.createHandler(tempFolder.newFolder()); + + HgTestUtil.checkForSkip(temp); + + incomingDirectory = tempFolder.newFolder("incoming"); + outgoingDirectory = tempFolder.newFolder("outgoing"); + + incomingRepository = new sonia.scm.repository.Repository("1", "hg", + "incoming"); + outgoingRepository = new sonia.scm.repository.Repository("2", "hg", + "outgoing"); + + incoming = Repository.create(createConfig(temp), incomingDirectory); + outgoing = Repository.create(createConfig(temp), outgoingDirectory); + + handler = mock(HgRepositoryHandler.class); + when(handler.getDirectory(incomingRepository)).thenReturn( + incomingDirectory); + when(handler.getDirectory(outgoingRepository)).thenReturn( + outgoingDirectory); + when(handler.getConfig()).thenReturn(temp.getConfig()); + } + + /** + * Method description + * + * + * @param expected + * @param actual + */ + protected void assertChangesetsEqual(Changeset expected, + sonia.scm.repository.Changeset actual) + { + assertEquals(expected.getNode(), actual.getId()); + assertEquals(expected.getMessage(), actual.getDescription()); + assertEquals(expected.getUser(), actual.getAuthor().toString()); + } + + /** + * Method description + * + * + * @param repository + * @param message + * + * @return + */ + protected Changeset commit(BaseRepository repository, String message) + { + CommitCommand c = CommitCommand.on(repository); + + c.user(createUser(UserTestData.createTrillian())); + c.message(message); + + return c.execute(); + } + + /** + * Method description + * + * + * + * @param handler + * @return + */ + private RepositoryConfiguration createConfig(HgRepositoryHandler handler) + { + HgConfig cfg = handler.getConfig(); + RepositoryConfiguration configuration = RepositoryConfiguration.DEFAULT; + + configuration.setHgBin(cfg.getHgBinary()); + + return configuration; + } + + + + /** + * Method description + * + * + * @param user + * + * @return + */ + protected String createUser(User user) + { + return user.getDisplayName().concat(" <").concat(user.getMail()).concat( + ">"); + } + + /** + * Method description + * + * + * @param repository + * @param parent + * @param name + * @param content + * + * @throws IOException + */ + protected void writeNewFile(BaseRepository repository, File parent, + String name, String content) + throws IOException + { + File file = new File(parent, name); + + Files.write(content, file, Charsets.UTF_8); + AddCommand.on(repository).execute(file); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + protected HgRepositoryHandler handler; + + /** Field description */ + protected BaseRepository incoming; + + /** Field description */ + protected File incomingDirectory; + + /** Field description */ + protected sonia.scm.repository.Repository incomingRepository; + + /** Field description */ + protected BaseRepository outgoing; + + /** Field description */ + protected File outgoingDirectory; + + /** Field description */ + protected sonia.scm.repository.Repository outgoingRepository; +}