87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden/*
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * The contents of this file are subject to the terms of the Common Development and
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * Distribution License (the License). You may not use this file except in compliance with the
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * License.
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden *
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * specific language governing permission and limitations under the License.
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden *
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * When distributing Covered Software, include this CDDL Header Notice in each file and include
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * Header, with the fields enclosed by brackets [] replaced by your own identifying
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden * information: "Portions copyright [year] [name of copyright owner]".
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden *
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper * Copyright 2015-2016 ForgeRock AS.
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden */
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenpackage com.iplanet.dpro.session.operations.strategies;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.assertj.core.api.Assertions.assertThat;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.mockito.BDDMockito.given;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.mockito.BDDMockito.willThrow;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.mockito.Mockito.mock;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.mockito.Mockito.verify;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport static org.mockito.Mockito.verifyZeroInteractions;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport com.iplanet.dpro.session.Session;
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeperimport com.iplanet.dpro.session.SessionEvent;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport com.iplanet.dpro.session.SessionException;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport com.iplanet.dpro.session.SessionID;
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hoganimport com.iplanet.dpro.session.SessionTimedOutException;
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeperimport com.iplanet.dpro.session.service.SessionLogging;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport com.iplanet.dpro.session.service.SessionService;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport com.iplanet.dpro.session.share.SessionInfo;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.forgerock.openam.session.blacklist.SessionBlacklist;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.forgerock.openam.sso.providers.stateless.StatelessSSOProvider;
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeperimport org.forgerock.openam.sso.providers.stateless.StatelessSession;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.forgerock.openam.sso.providers.stateless.StatelessSessionFactory;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.mockito.Mock;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.mockito.MockitoAnnotations;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.testng.annotations.BeforeMethod;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenimport org.testng.annotations.Test;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Maddenpublic class StatelessOperationsTest {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Mock
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private StatelessSSOProvider mockSsoProvider;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Mock
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private SessionService mockSessionService;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Mock
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private StatelessSessionFactory mockSessionFactory;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Mock
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private SessionBlacklist mockSessionBlacklist;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Mock
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper private StatelessSession mockSession;
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper @Mock
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper private SessionLogging mockSessionLogging;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private SessionID sid;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden private StatelessOperations statelessOperations;
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @BeforeMethod
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void setup() {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden MockitoAnnotations.initMocks(this);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden sid = new SessionID("test");
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden given(mockSession.getID()).willReturn(sid);
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper statelessOperations = new StatelessOperations(
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper null, mockSessionService, mockSessionFactory, mockSessionBlacklist, mockSessionLogging, null);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Test
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void shouldRefreshFromStatelessSessionFactory() throws Exception {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Given
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden SessionInfo info = new SessionInfo();
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan info.setExpiryTime(System.currentTimeMillis() + (1000 * 60 * 10));
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden given(mockSessionFactory.getSessionInfo(sid)).willReturn(info);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // When
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden SessionInfo result = statelessOperations.refresh(mockSession, false);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Then
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden verify(mockSessionFactory).getSessionInfo(sid);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden assertThat(result).isSameAs(info);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan @Test(expectedExceptions = SessionTimedOutException.class)
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan public void refreshShouldTimeoutFromStatelessSessionFactory() throws Exception {
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan // Given
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan SessionInfo info = new SessionInfo();
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan given(mockSessionFactory.getSessionInfo(sid)).willReturn(info);
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan // When
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan SessionInfo result = statelessOperations.refresh(mockSession, false);
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan // Then exception should be thrown, as session is timed-out
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan }
75ab3608cc2f4f23d0245470999f943733f7fc93Dirk Hogan
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Test
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void shouldBlacklistSessionOnLogout() throws Exception {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Given
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // When
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden statelessOperations.logout(mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Then
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper verify(mockSessionLogging).logEvent(
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper mockSessionFactory.getSessionInfo(mockSession.getSessionID()), SessionEvent.LOGOUT);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden verify(mockSessionBlacklist).blacklist(mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Test
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void shouldCheckPermissionToDestroySession() throws Exception {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Given
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden Session requester = mock(Session.class);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // When
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden statelessOperations.destroy(requester, mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Then
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden verify(mockSessionService).checkPermissionToDestroySession(requester, sid);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Test
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void shouldBlacklistSessionOnDestroyWhenAllowed() throws Exception {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Given
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden Session requester = mock(Session.class);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // When
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden statelessOperations.destroy(requester, mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Then
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper verify(mockSessionLogging).logEvent(
05ca76d5ae014644d576f679ef6aa50e50f9636fMark de Reeper mockSessionFactory.getSessionInfo(mockSession.getSessionID()), SessionEvent.DESTROY);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden verify(mockSessionBlacklist).blacklist(mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden @Test(expectedExceptions = SessionException.class, expectedExceptionsMessageRegExp = "test")
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden public void shouldNotBlacklistSessionOnDestroyIfNotAllowed() throws Exception {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Given
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden Session requester = mock(Session.class);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden SessionException ex = new SessionException("test");
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden willThrow(ex).given(mockSessionService).checkPermissionToDestroySession(requester, sid);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // When
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden try {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden statelessOperations.destroy(requester, mockSession);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden } finally {
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden // Then
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden verifyZeroInteractions(mockSessionBlacklist);
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden }
87d68743726585ee101ba2e7be2cf06cd34ebb80Neil Madden}