diff --git a/plugins/scm-git-plugin/pom.xml b/plugins/scm-git-plugin/pom.xml
index 43e1eb08a4..cd75938137 100644
--- a/plugins/scm-git-plugin/pom.xml
+++ b/plugins/scm-git-plugin/pom.xml
@@ -45,6 +45,15 @@
${jgit.version}
+
+
+
+ sonia.scm
+ scm-test
+ 1.0-M3-SNAPSHOT
+ test
+
+
diff --git a/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java b/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java
new file mode 100644
index 0000000000..534ed94f07
--- /dev/null
+++ b/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java
@@ -0,0 +1,102 @@
+/**
+ * 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;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import sonia.scm.store.StoreFactory;
+
+import static org.junit.Assert.*;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.io.File;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase
+{
+
+ /**
+ * Method description
+ *
+ *
+ * @param directory
+ */
+ @Override
+ protected void checkDirectory(File directory)
+ {
+ File head = new File(directory, "HEAD");
+
+ assertTrue(head.exists());
+ assertTrue(head.isFile());
+
+ File config = new File(directory, "config");
+
+ assertTrue(config.exists());
+ assertTrue(config.isFile());
+
+ File refs = new File(directory, "refs");
+
+ assertTrue(refs.exists());
+ assertTrue(refs.isDirectory());
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @param factory
+ * @param directory
+ *
+ * @return
+ */
+ @Override
+ protected RepositoryHandler createRepositoryHandler(StoreFactory factory,
+ File directory)
+ {
+ GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory);
+
+ repositoryHandler.init(contextProvider);
+
+ GitConfig config = new GitConfig();
+
+ config.setRepositoryDirectory(directory);
+ repositoryHandler.setConfig(config);
+
+ return repositoryHandler;
+ }
+}
diff --git a/plugins/scm-hg-plugin/pom.xml b/plugins/scm-hg-plugin/pom.xml
index bccf7cc264..121bca6839 100644
--- a/plugins/scm-hg-plugin/pom.xml
+++ b/plugins/scm-hg-plugin/pom.xml
@@ -26,6 +26,15 @@
provided
+
+
+
+ sonia.scm
+ scm-test
+ 1.0-M3-SNAPSHOT
+ test
+
+
diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgInitialConfigBuilder.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgInitialConfigBuilder.java
index 474aab8027..7b7f9f115d 100644
--- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgInitialConfigBuilder.java
+++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgInitialConfigBuilder.java
@@ -123,7 +123,7 @@ public class HgInitialConfigBuilder
*
* @return
*/
- private String search(String cmd)
+ public static String search(String cmd)
{
String cmdPath = null;
diff --git a/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java b/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java
new file mode 100644
index 0000000000..a233b30353
--- /dev/null
+++ b/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java
@@ -0,0 +1,103 @@
+/**
+ * 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;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import sonia.scm.store.StoreFactory;
+import sonia.scm.util.Util;
+
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.io.File;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase
+{
+
+ /**
+ * Method description
+ *
+ *
+ * @param directory
+ */
+ @Override
+ protected void checkDirectory(File directory)
+ {
+ File hgDirectory = new File(directory, ".hg");
+
+ assertTrue(hgDirectory.exists());
+ assertTrue(hgDirectory.isDirectory());
+
+ File hgrc = new File(hgDirectory, "hgrc");
+
+ assertTrue(hgrc.exists());
+ assertTrue(hgrc.isFile());
+ assertTrue(hgrc.length() > 0);
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @param factory
+ * @param directory
+ *
+ * @return
+ */
+ @Override
+ protected RepositoryHandler createRepositoryHandler(StoreFactory factory,
+ File directory)
+ {
+ HgRepositoryHandler handler = new HgRepositoryHandler(factory);
+
+ handler.init(contextProvider);
+ handler.getConfig().setRepositoryDirectory(directory);
+
+ // skip tests if hg not in path
+ if (Util.isEmpty(handler.getConfig().getHgBinary()))
+ {
+ System.out.println("WARNING could not find hg, skipping test");
+ assumeTrue(false);
+ }
+
+ return handler;
+ }
+}
diff --git a/plugins/scm-svn-plugin/pom.xml b/plugins/scm-svn-plugin/pom.xml
index bcbbee4aeb..0a74bc5ba8 100644
--- a/plugins/scm-svn-plugin/pom.xml
+++ b/plugins/scm-svn-plugin/pom.xml
@@ -37,6 +37,15 @@
${svnkit.version}
+
+
+
+ sonia.scm
+ scm-test
+ 1.0-M3-SNAPSHOT
+ test
+
+
diff --git a/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java b/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java
new file mode 100644
index 0000000000..41dcbe403a
--- /dev/null
+++ b/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java
@@ -0,0 +1,97 @@
+/**
+ * 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;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import sonia.scm.store.StoreFactory;
+
+import static org.junit.Assert.*;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.io.File;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase
+{
+
+ /**
+ * Method description
+ *
+ *
+ * @param directory
+ */
+ @Override
+ protected void checkDirectory(File directory)
+ {
+ File format = new File(directory, "format");
+
+ assertTrue(format.exists());
+ assertTrue(format.isFile());
+
+ File db = new File(directory, "db");
+
+ assertTrue(db.exists());
+ assertTrue(db.isDirectory());
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @param factory
+ * @param directory
+ *
+ * @return
+ */
+ @Override
+ protected RepositoryHandler createRepositoryHandler(StoreFactory factory,
+ File directory)
+ {
+ SvnRepositoryHandler handler = new SvnRepositoryHandler(factory);
+
+ handler.init(contextProvider);
+
+ SvnConfig config = new SvnConfig();
+
+ config.setRepositoryDirectory(directory);
+ handler.setConfig(config);
+
+ return handler;
+ }
+}
diff --git a/scm-core/pom.xml b/scm-core/pom.xml
index 6c16ebfef6..256ced1a4a 100644
--- a/scm-core/pom.xml
+++ b/scm-core/pom.xml
@@ -48,15 +48,6 @@
${jersey.version}
-
-
-
- org.slf4j
- slf4j-simple
- ${slf4j.version}
- test
-
-
diff --git a/scm-test/pom.xml b/scm-test/pom.xml
index 6310ddb9b9..50c5bfbe50 100644
--- a/scm-test/pom.xml
+++ b/scm-test/pom.xml
@@ -41,6 +41,12 @@
${mokito.version}
+
+ org.slf4j
+ slf4j-simple
+ ${slf4j.version}
+
+
diff --git a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java
new file mode 100644
index 0000000000..8799485b07
--- /dev/null
+++ b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java
@@ -0,0 +1,208 @@
+/**
+ * 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;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import org.junit.Test;
+
+import sonia.scm.AbstractTestBase;
+import sonia.scm.store.MemoryStoreFactory;
+import sonia.scm.store.StoreFactory;
+import sonia.scm.util.IOUtil;
+
+import static org.junit.Assert.*;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase
+{
+
+ /**
+ * Method description
+ *
+ *
+ * @param directory
+ */
+ protected abstract void checkDirectory(File directory);
+
+ /**
+ * Method description
+ *
+ *
+ * @param factory
+ * @param directory
+ *
+ * @return
+ */
+ protected abstract RepositoryHandler createRepositoryHandler(
+ StoreFactory factory, File directory);
+
+ /**
+ * Method description
+ *
+ *
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ @Test
+ public void testCreate() throws RepositoryException, IOException
+ {
+ createRepository();
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ @Test(expected = RepositoryAllreadyExistExeption.class)
+ public void testCreateExisitingRepository()
+ throws RepositoryException, IOException
+ {
+ createRepository();
+ createRepository();
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ @Test
+ public void testCreateResourcePath() throws RepositoryException, IOException
+ {
+ Repository repository = createRepository();
+ String path = handler.createResourcePath(repository);
+
+ assertNotNull(path);
+ assertTrue(path.trim().length() > 0);
+ assertTrue(path.contains(repository.getName()));
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ @Test
+ public void testDelete() throws RepositoryException, IOException
+ {
+ Repository repository = createRepository();
+
+ handler.delete(repository);
+
+ File directory = new File(baseDirectory, repository.getName());
+
+ assertFalse(directory.exists());
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @throws Exception
+ */
+ @Override
+ protected void postSetUp() throws Exception
+ {
+ MemoryStoreFactory storeFactory = new MemoryStoreFactory();
+
+ storeFactory.init(contextProvider);
+ baseDirectory = new File(contextProvider.getBaseDirectory(),
+ "repositories");
+ IOUtil.mkdirs(baseDirectory);
+ handler = createRepositoryHandler(storeFactory, baseDirectory);
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @throws Exception
+ */
+ @Override
+ protected void preTearDown() throws Exception
+ {
+ if (handler != null)
+ {
+ handler.close();
+ }
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @return
+ *
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ private Repository createRepository() throws RepositoryException, IOException
+ {
+ Repository repository = RepositoryTestData.createHeartOfGold();
+
+ handler.create(repository);
+
+ File directory = new File(baseDirectory, repository.getName());
+
+ assertTrue(directory.exists());
+ assertTrue(directory.isDirectory());
+ checkDirectory(directory);
+
+ return repository;
+ }
+
+ //~--- fields ---------------------------------------------------------------
+
+ /** Field description */
+ protected File baseDirectory;
+
+ /** Field description */
+ private RepositoryHandler handler;
+}