- ${%List of ant-like includes allowing to specify additionnal sync-ed files with repository}.
+ ${%List of ant-like includes allowing to specify additional files to synchronize with the repository}.
${%Includes should be case sensitive paths starting from your JENKINS_HOME directory, without / in the beginning; Use of wildcards} (${%* and **}) ${%is allowed}.
${%You can have a look at}
${%community shared includes in Jenkins wiki}, ${%feel free to share your owns on this page} !
${%Before creating new includes, you should be aware of some things} :
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/help/manualSynchronizationIncludes_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/help/manualSynchronizationIncludes_fr.properties
index 89039da6..ec375ad7 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/help/manualSynchronizationIncludes_fr.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/help/manualSynchronizationIncludes_fr.properties
@@ -1,20 +1,13 @@
-List\ of\ ant-like\ includes\ allowing\ to\ specify\ additionnal\ sync-ed\ files\ with\ repository=\
- Liste de chemin \u00e0 la Ant, permettant de sp\u00e9cifier des fichiers suppl\u00e9mentaires qui seront synchronis\u00e9s avec le repository
-Includes\ should\ be\ case\ sensitive\ paths\ starting\ from\ your\ JENKINS_HOME\ directory,\ without\ /\ in\ the\ beginning;\ Use\ of\ wildcards=\
- Les chemins doivent \u00eatre sensibles \u00e0 la casse, bas\u00e9s depuis votre r\u00e9pertoire JENKINS_HOME, et ne d\u00e9marrant pas par un /; L''utilisation des wildcards
+List\ of\ ant-like\ includes\ allowing\ to\ specify\ additional\ files\ to\ synchronize\ with\ the\ repository=Liste de chemin \u00E0 la Ant, permettant de sp\u00E9cifier des fichiers suppl\u00E9mentaires qui seront synchronis\u00E9s avec le repository
+Includes\ should\ be\ case\ sensitive\ paths\ starting\ from\ your\ JENKINS_HOME\ directory,\ without\ /\ in\ the\ beginning;\ Use\ of\ wildcards=Les chemins doivent \u00EAtre sensibles \u00E0 la casse, bas\u00E9s depuis votre r\u00E9pertoire JENKINS_HOME, et ne d\u00E9marrant pas par un /; L''utilisation des wildcards
*\ and\ **=* et **
-is\ allowed=est autoris\u00e9
+is\ allowed=est autoris\u00E9
You\ can\ have\ a\ look\ at=Vous pouvez jeter un oeil aux
-community\ shared\ includes\ in\ Jenkins\ wiki=chemin partag\u00e9s par la communaut\u00e9 dans le wiki Jenkins
-feel\ free\ to\ share\ your\ owns\ on\ this\ page=n''h\u00e9sitez pas \u00e0 partager les v\u00f4tres sur cette page
-Before\ creating\ new\ includes,\ you\ should\ be\ aware\ of\ some\ things=\
- Avant de cr\u00e9er de nouveaux chemins, vous devriez \u00eatre conscient de certaines contraintes
-Avoid\ includes\ for\ big\ and\ updated-often\ files=\
- Evitez les chemins pour les gros fichiers ainsi que ceux mis \u00e0 jour souvent
-otherwise,\ your\ jenkins\ instance\ will\ spend\ its\ CPU\ time\ to\ commit\ your\ file=\
- autrement, votre instance Jenkins va passer son temps CPU \u00e0 commiter votre fichier
-In\ order\ to\ be\ noticed\ at\ the\ right\ time,\ your\ files\ must\ be\ represented\ in\ Jenkins\ by\ a=\
- Afin d''\u00eatre notifi\u00e9 au bon moment, vos fichiers doivent correspondre, dans Jenkins, \u00e0 un
+community\ shared\ includes\ in\ Jenkins\ wiki=chemin partag\u00E9s par la communaut\u00E9 dans le wiki Jenkins
+feel\ free\ to\ share\ your\ owns\ on\ this\ page=n''h\u00E9sitez pas \u00E0 partager les v\u00F4tres sur cette page
+Before\ creating\ new\ includes,\ you\ should\ be\ aware\ of\ some\ things=Avant de cr\u00E9er de nouveaux chemins, vous devriez \u00EAtre conscient de certaines contraintes
+Avoid\ includes\ for\ big\ and\ updated-often\ files=Evitez les chemins pour les gros fichiers ainsi que ceux mis \u00E0 jour souvent
+otherwise,\ your\ jenkins\ instance\ will\ spend\ its\ CPU\ time\ to\ commit\ your\ file=autrement, votre instance Jenkins va passer son temps CPU \u00E0 commiter votre fichier
+In\ order\ to\ be\ noticed\ at\ the\ right\ time,\ your\ files\ must\ be\ represented\ in\ Jenkins\ by\ a=Afin d''\u00EAtre notifi\u00E9 au bon moment, vos fichiers doivent correspondre, dans Jenkins, \u00E0 un
most\ of\ them\ are,\ but\ who\ knows=la plupart le sont, mais qui sait
-Following\ includes\ are\ brought\ "out\ of\ the\ box"\ by\ scm-sync-configuration\ default\ includes=\
- Les chemins suivants sont fournis par d\u00e9faut par le plugin scm-sync-configuration
+Following\ includes\ are\ brought\ "out\ of\ the\ box"\ by\ scm-sync-configuration\ default\ includes=Les chemins suivants sont fournis par d\u00E9faut par le plugin scm-sync-configuration
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
index 2c74e408..c12808fd 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
@@ -1,7 +1,9 @@
-
+
\ No newline at end of file
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
index 7b68062d..888432f3 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
@@ -20,7 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-description.1=\
- Specify the git repository URL to synchronize your configuration files with, such as "git@github.com:mycompany/jenkins-config.git"
-description.2=\
- Note that, for the moment, your MUST reference your Git repository root
+description.1=Specify the git repository URL to synchronize your configuration files with, such as "git@github.com\:mycompany/jenkins-config.git"
+description.2=Note that, for the moment, you MUST reference your Git repository root
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help_fr.properties
index 6d1b0fe4..36fd76bf 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help_fr.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help_fr.properties
@@ -20,7 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-description.1=\
- Spécifier l''url du repository Git vers lequel synchroniser vos fichiers de configuration, tel que "git@github.com:mycompany/jenkins-config.git"
-description.2=\
- A noter qu''il est pour le moment obligatoire de référencer la racine du repository
+description.1=Sp\u00E9cifiez l''url du repository Git vers lequel synchroniser vos fichiers de configuration, tel que "git@github.com\:mycompany/jenkins-config.git"
+description.2=A noter qu''il est pour le moment obligatoire de r\u00E9f\u00E9rencer la racine du repository
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help.properties
index a8dc240c..69924a3e 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help.properties
@@ -20,14 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-description.1=\
- Specify the subversion repository URL to synchronize your configuration files with, such as "http://yourcompany.com/repos/hudson-config/"
-description.2=\
- When you enter URL, Hudson automatically checks if Hudson can connect to it. If access requires \
- authentication, it will ask you the necessary credential. If you already have a working \
- credential but would like to change it for other reasons, \
- click
this link \
- and specify different credential.
-description.3=\
- Each time you'll enter a new repository URL, Hudson will first synchronize all your configuration files with the repository \
- This process can take several minutes, depending on the amount of configuration files to synchronize.
+description.1=Specify the subversion repository URL to synchronize your configuration files with, such as "http\://yourcompany.com/repos/hudson-config/"
+description.2=When you enter a URL, Jenkins automatically checks if it can access the repository If access requires authentication, it will ask you the necessary credentials. If you already have a working credential but would like to change it for other reasons, click
this link and specify different credentials.
+description.3=Each time you enter a new repository URL, Jenkins will first synchronize all your configuration files with the repository. This process can take a while, depending on the amount of configuration files to synchronize.
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help_fr.properties
index 9ec3cc15..aa9f0669 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help_fr.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/svn/url-help_fr.properties
@@ -20,13 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-description.1=\
- Spécifiez l''URL du repository Subversion avec lequel synchronier vos fichiers de configuration, par exemple "http://yourcompany.com/repos/hudson-config/"
-description.2=\
- Quand vous entrez une URL, Hudson vérifie automatiquement s''il peut s''y connecter. Si l''accès nécessite \
- une authentification, il vous demandera les informations nécessaires. Si vous disposez déjà d''informations d''identification \
- qui marchent mais que vous voulez en changer, cliquez sur
ce lien \
- et renseignez des valeurs différentes.
-description.3=\
- A chaque fois que vous entrerez une nouvelle URL de repository, Hudson commencera par synchroniser tous vos fichier de configuration \
- avec le repository. Ce processus peut prendre plusieurs minutes, en fonction du nombre de fichier de configuration à synchroniser.
+description.1=Sp\u00E9cifiez l''URL du repository Subversion avec lequel synchronier vos fichiers de configuration, par exemple "http\://yourcompany.com/repos/hudson-config/"
+description.2=Quand vous entrez une URL, Jenkins v\u00E9rifie automatiquement s''il peut s''y connecter. Si l''acc\u00E8s n\u00E9cessite une authentification, il vous demandera les informations n\u00E9cessaires. Si vous disposez d\u00E9j\u00E0 d''informations d''identification qui marchent mais que vous voulez en changer, cliquez sur
ce lien et renseignez des valeurs diff\u00E9rentes.
+description.3=A chaque fois que vous entrerez une nouvelle URL de repository, Jenkins commencera par synchroniser tous vos fichier de configuration avec le repository. Ce processus peut prendre plusieurs minutes, en fonction du nombre de fichier de configuration \u00E0 synchroniser.
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
index 0e15fc1e..725876d0 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
@@ -1,37 +1,62 @@
package hudson.plugins.scm_sync_configuration.basic;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import hudson.model.Hudson;
+import hudson.plugins.scm_sync_configuration.JenkinsFilesHelper;
import hudson.plugins.scm_sync_configuration.util.ScmSyncConfigurationBaseTest;
import hudson.plugins.test.utils.scms.ScmUnderTestSubversion;
import java.io.File;
+import jenkins.model.Jenkins;
+
import org.junit.Test;
public class ScmSyncConfigurationBasicTest extends ScmSyncConfigurationBaseTest {
- public ScmSyncConfigurationBasicTest() {
- super(new ScmUnderTestSubversion());
- }
-
- @Test
- public void shouldRetrieveMockedHudsonInstanceCorrectly() throws Throwable {
- Hudson hudsonInstance = Hudson.getInstance();
- assertThat(hudsonInstance, is(notNullValue()));
- assertThat(hudsonInstance.toString().split("@")[0], is(not(equalTo("hudson.model.Hudson"))));
- }
-
- @Test
- public void shouldVerifyIfHudsonRootDirectoryExists() throws Throwable {
-
- Hudson hudsonInstance = Hudson.getInstance();
- File hudsonRootDir = hudsonInstance.getRootDir();
- assertThat(hudsonRootDir, is(not(equalTo(null))));
- assertThat(hudsonRootDir.exists(), is(true));
- }
+ public ScmSyncConfigurationBasicTest() {
+ super(new ScmUnderTestSubversion());
+ }
+
+ @Test
+ public void shouldRetrieveMockedHudsonInstanceCorrectly() throws Throwable {
+ Jenkins jenkins = Jenkins.getInstance();
+ assertNotNull("Jenkins instance must not be null", jenkins);
+ assertFalse("Expected a mocked Jenkins instance", jenkins.getClass().equals(Jenkins.class) || jenkins.getClass().equals(Hudson.class));
+ }
+
+ @Test
+ public void shouldVerifyIfHudsonRootDirectoryExists() throws Throwable {
+ Jenkins jenkins = Jenkins.getInstance();
+ File jenkinsRootDir = jenkins.getRootDir();
+ assertNotNull("Jenkins instance must not be null", jenkinsRootDir);
+ assertTrue("$JENKINS_HOME must be an existing directory", jenkinsRootDir.isDirectory());
+ }
+
+ @Test
+ public void testPathesOutsideJenkisRoot () throws Exception {
+ Jenkins jenkins = Jenkins.getInstance();
+ File rootDirectory = jenkins.getRootDir().getAbsoluteFile();
+ File parentDirectory = rootDirectory.getParentFile();
+ assertNull("File outside $JENKINS_HOME should return null", JenkinsFilesHelper.buildPathRelativeToHudsonRoot(parentDirectory));
+ assertNull("File outside $JENKINS_HOME should return null", JenkinsFilesHelper.buildPathRelativeToHudsonRoot(new File(parentDirectory, "foo.txt")));
+ }
+
+ @Test
+ public void testPathesInsideJenkisRoot () throws Exception {
+ Jenkins jenkins = Jenkins.getInstance();
+ File rootDirectory = jenkins.getRootDir().getAbsoluteFile();
+ File pathUnderTest = new File(rootDirectory, "config.xml");
+ String result = JenkinsFilesHelper.buildPathRelativeToHudsonRoot(pathUnderTest);
+ assertNotNull("File inside $JENKINS_HOME must not return null path", result);
+ assertEquals("Path " + pathUnderTest + " should resolve properly", result, "config.xml");
+ pathUnderTest = new File(new File (rootDirectory, "someDir"), "foo.txt");
+ result = JenkinsFilesHelper.buildPathRelativeToHudsonRoot(pathUnderTest);
+ assertNotNull("File inside $JENKINS_HOME must not return null path", result);
+ assertEquals("Path " + pathUnderTest + " should resolve properly", result, "someDir/foo.txt");
+ }
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsGitTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsGitTest.java
index c672c152..89474b78 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsGitTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsGitTest.java
@@ -1,15 +1,11 @@
package hudson.plugins.scm_sync_configuration.repository;
import hudson.plugins.test.utils.scms.ScmUnderTestGit;
-import org.junit.Ignore;
public class HudsonExtensionsGitTest extends HudsonExtensionsTest {
- public HudsonExtensionsGitTest() {
- super(new ScmUnderTestGit());
- }
-
- public void shouldJobRenameBeCorrectlyImpactedOnSCM() throws Throwable {
- super.shouldJobRenameBeCorrectlyImpactedOnSCM();
+ public HudsonExtensionsGitTest() {
+ super(new ScmUnderTestGit());
}
+
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsSubversionTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsSubversionTest.java
index bf081928..401c0c80 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsSubversionTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsSubversionTest.java
@@ -1,12 +1,96 @@
package hudson.plugins.scm_sync_configuration.repository;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+
+import org.codehaus.plexus.util.FileUtils;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import hudson.model.Item;
+import hudson.model.Job;
+import hudson.plugins.scm_sync_configuration.SCMManipulator;
+import hudson.plugins.scm_sync_configuration.ScmSyncConfigurationPlugin;
import hudson.plugins.test.utils.scms.ScmUnderTestSubversion;
public class HudsonExtensionsSubversionTest extends HudsonExtensionsTest {
- public HudsonExtensionsSubversionTest() {
- super(new ScmUnderTestSubversion());
- }
+ public HudsonExtensionsSubversionTest() {
+ super(new ScmUnderTestSubversion());
+ }
+
+ @Test
+ public void shouldJobDeleteDoesntPerformAnyScmUpdate() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Let's checkout current scm view ... and commit something in it ...
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
+ final File hello1 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/jobs/hello.txt");
+ final File hello2 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/hello2.txt");
+ FileUtils.fileAppend(hello1.getAbsolutePath(), "hello world !");
+ FileUtils.fileAppend(hello2.getAbsolutePath(), "hello world 2 !");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/hello.txt");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "hello2.txt");
+ assertTrue("External check-in should succeed", scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit"));
+
+ // Deleting fakeJob
+ Item mockedItem = Mockito.mock(Job.class);
+ File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
+ when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
+
+ sscItemListener.onDeleted(mockedItem);
+
+ // Assert no hello file is present in current hudson root
+ assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/jobs/hello.txt").exists(), is(false));
+ assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/hello2.txt").exists(), is(false));
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldJobRenameDoesntPerformAnyScmUpdate() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Let's checkout current scm view ... and commit something in it ...
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
+ final File hello1 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/jobs/hello.txt");
+ final File hello2 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/hello2.txt");
+ FileUtils.fileAppend(hello1.getAbsolutePath(), "hello world !");
+ FileUtils.fileAppend(hello2.getAbsolutePath(), "hello world 2 !");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/hello.txt");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "hello2.txt");
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit");
+
+ // Renaming fakeJob to newFakeJob
+ Item mockedItem = Mockito.mock(Job.class);
+ File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
+ when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
+
+ sscItemListener.onLocationChanged(mockedItem, "fakeJob", "newFakeJob");
+
+ // Assert no hello file is present in current hudson root
+ assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/jobs/hello.txt").exists(), is(false));
+ assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/hello2.txt").exists(), is(false));
+
+ assertStatusManagerIsOk();
+ }
+
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java
index bb4ebde4..c884c0f9 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java
@@ -2,9 +2,9 @@
import hudson.XmlFile;
import hudson.model.Item;
+import hudson.model.AbstractItem;
import hudson.model.Job;
import hudson.model.Saveable;
-import hudson.model.TopLevelItem;
import hudson.plugins.scm_sync_configuration.SCMManipulator;
import hudson.plugins.scm_sync_configuration.ScmSyncConfigurationPlugin;
import hudson.plugins.scm_sync_configuration.extensions.ScmSyncConfigurationItemListener;
@@ -15,380 +15,455 @@
import hudson.plugins.scm_sync_configuration.strategies.impl.JobConfigScmSyncStrategy;
import hudson.plugins.scm_sync_configuration.util.ScmSyncConfigurationPluginBaseTest;
import hudson.plugins.test.utils.scms.ScmUnderTest;
+
import org.codehaus.plexus.util.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.util.List;
+import jenkins.model.Jenkins;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
-@PrepareForTest(ScmSyncConfigurationPlugin.class)
public abstract class HudsonExtensionsTest extends ScmSyncConfigurationPluginBaseTest {
- private ScmSyncConfigurationItemListener sscItemListener;
- private ScmSyncConfigurationSaveableListener sscConfigurationSaveableListener;
-
- protected HudsonExtensionsTest(ScmUnderTest scmUnderTest) {
- super(scmUnderTest);
- }
-
- @Before
- public void initObjectsUnderTests() throws Throwable{
- this.sscItemListener = new ScmSyncConfigurationItemListener();
- this.sscConfigurationSaveableListener = new ScmSyncConfigurationSaveableListener();
-
- // Mocking ScmSyncConfigurationPlugin.getStrategyForSaveable()
- ScmSyncConfigurationPlugin sscPlugin = spy(ScmSyncConfigurationPlugin.getInstance());
- sscPlugin.setBusiness(this.sscBusiness);
- PowerMockito.doReturn(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES[0]).when(sscPlugin).getStrategyForSaveable(Mockito.any(Saveable.class), Mockito.any(File.class));
- }
-
- @Test
- public void shouldJobRenameBeCorrectlyImpactedOnSCM() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Renaming fakeJob to newFakeJob
- Item mockedItem = Mockito.mock(TopLevelItem.class);
- File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
- when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
- when(mockedItem.getName()).thenReturn("newFakeJob");
+ protected ScmSyncConfigurationItemListener sscItemListener;
+ protected ScmSyncConfigurationSaveableListener sscConfigurationSaveableListener;
+
+ protected HudsonExtensionsTest(ScmUnderTest scmUnderTest) {
+ super(scmUnderTest);
+ }
+
+ @Before
+ public void initObjectsUnderTests() throws Throwable{
+ this.sscItemListener = new ScmSyncConfigurationItemListener();
+ this.sscConfigurationSaveableListener = new ScmSyncConfigurationSaveableListener();
+ }
+ @Test
+ public void shouldJobRenameBeCorrectlyImpactedOnSCM() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Renaming fakeJob to newFakeJob
+ Item mockedItem = Mockito.mock(Job.class);
+ File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
+ when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
+ when(mockedItem.getName()).thenReturn("newFakeJob");
+ when(mockedItem.getParent()).thenReturn(null);
// We should duplicate files in fakeJob to newFakeJob
File oldJobDirectory = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/");
FileUtils.copyDirectory(oldJobDirectory, mockedItemRootDir);
- sscItemListener.onRenamed(mockedItem, "fakeJob", "newFakeJob");
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobRenameBeCorrectlyImpactedOnSCM/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobAddBeCorrectlyImpactedOnSCM() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- File jobDirectory = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
- File configFile = new File(jobDirectory.getAbsolutePath() + File.separator + "config.xml");
- jobDirectory.mkdir();
- FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobAddBeCorrectlyImpactedOnSCM/jobs/newFakeJob/config.xml").getFile(), configFile);
-
- // Creating fake new job
- Item mockedItem = Mockito.mock(TopLevelItem.class);
- when(mockedItem.getRootDir()).thenReturn(jobDirectory);
-
- sscItemListener.onCreated(mockedItem);
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
-
- sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobAddBeCorrectlyImpactedOnSCM/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobModificationBeCorrectlyImpactedOnSCM() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- File jobDirectory = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
- File configFile = new File(jobDirectory.getAbsolutePath() + File.separator + "config.xml");
-
- // Creating fake new job
- Item mockedItem = Mockito.mock(TopLevelItem.class);
- when(mockedItem.getRootDir()).thenReturn(jobDirectory);
-
- sscItemListener.onCreated(mockedItem);
-
- sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
-
- FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobModificationBeCorrectlyImpactedOnSCM/jobs/fakeJob/config.xml").getFile(), configFile);
-
- sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobModificationBeCorrectlyImpactedOnSCM/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldConfigModificationBeCorrectlyImpactedOnSCM() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- File configFile = new File(getCurrentHudsonRootDirectory() + "/hudson.tasks.Shell.xml" );
-
- // Creating fake new job
- Item mockedItem = Mockito.mock(Item.class);
- when(mockedItem.getRootDir()).thenReturn(configFile);
-
- sscItemListener.onCreated(mockedItem);
- sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
-
- FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldConfigModificationBeCorrectlyImpactedOnSCM/hudson.tasks.Shell.xml").getFile(), configFile);
-
- sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldConfigModificationBeCorrectlyImpactedOnSCM/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobRenameDoesntPerformAnyScmUpdate() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Let's checkout current scm view ... and commit something in it ...
- SCMManipulator scmManipulator = createMockedScmManipulator();
- File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
- scmManipulator.checkout(checkoutDirectoryForVerifications);
- final File hello1 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/jobs/hello.txt");
- final File hello2 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/hello2.txt");
- FileUtils.fileAppend(hello1.getAbsolutePath(), "hello world !");
- FileUtils.fileAppend(hello2.getAbsolutePath(), "hello world 2 !");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/hello.txt");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "hello2.txt");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit");
-
- // Renaming fakeJob to newFakeJob
- Item mockedItem = Mockito.mock(Item.class);
- File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
- when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
-
- sscItemListener.onRenamed(mockedItem, "fakeJob", "newFakeJob");
-
- // Assert no hello file is present in current hudson root
- assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/jobs/hello.txt").exists(), is(false));
- assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/hello2.txt").exists(), is(false));
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobDeleteBeCorrectlyImpactedOnSCM() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Deleting fakeJob
- Item mockedItem = Mockito.mock(TopLevelItem.class);
- File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
- when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
-
- sscItemListener.onDeleted(mockedItem);
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM" + getSuffixForTestFiles() + "/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM() throws Throwable {
- String newFakeJob = "expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM/jobs/newFakeJob";
- FileUtils.copyDirectoryStructure(new ClassPathResource(newFakeJob).getFile(), new File(getCurrentHudsonRootDirectory() + File.separator + "jobs" + File.separator + "newFakeJob"));
-
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Deleting fakeJob
- Item mockedItem = Mockito.mock(TopLevelItem.class);
- File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
- when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
-
- sscItemListener.onDeleted(mockedItem);
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldJobDeleteDoesntPerformAnyScmUpdate() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Let's checkout current scm view ... and commit something in it ...
- SCMManipulator scmManipulator = createMockedScmManipulator();
- File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
- scmManipulator.checkout(checkoutDirectoryForVerifications);
- final File hello1 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/jobs/hello.txt");
- final File hello2 = new File(checkoutDirectoryForVerifications.getAbsolutePath()+"/hello2.txt");
- FileUtils.fileAppend(hello1.getAbsolutePath(), "hello world !");
- FileUtils.fileAppend(hello2.getAbsolutePath(), "hello world 2 !");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/hello.txt");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "hello2.txt");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit");
-
- // Deleting fakeJob
- Item mockedItem = Mockito.mock(Item.class);
- File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
- when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
-
- sscItemListener.onDeleted(mockedItem);
-
- // Assert no hello file is present in current hudson root
- assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/jobs/hello.txt").exists(), is(false));
- assertThat(new File(this.getCurrentScmSyncConfigurationCheckoutDirectory()+"/hello2.txt").exists(), is(false));
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Let's checkout current scm view ... and commit something in it ...
- SCMManipulator scmManipulator = createMockedScmManipulator();
- File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
- scmManipulator.checkout(checkoutDirectoryForVerifications);
-
- verifyCurrentScmContentMatchesCurrentHudsonDir(true);
-
- final File configFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/config.xml");
- FileUtils.fileAppend(configFile.getAbsolutePath(), "toto");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on config file");
-
- final File configJobFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/fakeJob/config.xml");
- FileUtils.fileAppend(configJobFile.getAbsolutePath(), "titi");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on jonb file");
-
- verifyCurrentScmContentMatchesCurrentHudsonDir(false);
-
- // Reload config
- List
syncedFiles = sscBusiness.reloadAllFilesFromScm();
-
- verifyCurrentScmContentMatchesCurrentHudsonDir(true);
-
- assertThat(syncedFiles.size(), is(2));
- assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/config.xml")), is(true));
- assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/fakeJob/config.xml")), is(true));
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldReloadAllFilesUpdateScmAndReloadAllFilesWithFileAdd() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- // Let's checkout current scm view ... and commit something in it ...
- SCMManipulator scmManipulator = createMockedScmManipulator();
- File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
- scmManipulator.checkout(checkoutDirectoryForVerifications);
+ sscItemListener.onLocationChanged(mockedItem, "fakeJob", "newFakeJob");
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobRenameBeCorrectlyImpactedOnSCM/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldJobAddBeCorrectlyImpactedOnSCM() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File jobDirectory = new File(getCurrentHudsonRootDirectory() + "/jobs/newFakeJob/" );
+ File configFile = new File(jobDirectory.getAbsolutePath() + File.separator + "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobAddBeCorrectlyImpactedOnSCM/jobs/newFakeJob/config.xml").getFile(), configFile);
+
+ // Creating fake new job
+ Item mockedItem = Mockito.mock(Job.class);
+ when(mockedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onCreated(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobAddBeCorrectlyImpactedOnSCM/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldJobModificationBeCorrectlyImpactedOnSCM() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File jobDirectory = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
+ File configFile = new File(jobDirectory.getAbsolutePath() + File.separator + "config.xml");
+
+ // Creating fake new job
+ Item mockedItem = Mockito.mock(Job.class);
+ when(mockedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onCreated(mockedItem);
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobModificationBeCorrectlyImpactedOnSCM/jobs/fakeJob/config.xml").getFile(), configFile);
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobModificationBeCorrectlyImpactedOnSCM/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldConfigModificationBeCorrectlyImpactedOnSCM() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File configFile = new File(getCurrentHudsonRootDirectory() + "/hudson.tasks.Shell.xml" );
+
+ // Creating fake new plugin config
+ Item mockedItem = Mockito.mock(Item.class);
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.shouldConfigModificationBeCorrectlyImpactedOnSCM/hudson.tasks.Shell.xml").getFile(), configFile);
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldConfigModificationBeCorrectlyImpactedOnSCM/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldJobDeleteBeCorrectlyImpactedOnSCM() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Deleting fakeJob
+ Item mockedItem = Mockito.mock(Job.class);
+ File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
+ when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
+
+ sscItemListener.onDeleted(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM" + getSuffixForTestFiles() + "/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM() throws Throwable {
+ String newFakeJob = "expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM/jobs/newFakeJob";
+ FileUtils.copyDirectoryStructure(new ClassPathResource(newFakeJob).getFile(), new File(getCurrentHudsonRootDirectory() + File.separator + "jobs" + File.separator + "newFakeJob"));
+
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Deleting fakeJob
+ Item mockedItem = Mockito.mock(Job.class);
+ File mockedItemRootDir = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/" );
+ when(mockedItem.getRootDir()).thenReturn(mockedItemRootDir);
+
+ sscItemListener.onDeleted(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteWithTwoJobsBeCorrectlyImpactedOnSCM/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Let's checkout current scm view ... and commit something in it ...
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+ final File configFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/config.xml");
+ FileUtils.fileAppend(configFile.getAbsolutePath(), "toto");
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on config file");
+
+ final File configJobFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/fakeJob/config.xml");
+ FileUtils.fileAppend(configJobFile.getAbsolutePath(), "titi");
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on jonb file");
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(false);
+
+ // Reload config
+ List syncedFiles = sscBusiness.reloadAllFilesFromScm();
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+ assertThat(syncedFiles.size(), is(2));
+ assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/config.xml")), is(true));
+ assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/fakeJob/config.xml")), is(true));
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldReloadAllFilesUpdateScmAndReloadAllFilesWithFileAdd() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Let's checkout current scm view ... and commit something in it ...
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
// Verifying there isn't any difference between hudson and scm repo once every file are synchronized
- verifyCurrentScmContentMatchesCurrentHudsonDir(true);
-
- final File addedFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/myConfigFile.xml");
- FileUtils.fileWrite(addedFile.getAbsolutePath(), "toto");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "myConfigFile.xml");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit for add file");
-
- final String jobDir = checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/myJob";
- FileUtils.mkdir(jobDir);
- final File addedJobFile = new File(jobDir + "/config.xml");
- FileUtils.fileWrite(addedJobFile.getAbsolutePath(), "titi");
- scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/myJob");
- scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit for add job file");
-
- verifyCurrentScmContentMatchesCurrentHudsonDir(false);
-
- // Reload config
- List syncedFiles = sscBusiness.reloadAllFilesFromScm();
-
- verifyCurrentScmContentMatchesCurrentHudsonDir(true);
-
- assertThat(syncedFiles.size(), is(2));
- assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/myConfigFile.xml")), is(true));
- assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/myJob")), is(true));
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldFileWhichHaveToBeInSCM() throws Throwable {
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+ final File addedFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/myConfigFile.xml");
+ FileUtils.fileWrite(addedFile.getAbsolutePath(), "toto");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "myConfigFile.xml");
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit for add file");
+
+ final String jobDir = checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/myJob";
+ FileUtils.mkdir(jobDir);
+ final File addedJobFile = new File(jobDir + "/config.xml");
+ FileUtils.fileWrite(addedJobFile.getAbsolutePath(), "titi");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/myJob");
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit for add job file");
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(false);
+
+ // Reload config
+ List syncedFiles = sscBusiness.reloadAllFilesFromScm();
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+ assertThat(syncedFiles.size(), is(2));
+ assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/myConfigFile.xml")), is(true));
+ assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/myJob")), is(true));
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void testJobNameStartingWithDash() throws Exception {
+ createSCMMock();
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File jobDirectory = new File(getCurrentHudsonRootDirectory(), "jobs/-newFakeJob/" );
+ File configFile = new File(jobDirectory, "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml").getFile(), configFile);
+
+ // Creating fake new job
+ Item mockedItem = Mockito.mock(Job.class);
+ when(mockedItem.getName()).thenReturn("-newFakeJob");
+ when(mockedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onCreated(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/");
+
+ assertStatusManagerIsOk();
+
+ // Now delete it again
+ assertTrue("Config file deletion", configFile.delete());
+ assertTrue("Job dir deletion", jobDirectory.delete());
+
+ sscItemListener.onDeleted(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("hudsonRootBaseTemplate/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void testJobNameWithBlanks() throws Exception {
+ createSCMMock();
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File jobDirectory = new File(getCurrentHudsonRootDirectory(), "jobs/new fake Job/" );
+ File configFile = new File(jobDirectory, "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/new fake Job/config.xml").getFile(), configFile);
+
+ // Creating fake new job
+ Item mockedItem = Mockito.mock(Job.class);
+ when(mockedItem.getName()).thenReturn("new fake Job");
+ when(mockedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onCreated(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/");
+
+ assertStatusManagerIsOk();
+
+ // Now delete it again
+ assertTrue("Config file deletion", configFile.delete());
+ assertTrue("Job dir deletion", jobDirectory.delete());
+
+ sscItemListener.onDeleted(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("hudsonRootBaseTemplate/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void testJobRenameWithBlanksAndDash() throws Exception {
+ createSCMMock();
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ File jobDirectory = new File(getCurrentHudsonRootDirectory(), "jobs/-newFakeJob/" );
+ File configFile = new File(jobDirectory, "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml").getFile(), configFile);
+
+ // Creating fake new job
+ Item mockedItem = Mockito.mock(Job.class);
+ when(mockedItem.getName()).thenReturn("-newFakeJob");
+ when(mockedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onCreated(mockedItem);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(configFile));
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/");
+
+ assertStatusManagerIsOk();
+
+ // Now fake a rename
+ assertTrue("Config file deletion", configFile.delete());
+ assertTrue("Job dir deletion", jobDirectory.delete());
+ jobDirectory = new File(getCurrentHudsonRootDirectory(), "jobs/new fake Job/" );
+ configFile = new File(jobDirectory, "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/new fake Job/config.xml").getFile(), configFile);
+
+ Item mockedRenamedItem = Mockito.mock(Job.class);
+ when(mockedRenamedItem.getName()).thenReturn("new fake Job");
+ when(mockedRenamedItem.getRootDir()).thenReturn(jobDirectory);
+
+ sscItemListener.onLocationChanged(mockedRenamedItem, "-newFakeJob", "new fake Job");
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/");
+
+ assertStatusManagerIsOk();
+
+ // And while we're at it: let's rename it back
+ assertTrue("Config file deletion", configFile.delete());
+ assertTrue("Job dir deletion", jobDirectory.delete());
+ jobDirectory = new File(getCurrentHudsonRootDirectory(), "jobs/-newFakeJob/" );
+ configFile = new File(jobDirectory, "config.xml");
+ jobDirectory.mkdir();
+ FileUtils.copyFile(new ClassPathResource("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml").getFile(), configFile);
+
+ sscItemListener.onLocationChanged(mockedItem, "new fake Job", "-newFakeJob");
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldFileWhichHaveToBeInSCM() throws Throwable {
// IMPORTANT NOTE :
// For every tested files in this test, file path should exist in
// HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/ directory
- assertStrategy(JenkinsConfigScmSyncStrategy.class, Mockito.mock(Saveable.class), "config.xml");
- assertStrategy(BasicPluginsConfigScmSyncStrategy.class, Mockito.mock(Saveable.class), "hudson.scm.SubversionSCM.xml");
- assertStrategy(null, Mockito.mock(Saveable.class), "hudson.config.xml2");
- assertStrategy(null, Mockito.mock(Saveable.class), "nodeMonitors.xml");
- assertStrategy(null, Mockito.mock(Saveable.class), "toto" + File.separator + "hudson.config.xml");
-
- assertStrategy(null, Mockito.mock(Job.class), "toto" + File.separator + "config.xml");
- assertStrategy(null, Mockito.mock(Job.class), "jobs" + File.separator + "config.xml");
- assertStrategy(null, Mockito.mock(Saveable.class), "jobs" + File.separator + "myJob" + File.separator + "config.xml");
- assertStrategy(JobConfigScmSyncStrategy.class, Mockito.mock(TopLevelItem.class), "jobs" + File.separator + "myJob" + File.separator + "config.xml");
- assertStrategy(null, Mockito.mock(Job.class), "jobs" + File.separator + "myJob" + File.separator + "config2.xml");
- }
-
- private void assertStrategy(Class extends ScmSyncStrategy> expectedStrategyClass, Saveable saveableInstance, String targetPath) {
- ScmSyncStrategy strategy = ScmSyncConfigurationPlugin.getInstance().getStrategyForSaveable(saveableInstance, new File(getCurrentHudsonRootDirectory() + File.separator + targetPath));
- if (expectedStrategyClass == null) {
- assertThat(strategy, nullValue());
- }
- else {
- assertThat(strategy, notNullValue());
- assertThat(strategy, instanceOf(expectedStrategyClass));
- }
- }
+ assertStrategy(JenkinsConfigScmSyncStrategy.class, Mockito.mock(Saveable.class), "config.xml");
+ assertStrategy(BasicPluginsConfigScmSyncStrategy.class, Mockito.mock(Saveable.class), "hudson.scm.SubversionSCM.xml");
+ assertStrategy(null, Mockito.mock(Saveable.class), "hudson.config.xml2");
+ assertStrategy(null, Mockito.mock(Saveable.class), "nodeMonitors.xml");
+ assertStrategy(null, Mockito.mock(Saveable.class), "toto" + File.separator + "hudson.config.xml");
+
+ assertStrategy(null, Mockito.mock(Job.class), "toto" + File.separator + "config.xml");
+ assertStrategy(null, Mockito.mock(Job.class), "jobs" + File.separator + "config.xml");
+ assertStrategy(null, Mockito.mock(Saveable.class), "jobs" + File.separator + "myJob" + File.separator + "config.xml");
+ assertStrategy(JobConfigScmSyncStrategy.class, Mockito.mock(Job.class), "jobs" + File.separator + "myJob" + File.separator + "config.xml");
+ assertStrategy(JobConfigScmSyncStrategy.class, Mockito.mock(Job.class), "jobs" + File.separator + "myFolder" + File.separator + "jobs" + File.separator + "myJob" + File.separator + "config.xml");
+ assertStrategy(JobConfigScmSyncStrategy.class, Mockito.mock(AbstractItem.class), "jobs" + File.separator + "myFolder" + File.separator + "config.xml");
+ assertStrategy(null, Mockito.mock(Job.class), "jobs" + File.separator + "myJob" + File.separator + "config2.xml");
+ }
+
+ private void assertStrategy(Class extends ScmSyncStrategy> expectedStrategyClass, Saveable saveableInstance, String targetPath) {
+ ScmSyncStrategy strategy = ScmSyncConfigurationPlugin.getInstance().getStrategyForSaveable(saveableInstance, new File(getCurrentHudsonRootDirectory() + File.separator + targetPath));
+ if (expectedStrategyClass == null) {
+ assertThat(strategy, nullValue());
+ }
+ else {
+ assertThat(strategy, notNullValue());
+ assertThat(strategy, instanceOf(expectedStrategyClass));
+ }
+ }
@Override
- protected String getHudsonRootBaseTemplate(){
+ protected String getHudsonRootBaseTemplate(){
if("shouldFileWhichHaveToBeInSCM".equals(testName.getMethodName())){
return "HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/";
}
- return "hudsonRootBaseTemplate/";
- }
+ return "hudsonRootBaseTemplate/";
+ }
+
+ @Test
+ public void testPageMatchers() throws Exception {
+ assertStrategy(JobConfigScmSyncStrategy.class, Jenkins.getInstance().getRootUrl() + "job/jobName/configure");
+ assertStrategy(JobConfigScmSyncStrategy.class, Jenkins.getInstance().getRootUrl() + "job/folderName/job/jobName/configure");
+ assertStrategy(null, Jenkins.getInstance().getRootUrl() + "job/folderName/job/configure");
+ assertStrategy(null, Jenkins.getInstance().getRootUrl() + "job/folderName/job/someThing/configure/foo");
+ }
+
+ private void assertStrategy(Class extends ScmSyncStrategy> expectedStrategyClass, String url) {
+ ScmSyncStrategy strategy = ScmSyncConfigurationPlugin.getInstance().getStrategyForURL(url);
+ if (expectedStrategyClass == null) {
+ assertThat(strategy, nullValue());
+ }
+ else {
+ assertThat(strategy, notNullValue());
+ assertThat(strategy, instanceOf(expectedStrategyClass));
+ }
+ }
+
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java
index 75107891..434a0cd0 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java
@@ -17,78 +17,78 @@
@PrepareForTest(SCM.class)
public abstract class InitRepositoryTest extends ScmSyncConfigurationPluginBaseTest {
-
- protected InitRepositoryTest(ScmUnderTest scmUnderTest) {
- super(scmUnderTest);
- }
-
- @Test
- public void shouldNotInitializeAnyRepositoryWhenScmContextIsEmpty() throws Throwable {
- ScmContext emptyContext = new ScmContext(null, null);
- sscBusiness.init(emptyContext);
- assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
-
- emptyContext = new ScmContext(null, getSCMRepositoryURL());
- sscBusiness.init(emptyContext);
- assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
-
- createSCMMock(null);
- assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
-
- assertStatusManagerIsNull();
- }
-
- @Test
- @Ignore("Not yet implemented ! (it is difficult because svn list/log has not yet been implemented in svnjava impl")
- public void shouldInitializeLocalRepositoryWhenScmContextIsCorrentAndEvenIfScmDirectoryDoesntExist() throws Throwable {
- createSCMMock();
- assertThat(sscBusiness.scmCheckoutDirectorySettledUp(scmContext), is(true));
- }
-
- @Test
- public void shouldResetCheckoutConfigurationDirectoryWhenAsked() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // After init, local checkouted repository should exists
- assertThat(getCurrentScmSyncConfigurationCheckoutDirectory().exists(), is(true));
-
- // Populating checkoutConfiguration directory ..
- File fileWhichShouldBeDeletedAfterReset = new File(getCurrentScmSyncConfigurationCheckoutDirectory().getAbsolutePath()+"/hello.txt");
- assertThat(fileWhichShouldBeDeletedAfterReset.createNewFile(), is(true));
- FileUtils.fileWrite(fileWhichShouldBeDeletedAfterReset.getAbsolutePath(), "Hello world !");
-
- // Reseting the repository, without cleanup
- sscBusiness.initializeRepository(scmContext, false);
- assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(true));
-
- // Reseting the repository with cleanup
- sscBusiness.initializeRepository(scmContext, true);
- assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(false));
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldSynchronizeHudsonFiles() throws Throwable {
- // Initializing the repository...
- createSCMMock();
-
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
-
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
-
- assertStatusManagerIsOk();
- }
-
- @Test
- public void shouldInitializeLocalRepositoryWhenScmContextIsCorrect()
- throws Throwable {
- createSCMMock();
- assertThat(sscBusiness.scmCheckoutDirectorySettledUp(scmContext), is(true));
-
- assertStatusManagerIsOk();
- }
+
+ protected InitRepositoryTest(ScmUnderTest scmUnderTest) {
+ super(scmUnderTest);
+ }
+
+ @Test
+ public void shouldNotInitializeAnyRepositoryWhenScmContextIsEmpty() throws Throwable {
+ ScmContext emptyContext = new ScmContext(null, null);
+ sscBusiness.init(emptyContext);
+ assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
+
+ emptyContext = new ScmContext(null, getSCMRepositoryURL());
+ sscBusiness.init(emptyContext);
+ assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
+
+ createSCMMock(null);
+ assertThat(sscBusiness.scmCheckoutDirectorySettledUp(emptyContext), is(false));
+
+ assertStatusManagerIsNull();
+ }
+
+ @Test
+ @Ignore("Not yet implemented ! (it is difficult because svn list/log has not yet been implemented in svnjava impl")
+ public void shouldInitializeLocalRepositoryWhenScmContextIsCorrentAndEvenIfScmDirectoryDoesntExist() throws Throwable {
+ createSCMMock();
+ assertThat(sscBusiness.scmCheckoutDirectorySettledUp(scmContext), is(true));
+ }
+
+ @Test
+ public void shouldResetCheckoutConfigurationDirectoryWhenAsked() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // After init, local checked out repository should exist
+ assertThat(getCurrentScmSyncConfigurationCheckoutDirectory().exists(), is(true));
+
+ // Populating checkoutConfiguration directory ..
+ File fileWhichShouldBeDeletedAfterReset = new File(getCurrentScmSyncConfigurationCheckoutDirectory().getAbsolutePath()+"/hello.txt");
+ assertThat(fileWhichShouldBeDeletedAfterReset.createNewFile(), is(true));
+ FileUtils.fileWrite(fileWhichShouldBeDeletedAfterReset.getAbsolutePath(), "Hello world !");
+
+ // Reseting the repository, without cleanup
+ sscBusiness.initializeRepository(scmContext, false);
+ assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(true));
+
+ // Reseting the repository with cleanup
+ sscBusiness.initializeRepository(scmContext, true);
+ assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(false));
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldSynchronizeHudsonFiles() throws Throwable {
+ // Initializing the repository...
+ createSCMMock();
+
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/InitRepositoryTest.shouldSynchronizeHudsonFiles/");
+
+ assertStatusManagerIsOk();
+ }
+
+ @Test
+ public void shouldInitializeLocalRepositoryWhenScmContextIsCorrect()
+ throws Throwable {
+ createSCMMock();
+ assertThat(sscBusiness.scmCheckoutDirectorySettledUp(scmContext), is(true));
+
+ assertStatusManagerIsOk();
+ }
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/strategies/impl/JobConfigScmSyncStrategyTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/strategies/impl/JobConfigScmSyncStrategyTest.java
index e12fcf5b..153223bc 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/strategies/impl/JobConfigScmSyncStrategyTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/strategies/impl/JobConfigScmSyncStrategyTest.java
@@ -1,19 +1,13 @@
package hudson.plugins.scm_sync_configuration.strategies.impl;
import hudson.XmlFile;
-import hudson.model.Item;
import hudson.model.Job;
import hudson.plugins.scm_sync_configuration.ScmSyncConfigurationPlugin;
-import hudson.plugins.scm_sync_configuration.extensions.ScmSyncConfigurationItemListener;
import hudson.plugins.scm_sync_configuration.extensions.ScmSyncConfigurationSaveableListener;
-import hudson.plugins.scm_sync_configuration.strategies.ScmSyncStrategy;
-import hudson.plugins.scm_sync_configuration.util.ScmSyncConfigurationBaseTest;
import hudson.plugins.scm_sync_configuration.util.ScmSyncConfigurationPluginBaseTest;
-import hudson.plugins.test.utils.scms.ScmUnderTest;
import hudson.plugins.test.utils.scms.ScmUnderTestSubversion;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.util.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
@@ -35,34 +29,35 @@ public JobConfigScmSyncStrategyTest() {
}
@Before
- public void initObjectsUnderTests() throws Throwable{
- this.sscConfigurationSaveableListener = new ScmSyncConfigurationSaveableListener();
+ public void initObjectsUnderTests() throws Throwable{
+ this.sscConfigurationSaveableListener = new ScmSyncConfigurationSaveableListener();
}
+ @Override
protected String getHudsonRootBaseTemplate(){
- return "jobConfigStrategyTemplate/";
- }
+ return "jobConfigStrategyTemplate/";
+ }
// Reproducing JENKINS-17545
@Test
public void shouldConfigInSubmodulesNotSynced() throws ComponentLookupException, PlexusContainerException, IOException {
- // Initializing the repository...
- createSCMMock();
+ // Initializing the repository...
+ createSCMMock();
- // Synchronizing hudson config files
- sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+ // Synchronizing hudson config files
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
File subModuleConfigFile = new File(getCurrentHudsonRootDirectory() + "/jobs/fakeJob/modules/submodule/config.xml" );
// Creating fake new item
- Job mockedItem = Mockito.mock(Job.class);
+ Job,?> mockedItem = Mockito.mock(Job.class);
when(mockedItem.getRootDir()).thenReturn(subModuleConfigFile.getParentFile());
sscConfigurationSaveableListener.onChange(mockedItem, new XmlFile(subModuleConfigFile));
- verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/JobConfigScmSyncStrategyTest.shouldConfigInSubmodulesNotSynced/");
+ verifyCurrentScmContentMatchesHierarchy("expected-scm-hierarchies/JobConfigScmSyncStrategyTest.shouldConfigInSubmodulesNotSynced/");
- assertStatusManagerIsOk();
+ assertStatusManagerIsOk();
}
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java
index 5de847fa..2bef1afe 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java
@@ -16,6 +16,7 @@
import hudson.plugins.scm_sync_configuration.xstream.migration.ScmSyncConfigurationPOJO;
import hudson.plugins.test.utils.DirectoryUtils;
import hudson.plugins.test.utils.scms.ScmUnderTest;
+
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.util.FileUtils;
@@ -32,13 +33,15 @@
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.core.io.ClassPathResource;
+import com.google.common.collect.Lists;
+
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
-import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
+import jenkins.model.Jenkins;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.spy;
@@ -46,191 +49,204 @@
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({ "org.tmatesoft.svn.*" })
-@PrepareForTest({Hudson.class, SCM.class, ScmSyncSubversionSCM.class, PluginWrapper.class})
+@PrepareForTest({Hudson.class, Jenkins.class, SCM.class, ScmSyncSubversionSCM.class, PluginWrapper.class})
public abstract class ScmSyncConfigurationBaseTest {
-
- @Rule protected TestName testName = new TestName();
- private File currentTestDirectory = null;
- private File curentLocalRepository = null;
- private File currentHudsonRootDirectory = null;
- protected ScmSyncConfigurationBusiness sscBusiness = null;
- protected ScmContext scmContext = null;
-
- private ScmUnderTest scmUnderTest;
-
- protected ScmSyncConfigurationBaseTest(ScmUnderTest scmUnderTest) {
- this.scmUnderTest = scmUnderTest;
- this.scmContext = null;
- }
-
- @Before
- public void setup() throws Throwable {
- // Instantiating ScmSyncConfigurationPlugin instance for unit tests by using
+
+ @Rule protected TestName testName = new TestName();
+
+ private static final String TEST_URL = "https://jenkins.example.org/";
+
+ private File currentTestDirectory = null;
+ private File curentLocalRepository = null;
+ private File currentHudsonRootDirectory = null;
+ protected ScmSyncConfigurationBusiness sscBusiness = null;
+ protected ScmContext scmContext = null;
+
+ private final ScmUnderTest scmUnderTest;
+
+ protected ScmSyncConfigurationBaseTest(ScmUnderTest scmUnderTest) {
+ this.scmUnderTest = scmUnderTest;
+ this.scmContext = null;
+ }
+
+ @SuppressWarnings("deprecation") // We need to mock Hudson.getInstance()
+ @Before
+ public void setup() throws Throwable {
+ // Instantiating ScmSyncConfigurationPlugin instance for unit tests by using
// synchronous transactions (instead of an asynchronous ones)
// => this way, every commit will be processed synchronously !
- ScmSyncConfigurationPlugin scmSyncConfigPluginInstance = new ScmSyncConfigurationPlugin(true);
-
- // Mocking PluginWrapper attached to current ScmSyncConfigurationPlugin instance
- PluginWrapper pluginWrapper = PowerMockito.mock(PluginWrapper.class);
- when(pluginWrapper.getShortName()).thenReturn("scm-sync-configuration");
- // Setting field on current plugin instance
- Field wrapperField = Plugin.class.getDeclaredField("wrapper");
- boolean wrapperFieldAccessibility = wrapperField.isAccessible();
- wrapperField.setAccessible(true);
- wrapperField.set(scmSyncConfigPluginInstance, pluginWrapper);
- wrapperField.setAccessible(wrapperFieldAccessibility);
-
- Field businessField = ScmSyncConfigurationPlugin.class.getDeclaredField("business");
- businessField.setAccessible(true);
- sscBusiness = (ScmSyncConfigurationBusiness) businessField.get(scmSyncConfigPluginInstance);
-
- // Mocking Hudson root directory
- currentTestDirectory = createTmpDirectory("SCMSyncConfigTestsRoot");
- currentHudsonRootDirectory = new File(currentTestDirectory.getAbsolutePath()+"/hudsonRootDir/");
- if(!(currentHudsonRootDirectory.mkdir())) { throw new IOException("Could not create hudson root directory: " + currentHudsonRootDirectory.getAbsolutePath()); }
- FileUtils.copyDirectoryStructure(new ClassPathResource(getHudsonRootBaseTemplate()).getFile(), currentHudsonRootDirectory);
+ ScmSyncConfigurationPlugin scmSyncConfigPluginInstance = new ScmSyncConfigurationPlugin(true) {
+ @Override
+ public void initialInit() throws Exception {
+ // No-op. We *must not* initialize here in tests because the tests provide their own setup.
+ }
+ };
+
+ // Mocking PluginWrapper attached to current ScmSyncConfigurationPlugin instance
+ PluginWrapper pluginWrapper = PowerMockito.mock(PluginWrapper.class);
+ when(pluginWrapper.getShortName()).thenReturn("scm-sync-configuration");
+ // Setting field on current plugin instance
+ Field wrapperField = Plugin.class.getDeclaredField("wrapper");
+ boolean wrapperFieldAccessibility = wrapperField.isAccessible();
+ wrapperField.setAccessible(true);
+ wrapperField.set(scmSyncConfigPluginInstance, pluginWrapper);
+ wrapperField.setAccessible(wrapperFieldAccessibility);
+
+ Field businessField = ScmSyncConfigurationPlugin.class.getDeclaredField("business");
+ businessField.setAccessible(true);
+ sscBusiness = (ScmSyncConfigurationBusiness) businessField.get(scmSyncConfigPluginInstance);
+
+ // Mocking Hudson root directory
+ currentTestDirectory = createTmpDirectory("SCMSyncConfigTestsRoot");
+ currentHudsonRootDirectory = new File(currentTestDirectory.getAbsolutePath()+"/hudsonRootDir/");
+ if(!(currentHudsonRootDirectory.mkdir())) { throw new IOException("Could not create hudson root directory: " + currentHudsonRootDirectory.getAbsolutePath()); }
+ FileUtils.copyDirectoryStructure(new ClassPathResource(getHudsonRootBaseTemplate()).getFile(), currentHudsonRootDirectory);
//EnvVars env = Computer.currentComputer().getEnvironment();
//env.put("HUDSON_HOME", tmpHudsonRoot.getPath() );
- // Creating local repository...
- curentLocalRepository = new File(currentTestDirectory.getAbsolutePath()+"/localRepo/");
- if(!(curentLocalRepository.mkdir())) { throw new IOException("Could not create local repo directory: " + curentLocalRepository.getAbsolutePath()); }
- scmUnderTest.initRepo(curentLocalRepository);
-
- // Mocking user
- User mockedUser = Mockito.mock(User.class);
- when(mockedUser.getId()).thenReturn("fcamblor");
-
- // Mocking Hudson singleton instance ...
- // Warning : this line will only work on Objenesis supported VMs :
- // http://code.google.com/p/objenesis/wiki/ListOfCurrentlySupportedVMs
- Hudson hudsonMockedInstance = spy((Hudson) new ObjenesisStd().getInstantiatorOf(Hudson.class).newInstance());
- PowerMockito.doReturn(currentHudsonRootDirectory).when(hudsonMockedInstance).getRootDir();
- PowerMockito.doReturn(mockedUser).when(hudsonMockedInstance).getMe();
- PowerMockito.doReturn(scmSyncConfigPluginInstance).when(hudsonMockedInstance).getPlugin(ScmSyncConfigurationPlugin.class);
-
- PowerMockito.mockStatic(Hudson.class);
- PowerMockito.doReturn(hudsonMockedInstance).when(Hudson.class); Hudson.getInstance();
- //when(Hudson.getInstance()).thenReturn(hudsonMockedInstance);
- }
-
- @After
- public void teardown() throws Throwable {
- // Deleting current test directory
- FileUtils.deleteDirectory(currentTestDirectory);
- }
-
- // Overridable
- protected String getHudsonRootBaseTemplate(){
- return "hudsonRootBaseTemplate/";
- }
-
- protected static File createTmpDirectory(String directoryPrefix) throws IOException {
- final File temp = File.createTempFile(directoryPrefix, Long.toString(System.nanoTime()));
- if(!(temp.delete())) { throw new IOException("Could not delete temp file: " + temp.getAbsolutePath()); }
- if(!(temp.mkdir())) { throw new IOException("Could not create temp directory: " + temp.getAbsolutePath()); }
- return (temp);
- }
-
- protected SCM createSCMMock(){
- return createSCMMock(getSCMRepositoryURL());
- }
-
- protected SCM createSCMMock(String url){
- SCM mockedSCM = spy(SCM.valueOf(getSCMClass().getName()));
-
- if(scmUnderTest.useCredentials()){
- SCMCredentialConfiguration mockedCredential = new SCMCredentialConfiguration("toto");
- PowerMockito.doReturn(mockedCredential).when(mockedSCM).extractScmCredentials((String)Mockito.notNull());
- }
-
- scmContext = new ScmContext(mockedSCM, url);
- ScmSyncConfigurationPOJO config = new DefaultSSCPOJO();
- config.setScm(scmContext.getScm());
- config.setScmRepositoryUrl(scmContext.getScmRepositoryUrl());
- ScmSyncConfigurationPlugin.getInstance().loadData(config);
- ScmSyncConfigurationPlugin.getInstance().init();
-
- return mockedSCM;
- }
-
- protected SCMManipulator createMockedScmManipulator() throws ComponentLookupException, PlexusContainerException{
- // Settling up scm context
- SCMManipulator scmManipulator = new SCMManipulator(SCMManagerFactory.getInstance().createScmManager());
- boolean configSettledUp = scmManipulator.scmConfigurationSettledUp(scmContext, true);
- assertThat(configSettledUp, is(true));
-
- return scmManipulator;
- }
-
- protected void verifyCurrentScmContentMatchesCurrentHudsonDir(boolean match) throws ComponentLookupException, PlexusContainerException, IOException{
+ // Creating local repository...
+ curentLocalRepository = new File(currentTestDirectory.getAbsolutePath()+"/localRepo/");
+ if(!(curentLocalRepository.mkdir())) { throw new IOException("Could not create local repo directory: " + curentLocalRepository.getAbsolutePath()); }
+ scmUnderTest.initRepo(curentLocalRepository);
+
+ // Mocking user
+ User mockedUser = Mockito.mock(User.class);
+ when(mockedUser.getId()).thenReturn("fcamblor");
+
+ // Mocking Hudson singleton instance ...
+ // Warning : this line will only work on Objenesis supported VMs :
+ // http://code.google.com/p/objenesis/wiki/ListOfCurrentlySupportedVMs
+ Hudson hudsonMockedInstance = spy((Hudson) new ObjenesisStd().getInstantiatorOf(Hudson.class).newInstance());
+ PowerMockito.doReturn(currentHudsonRootDirectory).when(hudsonMockedInstance).getRootDir();
+ PowerMockito.doReturn(mockedUser).when(hudsonMockedInstance).getMe();
+ PowerMockito.doReturn(scmSyncConfigPluginInstance).when(hudsonMockedInstance).getPlugin(ScmSyncConfigurationPlugin.class);
+ PowerMockito.doReturn(TEST_URL).when(hudsonMockedInstance).getRootUrl();
+ PowerMockito.doReturn(TEST_URL).when(hudsonMockedInstance).getRootUrlFromRequest();
+
+ PowerMockito.mockStatic(Jenkins.class);
+ PowerMockito.doReturn(hudsonMockedInstance).when(Jenkins.class); Jenkins.getInstance();
+ PowerMockito.mockStatic(Hudson.class);
+ PowerMockito.doReturn(hudsonMockedInstance).when(Hudson.class); Hudson.getInstance();
+ //when(Hudson.getInstance()).thenReturn(hudsonMockedInstance);
+ }
+
+ @After
+ public void teardown() throws Throwable {
+ // Deleting current test directory
+ FileUtils.deleteDirectory(currentTestDirectory);
+ }
+
+ // Overridable
+ protected String getHudsonRootBaseTemplate(){
+ return "hudsonRootBaseTemplate/";
+ }
+
+ protected static File createTmpDirectory(String directoryPrefix) throws IOException {
+ final File temp = File.createTempFile(directoryPrefix, Long.toString(System.nanoTime()));
+ if(!(temp.delete())) { throw new IOException("Could not delete temp file: " + temp.getAbsolutePath()); }
+ if(!(temp.mkdir())) { throw new IOException("Could not create temp directory: " + temp.getAbsolutePath()); }
+ return (temp);
+ }
+
+ protected SCM createSCMMock(){
+ return createSCMMock(getSCMRepositoryURL());
+ }
+
+ protected SCM createSCMMock(String url){
+ SCM mockedSCM = spy(SCM.valueOf(getSCMClass().getName()));
+
+ if(scmUnderTest.useCredentials()){
+ SCMCredentialConfiguration mockedCredential = new SCMCredentialConfiguration("toto");
+ PowerMockito.doReturn(mockedCredential).when(mockedSCM).extractScmCredentials((String)Mockito.notNull());
+ }
+
+ scmContext = new ScmContext(mockedSCM, url);
+ ScmSyncConfigurationPOJO config = new DefaultSSCPOJO();
+ config.setScm(scmContext.getScm());
+ config.setScmRepositoryUrl(scmContext.getScmRepositoryUrl());
+ ScmSyncConfigurationPlugin.getInstance().loadData(config);
+ ScmSyncConfigurationPlugin.getInstance().init();
+
+ return mockedSCM;
+ }
+
+ protected SCMManipulator createMockedScmManipulator() throws ComponentLookupException, PlexusContainerException{
+ // Settling up scm context
+ SCMManipulator scmManipulator = new SCMManipulator(SCMManagerFactory.getInstance().createScmManager());
+ boolean configSettledUp = scmManipulator.scmConfigurationSettledUp(scmContext, true);
+ assertThat(configSettledUp, is(true));
+
+ return scmManipulator;
+ }
+
+ protected void verifyCurrentScmContentMatchesCurrentHudsonDir(boolean match) throws ComponentLookupException, PlexusContainerException, IOException{
verifyCurrentScmContentMatchesHierarchy(getCurrentHudsonRootDirectory(), match);
}
protected void verifyCurrentScmContentMatchesHierarchy(String hierarchyPath, boolean match) throws ComponentLookupException, PlexusContainerException, IOException{
- verifyCurrentScmContentMatchesHierarchy(new ClassPathResource(hierarchyPath).getFile(), match);
- }
+ verifyCurrentScmContentMatchesHierarchy(new ClassPathResource(hierarchyPath).getFile(), match);
+ }
protected void verifyCurrentScmContentMatchesHierarchy(File hierarchy, boolean match) throws ComponentLookupException, PlexusContainerException, IOException{
- SCMManipulator scmManipulator = createMockedScmManipulator();
-
- // Checkouting scm in temp directory
- File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__verifyCurrentScmContentMatchesHierarchy");
- scmManipulator.checkout(checkoutDirectoryForVerifications);
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+
+ // Checkouting scm in temp directory
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__verifyCurrentScmContentMatchesHierarchy");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
List diffs = DirectoryUtils.diffDirectories(checkoutDirectoryForVerifications, hierarchy,
getSpecialSCMDirectoryExcludePattern(), true);
- FileUtils.deleteDirectory(checkoutDirectoryForVerifications);
-
+ FileUtils.deleteDirectory(checkoutDirectoryForVerifications);
+
if(match){
assertTrue("Directories doesn't match : "+diffs, diffs.isEmpty());
} else {
assertFalse("Directories should _not_ match !", diffs.isEmpty());
}
- }
-
- protected void verifyCurrentScmContentMatchesHierarchy(String hierarchyPath) throws ComponentLookupException, PlexusContainerException, IOException{
- verifyCurrentScmContentMatchesHierarchy(hierarchyPath, true);
- }
-
- // Overridable in a near future (when dealing with multiple scms ...)
- protected String getSCMRepositoryURL(){
- return scmUnderTest.createUrl(this.getCurentLocalRepository().getAbsolutePath());
- }
-
- protected static List getSpecialSCMDirectoryExcludePattern(){
- return new ArrayList(){{
- add(Pattern.compile("\\.svn"));
- add(Pattern.compile("\\.git.*"));
- add(Pattern.compile("scm-sync-configuration\\..*\\.log"));
- add(Pattern.compile("scm-sync-configuration"));
- }};
- }
-
- protected String getSuffixForTestFiles() {
- return scmUnderTest.getSuffixForTestFiles();
- }
-
- // Overridable in a near future (when dealing with multiple scms ...)
- protected Class extends SCM> getSCMClass(){
- return scmUnderTest.getClazz();
- }
-
- protected File getCurrentTestDirectory() {
- return currentTestDirectory;
- }
-
- protected File getCurentLocalRepository() {
- return curentLocalRepository;
- }
-
- public File getCurrentHudsonRootDirectory() {
- return currentHudsonRootDirectory;
- }
-
- public File getCurrentScmSyncConfigurationCheckoutDirectory(){
- return new File(currentHudsonRootDirectory.getAbsolutePath()+"/scm-sync-configuration/checkoutConfiguration/");
- }
-
+ }
+
+ protected void verifyCurrentScmContentMatchesHierarchy(String hierarchyPath) throws ComponentLookupException, PlexusContainerException, IOException{
+ verifyCurrentScmContentMatchesHierarchy(hierarchyPath, true);
+ }
+
+ // Overridable in a near future (when dealing with multiple scms ...)
+ protected String getSCMRepositoryURL(){
+ return scmUnderTest.createUrl(this.getCurentLocalRepository().getAbsolutePath());
+ }
+
+ protected static List getSpecialSCMDirectoryExcludePattern(){
+ return Lists.newArrayList(
+ Pattern.compile("\\.svn"),
+ Pattern.compile("\\.git.*"),
+ Pattern.compile("scm-sync-configuration\\..*\\.log"),
+ Pattern.compile("scm-sync-configuration")
+ );
+ }
+
+ protected String getSuffixForTestFiles() {
+ return scmUnderTest.getSuffixForTestFiles();
+ }
+
+ // Overridable in a near future (when dealing with multiple scms ...)
+ protected Class extends SCM> getSCMClass(){
+ return scmUnderTest.getClazz();
+ }
+
+ protected File getCurrentTestDirectory() {
+ return currentTestDirectory;
+ }
+
+ protected File getCurentLocalRepository() {
+ return curentLocalRepository;
+ }
+
+ public File getCurrentHudsonRootDirectory() {
+ return currentHudsonRootDirectory;
+ }
+
+ public File getCurrentScmSyncConfigurationCheckoutDirectory(){
+ return new File(currentHudsonRootDirectory.getAbsolutePath()+"/scm-sync-configuration/checkoutConfiguration/");
+ }
+
}
diff --git a/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/config.xml b/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/config.xml
new file mode 100644
index 00000000..f1972d75
--- /dev/null
+++ b/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/jobs/myJob/config.xml b/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/jobs/myJob/config.xml
new file mode 100644
index 00000000..f1972d75
--- /dev/null
+++ b/src/test/resources/HudsonExtensionsTest.shouldFileWhichHaveToBeInSCM/jobs/myFolder/jobs/myJob/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/config.xml
new file mode 100644
index 00000000..824eae41
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/config.xml
@@ -0,0 +1,31 @@
+
+
+ 1.339
+ 2
+ NORMAL
+ true
+
+
+ true
+
+ Welcome !
+
+
+
+ 5
+ 0
+
+
+
+ All
+ false
+ false
+
+
+ All
+ 0
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/hudson.tasks.Shell.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/hudson.tasks.Shell.xml
new file mode 100644
index 00000000..8b953697
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/hudson.tasks.Shell.xml
@@ -0,0 +1,5 @@
+
+
+
+ /bin/bash
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml
new file mode 100644
index 00000000..fe28eac3
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/-newFakeJob/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ true
+ false
+
+ false
+ true
+ false
+ true
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/fakeJob/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/fakeJob/config.xml
new file mode 100644
index 00000000..f1972d75
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/jobs/fakeJob/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/scm-sync-configuration.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/scm-sync-configuration.xml
new file mode 100644
index 00000000..a83018f2
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameStartingWithDash/scm-sync-configuration.xml
@@ -0,0 +1,5 @@
+
+
+ scm:svn:https://myrepo/synchronizedDirectory/
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/config.xml
new file mode 100644
index 00000000..824eae41
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/config.xml
@@ -0,0 +1,31 @@
+
+
+ 1.339
+ 2
+ NORMAL
+ true
+
+
+ true
+
+ Welcome !
+
+
+
+ 5
+ 0
+
+
+
+ All
+ false
+ false
+
+
+ All
+ 0
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/hudson.tasks.Shell.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/hudson.tasks.Shell.xml
new file mode 100644
index 00000000..8b953697
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/hudson.tasks.Shell.xml
@@ -0,0 +1,5 @@
+
+
+
+ /bin/bash
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/fakeJob/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/fakeJob/config.xml
new file mode 100644
index 00000000..f1972d75
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/fakeJob/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/new fake Job/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/new fake Job/config.xml
new file mode 100644
index 00000000..fe28eac3
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/jobs/new fake Job/config.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ false
+
+
+ true
+ true
+ false
+
+ false
+ true
+ false
+ true
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/scm-sync-configuration.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/scm-sync-configuration.xml
new file mode 100644
index 00000000..a83018f2
--- /dev/null
+++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.testAddJobNameWithBlanks/scm-sync-configuration.xml
@@ -0,0 +1,5 @@
+
+
+ scm:svn:https://myrepo/synchronizedDirectory/
+
+
\ No newline at end of file