455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell/*
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * The contents of this file are subject to the terms of the Common Development and
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * Distribution License (the License). You may not use this file except in compliance with the
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * License.
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell *
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * specific language governing permission and limitations under the License.
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell *
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * When distributing Covered Software, include this CDDL Header Notice in each file and include
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * Header, with the fields enclosed by brackets [] replaced by your own identifying
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * information: "Portions copyright [year] [name of copyright owner]".
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell *
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * Copyright 2016 ForgeRock AS.
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell */
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellpackage com.iplanet.dpro.session.service;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport static org.assertj.core.api.Assertions.assertThat;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport static org.forgerock.json.test.assertj.AssertJJsonValueAssert.assertThat;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport static org.mockito.BDDMockito.given;
c007849bbb809877e23d714ab629dea788abceddCraig McDonnellimport static org.mockito.Mockito.*;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport java.util.LinkedHashMap;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport java.util.List;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport java.util.Set;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.forgerock.json.JsonValue;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.forgerock.openam.notifications.NotificationBroker;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.forgerock.openam.notifications.NotificationsConfig;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.forgerock.openam.notifications.Topic;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.forgerock.openam.session.SessionEventType;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.mockito.ArgumentCaptor;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.testng.annotations.BeforeMethod;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport org.testng.annotations.Test;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport com.iplanet.dpro.session.SessionID;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellimport com.sun.identity.shared.debug.Debug;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnellpublic class SessionNotificationPublisherTest {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private InternalSession session;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private NotificationBroker notificationBroker;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private NotificationsConfig notificationsConfig;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private SessionNotificationPublisher sessionNotificationPublisher;
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @BeforeMethod
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void setUp() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell notificationBroker = mock(NotificationBroker.class);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell notificationsConfig = mock(NotificationsConfig.class);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell session = mock(InternalSession.class);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell sessionNotificationPublisher =
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell new SessionNotificationPublisher(mock(Debug.class), notificationsConfig, notificationBroker);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldPublishSessionNotificationForMasterSessionIdAndRestrictedSessionIds() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Given
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell given(session.getSessionID()).willReturn(new SessionID("masterSessionId"));
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell given(session.getRestrictedTokens()).willReturn(restrictedTokens(
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell "restrictedToken1", "restrictedToken2", "restrictedToken3"));
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // When
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell List<JsonValue> notifications = fireSessionEvent(SessionEventType.SESSION_CREATION);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Then
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertThat(notifications.get(0)).stringAt("tokenId").isEqualTo("masterSessionId");
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertThat(notifications.get(1)).stringAt("tokenId").isEqualTo("restrictedToken1");
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertThat(notifications.get(2)).stringAt("tokenId").isEqualTo("restrictedToken2");
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertThat(notifications.get(3)).stringAt("tokenId").isEqualTo("restrictedToken3");
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell /**
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * Returns Set of SessionIDs which will be iterated in the order they were provided.
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * <p>
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell * This allows notifications to be accessed by index.
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell */
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private Set<SessionID> restrictedTokens(String... sessionIdStrings) {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell LinkedHashMap<SessionID, SessionID> restrictedTokens = new LinkedHashMap<>();
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell for (final String sessionIdString : sessionIdStrings) {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell SessionID sessionId = new SessionID(sessionIdString);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell restrictedTokens.put(sessionId, sessionId);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell return restrictedTokens.keySet();
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForSessionCreation() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.SESSION_CREATION);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForIdleTimeOut() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.IDLE_TIMEOUT);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForMaxTimeOut() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.MAX_TIMEOUT);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForLogout() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.LOGOUT);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForDestroy() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.DESTROY);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldSendNotificationForPropertyChanged() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertSendsNotificationForSessionEvent(SessionEventType.PROPERTY_CHANGED);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldIgnoreQuotaExhaustedEvent() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertIgnoresSessionEvent(SessionEventType.QUOTA_EXHAUSTED);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell @Test
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell public void shouldIgnoreProtectedPropertyEvent() {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertIgnoresSessionEvent(SessionEventType.PROTECTED_PROPERTY);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private void assertSendsNotificationForSessionEvent(SessionEventType sessionEventType) {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Given
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell given(session.getSessionID()).willReturn(new SessionID("masterSessionId"));
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // When
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell List<JsonValue> notifications = fireSessionEvent(sessionEventType);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Then
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell SessionEventType eventType = (SessionEventType) notifications.get(0).get("eventType").getObject();
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell assertThat(eventType).isEqualTo(sessionEventType);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private void assertIgnoresSessionEvent(SessionEventType sessionEventType) {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Given
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // When
014065ea14b5a1e46190cd2a6014945aea15689bCraig McDonnell sessionNotificationPublisher.onEvent(new InternalSessionEvent(session, sessionEventType,
014065ea14b5a1e46190cd2a6014945aea15689bCraig McDonnell System.currentTimeMillis()));
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell // Then
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell verifyZeroInteractions(notificationBroker);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell private List<JsonValue> fireSessionEvent(SessionEventType sessionEventType) {
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell given(notificationsConfig.isAgentsEnabled()).willReturn(true);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell ArgumentCaptor<JsonValue> notificationCaptor = ArgumentCaptor.forClass(JsonValue.class);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell given(notificationBroker.publish(eq(Topic.of("/agent/session")), notificationCaptor.capture())).willReturn(true);
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
014065ea14b5a1e46190cd2a6014945aea15689bCraig McDonnell sessionNotificationPublisher.onEvent(new InternalSessionEvent(session, sessionEventType,
014065ea14b5a1e46190cd2a6014945aea15689bCraig McDonnell System.currentTimeMillis()));
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell return notificationCaptor.getAllValues();
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell }
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell
455375d46179ba24afcd3662bdfb6aaf03a9479cCraig McDonnell}