/*
* 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.configuration.integration;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.testsupport.BytemanHelper;
import org.hibernate.search.testsupport.BytemanHelper.BytemanAccessor;
import org.hibernate.search.testsupport.junit.ElasticsearchSupportInProgress;
import org.hibernate.search.test.util.FullTextSessionBuilder;
import org.jboss.byteman.contrib.bmunit.BMRule;
import org.jboss.byteman.contrib.bmunit.BMRules;
import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* @author Hardy Ferentschik
*/
@RunWith(BMUnitRunner.class)
@Category(ElasticsearchSupportInProgress.class) // HSEARCH-2481 Byteman-based tests re-executed in the Elasticsearch module won't work
public class HibernateSearchSessionFactoryObserverTest {
@Rule
public BytemanAccessor byteman = BytemanHelper.createAccessor();
@Test
@BMRules(rules = {
@BMRule(targetClass = "org.hibernate.internal.SessionFactoryImpl",
targetMethod = "close",
helper = "org.hibernate.search.testsupport.BytemanHelper",
action = "countInvocation()",
name = "Session close counter"),
@BMRule(targetClass = "org.hibernate.search.spi.SearchIntegratorBuilder",
targetMethod = "buildSearchIntegrator",
action = "throw new java.lang.RuntimeException(\"Byteman created runtime exception\")",
name = "Factory build prohibitor")
})
public void testSessionFactoryGetsClosedOnSearchFactoryCreationFailure() {
final FullTextSessionBuilder builder = new FullTextSessionBuilder();
builder.addAnnotatedClass( Foo.class );
try {
builder.build();
fail( "ByteMan should have forced an exception" );
}
catch (RuntimeException e) {
assertEquals( "Wrong invocation count", 1, byteman.getAndResetInvocationCount() );
}
}
@Entity
@Indexed
public static class Foo {
@Id
private long id;
}
}