/*
* Copyright 2013 Proofpoint Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kairosdb.client;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
import org.junit.Test;
import org.kairosdb.client.builder.MetricBuilder;
import org.kairosdb.client.builder.QueryBuilder;
import org.kairosdb.client.builder.TimeUnit;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
public class HttpClientTest
{
@Test(expected = NullPointerException.class)
public void test_constructor_null_url_invalid() throws MalformedURLException
{
new HttpClient(null);
}
@Test(expected = IllegalArgumentException.class)
public void test_constructor_empty_url_invalid() throws MalformedURLException
{
new HttpClient("");
}
@Test(expected = MalformedURLException.class)
public void test_constructor_invalid_url() throws MalformedURLException
{
new HttpClient("foo");
}
@Test(expected = IllegalArgumentException.class)
public void test_negativeRetries_invalid() throws MalformedURLException
{
HttpClient client = new HttpClient("http://bogus");
client.setRetryCount(-1);
}
@Test
public void test_pushMetrics_DefaultRetries() throws IOException, URISyntaxException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
MetricBuilder builder = MetricBuilder.getInstance();
builder.addMetric("newMetric").addDataPoint(10, 10).addTag("host", "server1");
try
{
client.pushMetrics(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(4)); // 1 try and 3 retries
}
}
@Test
public void test_pushMetrics_setRetries() throws URISyntaxException, MalformedURLException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
client.setRetryCount(10);
MetricBuilder builder = MetricBuilder.getInstance();
builder.addMetric("newMetric").addDataPoint(10, 10).addTag("host", "server1");
try
{
client.pushMetrics(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(11)); // 1 try and 10 retries
}
}
@Test
public void test_pushMetrics_setRetries_zero() throws URISyntaxException, MalformedURLException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
client.setRetryCount(0);
MetricBuilder builder = MetricBuilder.getInstance();
builder.addMetric("newMetric").addDataPoint(10, 10).addTag("host", "server1");
try
{
client.pushMetrics(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(1)); // 1 try and 0 retries
}
}
@Test
public void test_query_DefaultRetries() throws IOException, URISyntaxException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
QueryBuilder builder = QueryBuilder.getInstance();
builder.setStart(1, TimeUnit.DAYS);
builder.addMetric("newMetric");
try
{
client.query(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(4)); // 1 try and 3 retries
}
}
@Test
public void test_query_setRetries() throws URISyntaxException, MalformedURLException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
client.setRetryCount(10);
QueryBuilder builder = QueryBuilder.getInstance();
builder.setStart(1, TimeUnit.DAYS);
builder.addMetric("newMetric");
try
{
client.query(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(11)); // 1 try and 10 retries
}
}
@Test
public void test_query_setRetries_zero() throws URISyntaxException, MalformedURLException
{
HttpClient client = new HttpClient("http://bogus");
FakeClient fakeClient = new FakeClient();
client.setClient(fakeClient);
client.setRetryCount(0);
QueryBuilder builder = QueryBuilder.getInstance();
builder.setStart(1, TimeUnit.DAYS);
builder.addMetric("newMetric");
try
{
client.query(builder);
fail("IOException should have been thrown");
}
catch (IOException e)
{
assertThat(fakeClient.getExecutionCount(), equalTo(1)); // 1 try and 0 retries
}
}
private static class FakeClient extends CloseableHttpClient
{
private int executionCount;
private int getExecutionCount()
{
return executionCount;
}
@Override
public HttpParams getParams()
{
return null;
}
@Override
public ClientConnectionManager getConnectionManager()
{
return null;
}
@Override
public CloseableHttpResponse execute(HttpUriRequest httpUriRequest) throws IOException
{
executionCount++;
throw new IOException("Fake Exception");
}
@Override
public CloseableHttpResponse execute(HttpUriRequest httpUriRequest, HttpContext httpContext) throws IOException
{
executionCount++;
throw new IOException("Fake Exception");
}
@Override
public CloseableHttpResponse execute(HttpHost httpHost, HttpRequest httpRequest) throws IOException
{
return null;
}
@Override
protected CloseableHttpResponse doExecute(HttpHost httpHost, HttpRequest httpRequest, HttpContext httpContext) throws IOException
{
return null;
}
@Override
public CloseableHttpResponse execute(HttpHost httpHost, HttpRequest httpRequest, HttpContext httpContext) throws IOException
{
return null;
}
@Override
public <T> T execute(HttpUriRequest httpUriRequest, ResponseHandler<? extends T> responseHandler) throws IOException
{
return null;
}
@Override
public <T> T execute(HttpUriRequest httpUriRequest, ResponseHandler<? extends T> responseHandler, HttpContext httpContext) throws IOException
{
return null;
}
@Override
public <T> T execute(HttpHost httpHost, HttpRequest httpRequest, ResponseHandler<? extends T> responseHandler) throws IOException
{
return null;
}
@Override
public <T> T execute(HttpHost httpHost, HttpRequest httpRequest, ResponseHandler<? extends T> responseHandler, HttpContext httpContext) throws IOException
{
return null;
}
@Override
public void close() throws IOException
{
}
}
}