diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-04-06 09:57:19 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-04-07 12:12:32 +0200 |
commit | a2be8c1b0c660f10b2e86ac046af3cfaea61214d (patch) | |
tree | a21057b61d9fb834c5c751e6f88021632d7fbcc3 /sonar-ws/src/test | |
parent | f6bfd1d2f0373da2d2929d9217721a81fc3afe5d (diff) | |
download | sonarqube-a2be8c1b0c660f10b2e86ac046af3cfaea61214d.tar.gz sonarqube-a2be8c1b0c660f10b2e86ac046af3cfaea61214d.zip |
SONAR-6948 Ability for Java server extensions to call web services
Diffstat (limited to 'sonar-ws/src/test')
3 files changed, 212 insertions, 15 deletions
diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/HttpConnectorTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/HttpConnectorTest.java index a18407bd28b..767978108a7 100644 --- a/sonar-ws/src/test/java/org/sonarqube/ws/client/HttpConnectorTest.java +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/HttpConnectorTest.java @@ -60,7 +60,7 @@ public class HttpConnectorTest { @Test public void test_default_settings() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(); assertThat(underTest.baseUrl()).isEqualTo(serverUrl); GetRequest request = new GetRequest("api/issues/search").setMediaType(MediaTypes.PROTOBUF); WsResponse response = underTest.call(request); @@ -87,7 +87,7 @@ public class HttpConnectorTest { @Test public void use_basic_authentication() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .credentials("theLogin", "thePassword") .build(); @@ -102,7 +102,7 @@ public class HttpConnectorTest { @Test public void use_basic_authentication_with_null_password() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .credentials("theLogin", null) .build(); @@ -121,7 +121,7 @@ public class HttpConnectorTest { @Test public void use_access_token() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .token("theToken") .build(); @@ -136,7 +136,7 @@ public class HttpConnectorTest { @Test public void use_proxy_authentication() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .proxyCredentials("theProxyLogin", "theProxyPassword") .build(); @@ -150,7 +150,7 @@ public class HttpConnectorTest { @Test public void override_timeouts() { - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .readTimeoutMilliseconds(42) .connectTimeoutMilliseconds(74) @@ -163,7 +163,7 @@ public class HttpConnectorTest { @Test public void send_user_agent() throws Exception { answerHelloWorld(); - HttpConnector underTest = new HttpConnector.Builder() + HttpConnector underTest = HttpConnector.newBuilder() .url(serverUrl) .userAgent("Maven Plugin/2.3") .build(); @@ -176,7 +176,7 @@ public class HttpConnectorTest { @Test public void fail_if_unknown_implementation_of_request() { - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(); try { underTest.call(mock(WsRequest.class)); fail(); @@ -192,7 +192,7 @@ public class HttpConnectorTest { .setParam("severity", "MAJOR") .setMediaType(MediaTypes.PROTOBUF); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(); WsResponse response = underTest.call(request); // verify response @@ -215,7 +215,7 @@ public class HttpConnectorTest { .setPart("report", new PostRequest.Part(MediaTypes.TXT, reportFile)) .setMediaType(MediaTypes.PROTOBUF); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(); WsResponse response = underTest.call(request); assertThat(response.hasContent()).isTrue(); @@ -233,7 +233,7 @@ public class HttpConnectorTest { public void http_error() throws Exception { server.enqueue(new MockResponse().setResponseCode(404)); PostRequest request = new PostRequest("api/issues/search"); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(); WsResponse wsResponse = underTest.call(request); assertThat(wsResponse.code()).isEqualTo(404); @@ -242,7 +242,7 @@ public class HttpConnectorTest { @Test public void support_base_url_ending_with_slash() throws Exception { assertThat(serverUrl).endsWith("/"); - HttpConnector underTest = new HttpConnector.Builder().url(StringUtils.removeEnd(serverUrl, "/")).build(); + HttpConnector underTest = HttpConnector.newBuilder().url(StringUtils.removeEnd(serverUrl, "/")).build(); GetRequest request = new GetRequest("api/issues/search"); answerHelloWorld(); @@ -255,7 +255,7 @@ public class HttpConnectorTest { public void support_base_url_with_context() { // just to be sure assertThat(serverUrl).endsWith("/"); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl + "sonar").build(); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl + "sonar").build(); GetRequest request = new GetRequest("api/issues/search"); answerHelloWorld(); @@ -269,7 +269,7 @@ public class HttpConnectorTest { @Test public void support_tls_1_2_on_java7() { when(javaVersion.isJava7()).thenReturn(true); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(javaVersion); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(javaVersion); assertTlsAndClearTextSpecifications(underTest); // enable TLS 1.0, 1.1 and 1.2 @@ -279,7 +279,7 @@ public class HttpConnectorTest { @Test public void support_tls_versions_of_java8() { when(javaVersion.isJava7()).thenReturn(false); - HttpConnector underTest = new HttpConnector.Builder().url(serverUrl).build(javaVersion); + HttpConnector underTest = HttpConnector.newBuilder().url(serverUrl).build(javaVersion); assertTlsAndClearTextSpecifications(underTest); assertThat(underTest.okHttpClient().getSslSocketFactory()).isInstanceOf(SSLSocketFactory.getDefault().getClass()); diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/LocalWsConnectorTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/LocalWsConnectorTest.java new file mode 100644 index 00000000000..d92f4a8d3d5 --- /dev/null +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/LocalWsConnectorTest.java @@ -0,0 +1,150 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonarqube.ws.client; + +import com.google.common.collect.ImmutableMap; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.apache.commons.io.IOUtils; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Test; +import org.sonar.api.server.ws.LocalConnector; +import org.sonarqube.ws.MediaTypes; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class LocalWsConnectorTest { + + LocalConnector connector = mock(LocalConnector.class); + LocalWsConnector underTest = new LocalWsConnector(connector); + + @Test + public void baseUrl_is_always_slash() { + assertThat(underTest.baseUrl()).isEqualTo("/"); + } + + @Test + public void call_request() throws Exception { + WsRequest wsRequest = new PostRequest("api/issues/search") + .setMediaType(MediaTypes.JSON) + .setParam("foo", "bar"); + answer(new DumbLocalResponse(400, MediaTypes.JSON, "{}".getBytes(UTF_8), Collections.<String>emptyList())); + + WsResponse wsResponse = underTest.call(wsRequest); + + verifyRequested("POST", "api/issues/search", MediaTypes.JSON, ImmutableMap.of("foo", "bar")); + assertThat(wsResponse.code()).isEqualTo(400); + assertThat(wsResponse.content()).isEqualTo("{}"); + assertThat(IOUtils.toString(wsResponse.contentReader())).isEqualTo("{}"); + assertThat(IOUtils.toString(wsResponse.contentStream())).isEqualTo("{}"); + assertThat(wsResponse.contentType()).isEqualTo(MediaTypes.JSON); + assertThat(wsResponse.requestUrl()).isEqualTo("api/issues/search"); + } + + @Test + public void call_request_with_defaults() throws Exception { + // no parameters, no media type + WsRequest wsRequest = new GetRequest("api/issues/search"); + answer(new DumbLocalResponse(200, MediaTypes.JSON, "".getBytes(UTF_8), Collections.<String>emptyList())); + + WsResponse wsResponse = underTest.call(wsRequest); + + verifyRequested("GET", "api/issues/search", MediaTypes.JSON, Collections.<String, String>emptyMap()); + assertThat(wsResponse.code()).isEqualTo(200); + assertThat(wsResponse.content()).isEqualTo(""); + assertThat(IOUtils.toString(wsResponse.contentReader())).isEqualTo(""); + assertThat(IOUtils.toString(wsResponse.contentStream())).isEqualTo(""); + assertThat(wsResponse.contentType()).isEqualTo(MediaTypes.JSON); + } + + private void answer(DumbLocalResponse response) { + when(connector.call(any(LocalConnector.LocalRequest.class))).thenReturn(response); + } + + private void verifyRequested(final String expectedMethod, final String expectedPath, + final String expectedMediaType, + final Map<String, String> expectedParams) { + verify(connector).call(argThat(new TypeSafeMatcher<LocalConnector.LocalRequest>() { + @Override + protected boolean matchesSafely(LocalConnector.LocalRequest localRequest) { + boolean ok = localRequest.getMethod().equals(expectedMethod) && localRequest.getPath().equals(expectedPath); + ok &= localRequest.getMediaType().equals(expectedMediaType); + for (Map.Entry<String, String> expectedParam : expectedParams.entrySet()) { + String paramKey = expectedParam.getKey(); + ok &= localRequest.hasParam(paramKey); + ok &= expectedParam.getValue().equals(localRequest.getParam(paramKey)); + } + return ok; + } + + @Override + public void describeTo(Description description) { + } + })); + } + + private static class DumbLocalResponse implements LocalConnector.LocalResponse { + private final int code; + private final String mediaType; + private final byte[] bytes; + private final List<String> headers; + + public DumbLocalResponse(int code, String mediaType, byte[] bytes, List<String> headers) { + this.code = code; + this.mediaType = mediaType; + this.bytes = bytes; + this.headers = headers; + } + + @Override + public int getStatus() { + return code; + } + + @Override + public String getMediaType() { + return mediaType; + } + + @Override + public byte[] getBytes() { + return bytes; + } + + @Override + public Collection<String> getHeaderNames() { + return headers; + } + + @Override + public String getHeader(String name) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientFactoriesTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientFactoriesTest.java new file mode 100644 index 00000000000..351a80dc295 --- /dev/null +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientFactoriesTest.java @@ -0,0 +1,47 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonarqube.ws.client; + +import org.junit.Test; +import org.sonar.api.server.ws.LocalConnector; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +public class WsClientFactoriesTest { + @Test + public void create_http_client() { + HttpConnector connector = HttpConnector.newBuilder().url("http://localhost:9000").build(); + WsClient client = WsClientFactories.getDefault().newClient(connector); + + assertThat(client).isInstanceOf(DefaultWsClient.class); + assertThat(client.wsConnector()).isSameAs(connector); + } + + @Test + public void create_local_client() { + LocalConnector connector = mock(LocalConnector.class); + WsClient client = WsClientFactories.getLocal().newClient(connector); + + assertThat(client).isInstanceOf(DefaultWsClient.class); + assertThat(client.wsConnector()).isInstanceOf(LocalWsConnector.class); + assertThat(((LocalWsConnector) client.wsConnector()).getLocalConnector()).isSameAs(connector); + } +} |