package org.ovirt.engine.core.bll.aaa; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anySet; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Collections; import java.util.Date; import org.apache.commons.lang.time.DateUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.dao.EngineSessionDao; import org.ovirt.engine.core.utils.MockConfigRule; /** * A test case for the {@link SessionDataContainer} class. */ @RunWith(MockitoJUnitRunner.class) public class SessionDataContainerTest { private static final String TEST_KEY = "someKey"; private static final String TEST_VALUE = "someValue"; private static final String TEST_SESSION_ID = "someSession"; private static final String TEST_SSO_TOKEN = "someToken"; private static final String USER = "user"; private static final String SOFT_LIMIT = "soft_limit"; @Rule public MockConfigRule mcr = new MockConfigRule(); @Mock private EngineSessionDao engineSessionDao; @InjectMocks private SessionDataContainer container; @Mock private SessionDataContainer.SsoSessionValidator ssoSessionValidator; @Mock private SsoSessionUtils ssoSessionUtils; @Before public void setUpContainer() { when(engineSessionDao.remove(anyLong())).thenReturn(1); when(ssoSessionValidator.getSessionStatuses(anySet())).thenReturn(Collections.singletonMap(TEST_SSO_TOKEN, true)); when(ssoSessionUtils.isSessionInUse(anyLong())).thenReturn(false); DbUser user = mock(DbUser.class); container.setUser(TEST_SESSION_ID, user); container.setSsoAccessToken(TEST_SESSION_ID, TEST_SSO_TOKEN); } public void clearSession() { container.removeSessionOnLogout(TEST_SESSION_ID); } @Test public void testGetDataAndSetDataWithEmptySession() { assertNull("Get should return null with an empty session", container.getData("", TEST_KEY, false)); clearSession(); } @Test public void testGetDataAndSetDataWithFullSession() { container.setData(TEST_SESSION_ID, TEST_KEY, TEST_VALUE); assertEquals("Get should return the value with a given session", TEST_VALUE, container.getData(TEST_SESSION_ID, TEST_KEY, false)); clearSession(); } @Test public void testGetUserAndSetUserWithSessionParam() { DbUser user = mock(DbUser.class); container.setUser(TEST_SESSION_ID, user); assertEquals("Get should return the value with a given session", user, container.getUser(TEST_SESSION_ID, false)); clearSession(); } /* Tests for session management */ @Test public void testRemoveWithParam() { // Set some data on the test sessions container.setData(TEST_SESSION_ID, TEST_KEY, TEST_VALUE); container.removeSessionOnLogout(TEST_SESSION_ID); assertNull("Get should return null since the session was removed", container.getData(TEST_SESSION_ID, TEST_KEY, false)); } /* Tests for clearedExpiredSessions */ @Test public void testCleanExpiredSessions() { initDataForClearTest(TEST_KEY); // Clear expired sessions - data is moved to older generation // nothing should happen as far as the user is concerned container.cleanExpiredUsersSessions(); assertNull("Get not find the session", container.getData(TEST_SESSION_ID, TEST_KEY, false)); } @Test public void testCleanExpiredSessionsWithRunningCommands() { when(ssoSessionUtils.isSessionInUse(anyLong())).thenReturn(true); initDataForClearTest(TEST_KEY); // Clear expired sessions - data is moved to older generation // nothing should happen as far as the user is concerned container.cleanExpiredUsersSessions(); assertNotNull("Get found the session", container.getData(TEST_SESSION_ID, TEST_KEY, false)); } /** Initializes the {@link #key} data */ private void initDataForClearTest(String key) { container.setData(TEST_SESSION_ID, key, mock(DbUser.class)); container.setData(TEST_SESSION_ID, SOFT_LIMIT, DateUtils.addMinutes(new Date(), -1)); } @Test public void testRefreshUserSession() { // refresh the old session (refresh = true) container.getData(TEST_SESSION_ID, USER, true); // cleared expired session container.cleanExpiredUsersSessions(); Object obj = container.getData(TEST_SESSION_ID, USER, false); // session should be already refreshed -> not null assertNotNull("Get should return null since the session wasn't refresh", container.getData(TEST_SESSION_ID, USER, false)); clearSession(); } @Test public void testRefreshUserSessionAfterExpiration() { initDataForClearTest(USER); // Clear expired sessions twice - data is moved to older generation, then removed container.cleanExpiredUsersSessions(); container.cleanExpiredUsersSessions(); // refresh the old session (refresh = true) // -> the user session is already expired so couldn't refresh it container.getData(TEST_SESSION_ID, USER, true); // no session available assertNull("Get should return null since the session wasn't refresh", container.getData(TEST_SESSION_ID, USER, false)); } }