org.springframework.data.solr.server.support.SolrClientUtilTests.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.data.solr.server.support.SolrClientUtilTests.java

Source

/*
 * Copyright 2012 - 2016 the original author or authors.
 *
 * 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.springframework.data.solr.server.support;

import static org.hamcrest.core.IsCollectionContaining.*;
import static org.hamcrest.core.IsEqual.*;
import static org.hamcrest.text.IsEmptyString.*;

import java.net.MalformedURLException;
import java.util.Map;

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.SingleClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
import org.apache.solr.core.CoreContainer;
import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsSame;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.data.solr.core.mapping.SolrDocument;
import org.springframework.test.util.ReflectionTestUtils;

/**
 * @author Christoph Strobl
 * @author Venil Noronha
 */
public class SolrClientUtilTests {

    private static final String FIELD_ZOO_KEEPER = "zkHost";
    private static final String FIELD_ALIVE_SERVERS = "aliveServers";

    private static final String CORE_NAME = "core1";
    private static final String ZOO_KEEPER_URL = "http://127.0.0.1/zk";
    private static final String BASE_URL = "http://127.0.0.1:8983/solr";
    private static final String ALTERNATE_BASE_URL = "http://localhost:8983/solr";

    private static final String CORE_URL = BASE_URL + "/" + CORE_NAME;
    private static final String ALTERNATE_CORE_URL = ALTERNATE_BASE_URL + "/" + CORE_NAME;

    @Test(expected = IllegalArgumentException.class)
    public void testCloneNullThrowsIllegalArgumentException() {
        SolrClientUtils.clone(null);
    }

    @Test
    public void testClonesHttpSolrClientCorrectly() {
        HttpSolrClient httpSolrClient = new HttpSolrClient(BASE_URL);
        httpSolrClient.setDefaultMaxConnectionsPerHost(10);
        httpSolrClient.setFollowRedirects(true);
        httpSolrClient.setUseMultiPartPost(true);

        HttpSolrClient clone = SolrClientUtils.clone(httpSolrClient);
        Assert.assertEquals(httpSolrClient.getBaseURL(), clone.getBaseURL());
        assertHttpSolrClientProperties(httpSolrClient, clone);
    }

    @Test
    public void testClonesHttpSolrClientForCoreCorrectly() {
        HttpSolrClient httpSolrClient = new HttpSolrClient(BASE_URL);
        httpSolrClient.setDefaultMaxConnectionsPerHost(10);
        httpSolrClient.setFollowRedirects(true);
        httpSolrClient.setUseMultiPartPost(true);

        HttpSolrClient clone = SolrClientUtils.clone(httpSolrClient, CORE_NAME);

        Assert.assertEquals(CORE_URL, clone.getBaseURL());

        assertHttpSolrClientProperties(httpSolrClient, clone);
    }

    @Test
    public void testClonesLBHttpSolrClientCorrectly() throws MalformedURLException {
        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(BASE_URL, ALTERNATE_BASE_URL);
        lbSolrClient.setAliveCheckInterval(10);

        LBHttpSolrClient clone = SolrClientUtils.clone(lbSolrClient);

        Assert.assertEquals(ReflectionTestUtils.getField(lbSolrClient, FIELD_ALIVE_SERVERS),
                ReflectionTestUtils.getField(clone, FIELD_ALIVE_SERVERS));
        assertLBHttpSolrClientProperties(lbSolrClient, clone);
    }

    @Test
    @SuppressWarnings("unchecked")
    public void testClonesLBHttpSolrClientForCoreCorrectly() throws MalformedURLException {
        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(BASE_URL, ALTERNATE_BASE_URL);
        lbSolrClient.setAliveCheckInterval(10);

        LBHttpSolrClient clone = SolrClientUtils.clone(lbSolrClient, CORE_NAME);

        Map<String, ?> aliveServers = (Map<String, ?>) ReflectionTestUtils.getField(clone, FIELD_ALIVE_SERVERS);
        Assert.assertThat(aliveServers.keySet(), hasItems(CORE_URL, ALTERNATE_CORE_URL));

        assertLBHttpSolrClientProperties(lbSolrClient, clone);
    }

    @Test
    public void testClonesCloudSolrClientCorrectly() throws MalformedURLException {
        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(BASE_URL, ALTERNATE_BASE_URL);
        CloudSolrClient cloudClient = new CloudSolrClient(ZOO_KEEPER_URL, lbSolrClient);

        CloudSolrClient clone = SolrClientUtils.clone(cloudClient);
        Assert.assertEquals(ZOO_KEEPER_URL, ReflectionTestUtils.getField(clone, FIELD_ZOO_KEEPER));

        LBHttpSolrClient lbClone = clone.getLbClient();
        Assert.assertEquals(ReflectionTestUtils.getField(lbSolrClient, FIELD_ALIVE_SERVERS),
                ReflectionTestUtils.getField(lbClone, FIELD_ALIVE_SERVERS));

        assertLBHttpSolrClientProperties(lbSolrClient, lbClone);
    }

