package org.infinispan.test.integration.as.jms.infinispan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.List;
import javax.inject.Inject;
import org.infinispan.test.integration.as.jms.controller.RegistrationController;
import org.infinispan.test.integration.as.jms.infinispan.controller.MembersCache;
import org.infinispan.test.integration.as.jms.model.RegisteredMember;
import org.jboss.arquillian.container.test.api.OperateOnDeployment;
import org.jboss.arquillian.junit.InSequence;
import org.junit.Test;
/**
* Test that the JMS backend can be used at the same time with Infinispan.
* <p/>
* Search dependencies are not added to the archives.
*
* @author Davide D'Alto <davide@hibernate.org>
*/
public abstract class SearchNewEntityJmsMasterSlaveAndInfinispan {
/**
* Idle loop to wait for results to be transmitted
*/
private static final int SLEEP_TIME_FOR_SYNCHRONIZATION = 50;
/**
* Multiplier to how long we can wait before considering the test failed.
*/
private static final int MAX_PERIOD_RETRIES = 5;
private static final int MAX_SEARCH_ATTEMPTS = (MAX_PERIOD_RETRIES * 1000 / SLEEP_TIME_FOR_SYNCHRONIZATION);
@Inject
RegistrationController memberRegistration;
@Inject
MembersCache cache;
@Test
@InSequence(0)
@OperateOnDeployment("master")
public void deleteExistingMembers() throws Exception {
int deletedMembers = memberRegistration.deleteAllMembers();
assertEquals("At the start of the test there should be no members", 0, deletedMembers);
}
@Test
@InSequence(1)
@OperateOnDeployment("slave-1")
public void registerNewMemberOnSlave1() throws Exception {
RegisteredMember newMember = memberRegistration.getNewMember();
assertNull("A non registered member should have null ID", newMember.getId());
newMember.setName("Davide D'Alto");
newMember.setEmail("slave1@email");
memberRegistration.register();
assertNotNull("A registered member should have an ID", newMember.getId());
// Add new member in the cache
cache.put("slave-1", newMember.getName());
}
@Test
@InSequence(2)
@OperateOnDeployment("slave-2")
public void registerNewMemberOnSlave2() throws Exception {
RegisteredMember newMember = memberRegistration.getNewMember();
assertNull("A non registered member should have null ID", newMember.getId());
newMember.setName("Peter O'Tall");
newMember.setEmail("slave2@email");
memberRegistration.register();
assertNotNull("A registered member should have an ID", newMember.getId());
// Add new member in the cache
cache.put("slave-2", newMember.getName());
// Read slave-1 member from the cache
assertEquals("Davide D'Alto", cache.get("slave-1"));
}
@Test
@InSequence(3)
@OperateOnDeployment("master")
public void searchNewMembersAfterSynchronizationOnMaster() throws Exception {
assertSearchResult("Davide D'Alto", search("Davide"));
assertSearchResult("Peter O'Tall", search("Peter"));
// Read users from the cache
assertEquals("Missing cache entry", "Davide D'Alto", cache.get("slave-1"));
assertEquals("Missing cache entry", "Peter O'Tall", cache.get("slave-2"));
}
private void assertSearchResult(String expectedResult, List<RegisteredMember> results) {
assertEquals("Unexpected number of results, expected <" + expectedResult + ">", 1, results.size());
assertEquals("Unexpected result from search", expectedResult, results.get(0).getName());
}
private void waitForIndexSynchronization() throws InterruptedException {
Thread.sleep(SLEEP_TIME_FOR_SYNCHRONIZATION);
}
private List<RegisteredMember> search(String name) throws InterruptedException {
List<RegisteredMember> results = memberRegistration.search(name);
int attempts = 0;
while (results.size() == 0 && attempts < MAX_SEARCH_ATTEMPTS) {
attempts++;
waitForIndexSynchronization();
results = memberRegistration.search(name);
}
return results;
}
}