diff --git a/client/pom.xml b/client/pom.xml index 8e457ffe..8afe0ad3 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,7 +5,7 @@ io.split.client java-client-parent - 4.13.0-rc2 + 4.13.0 java-client jar @@ -188,7 +188,6 @@ 4.12.0 - org.apache.commons diff --git a/client/src/main/java/io/split/client/SplitClientConfig.java b/client/src/main/java/io/split/client/SplitClientConfig.java index 48723862..6cb9632a 100644 --- a/client/src/main/java/io/split/client/SplitClientConfig.java +++ b/client/src/main/java/io/split/client/SplitClientConfig.java @@ -1103,7 +1103,16 @@ public SplitClientConfig build() { _storageMode = StorageMode.PLUGGABLE; } - return new SplitClientConfig( + if (_authScheme == HttpAuthScheme.KERBEROS) { + if (proxy() == null) { + throw new IllegalStateException("Kerberos mode require Proxy parameters."); + } + if (_kerberosPrincipalName == null) { + throw new IllegalStateException("Kerberos mode require Kerberos Principal Name."); + } + } + + return new SplitClientConfig( _endpoint, _eventsEndpoint, _featuresRefreshRate, diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index 6b99f355..f0b0c575 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -129,6 +129,7 @@ import java.util.HashSet; import java.util.List; import java.util.ArrayList; +import java.util.concurrent.TimeUnit; import static io.split.client.utils.SplitExecutorFactory.buildExecutorService; @@ -538,7 +539,9 @@ private static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClient httpClientbuilder = setupProxy(httpClientbuilder, config); } + // setup Kerberos client if (config.authScheme() == HttpAuthScheme.KERBEROS) { + _log.info("Using Kerberos-Proxy Authentication Scheme."); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(config.proxy().getHostName(), config.proxy().getPort())); HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.HEADERS); @@ -552,7 +555,8 @@ private static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClient Authenticator proxyAuthenticator = new HTTPKerberosAuthInterceptor(config.kerberosPrincipalName(), kerberosOptions); OkHttpClient client = new Builder() .proxy(proxy) -// .readTimeoutMillis(config.readTimeout()) + .readTimeout(config.readTimeout(), TimeUnit.MILLISECONDS) + .connectTimeout(config.connectionTimeout(), TimeUnit.MILLISECONDS) .addInterceptor(logging) .proxyAuthenticator(proxyAuthenticator) .build(); diff --git a/client/src/main/java/io/split/service/SplitHttpClientKerberosImpl.java b/client/src/main/java/io/split/service/SplitHttpClientKerberosImpl.java index 4f0a8be0..b335e233 100644 --- a/client/src/main/java/io/split/service/SplitHttpClientKerberosImpl.java +++ b/client/src/main/java/io/split/service/SplitHttpClientKerberosImpl.java @@ -103,7 +103,7 @@ public SplitHttpResponse get(URI uri, FetchOptions options, Map> additionalHeaders) { try { - Builder requestBuilder = new Builder(); + Builder requestBuilder = getRequestBuilder(); requestBuilder.url(url.toString()); setBasicHeaders(requestBuilder); setAdditionalAndDecoratedHeaders(requestBuilder, additionalHeaders); @@ -113,7 +113,7 @@ public SplitHttpResponse post(URI url, HttpEntity entity, RequestBody postBody = RequestBody.create(post.getBytes()); requestBuilder.post(postBody); - Request request = requestBuilder.build(); + Request request = getRequest(requestBuilder); _log.debug(String.format("Request Headers: %s", request.headers())); Response response = _client.newCall(request).execute(); @@ -140,7 +140,14 @@ public SplitHttpResponse post(URI url, HttpEntity entity, } } - private void setBasicHeaders(Builder requestBuilder) { + protected Builder getRequestBuilder() { + return new Builder(); + } + + protected Request getRequest(Builder requestBuilder) { + return requestBuilder.build(); + } + protected void setBasicHeaders(Builder requestBuilder) { requestBuilder.addHeader(HEADER_API_KEY, "Bearer " + _apikey); requestBuilder.addHeader(HEADER_CLIENT_VERSION, _metadata.getSdkVersion()); requestBuilder.addHeader(HEADER_CLIENT_MACHINE_IP, _metadata.getMachineIp()); @@ -150,7 +157,7 @@ private void setBasicHeaders(Builder requestBuilder) { : _apikey); } - private void setAdditionalAndDecoratedHeaders(Builder requestBuilder, Map> additionalHeaders) { + protected void setAdditionalAndDecoratedHeaders(Builder requestBuilder, Map> additionalHeaders) { if (additionalHeaders != null) { for (Map.Entry> entry : additionalHeaders.entrySet()) { for (String value : entry.getValue()) { @@ -165,7 +172,7 @@ private void setAdditionalAndDecoratedHeaders(Builder requestBuilder, Map responseHeaders = new ArrayList<>(); Map> map = response.headers().toMultimap(); for (Map.Entry> entry : map.entrySet()) { diff --git a/client/src/test/java/io/split/client/SplitClientConfigTest.java b/client/src/test/java/io/split/client/SplitClientConfigTest.java index 86b18541..760479d8 100644 --- a/client/src/test/java/io/split/client/SplitClientConfigTest.java +++ b/client/src/test/java/io/split/client/SplitClientConfigTest.java @@ -260,6 +260,9 @@ public Map> getHeaderOverrides(RequestContext context) { public void checkExpectedAuthScheme() { SplitClientConfig cfg = SplitClientConfig.builder() .authScheme(HttpAuthScheme.KERBEROS) + .kerberosPrincipalName("bilal@bilal") + .proxyHost("local") + .proxyPort(8080) .build(); Assert.assertEquals(HttpAuthScheme.KERBEROS, cfg.authScheme()); @@ -267,4 +270,21 @@ public void checkExpectedAuthScheme() { .build(); Assert.assertEquals(null, cfg.authScheme()); } + + @Test(expected = IllegalStateException.class) + public void testAuthSchemeWithoutProxy() { + SplitClientConfig.builder() + .authScheme(HttpAuthScheme.KERBEROS) + .kerberosPrincipalName("bilal") + .build(); + } + + @Test(expected = IllegalStateException.class) + public void testAuthSchemeWithoutPrincipalName() { + SplitClientConfig.builder() + .authScheme(HttpAuthScheme.KERBEROS) + .proxyHost("local") + .proxyPort(8080) + .build(); + } } \ No newline at end of file diff --git a/client/src/test/java/io/split/client/SplitFactoryImplTest.java b/client/src/test/java/io/split/client/SplitFactoryImplTest.java index be1526a9..aec9e3b6 100644 --- a/client/src/test/java/io/split/client/SplitFactoryImplTest.java +++ b/client/src/test/java/io/split/client/SplitFactoryImplTest.java @@ -352,7 +352,8 @@ public void testLocalhosJsonInputStreamNullAndFileTypeNull() throws URISyntaxExc } @Test - public void testFactoryKerberosInstance() throws URISyntaxException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException { + public void testFactoryKerberosInstance() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + SplitFactoryImpl splitFactory = null; SplitClientConfig splitClientConfig = SplitClientConfig.builder() .setBlockUntilReadyTimeout(10000) .authScheme(HttpAuthScheme.KERBEROS) @@ -360,7 +361,11 @@ public void testFactoryKerberosInstance() throws URISyntaxException, NoSuchMetho .proxyPort(6060) .proxyHost(ENDPOINT) .build(); - SplitFactoryImpl splitFactory = new SplitFactoryImpl("asdf", splitClientConfig); + try { + splitFactory = new SplitFactoryImpl("asdf", splitClientConfig); + } catch(Exception e) { + + } Method method = SplitFactoryImpl.class.getDeclaredMethod("buildSplitHttpClient", String.class, SplitClientConfig.class, SDKMetadata.class, RequestDecorator.class); diff --git a/client/src/test/java/io/split/service/HttpSplitClientKerberosTest.java b/client/src/test/java/io/split/service/HttpSplitClientKerberosTest.java index ac8c15f7..bf017996 100644 --- a/client/src/test/java/io/split/service/HttpSplitClientKerberosTest.java +++ b/client/src/test/java/io/split/service/HttpSplitClientKerberosTest.java @@ -3,6 +3,7 @@ import com.google.common.base.Charsets; import com.google.common.io.Files; +import io.split.client.CustomHeaderDecorator; import io.split.client.RequestDecorator; import io.split.client.dtos.*; import io.split.client.impressions.Impression; @@ -12,66 +13,90 @@ import io.split.engine.common.FetchOptions; import okhttp3.OkHttpClient; -import okhttp3.OkHttpClient.Builder; +import okhttp3.OkHttpClient.*; +import okhttp3.HttpUrl; +import okhttp3.Headers; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.apache.hc.core5.http.*; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.junit.Assert; import org.junit.Test; -import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import java.io.*; import java.lang.reflect.InvocationTargetException; -import java.net.*; -import java.nio.charset.StandardCharsets; -import java.util.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.InetSocketAddress; +import java.util.List; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; public class HttpSplitClientKerberosTest { @Test - public void testGetWithSpecialCharacters() throws URISyntaxException, IOException { - Map> responseHeaders = new HashMap>(); - responseHeaders.put((HttpHeaders.VIA), Arrays.asList("HTTP/1.1 s_proxy_rio1")); - URI rootTarget = URI.create("https://api.split.io/splitChanges?since=1234567"); - - HttpURLConnection mockHttpURLConnection = Mockito.mock(HttpURLConnection.class); - when(mockHttpURLConnection.getHeaderFields()).thenReturn(responseHeaders); + public void testGetWithSpecialCharacters() throws IOException, InterruptedException { + MockWebServer server = new MockWebServer(); + BufferedReader br = new BufferedReader(new FileReader("src/test/resources/split-change-special-characters.json")); + String body; + try { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + body = sb.toString(); + } finally { + br.close(); + } + server.enqueue(new MockResponse().setBody(body).addHeader(HttpHeaders.VIA, "HTTP/1.1 s_proxy_rio1")); + server.start(); + HttpUrl baseUrl = server.url("/v1/"); + URI rootTarget = baseUrl.uri(); RequestDecorator decorator = new RequestDecorator(null); + OkHttpClient client = new Builder().build(); - Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK); - ByteArrayInputStream stubInputStream = new ByteArrayInputStream(Files.asCharSource( - new File("src/test/resources/split-change-special-characters.json"), Charsets.UTF_8).read().getBytes(Charsets.UTF_8)); - when(mockHttpURLConnection.getInputStream()).thenReturn(stubInputStream); - - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() - .proxy(proxy) - .build(); - - SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); + SplitHttpClientKerberosImpl splitHttpClientKerberosImpl = new SplitHttpClientKerberosImpl(client, decorator, "qwerty", metadata()); Map> additionalHeaders = Collections.singletonMap("AdditionalHeader", Collections.singletonList("add")); - try { - SplitHttpResponse splitHttpResponse = splitHtpClientKerberos.get(rootTarget, + SplitHttpResponse splitHttpResponse = splitHttpClientKerberosImpl.get(rootTarget, new FetchOptions.Builder().cacheControlHeaders(true).build(), additionalHeaders); - } catch (Exception e) { - } -/* - SplitChange change = Json.fromJson(splitHttpResponse.body(), SplitChange.class); + + RecordedRequest request = server.takeRequest(); + server.shutdown(); + Headers requestHeaders = request.getHeaders(); + + assertThat(splitHttpResponse.statusCode(), is(equalTo(HttpURLConnection.HTTP_OK))); + Assert.assertEquals("/v1/", request.getPath()); + assertThat(requestHeaders.get("Authorization"), is(equalTo("Bearer qwerty"))) ; + assertThat(requestHeaders.get("SplitSDKClientKey"), is(equalTo("erty"))); + assertThat(requestHeaders.get("SplitSDKVersion"), is(equalTo("java-1.2.3"))); + assertThat(requestHeaders.get("SplitSDKMachineIP"), is(equalTo("1.2.3.4"))); + assertThat(requestHeaders.get("SplitSDKMachineName"), is(equalTo("someIP"))); + assertThat(requestHeaders.get("AdditionalHeader"), is(equalTo("add"))); + + SplitChange change = Json.fromJson(splitHttpResponse.body(), SplitChange.class); Header[] headers = splitHttpResponse.responseHeaders(); - assertThat(headers[0].getName(), is(equalTo("Via"))); - assertThat(headers[0].getValue(), is(equalTo("[HTTP/1.1 s_proxy_rio1]"))); + assertThat(headers[1].getName(), is(equalTo("via"))); + assertThat(headers[1].getValue(), is(equalTo("[HTTP/1.1 s_proxy_rio1]"))); + assertThat(splitHttpResponse.statusCode(), is(equalTo(200))); Assert.assertNotNull(change); Assert.assertEquals(1, change.splits.size()); Assert.assertNotNull(change.splits.get(0)); @@ -82,30 +107,61 @@ public void testGetWithSpecialCharacters() throws URISyntaxException, IOExceptio Assert.assertEquals("{\"test\": \"blue\",\"grüne Straße\": 13}", configs.get("on")); Assert.assertEquals("{\"test\": \"blue\",\"size\": 15}", configs.get("off")); Assert.assertEquals(2, split.sets.size()); - - */ } @Test - public void testGetParameters() throws URISyntaxException, MalformedURLException { - URI uri = new URI("https://api.split.io/splitChanges?since=1234567"); - FetchOptions options = new FetchOptions.Builder().cacheControlHeaders(true).build(); - SplitHttpClientKerberosImpl splitHtpClientKerberos = Mockito.mock(SplitHttpClientKerberosImpl.class); - when(splitHtpClientKerberos.get(uri, options, null)).thenCallRealMethod(); + public void testGetParameters() throws URISyntaxException, IOException, InterruptedException { + class MyCustomHeaders implements CustomHeaderDecorator { + public MyCustomHeaders() {} + @Override + public Map> getHeaderOverrides(RequestContext context) { + Map> additionalHeaders = context.headers(); + additionalHeaders.put("first", Arrays.asList("1")); + additionalHeaders.put("second", Arrays.asList("2.1", "2.2")); + additionalHeaders.put("third", Arrays.asList("3")); + return additionalHeaders; + } + } + MockWebServer server = new MockWebServer(); + BufferedReader br = new BufferedReader(new FileReader("src/test/resources/split-change-special-characters.json")); + String body; try { - SplitHttpResponse splitHttpResponse = splitHtpClientKerberos.get(uri, options, null); - } catch (Exception e) { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + body = sb.toString(); + } finally { + br.close(); } -// ArgumentCaptor optionsCaptor = ArgumentCaptor.forClass(FetchOptions.class); -// ArgumentCaptor headersCaptor = ArgumentCaptor.forClass(HashMap.class); -// verify(splitHtpClientKerberos).get(connectionCaptor.capture(), optionsCaptor.capture(), headersCaptor.capture()); + server.enqueue(new MockResponse().setBody(body).addHeader(HttpHeaders.VIA, "HTTP/1.1 s_proxy_rio1")); + server.start(); + HttpUrl baseUrl = server.url("/splitChanges?since=1234567"); + URI rootTarget = baseUrl.uri(); + RequestDecorator decorator = new RequestDecorator(new MyCustomHeaders()); + OkHttpClient client = new Builder().build(); - // assertThat(connectionCaptor.getValue().getRequestMethod(), is(equalTo("GET"))); -// assertThat(connectionCaptor.getValue().getURL().toString(), is(equalTo(new URL("https://api.split.io/splitChanges?since=1234567").toString()))); + SplitHttpClientKerberosImpl splitHttpClientKerberosImpl = new SplitHttpClientKerberosImpl(client, decorator, "qwerty", metadata()); - // assertThat(optionsCaptor.getValue().cacheControlHeadersEnabled(), is(equalTo(true))); + FetchOptions options = new FetchOptions.Builder().cacheControlHeaders(true).build(); + SplitHttpResponse splitHttpResponse = splitHttpClientKerberosImpl.get(rootTarget, options, null); + + RecordedRequest request = server.takeRequest(); + server.shutdown(); + Headers requestHeaders = request.getHeaders(); + + assertThat(requestHeaders.get("Cache-Control"), is(equalTo("no-cache"))); + assertThat(requestHeaders.get("first"), is(equalTo("1"))); + assertThat(requestHeaders.values("second"), is(equalTo(Arrays.asList("2.1","2.2")))); + assertThat(requestHeaders.get("third"), is(equalTo("3"))); + Assert.assertEquals("/splitChanges?since=1234567", request.getPath()); + assertThat(request.getMethod(), is(equalTo("GET"))); } @Test @@ -113,13 +169,8 @@ public void testGetError() throws URISyntaxException, IOException { URI uri = new URI("https://api.split.io/splitChanges?since=1234567"); RequestDecorator decorator = new RequestDecorator(null); -// Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_INTERNAL_ERROR); - ByteArrayInputStream stubInputStream = new ByteArrayInputStream(Files.asCharSource( - new File("src/test/resources/split-change-special-characters.json"), Charsets.UTF_8).read().getBytes(Charsets.UTF_8)); -// when(mockHttpURLConnection.getInputStream()).thenReturn(stubInputStream); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() + OkHttpClient client = new OkHttpClient.Builder() .proxy(proxy) .build(); try { @@ -128,7 +179,6 @@ public void testGetError() throws URISyntaxException, IOException { new FetchOptions.Builder().cacheControlHeaders(true).build(), null); } catch (Exception e) { } - // Assert.assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, (long) splitHttpResponse.statusCode()); } @Test(expected = IllegalStateException.class) @@ -137,34 +187,33 @@ public void testException() throws URISyntaxException, InvocationTargetException URI uri = new URI("https://api.split.io/splitChanges?since=1234567"); RequestDecorator decorator = null; -// Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_INTERNAL_ERROR); ByteArrayInputStream stubInputStream = new ByteArrayInputStream(Files.asCharSource( new File("src/test/resources/split-change-special-characters.json"), Charsets.UTF_8).read().getBytes(Charsets.UTF_8)); -// when(mockHttpURLConnection.getInputStream()).thenReturn(stubInputStream); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() + OkHttpClient client = new OkHttpClient.Builder() .proxy(proxy) .build(); SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); SplitHttpResponse splitHttpResponse = splitHtpClientKerberos.get(uri, new FetchOptions.Builder().cacheControlHeaders(true).build(), null); - } @Test - public void testPost() throws URISyntaxException, IOException, ParseException { - URI uri = new URI("https://api.split.io/splitChanges?since=1234567"); + public void testPost() throws URISyntaxException, IOException, ParseException, InterruptedException { + MockWebServer server = new MockWebServer(); + + server.enqueue(new MockResponse().addHeader(HttpHeaders.VIA, "HTTP/1.1 s_proxy_rio1")); + server.start(); + HttpUrl baseUrl = server.url("/impressions"); + URI rootTarget = baseUrl.uri(); RequestDecorator decorator = new RequestDecorator(null); -// Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK); + OkHttpClient client = new Builder().build(); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() - .proxy(proxy) - .build(); - SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); + SplitHttpClientKerberosImpl splitHttpClientKerberosImpl = new SplitHttpClientKerberosImpl(client, decorator, "qwerty", metadata()); + FetchOptions options = new FetchOptions.Builder().cacheControlHeaders(true).build(); // Send impressions List toSend = Arrays.asList(new TestImpressions("t1", Arrays.asList( KeyImpression.fromImpression(new Impression("k1", null, "t1", "on", 123L, "r1", 456L, null)), @@ -177,52 +226,28 @@ public void testPost() throws URISyntaxException, IOException, ParseException { Map> additionalHeaders = Collections.singletonMap("SplitSDKImpressionsMode", Collections.singletonList("OPTIMIZED")); -// when(mockHttpURLConnection.getHeaderFields()).thenReturn(additionalHeaders); - - ByteArrayOutputStream mockOs = Mockito.mock( ByteArrayOutputStream.class); - // when(mockHttpURLConnection.getOutputStream()).thenReturn(mockOs); - - try { - SplitHttpResponse splitHttpResponse = splitHtpClientKerberos.post(uri, Utils.toJsonEntity(toSend), - additionalHeaders); - - // Capture outgoing request and validate it - ArgumentCaptor captor = ArgumentCaptor.forClass(byte[].class); - verify(mockOs).write(captor.capture()); - String postBody = EntityUtils.toString(Utils.toJsonEntity(toSend)); - // assertThat(captor.getValue(), is(equalTo(postBody.getBytes(StandardCharsets.UTF_8)))); - - Header[] headers = splitHttpResponse.responseHeaders(); - // assertThat(headers[0].getName(), is(equalTo("SplitSDKImpressionsMode"))); - // assertThat(headers[0].getValue(), is(equalTo("[OPTIMIZED]"))); - - // Assert.assertEquals(200, (long) splitHttpResponse.statusCode()); - } catch (Exception e) { - } - } - @Test - public void testPotParameters() throws URISyntaxException, IOException { - URI uri = new URI("https://kubernetesturl.com/split/api/testImpressions/bulk"); -// when(splitHtpClientKerberos.post(uri, null, null)).thenCallRealMethod(); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() - .proxy(proxy) - .build(); - RequestDecorator decorator = new RequestDecorator(null); - SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); + SplitHttpResponse splitHttpResponse = splitHttpClientKerberosImpl.post(rootTarget, Utils.toJsonEntity(toSend), + additionalHeaders); - try { - SplitHttpResponse splitHttpResponse = splitHtpClientKerberos.post(uri, null, null); - } catch (Exception e) { - } + RecordedRequest request = server.takeRequest(); + server.shutdown(); + Headers requestHeaders = request.getHeaders(); + String postBody = EntityUtils.toString(Utils.toJsonEntity(toSend)); -// ArgumentCaptor connectionCaptor = ArgumentCaptor.forClass(HttpURLConnection.class); -// ArgumentCaptor entityCaptor = ArgumentCaptor.forClass(HttpEntity.class); -// ArgumentCaptor headersCaptor = ArgumentCaptor.forClass(HashMap.class); -// verify(splitHtpClientKerberos).doPost(connectionCaptor.capture(), entityCaptor.capture(), headersCaptor.capture()); + Assert.assertEquals("POST /impressions HTTP/1.1", request.getRequestLine()); + Assert.assertEquals(postBody, request.getBody().readUtf8()); + assertThat(requestHeaders.get("Authorization"), is(equalTo("Bearer qwerty"))) ; + assertThat(requestHeaders.get("SplitSDKClientKey"), is(equalTo("erty"))); + assertThat(requestHeaders.get("SplitSDKVersion"), is(equalTo("java-1.2.3"))); + assertThat(requestHeaders.get("SplitSDKMachineIP"), is(equalTo("1.2.3.4"))); + assertThat(requestHeaders.get("SplitSDKMachineName"), is(equalTo("someIP"))); + assertThat(requestHeaders.get("SplitSDKImpressionsMode"), is(equalTo("OPTIMIZED"))); - // assertThat(connectionCaptor.getValue().getURL().toString(), is(equalTo(new URL("https://kubernetesturl.com/split/api/testImpressions/bulk").toString()))); + Header[] headers = splitHttpResponse.responseHeaders(); + assertThat(headers[1].getName(), is(equalTo("via"))); + assertThat(headers[1].getValue(), is(equalTo("[HTTP/1.1 s_proxy_rio1]"))); + assertThat(splitHttpResponse.statusCode(), is(equalTo(200))); } @Test @@ -230,11 +255,9 @@ public void testPosttError() throws URISyntaxException, IOException { URI uri = new URI("https://kubernetesturl.com/split/api/testImpressions/bulk"); RequestDecorator decorator = new RequestDecorator(null); ByteArrayOutputStream mockOs = Mockito.mock( ByteArrayOutputStream.class); -// Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_INTERNAL_ERROR); -// when(mockHttpURLConnection.getOutputStream()).thenReturn(mockOs); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() + OkHttpClient client = new OkHttpClient.Builder() .proxy(proxy) .build(); SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); @@ -251,11 +274,10 @@ public void testPosttError() throws URISyntaxException, IOException { @Test(expected = IllegalStateException.class) public void testPosttException() throws URISyntaxException, IOException { RequestDecorator decorator = null; -// Mockito.when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK); URI uri = new URI("https://kubernetesturl.com/split/api/testImpressions/bulk"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("1.0.0.127", 8080)); - OkHttpClient client = new Builder() + OkHttpClient client = new OkHttpClient.Builder() .proxy(proxy) .build(); SplitHttpClientKerberosImpl splitHtpClientKerberos = SplitHttpClientKerberosImpl.create(client, decorator, "qwerty", metadata()); diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index e4ffe0e2..2e502e35 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.13.0-rc2 + 4.13.0 2.1.0 diff --git a/pom.xml b/pom.xml index 159f6135..e99da05f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.13.0-rc2 + 4.13.0 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index c4947261..6a25062e 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.13.0-rc2 + 4.13.0 redis-wrapper 3.1.0 diff --git a/testing/pom.xml b/testing/pom.xml index 70b12624..adbffc99 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,7 +5,7 @@ io.split.client java-client-parent - 4.13.0-rc2 + 4.13.0 java-client-testing jar