added unit test for incoming hg command

This commit is contained in:
Sebastian Sdorra
2013-05-10 12:50:11 +02:00
parent fdfd7a58a4
commit f4a3bc57c3
4 changed files with 345 additions and 11 deletions

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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;
}