diff --git a/src/test/java/org/jenkinsci/plugins/scriptler/builder/ScriptlerBuilderWithRestartTest.java b/src/test/java/org/jenkinsci/plugins/scriptler/builder/ScriptlerBuilderWithRestartTest.java index 236d898c..16da376a 100644 --- a/src/test/java/org/jenkinsci/plugins/scriptler/builder/ScriptlerBuilderWithRestartTest.java +++ b/src/test/java/org/jenkinsci/plugins/scriptler/builder/ScriptlerBuilderWithRestartTest.java @@ -41,17 +41,15 @@ import org.htmlunit.xml.XmlPage; import org.jenkinsci.plugins.scriptler.ScriptlerManagementHelper; import org.jenkinsci.plugins.scriptler.config.Parameter; -import org.jenkinsci.plugins.scriptler.testharness.RestartableJenkinsExtension; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.jvnet.hudson.test.JenkinsRule; -import org.jvnet.hudson.test.RestartableJenkinsRule; +import org.jvnet.hudson.test.junit.jupiter.WithJenkins; /** * Warning: a user without RUN_SCRIPT can currently only clone an existing builder INSIDE a project. * You can search CLONE_NOTE inside this test to see the cases */ -@ExtendWith(RestartableJenkinsExtension.class) +@WithJenkins class ScriptlerBuilderWithRestartTest { private static final String SCRIPT_CONTENTS = "print 'Hello World!'"; private static final String SCRIPT_USABLE_1 = "script_usable_1.groovy"; @@ -62,65 +60,49 @@ class ScriptlerBuilderWithRestartTest { private static final String SCRIPT_NOT_USABLE = "not_usable.groovy"; @Test - void configRoundTrip(RestartableJenkinsRule rule) { - rule.then(r -> { - r.jenkins.setCrumbIssuer(null); - - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_1, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_2, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_3, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_4, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_NOT_USABLE, SCRIPT_CONTENTS, false); - - FreeStyleProject project = r.createFreeStyleProject("test"); - - try (JenkinsRule.WebClient wc = r.createWebClient()) { - - WebRequest request = - new WebRequest(new URL(r.getURL() + project.getShortUrl() + "configSubmit"), HttpMethod.POST); - - final String projectName = project.getName(); - request.setRequestParameters(List.of(new NameValuePair( - "json", - JSONObject.fromObject(Map.of( - "name", - projectName, - "builder", - Map.of( - "kind", - ScriptlerBuilder.class.getName(), - "builderId", - "", - "scriptlerScriptId", - SCRIPT_USABLE_1, - "propagateParams", - true, - "defineParams", - Map.of( - "parameters", - List.of( - Map.of("name", "param1", "value", "value1"), - Map.of("name", "param2", "value", "value2")))))) - .toString()))); - HtmlPage page = wc.getPage(request); - r.assertGoodStatus(page); - - ScriptlerBuilder scriptlerBuilder = project.getBuildersList().get(ScriptlerBuilder.class); - assertNotNull(scriptlerBuilder); - assertNotNull(scriptlerBuilder.getBuilderId()); - assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); - assertTrue(scriptlerBuilder.isPropagateParams()); - assertIterableEquals( - List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), - scriptlerBuilder.getParametersList()); - } - }); - - rule.then(r -> { - FreeStyleProject p = r.jenkins.getItemByFullName("test", FreeStyleProject.class); - - ScriptlerBuilder scriptlerBuilder = - Objects.requireNonNull(p).getBuildersList().get(ScriptlerBuilder.class); + void configRoundTrip(JenkinsRule r) throws Throwable { + r.jenkins.setCrumbIssuer(null); + + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_1, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_2, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_3, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_4, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_NOT_USABLE, SCRIPT_CONTENTS, false); + + FreeStyleProject project = r.createFreeStyleProject("test"); + + try (JenkinsRule.WebClient wc = r.createWebClient()) { + + WebRequest request = + new WebRequest(new URL(r.getURL() + project.getShortUrl() + "configSubmit"), HttpMethod.POST); + + final String projectName = project.getName(); + request.setRequestParameters(List.of(new NameValuePair( + "json", + JSONObject.fromObject(Map.of( + "name", + projectName, + "builder", + Map.of( + "kind", + ScriptlerBuilder.class.getName(), + "builderId", + "", + "scriptlerScriptId", + SCRIPT_USABLE_1, + "propagateParams", + true, + "defineParams", + Map.of( + "parameters", + List.of( + Map.of("name", "param1", "value", "value1"), + Map.of("name", "param2", "value", "value2")))))) + .toString()))); + HtmlPage page = wc.getPage(request); + r.assertGoodStatus(page); + + ScriptlerBuilder scriptlerBuilder = project.getBuildersList().get(ScriptlerBuilder.class); assertNotNull(scriptlerBuilder); assertNotNull(scriptlerBuilder.getBuilderId()); assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); @@ -128,32 +110,45 @@ void configRoundTrip(RestartableJenkinsRule rule) { assertIterableEquals( List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), scriptlerBuilder.getParametersList()); - }); + } + + r.restart(); + + FreeStyleProject p = r.jenkins.getItemByFullName("test", FreeStyleProject.class); + + ScriptlerBuilder scriptlerBuilder = + Objects.requireNonNull(p).getBuildersList().get(ScriptlerBuilder.class); + assertNotNull(scriptlerBuilder); + assertNotNull(scriptlerBuilder.getBuilderId()); + assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); + assertTrue(scriptlerBuilder.isPropagateParams()); + assertIterableEquals( + List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), + scriptlerBuilder.getParametersList()); } @Test - void configRoundTripConfigXml(RestartableJenkinsRule rule) { - rule.then(r -> { - r.jenkins.setCrumbIssuer(null); + void configRoundTripConfigXml(JenkinsRule r) throws Throwable { + r.jenkins.setCrumbIssuer(null); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_1, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_2, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_3, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_4, SCRIPT_CONTENTS, true); - ScriptlerManagementHelper.saveScript(SCRIPT_NOT_USABLE, SCRIPT_CONTENTS, false); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_1, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_2, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_3, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_USABLE_4, SCRIPT_CONTENTS, true); + ScriptlerManagementHelper.saveScript(SCRIPT_NOT_USABLE, SCRIPT_CONTENTS, false); - FreeStyleProject project = r.createFreeStyleProject("test"); + FreeStyleProject project = r.createFreeStyleProject("test"); - try (JenkinsRule.WebClient wc = r.createWebClient()) { + try (JenkinsRule.WebClient wc = r.createWebClient()) { - XmlPage xmlPage = wc.goToXml(project.getShortUrl() + "config.xml"); - r.assertGoodStatus(xmlPage); - String xml = xmlPage.getWebResponse().getContentAsString(); + XmlPage xmlPage = wc.goToXml(project.getShortUrl() + "config.xml"); + r.assertGoodStatus(xmlPage); + String xml = xmlPage.getWebResponse().getContentAsString(); - String modifiedXml = xml.replace( - "", - String.format( - """ + String modifiedXml = xml.replace( + "", + String.format( + """ @@ -171,39 +166,38 @@ void configRoundTripConfigXml(RestartableJenkinsRule rule) { """, - SCRIPT_USABLE_1)); - - WebRequest request = new WebRequest(new URL(project.getAbsoluteUrl() + "config.xml"), HttpMethod.POST); - request.setRequestBody(modifiedXml); - request.setEncodingType(null); - HtmlPage page = wc.getPage(request); - r.assertGoodStatus(page); - - project = r.jenkins.getItemByFullName(project.getFullName(), FreeStyleProject.class); - ScriptlerBuilder scriptlerBuilder = - Objects.requireNonNull(project).getBuildersList().get(ScriptlerBuilder.class); - assertNotNull(scriptlerBuilder); - assertEquals("", scriptlerBuilder.getBuilderId()); - assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); - assertTrue(scriptlerBuilder.isPropagateParams()); - assertIterableEquals( - List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), - scriptlerBuilder.getParametersList()); - } - }); - - rule.then(r -> { - FreeStyleProject p = r.jenkins.getItemByFullName("test", FreeStyleProject.class); + SCRIPT_USABLE_1)); + WebRequest request = new WebRequest(new URL(project.getAbsoluteUrl() + "config.xml"), HttpMethod.POST); + request.setRequestBody(modifiedXml); + request.setEncodingType(null); + HtmlPage page = wc.getPage(request); + r.assertGoodStatus(page); + + project = r.jenkins.getItemByFullName(project.getFullName(), FreeStyleProject.class); ScriptlerBuilder scriptlerBuilder = - Objects.requireNonNull(p).getBuildersList().get(ScriptlerBuilder.class); + Objects.requireNonNull(project).getBuildersList().get(ScriptlerBuilder.class); assertNotNull(scriptlerBuilder); - assertNotNull(scriptlerBuilder.getBuilderId()); + assertEquals("", scriptlerBuilder.getBuilderId()); assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); assertTrue(scriptlerBuilder.isPropagateParams()); assertIterableEquals( List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), scriptlerBuilder.getParametersList()); - }); + } + + r.restart(); + + FreeStyleProject p = r.jenkins.getItemByFullName("test", FreeStyleProject.class); + + ScriptlerBuilder scriptlerBuilder = + Objects.requireNonNull(p).getBuildersList().get(ScriptlerBuilder.class); + assertNotNull(scriptlerBuilder); + assertNotNull(scriptlerBuilder.getBuilderId()); + assertEquals(SCRIPT_USABLE_1, scriptlerBuilder.getScriptId()); + assertTrue(scriptlerBuilder.isPropagateParams()); + assertIterableEquals( + List.of(new Parameter("param1", "value1"), new Parameter("param2", "value2")), + scriptlerBuilder.getParametersList()); } } diff --git a/src/test/java/org/jenkinsci/plugins/scriptler/testharness/RestartableJenkinsExtension.java b/src/test/java/org/jenkinsci/plugins/scriptler/testharness/RestartableJenkinsExtension.java deleted file mode 100644 index 78e9aae8..00000000 --- a/src/test/java/org/jenkinsci/plugins/scriptler/testharness/RestartableJenkinsExtension.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.jenkinsci.plugins.scriptler.testharness; - -import org.junit.jupiter.api.extension.AfterEachCallback; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.support.TypeBasedParameterResolver; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.Statement; -import org.jvnet.hudson.test.RestartableJenkinsRule; - -/** - * JUnit 5 extension providing {@link RestartableJenkinsRule} integration. - */ -public class RestartableJenkinsExtension extends TypeBasedParameterResolver - implements AfterEachCallback { - - private static final String KEY = "jenkins-instance"; - private static final ExtensionContext.Namespace NAMESPACE = - ExtensionContext.Namespace.create(RestartableJenkinsExtension.class); - - @Override - public void afterEach(ExtensionContext context) throws Exception { - final RestartableJenkinsRule rule = context.getStore(NAMESPACE).remove(KEY, RestartableJenkinsRule.class); - if (rule == null) { - return; - } - - try { - rule.apply( - new Statement() { - @Override - public void evaluate() { - // body is already evaluated, nothing more to do here - } - }, - new FrameworkMethod(context.getRequiredTestMethod()), - context.getRequiredTestInstance()) - .evaluate(); - } catch (Exception | Error e) { - throw e; - } catch (Throwable t) { - throw new Exception(t); - } - } - - @Override - public RestartableJenkinsRule resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) - throws ParameterResolutionException { - return extensionContext - .getStore(NAMESPACE) - .getOrComputeIfAbsent(KEY, key -> new RestartableJenkinsRule(), RestartableJenkinsRule.class); - } -}