From 06eccb61d2aa83b9d3a7e94724a6d207011de2d4 Mon Sep 17 00:00:00 2001 From: Maxim Epishchev Date: Mon, 1 Feb 2016 18:21:01 +0300 Subject: Add tests for integration CredentialsSupport functional By default we using username/password from original text fields (config.jelly). If credentials ID provided in plugin settings - using them for BitBucket API auth. --- .../BitbucketRepository.java | 43 +++++++++---- .../bitbucket/ApiClient.java | 71 +++++++++++++++------- 2 files changed, 80 insertions(+), 34 deletions(-) (limited to 'src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder') diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java index d8c736e..23b0607 100644 --- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java +++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java @@ -23,7 +23,7 @@ import jenkins.scm.api.SCMSourceOwner; import jenkins.scm.api.SCMSourceOwners; import org.apache.commons.lang.StringUtils; -static com.cloudbees.plugins.credentials.CredentialsMatchers.instanceOf; +import static com.cloudbees.plugins.credentials.CredentialsMatchers.instanceOf; /** * Created by nishio @@ -40,33 +40,46 @@ public class BitbucketRepository { private BitbucketPullRequestsBuilder builder; private BitbucketBuildTrigger trigger; private ApiClient client; - + public BitbucketRepository(String projectPath, BitbucketPullRequestsBuilder builder) { this.projectPath = projectPath; this.builder = builder; } public void init() { - this.init(null); + this.init(null, null); + } + + public void init(Class httpFactory) { + this.init(null, httpFactory); } public void init(ApiClient client) { + this.init(client, null); + } + + public void init(ApiClient client, Class httpFactory) { this.trigger = this.builder.getTrigger(); - String username = trigger.getUsername(); - String password = trigger.getPassword(); - StandardUsernamePasswordCredentials credentials = getCredentials(trigger.getCredentialsId()); - if (credentials != null) { - username = credentials.getUsername(); - password = credentials.getPassword().getPlainText(); - } - this.client = (client == null) ? new ApiClient( + + if (client == null) { + String username = trigger.getUsername(); + String password = trigger.getPassword(); + StandardUsernamePasswordCredentials credentials = getCredentials(trigger.getCredentialsId()); + if (credentials != null) { + username = credentials.getUsername(); + password = credentials.getPassword().getPlainText(); + } + this.client = new ApiClient( username, password, trigger.getRepositoryOwner(), trigger.getRepositoryName(), trigger.getCiKey(), - trigger.getCiName() - ) : client; + trigger.getCiName(), + httpFactory + ); + + } else this.client = client; } public Collection getTargetPullRequests() { @@ -80,6 +93,10 @@ public class BitbucketRepository { } return targetPullRequests; } + + public ApiClient getClient() { + return this.client; + } public void addFutureBuildTasks(Collection pullRequests) { for(Pullrequest pullRequest : pullRequests) { diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java index e635f65..509dfaf 100644 --- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java +++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java @@ -17,7 +17,6 @@ import java.util.logging.Logger; import jenkins.model.Jenkins; import hudson.ProxyConfiguration; import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.util.EncodingUtil; /** @@ -33,13 +32,55 @@ public class ApiClient { private Credentials credentials; private String key; private String name; - - public ApiClient(String username, String password, String owner, String repositoryName, String key, String name) { + private HttpClientFactory factory; + + public static class HttpClientFactory { + public static final HttpClientFactory INSTANCE = new HttpClientFactory(); + + public HttpClient getInstanceHttpClient() { + HttpClient client = new HttpClient(); + if (Jenkins.getInstance() == null) return client; + + ProxyConfiguration proxy = Jenkins.getInstance().proxy; + if (proxy == null) return client; + + logger.log(Level.INFO, "Jenkins proxy: {0}:{1}", new Object[]{ proxy.name, proxy.port }); + client.getHostConfiguration().setProxy(proxy.name, proxy.port); + String username = proxy.getUserName(); + String password = proxy.getPassword(); + + // Consider it to be passed if username specified. Sufficient? + if (username != null && !"".equals(username.trim())) { + logger.log(Level.INFO, "Using proxy authentication (user={0})", username); + client.getState().setProxyCredentials(AuthScope.ANY, + new UsernamePasswordCredentials(username, password)); + } + + return client; + } + } + + public ApiClient( + String username, String password, + String owner, String repositoryName, + String key, String name, + Class httpFactory + ) { this.credentials = new UsernamePasswordCredentials(username, password); this.owner = owner; this.repositoryName = repositoryName; this.key = key; this.name = name; + + try { + this.factory = (httpFactory != null) ? httpFactory.newInstance() : HttpClientFactory.INSTANCE; + } catch(InstantiationException e) { + logger.log(Level.WARNING, "failed new instance of {0}: {1} ", new Object[] { httpFactory.getName(), e }); + e.printStackTrace(); + } catch (IllegalAccessException e) { + logger.log(Level.WARNING, "failed new instance of {0}: {1} ", new Object[] { httpFactory.getName(), e }); + e.printStackTrace(); + } } public List getPullRequests() { @@ -47,6 +88,7 @@ public class ApiClient { return parse(get(v2("/pullrequests/")), Pullrequest.Response.class).getPullrequests(); } catch(Exception e) { logger.log(Level.WARNING, "invalid pull request response.", e); + e.printStackTrace(); } return Collections.EMPTY_LIST; } @@ -56,6 +98,7 @@ public class ApiClient { return parse(get(v1("/pullrequests/" + pullRequestId + "/comments")), new TypeReference>() {}); } catch(Exception e) { logger.log(Level.WARNING, "invalid pull request response.", e); + e.printStackTrace(); } return Collections.EMPTY_LIST; } @@ -112,6 +155,7 @@ public class ApiClient { return parse(post(v2("/pullrequests/" + pullRequestId + "/approve"), new NameValuePair[]{}), Pullrequest.Participant.class); } catch (IOException e) { + logger.log(Level.WARNING, "Invalid pull request approval response.", e); e.printStackTrace(); } return null; @@ -131,24 +175,7 @@ public class ApiClient { } private HttpClient getHttpClient() { - HttpClient client = new HttpClient(); - if (Jenkins.getInstance() == null) return client; - - ProxyConfiguration proxy = Jenkins.getInstance().proxy; - if (proxy == null) return client; - - logger.info("Jenkins proxy: " + proxy.name + ":" + proxy.port); - client.getHostConfiguration().setProxy(proxy.name, proxy.port); - String username = proxy.getUserName(); - String password = proxy.getPassword(); - - // Consider it to be passed if username specified. Sufficient? - if (username != null && !"".equals(username.trim())) { - logger.info("Using proxy authentication (user=" + username + ")"); - client.getState().setProxyCredentials(AuthScope.ANY, - new UsernamePasswordCredentials(username, password)); - } - return client; + return this.factory.getInstanceHttpClient(); } private String v1(String url) { @@ -193,8 +220,10 @@ public class ApiClient { client.executeMethod(req); return req.getResponseBodyAsString(); } catch (HttpException e) { + logger.log(Level.WARNING, "Failed to send request.", e); e.printStackTrace(); } catch (IOException e) { + logger.log(Level.WARNING, "Failed to send request.", e); e.printStackTrace(); } return null; -- cgit v1.2.3