package io.searchbox.client;
import java.util.HashSet;
import io.searchbox.client.config.ClientConfig;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.client.config.discovery.NodeChecker;
import io.searchbox.client.http.JestHttpClient;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.apache.http.nio.conn.NHttpClientConnectionManager;
import org.junit.Test;
import org.mockito.Mockito;
import static java.util.Arrays.asList;
import static org.junit.Assert.*;
/**
* @author Dogukan Sonmez
* @author cihat keser
*/
public class JestClientFactoryTest {
@Test
public void clientCreationWithTimeout() {
JestClientFactory factory = new JestClientFactory();
HttpClientConfig httpClientConfig = new HttpClientConfig.Builder(
"someUri").connTimeout(150).readTimeout(300).build();
factory.setHttpClientConfig(httpClientConfig);
final RequestConfig defaultRequestConfig = factory.getRequestConfig();
assertNotNull(defaultRequestConfig);
assertEquals(150, defaultRequestConfig.getConnectTimeout());
assertEquals(300, defaultRequestConfig.getSocketTimeout());
}
@Test
public void clientCreationWithDiscovery() {
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig.Builder("http://localhost:9200").discoveryEnabled(true).build());
JestHttpClient jestClient = (JestHttpClient) factory.getObject();
assertTrue(jestClient != null);
assertNotNull(jestClient.getAsyncClient());
assertTrue(factory.getConnectionManager() instanceof BasicHttpClientConnectionManager);
assertEquals(jestClient.getServerPoolSize(), 1);
}
@Test
public void clientCreationWithNullClientConfig() {
JestClientFactory factory = new JestClientFactory();
JestHttpClient jestClient = (JestHttpClient) factory.getObject();
assertTrue(jestClient != null);
assertNotNull(jestClient.getAsyncClient());
assertEquals(jestClient.getServerPoolSize(), 1);
assertEquals("server list should contain localhost:9200",
"http://localhost:9200", jestClient.getNextServer());
}
@Test
public void multiThreadedClientCreation() {
JestClientFactory factory = new JestClientFactory();
HttpRoute routeOne = new HttpRoute(new HttpHost("http://test.localhost"));
HttpRoute routeTwo = new HttpRoute(new HttpHost("http://localhost"));
HttpClientConfig httpClientConfig = new HttpClientConfig.Builder("http://localhost:9200")
.multiThreaded(true)
.maxTotalConnection(20)
.defaultMaxTotalConnectionPerRoute(10)
.maxTotalConnectionPerRoute(routeOne, 5)
.maxTotalConnectionPerRoute(routeTwo, 6)
.build();
factory.setHttpClientConfig(httpClientConfig);
JestHttpClient jestClient = (JestHttpClient) factory.getObject();
assertTrue(jestClient != null);
assertEquals(jestClient.getServerPoolSize(), 1);
assertEquals("server list should contain localhost:9200", "http://localhost:9200", jestClient.getNextServer());
final HttpClientConnectionManager connectionManager = factory.getConnectionManager();
assertTrue(connectionManager instanceof PoolingHttpClientConnectionManager);
assertEquals(10, ((PoolingHttpClientConnectionManager) connectionManager).getDefaultMaxPerRoute());
assertEquals(20, ((PoolingHttpClientConnectionManager) connectionManager).getMaxTotal());
assertEquals(5, ((PoolingHttpClientConnectionManager) connectionManager).getMaxPerRoute(routeOne));
assertEquals(6, ((PoolingHttpClientConnectionManager) connectionManager).getMaxPerRoute(routeTwo));
final NHttpClientConnectionManager nConnectionManager = factory.getAsyncConnectionManager();
assertTrue(nConnectionManager instanceof PoolingNHttpClientConnectionManager);
assertEquals(10, ((PoolingNHttpClientConnectionManager) nConnectionManager).getDefaultMaxPerRoute());
assertEquals(20, ((PoolingNHttpClientConnectionManager) nConnectionManager).getMaxTotal());
assertEquals(5, ((PoolingNHttpClientConnectionManager) nConnectionManager).getMaxPerRoute(routeOne));
assertEquals(6, ((PoolingNHttpClientConnectionManager) nConnectionManager).getMaxPerRoute(routeTwo));
}
@Test
public void clientCreationWithDiscoveryAndOverriddenNodeChecker() {
JestClientFactory factory = Mockito.spy(new ExtendedJestClientFactory());
HttpClientConfig httpClientConfig = Mockito.spy(new HttpClientConfig.Builder("http://localhost:9200")
.discoveryEnabled(true)
.build());
factory.setHttpClientConfig(httpClientConfig);
JestHttpClient jestClient = (JestHttpClient) factory.getObject();
assertTrue(jestClient != null);
assertNotNull(jestClient.getAsyncClient());
assertEquals(jestClient.getServerPoolSize(), 1);
assertEquals("server list should contain localhost:9200",
"http://localhost:9200", jestClient.getNextServer());
Mockito.verify(factory, Mockito.times(1)).createNodeChecker(Mockito.any(JestHttpClient.class),
Mockito.same(httpClientConfig));
}
@Test
public void clientCreationWithPreemptiveAuth() {
JestClientFactory factory = new JestClientFactory();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("someUser", "somePassword"));
HttpHost targetHost1 = new HttpHost("targetHostName1", 80, "http");
HttpHost targetHost2 = new HttpHost("targetHostName2", 80, "http");
HttpClientConfig httpClientConfig = new HttpClientConfig.Builder("someUri")
.credentialsProvider(credentialsProvider)
.preemptiveAuthTargetHosts(new HashSet<HttpHost>(asList(targetHost1, targetHost2)))
.build();
factory.setHttpClientConfig(httpClientConfig);
JestHttpClient jestHttpClient = (JestHttpClient) factory.getObject();
HttpClientContext httpClientContext = jestHttpClient.getHttpClientContextTemplate();
assertNotNull(httpClientContext.getAuthCache().get(targetHost1));
assertNotNull(httpClientContext.getAuthCache().get(targetHost2));
assertEquals(credentialsProvider, httpClientContext.getCredentialsProvider());
}
class ExtendedJestClientFactory extends JestClientFactory {
@Override
protected NodeChecker createNodeChecker(JestHttpClient client, HttpClientConfig httpClientConfig) {
return new OtherNodeChecker(client, httpClientConfig);
}
}
class OtherNodeChecker extends NodeChecker {
public OtherNodeChecker(JestClient jestClient, ClientConfig clientConfig) {
super(jestClient, clientConfig);
}
}
}