/*
* 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.test.integration.wildfly.massindexing;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import javax.inject.Inject;
import org.hibernate.search.testsupport.TestForIssue;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.Asset;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.persistence20.PersistenceDescriptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.hibernate.search.test.integration.VersionTestHelper.getHibernateORMModuleName;
import static org.hibernate.search.test.integration.VersionTestHelper.getWildFlyModuleIdentifier;
import static org.junit.Assert.assertEquals;
/**
* Test for applying the transaction timeout during id production in mass indexing.
*
* @author Gunnar Morling
*/
@RunWith(Arquillian.class)
@TestForIssue(jiraKey = "HSEARCH-1474")
public class MassIndexingTimeoutIT {
private static final int NUMBER_OF_ENTIIES = 2000;
@Deployment
public static Archive<?> createTestArchive() {
WebArchive archive = ShrinkWrap
.create( WebArchive.class, MassIndexingTimeoutIT.class.getSimpleName() + ".war" )
.addClasses( Concert.class, ConcertManager.class )
.addAsResource( persistenceXml(), "META-INF/persistence.xml" )
.addAsWebInfResource( EmptyAsset.INSTANCE, "beans.xml" );
return archive;
}
private static Asset persistenceXml() {
String persistenceXml = Descriptors.create( PersistenceDescriptor.class )
.version( "2.0" )
.createPersistenceUnit()
.name( "primary" )
.clazz( Concert.class.getName() )
.jtaDataSource( "java:jboss/datasources/ExampleDS" )
.getOrCreateProperties()
.createProperty().name( "hibernate.hbm2ddl.auto" ).value( "create-drop" ).up()
.createProperty().name( "hibernate.search.default.lucene_version" ).value( "LUCENE_CURRENT" ).up()
.createProperty().name( "hibernate.search.default.directory_provider" ).value( "ram" ).up()
.createProperty().name( "hibernate.search.indexing_strategy" ).value( "manual" ).up()
.createProperty().name( "hibernate.jdbc.batch_size" ).value( "50" ).up()
.createProperty().name( "wildfly.jpa.hibernate.search.module" ).value( getWildFlyModuleIdentifier() ).up()
.createProperty().name( "jboss.as.jpa.providerModule" ).value( getHibernateORMModuleName() ).up()
.up().up()
.exportAsString();
return new StringAsset( persistenceXml );
}
@Inject
private ConcertManager concertManager;
/**
* Asserts that the configured transaction timeout is applied during id production. The batch size and test data are
* chosen to ensure that id consumption applies back-pressure on the {@code ProducerConsumerQueue}, causing the id
* producer to run into a TX timeout if the configured default timeout applied.
* <p>
* More specifically, consumption of the ids takes that long (by means of artificial slow-down in {@link Concert},
* that the id producer cannot emit all 2000 ids before the default transaction time out applied. So this test only
* passes if the default timeout is overridden by the timeout given for the mass indexer.
* <p>
* The timeout is given via {@code coordinator-environment#default-timeout} in standalone-full-testqueues.xml.
*/
@Test
public void configuredTimeoutIsAppliedDuringIdProduction() throws Exception {
insertTestData();
assertEquals( 0, concertManager.findConcertsByArtist( "Hruce Bronsby" ).size() );
Concert.SLOW_DOWN = true;
concertManager.indexConcerts();
Concert.SLOW_DOWN = false;
List<Concert> artists = concertManager.findConcertsByArtist( "Hruce Bronsby" );
assertEquals(
"Expecting all entries to be indexed, as the configured transaction timeout is long enough to " +
"produce all items",
NUMBER_OF_ENTIIES,
artists.size()
);
}
private void insertTestData() {
List<Concert> concerts = new ArrayList<>();
GregorianCalendar calendar = new GregorianCalendar( TimeZone.getTimeZone( "UTC" ), Locale.ROOT );
calendar.set( 2015, 0, 31 );
Date time = calendar.getTime();
for ( int i = 0; i < NUMBER_OF_ENTIIES; i++ ) {
concerts.add( new Concert( "Hruce Bronsby", time ) );
}
concertManager.saveConcerts( concerts );
}
}