/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.elasticsearch.test;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.elasticsearch.cfg.ElasticsearchEnvironment;
import org.hibernate.search.elasticsearch.cfg.ElasticsearchIndexStatus;
import org.hibernate.search.elasticsearch.cfg.IndexSchemaManagementStrategy;
import org.hibernate.search.elasticsearch.impl.ElasticsearchIndexManager;
import org.hibernate.search.elasticsearch.impl.JsonBuilder;
import org.hibernate.search.elasticsearch.testutil.TestElasticsearchClient;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.test.SearchInitializationTestBase;
import org.hibernate.search.test.util.ImmutableTestConfiguration;
import org.hibernate.testing.TestForIssue;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for {@link ElasticsearchIndexManager}'s schema validation feature.
*
* @author Yoann Rodiere
*/
@RunWith(Parameterized.class)
@TestForIssue(jiraKey = "HSEARCH-2456")
public class ElasticsearchIndexExistsCheckIT extends SearchInitializationTestBase {
@Parameters(name = "With strategy {0}")
public static Iterable<IndexSchemaManagementStrategy> strategies() {
// The "NONE" strategy never checks that the index exists.
return EnumSet.complementOf( EnumSet.of( IndexSchemaManagementStrategy.NONE ) );
}
@Rule
public ExpectedException thrown = ExpectedException.none();
@Rule
public TestElasticsearchClient elasticSearchClient = new TestElasticsearchClient();
private IndexSchemaManagementStrategy strategy;
public ElasticsearchIndexExistsCheckIT(IndexSchemaManagementStrategy strategy) {
super();
this.strategy = strategy;
}
@Test
public void indexMissing() throws Exception {
Assume.assumeFalse( "The strategy " + strategy + " creates an index automatically."
+ " No point running this test.",
createsIndex( strategy ) );
elasticSearchClient.index( SimpleEntity.class ).ensureDoesNotExist();
thrown.expect( SearchException.class );
thrown.expectMessage( "HSEARCH400050" );
init( SimpleEntity.class );
}
@Test
public void invalidIndexStatus_creatingIndex() throws Exception {
Assume.assumeTrue( "The strategy " + strategy + " doesn't creates an index automatically."
+ " No point running this test.",
createsIndex( strategy ) );
// Make sure automatically created indexes will never be green
elasticSearchClient.template( "yellow_index_because_not_enough_nodes_for_so_many_replicas" )
.create(
"*",
/*
* The exact number of replicas we ask for doesn't matter much,
* since we're testing with only 1 node (the cluster can't replicate shards)
*/
JsonBuilder.object().addProperty( "number_of_replicas", 5 ).build()
);
elasticSearchClient.index( SimpleEntity.class ).ensureDoesNotExist();
thrown.expect( SearchException.class );
thrown.expectMessage( "HSEARCH400024" );
thrown.expectMessage( "100ms" );
init( SimpleEntity.class );
}
@Test
public void invalidIndexStatus_usingPreexistingIndex() throws Exception {
// Make sure automatically created indexes will never be green
elasticSearchClient.template( "yellow_index_because_not_enough_nodes_for_so_many_replicas" )
.create(
"*",
/*
* The exact number of replicas we ask for doesn't matter much,
* since we're testing with only 1 node (the cluster can't replicate shards)
*/
JsonBuilder.object().addProperty( "number_of_replicas", 5 ).build()
);
elasticSearchClient.index( SimpleEntity.class ).deleteAndCreate();
thrown.expect( SearchException.class );
thrown.expectMessage( "HSEARCH400024" );
thrown.expectMessage( "100ms" );
init( SimpleEntity.class );
}
@Override
protected void init(Class<?> ... entityClasses) {
Map<String, Object> settings = new HashMap<>();
settings.put(
"hibernate.search.default." + ElasticsearchEnvironment.INDEX_SCHEMA_MANAGEMENT_STRATEGY,
strategy.getExternalName()
);
settings.put(
"hibernate.search.default." + ElasticsearchEnvironment.INDEX_MANAGEMENT_WAIT_TIMEOUT,
"100"
);
settings.put(
"hibernate.search.default." + ElasticsearchEnvironment.REQUIRED_INDEX_STATUS,
ElasticsearchIndexStatus.GREEN.getElasticsearchString()
);
init( new ImmutableTestConfiguration( settings, entityClasses ) );
}
private boolean createsIndex(IndexSchemaManagementStrategy strategy) {
return !IndexSchemaManagementStrategy.NONE.equals( strategy )
&& !IndexSchemaManagementStrategy.VALIDATE.equals( strategy );
}
@Indexed
@Entity
private static class SimpleEntity {
@DocumentId
@Id
Long id;
@Field
String myField;
}
}