package org.infinispan.spring.session;
import static org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.util.concurrent.TimeUnit;
import org.infinispan.spring.provider.SpringCache;
import org.infinispan.test.AbstractInfinispanTest;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.MapSession;
import org.testng.annotations.Test;
public abstract class InfinispanSessionRepositoryTCK extends AbstractInfinispanTest {
protected SpringCache springCache;
protected AbstractInfinispanSessionRepository sessionRepository;
protected abstract SpringCache createSpringCache();
protected abstract AbstractInfinispanSessionRepository createRepository(SpringCache springCache) throws Exception;
protected void init() throws Exception {
springCache = createSpringCache();
sessionRepository = createRepository(springCache);
}
@Test(expectedExceptions = NullPointerException.class)
public void testThrowingExceptionOnNullSpringCache() throws Exception {
createRepository(null);
}
@Test
public void testCreatingSession() throws Exception {
//when
MapSession session = sessionRepository.createSession();
//then
assertTrue(session.getId() != null);
assertTrue(session.getCreationTime() != 0);
assertNull(sessionRepository.getSession(session.getId()));
}
@Test
public void testSavingSession() throws Exception {
//when
MapSession session = sessionRepository.createSession();
sessionRepository.save(session);
//then
assertNotNull(sessionRepository.getSession(session.getId()));
}
@Test
public void testUpdatingTTLOnAccessingData() throws Exception {
//when
MapSession session = sessionRepository.createSession();
long accessTimeBeforeSaving = session.getLastAccessedTime();
sessionRepository.save(session);
long accessTimeAfterSaving = session.getLastAccessedTime();
long accessTimeAfterAccessing = sessionRepository.getSession(session.getId()).getLastAccessedTime();
//then
assertTrue(accessTimeBeforeSaving > 0);
assertTrue(accessTimeBeforeSaving <= System.currentTimeMillis());
assertTrue(accessTimeAfterSaving > 0);
assertTrue(accessTimeAfterSaving <= System.currentTimeMillis());
assertTrue(accessTimeAfterAccessing > 0);
assertTrue(accessTimeAfterAccessing >= accessTimeAfterSaving);
}
@Test
public void testDeletingSession() throws Exception {
//when
MapSession session = sessionRepository.createSession();
sessionRepository.save(session);
sessionRepository.delete(session.getId());
//then
assertNull(sessionRepository.getSession(session.getId()));
}
@Test(timeOut = 5000)
public void testEvictingSession() throws Exception {
//when
MapSession session = sessionRepository.createSession();
session.setMaxInactiveIntervalInSeconds(1);
sessionRepository.save(session);
//then
while (sessionRepository.getSession(session.getId(), false) != null) {
TimeUnit.MILLISECONDS.sleep(500);
}
}
@Test
public void testExtractingPrincipalWithWrongIndexName() throws Exception {
//when
int sizeWithWrongIndexName = ((FindByIndexNameSessionRepository) sessionRepository).findByIndexNameAndIndexValue("wrongIndexName", "").size();
int sizeWithNullIndexName = ((FindByIndexNameSessionRepository) sessionRepository).findByIndexNameAndIndexValue(null, "").size();
//then
assertTrue(sizeWithNullIndexName == 0);
assertTrue(sizeWithWrongIndexName == 0);
}
@Test
public void testExtractingPrincipal() throws Exception {
//given
addEmptySessionWithPrincipal(sessionRepository, "test1");
addEmptySessionWithPrincipal(sessionRepository, "test2");
addEmptySessionWithPrincipal(sessionRepository, "test3");
//when
int numberOfTest1Users = ((FindByIndexNameSessionRepository) sessionRepository)
.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, "test1").size();
int numberOfNonExistingUsers = ((FindByIndexNameSessionRepository) sessionRepository)
.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, "notExisting").size();
//then
assertTrue(numberOfTest1Users == 1);
assertTrue(numberOfNonExistingUsers == 0);
}
protected void addEmptySessionWithPrincipal(AbstractInfinispanSessionRepository sessionRepository, String principalName) {
MapSession session = sessionRepository.createSession();
session.setAttribute(PRINCIPAL_NAME_INDEX_NAME, principalName);
sessionRepository.save(session);
}
}