    @Test
    @SuppressWarnings("unchecked")
    public void testClonesCloudSolrClientForCoreCorrectlyWhenCoreNameIsNotEmpty() throws MalformedURLException {
        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(BASE_URL, ALTERNATE_BASE_URL);
        CloudSolrClient cloudClient = new CloudSolrClient(ZOO_KEEPER_URL, lbSolrClient);

        CloudSolrClient clone = SolrClientUtils.clone(cloudClient, CORE_NAME);
        Assert.assertEquals(ZOO_KEEPER_URL, ReflectionTestUtils.getField(clone, FIELD_ZOO_KEEPER));

        LBHttpSolrClient lbClone = clone.getLbClient();
        Map<String, ?> aliveServers = (Map<String, ?>) ReflectionTestUtils.getField(lbClone, FIELD_ALIVE_SERVERS);
        Assert.assertThat(aliveServers.keySet(), hasItems(CORE_URL, ALTERNATE_CORE_URL));

        assertLBHttpSolrClientProperties(lbSolrClient, lbClone);
        Assert.assertThat(clone.getDefaultCollection(), equalTo(CORE_NAME));
    }

    @Test
    public void testClonesCloudSolrClientForCoreCorrectlyWhenNoLBHttpServerPresent() throws MalformedURLException {
        CloudSolrClient cloudClient = new CloudSolrClient(ZOO_KEEPER_URL);

        CloudSolrClient clone = SolrClientUtils.clone(cloudClient, CORE_NAME);
        Assert.assertEquals(ZOO_KEEPER_URL, ReflectionTestUtils.getField(clone, FIELD_ZOO_KEEPER));

        LBHttpSolrClient lbClone = clone.getLbClient();

        assertLBHttpSolrClientProperties(cloudClient.getLbClient(), lbClone);
        Assert.assertThat(clone.getDefaultCollection(), equalTo(CORE_NAME));
    }

    @Test
    public void testCreateUrlForCoreAppendsCoreCorrectly() {
        Assert.assertEquals(CORE_URL, SolrClientUtils.appendCoreToBaseUrl(BASE_URL, CORE_NAME));
    }

    @Test
    public void testCreateUrlForCoreAppendsCoreCorrectlyWhenBaseUrlHasTrailingSlash() {
        Assert.assertEquals(CORE_URL, SolrClientUtils.appendCoreToBaseUrl(BASE_URL + "/", CORE_NAME));
    }

    @Test
    public void testCreateUrlForCoreAppendsCoreCorrectlyWhenCoreIsEmpty() {
        Assert.assertEquals(BASE_URL, SolrClientUtils.appendCoreToBaseUrl(BASE_URL, "  "));
    }

    @Test
    public void testCreateUrlForCoreAppendsCoreCorrectlyWhenCoreIsNull() {
        Assert.assertEquals(BASE_URL, SolrClientUtils.appendCoreToBaseUrl(BASE_URL, null));
    }

    @Test(expected = IllegalArgumentException.class)
    public void testCreateUrlForCoreThrowsIllegalArgumentExceptionWhenBaseUrlIsNull() {
        Assert.assertEquals(BASE_URL, SolrClientUtils.appendCoreToBaseUrl(null, null));
    }

    @Test
    public void testResolveSolrCoreNameShouldReturnEmptyStringWhenNoAnnotationPresent() {
        Assert.assertThat(SolrClientUtils.resolveSolrCoreName(ClassWithoutSolrDocumentAnnotation.class),
                isEmptyString());
    }

    @Test
    public void testResolveSolrCoreNameShouldReturnEmptyStringWhenAnnotationHasNoValue() {
        Assert.assertThat(SolrClientUtils.resolveSolrCoreName(ClassWithEmptySolrDocumentAnnotation.class),
                isEmptyString());
    }

    @Test
    public void testResolveSolrCoreNameShouldReturnAnnotationValueWhenPresent() {
        Assert.assertThat(SolrClientUtils.resolveSolrCoreName(ClassWithSolrDocumentAnnotation.class),
                equalTo("core1"));
    }

    @Test
    public void testResolveDefaultSolrCoreName() {
        Assert.assertEquals("default-core",
                SolrClientUtils.resolveSolrCoreName(ClassWithoutSolrDocumentAnnotation.class, "default-core"));
    }

    @Test
    public void testResolveDefaultSolrCoreNameWithEmptyAnnotation() {
        Assert.assertEquals("default-core",
                SolrClientUtils.resolveSolrCoreName(ClassWithEmptySolrDocumentAnnotation.class, "default-core"));
    }

    @Test
    public void testResolveDefaultSolrCoreNameWithAnnotation() {
        Assert.assertEquals("core1",
                SolrClientUtils.resolveSolrCoreName(ClassWithSolrDocumentAnnotation.class, "default-core"));
    }

