From d80089bb99dbf43b102ae04dcd3fdff221c5e47b Mon Sep 17 00:00:00 2001 From: Mincong HUANG Date: Mon, 17 Apr 2017 09:31:00 +0200 Subject: [PATCH] HSEARCH-2624 Add test for multi-tenancy --- jsr352/core/pom.xml | 23 +++- .../MassIndexingJobWithMultiTenancyIT.java | 121 ++++++++++++++++++ .../search/jsr352/test/util/JobTestUtil.java | 29 +++-- jsr352/pom.xml | 7 + 4 files changed, 168 insertions(+), 12 deletions(-) create mode 100644 jsr352/core/src/test/java/org/hibernate/search/jsr352/massindexing/MassIndexingJobWithMultiTenancyIT.java diff --git a/jsr352/core/pom.xml b/jsr352/core/pom.xml index 980737c775b..afa236a159e 100644 --- a/jsr352/core/pom.xml +++ b/jsr352/core/pom.xml @@ -8,7 +8,7 @@ 4.0.0 - + org.hibernate hibernate-search-jsr352-parent @@ -16,7 +16,7 @@ hibernate-search-jsr352-core - + Hibernate Search JSR-352 Core of the Hibernate Search JSR-352 integration @@ -39,11 +39,26 @@ + + org.hibernate + hibernate-testing + test + + + org.hibernate + hibernate-search-testing + test + junit junit test + + org.easytesting + fest-assert + test + org.mockito mockito-all @@ -69,7 +84,7 @@ byteman-bmunit test - + com.ibm.jbatch com.ibm.jbatch-runtime @@ -79,7 +94,7 @@ org.apache.derby diff --git a/jsr352/core/src/test/java/org/hibernate/search/jsr352/massindexing/MassIndexingJobWithMultiTenancyIT.java b/jsr352/core/src/test/java/org/hibernate/search/jsr352/massindexing/MassIndexingJobWithMultiTenancyIT.java new file mode 100644 index 00000000000..bf053b0b2db --- /dev/null +++ b/jsr352/core/src/test/java/org/hibernate/search/jsr352/massindexing/MassIndexingJobWithMultiTenancyIT.java @@ -0,0 +1,121 @@ +/* + * 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 . + */ +package org.hibernate.search.jsr352.massindexing; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.persistence.EntityManagerFactory; + +import org.hibernate.Session; +import org.hibernate.search.FullTextSession; +import org.hibernate.search.Search; +import org.hibernate.search.jsr352.massindexing.test.entity.Company; +import org.hibernate.search.jsr352.test.util.JobFactory; +import org.hibernate.search.jsr352.test.util.JobTestUtil; +import org.hibernate.search.test.SearchTestBase; + +import org.junit.Before; +import org.junit.Test; + +import org.fest.util.Collections; + +import static org.fest.assertions.Assertions.assertThat; +import static org.hibernate.search.jsr352.test.util.JobTestUtil.findIndexedResultsInTenant; + +/** + * @author Mincong Huang + */ +public class MassIndexingJobWithMultiTenancyIT extends SearchTestBase { + + private static final String TARGET_TENANT_ID = "targetTenant"; + + private static final String UNUSED_TENANT_ID = "unusedTenant"; + + private static final int JOB_TIMEOUT_MS = 10_000; + + private JobOperator jobOperator = JobFactory.getJobOperator(); + + private final List companies = Arrays.asList( + new Company( "Google" ), + new Company( "Red Hat" ), + new Company( "Microsoft" ) + ); + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + persist( TARGET_TENANT_ID, companies ); + purgeAll( TARGET_TENANT_ID, Company.class ); + } + + private void persist(String tenantId, List entities) { + try (Session session = openSessionWithTenantId( tenantId )) { + session.getTransaction().begin(); + entities.forEach( session::persist ); + session.getTransaction().commit(); + } + } + + private void purgeAll(String tenantId, Class entityType) throws IOException { + FullTextSession session = Search.getFullTextSession( openSessionWithTenantId( tenantId ) ); + session.purgeAll( entityType ); + session.flushToIndexes(); + session.close(); + } + + @Test + public void shouldHandleTenantIds() throws Exception { + long executionId = jobOperator.start( + MassIndexingJob.NAME, + MassIndexingJob.parameters() + .forEntity( Company.class ) + .tenantId( TARGET_TENANT_ID ) + .build() + ); + + JobExecution jobExecution = jobOperator.getJobExecution( executionId ); + JobTestUtil.waitForTermination( jobOperator, jobExecution, JOB_TIMEOUT_MS ); + assertThat( jobExecution.getBatchStatus() ).isEqualTo( BatchStatus.COMPLETED ); + + EntityManagerFactory emf = getSessionFactory().unwrap( EntityManagerFactory.class ); + + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Google", TARGET_TENANT_ID ) ).hasSize( 1 ); + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Red Hat", TARGET_TENANT_ID ) ).hasSize( 1 ); + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Microsoft", TARGET_TENANT_ID ) ).hasSize( 1 ); + + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Google", UNUSED_TENANT_ID ) ).isEmpty(); + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Red Hat", UNUSED_TENANT_ID ) ).isEmpty(); + assertThat( findIndexedResultsInTenant( emf, Company.class, "name", "Microsoft", UNUSED_TENANT_ID ) ).isEmpty(); + } + + private Session openSessionWithTenantId(String tenantId) { + return getSessionFactory().withOptions().tenantIdentifier( tenantId ).openSession(); + } + + @Override + public Class[] getAnnotatedClasses() { + return new Class[] { Company.class }; + } + + @Override + public Set multiTenantIds() { + return Collections.set( TARGET_TENANT_ID, UNUSED_TENANT_ID ); + } + + @Override + public void configure(Map cfg) { + cfg.put( "hibernate.search.indexing_strategy", "manual" ); + } + +} diff --git a/jsr352/core/src/test/java/org/hibernate/search/jsr352/test/util/JobTestUtil.java b/jsr352/core/src/test/java/org/hibernate/search/jsr352/test/util/JobTestUtil.java index 7818bb71a49..313e92663f0 100644 --- a/jsr352/core/src/test/java/org/hibernate/search/jsr352/test/util/JobTestUtil.java +++ b/jsr352/core/src/test/java/org/hibernate/search/jsr352/test/util/JobTestUtil.java @@ -10,11 +10,12 @@ import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import org.hibernate.search.jpa.FullTextEntityManager; -import org.hibernate.search.jpa.Search; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.search.FullTextSession; +import org.hibernate.search.Search; import org.hibernate.search.jsr352.logging.impl.Log; import org.hibernate.search.util.logging.impl.LoggerFactory; @@ -55,15 +56,27 @@ public static JobExecution waitForTermination(JobOperator jobOperator, JobExecut } public static List findIndexedResults(EntityManagerFactory emf, Class clazz, String key, String value) { - EntityManager em = emf.createEntityManager(); - FullTextEntityManager ftem = Search.getFullTextEntityManager( em ); - Query luceneQuery = ftem.getSearchFactory().buildQueryBuilder() + SessionFactory sessionFactory = emf.unwrap( SessionFactory.class ); + try (Session session = sessionFactory.openSession()) { + return find( session, clazz, key, value ); + } + } + + public static List findIndexedResultsInTenant(EntityManagerFactory emf, Class clazz, String key, String value, String tenantId) { + SessionFactory sessionFactory = emf.unwrap( SessionFactory.class ); + try (Session session = sessionFactory.withOptions().tenantIdentifier( tenantId ).openSession()) { + return find( session, clazz, key, value ); + } + } + + private static List find(Session session, Class clazz, String key, String value) { + FullTextSession fts = Search.getFullTextSession( session ); + Query luceneQuery = fts.getSearchFactory().buildQueryBuilder() .forEntity( clazz ).get() .keyword().onField( key ).matching( value ) .createQuery(); @SuppressWarnings("unchecked") - List result = ftem.createFullTextQuery( luceneQuery ).getResultList(); - em.close(); + List result = fts.createFullTextQuery( luceneQuery ).getResultList(); return result; } diff --git a/jsr352/pom.xml b/jsr352/pom.xml index d0a8dcf7269..336c9c88a25 100644 --- a/jsr352/pom.xml +++ b/jsr352/pom.xml @@ -72,6 +72,13 @@ org.jboss.logging jboss-logging-annotations + + + org.hibernate + hibernate-search-orm + test-jar + test +