diff --git a/pom.xml b/pom.xml index c5b6a9bb..8ad65a7e 100644 --- a/pom.xml +++ b/pom.xml @@ -141,6 +141,11 @@ 1.16 test + + org.mockito + mockito-core + test + org.jenkins-ci.plugins subversion diff --git a/src/main/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManager.java b/src/main/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManager.java index 6b4c2953..7381eac5 100644 --- a/src/main/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManager.java +++ b/src/main/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManager.java @@ -1,9 +1,11 @@ package org.jenkinsci.plugins.rundeck.client; +import com.google.common.annotations.VisibleForTesting; import hudson.AbortException; import okhttp3.ResponseBody; import org.jenkinsci.plugins.rundeck.RundeckInstance; import org.rundeck.client.RundeckClient; +import org.rundeck.client.RundeckClient.Builder; import org.rundeck.client.api.RundeckApi; import org.rundeck.client.api.model.*; import org.rundeck.client.api.model.scheduler.ScheduledJobItem; @@ -23,6 +25,8 @@ public class RundeckClientManager implements RundeckManager { private RundeckInstance rundeckInstance; private Client client; + private Builder clientBuilder; + public RundeckClientManager() { } @@ -31,6 +35,20 @@ public RundeckClientManager(RundeckInstance rundeckInstance) { buildClient(); } + + private Builder createRundeckClientBuilder() { + if (clientBuilder != null) { + return clientBuilder; + } else { + return RundeckClient.builder(); + } + } + + @VisibleForTesting + protected void setRundeckClientBuilder(Builder builder) { + clientBuilder = builder; + } + public RundeckInstance getRundeckInstance() { return rundeckInstance; } @@ -49,12 +67,13 @@ public void setClient(Client client) { public void buildClient(){ if(client == null){ - RundeckClient.Builder builder = RundeckClient.builder().baseUrl(rundeckInstance.getUrl()); + RundeckClient.Builder builder = createRundeckClientBuilder().baseUrl(rundeckInstance.getUrl()); if(rundeckInstance.getToken()!=null && !rundeckInstance.getToken().getPlainText().isEmpty()){ builder.tokenAuth(rundeckInstance.getToken().getPlainText()); } - if(rundeckInstance.getLogin() != null && rundeckInstance.getPassword()!=null){ + if (rundeckInstance.getLogin() != null && rundeckInstance.getPassword() != null + && !rundeckInstance.getPassword().getPlainText().isEmpty()) { builder.passwordAuth(rundeckInstance.getLogin(),rundeckInstance.getPassword().getPlainText() ); } diff --git a/src/test/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManagerTest.java b/src/test/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManagerTest.java new file mode 100644 index 00000000..4f555002 --- /dev/null +++ b/src/test/java/org/jenkinsci/plugins/rundeck/client/RundeckClientManagerTest.java @@ -0,0 +1,39 @@ +package org.jenkinsci.plugins.rundeck.client; + +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import hudson.util.Secret; +import org.jenkinsci.plugins.rundeck.RundeckInstance; +import org.junit.Test; +import org.rundeck.client.RundeckClient; +import org.rundeck.client.RundeckClient.Builder; +import org.rundeck.client.api.RundeckApi; + +public class RundeckClientManagerTest { + + @Test + public void usingTokenDoesNotTryToSetUsernameAndPasswordCredentialsMethodWhenEarlierLoginInformationIsFoundInConfiguration() { + + Builder clientBuilderSpy = spy(RundeckClient.builder()); + + RundeckInstance rundeckInstanceMock = mock(RundeckInstance.class); + when(rundeckInstanceMock.getUrl()).thenReturn("http://localhost:4044"); + + when(rundeckInstanceMock.getToken()).thenReturn(Secret.fromString("aToken")); + when(rundeckInstanceMock.getTokenPlainText()).thenReturn("aToken"); + when(rundeckInstanceMock.getLogin()).thenReturn("bad_data_from_plugin_data_somehow"); + when(rundeckInstanceMock.getPassword()).thenReturn(Secret.fromString("")); + when(rundeckInstanceMock.getPasswordPlainText()).thenReturn(""); + + RundeckClientManager rundeckClientManager = new RundeckClientManager(rundeckInstanceMock); + rundeckClientManager.setRundeckClientBuilder(clientBuilderSpy); + rundeckClientManager.buildClient(); + + verify(clientBuilderSpy, never()).passwordAuth(anyString(), anyString()); + + } +}