    /**
     * @see DATASOLR-189
     */
    @Test
    public void cloningLBHttpSolrClientShouldCopyHttpParamsCorrectly() throws MalformedURLException {

        HttpParams params = new BasicHttpParams();
        params.setParameter("foo", "bar");
        DefaultHttpClient client = new DefaultHttpClient(params);

        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(client, BASE_URL, ALTERNATE_BASE_URL);

        LBHttpSolrClient cloned = SolrClientUtils.clone(lbSolrClient, CORE_NAME);
        Assert.assertThat(cloned.getHttpClient().getParams(), IsEqual.equalTo(params));

    }

    /**
     * @see DATASOLR-189
     */
    @Test
    public void cloningLBHttpSolrClientShouldCopyCredentialsProviderCorrectly() {

        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("foo", "bar"));

        DefaultHttpClient client = new DefaultHttpClient();
        client.setCredentialsProvider(credentialsProvider);

        LBHttpSolrClient lbSolrClient = new LBHttpSolrClient(client, BASE_URL, ALTERNATE_BASE_URL);

        LBHttpSolrClient cloned = SolrClientUtils.clone(lbSolrClient, CORE_NAME);
        Assert.assertThat(((AbstractHttpClient) cloned.getHttpClient()).getCredentialsProvider(),
                IsEqual.<CredentialsProvider>equalTo(credentialsProvider));
    }

    /**
     * @see DATASOLR-189
     */
    @Test
    public void cloningHttpSolrClientShouldCopyHttpParamsCorrectly() {

        HttpParams params = new BasicHttpParams();
        params.setParameter("foo", "bar");
        DefaultHttpClient client = new DefaultHttpClient(params);

        HttpSolrClient solrClient = new HttpSolrClient(BASE_URL, client);
        HttpSolrClient cloned = SolrClientUtils.clone(solrClient);

        Assert.assertThat(cloned.getHttpClient().getParams(), IsEqual.equalTo(params));
    }

    /**
     * @see DATASOLR-189
     */
    @Test
    public void cloningHttpSolrClientShouldCopyCredentialsProviderCorrectly() {

        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("foo", "bar"));

        DefaultHttpClient client = new DefaultHttpClient();
        client.setCredentialsProvider(credentialsProvider);

        HttpSolrClient solrClient = new HttpSolrClient(BASE_URL, client);
        HttpSolrClient cloned = SolrClientUtils.clone(solrClient);

        Assert.assertThat(((AbstractHttpClient) cloned.getHttpClient()).getCredentialsProvider(),
                IsEqual.<CredentialsProvider>equalTo(credentialsProvider));
    }

    /**
     * @see DATASOLR-227
     */
    @Test
    public void cloningHttpSolrClientShouldCopyConnectionManager() {

        ClientConnectionManager conncetionManager = new SingleClientConnManager();

        DefaultHttpClient client = new DefaultHttpClient(conncetionManager);

        HttpSolrClient solrClient = new HttpSolrClient(BASE_URL, client);
        HttpSolrClient cloned = SolrClientUtils.clone(solrClient);

        Assert.assertThat(((AbstractHttpClient) cloned.getHttpClient()).getConnectionManager(),
                IsEqual.<ClientConnectionManager>equalTo(conncetionManager));
    }

    /**
     * @see DATASOLR-203
     */
    @Test
    public void cloningEmbeddedSolrServerShouldReuseCoreContainer() {

        CoreContainer coreContainer = Mockito.mock(CoreContainer.class);
        EmbeddedSolrServer solrServer = new EmbeddedSolrServer(coreContainer, "core1");

        EmbeddedSolrServer clone = SolrClientUtils.clone(solrServer, "core1");
        Assert.assertThat(clone.getCoreContainer(), IsSame.sameInstance(coreContainer));
    }

    private void assertHttpSolrClientProperties(HttpSolrClient httpSolrServer, HttpSolrClient clone) {
        Assert.assertEquals(ReflectionTestUtils.getField(httpSolrServer, "followRedirects"),
                ReflectionTestUtils.getField(clone, "followRedirects"));
        Assert.assertEquals(ReflectionTestUtils.getField(httpSolrServer, "useMultiPartPost"),
                ReflectionTestUtils.getField(clone, "useMultiPartPost"));
    }

    private void assertLBHttpSolrClientProperties(LBHttpSolrClient lbSolrServer, LBHttpSolrClient clone) {
        Assert.assertEquals(ReflectionTestUtils.getField(lbSolrServer, "interval"),
                ReflectionTestUtils.getField(clone, "interval"));
    }

    private static class ClassWithoutSolrDocumentAnnotation {

    }

    @SolrDocument
    private static class ClassWithEmptySolrDocumentAnnotation {

    }

    @SolrDocument(solrCoreName = "core1")
    private static class ClassWithSolrDocumentAnnotation {

    }

}