/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.portlet.container.services; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.servlet.http.Cookie; import org.apereo.portal.portlet.dao.IPortletCookieDao; import org.apereo.portal.portlet.om.IPortalCookie; import org.apereo.portal.portlet.om.IPortletCookie; import org.apereo.portal.portlet.om.IPortletWindowId; import org.easymock.EasyMock; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; /** * Tests for {@link PortletCookieServiceImpl}. * */ public class PortletCookieServiceImplTest { /** * Control test invocation of {@link * PortletCookieServiceImpl#updatePortalCookie(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse)}. */ @Test public void testUpdatePortletCookieControl() { IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect( portletCookieDao.createPortalCookie( PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); EasyMock.expect( portletCookieDao.updatePortalCookieExpiration( portalCookie, PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); EasyMock.replay(portletCookieDao); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletResponse response = new MockHttpServletResponse(); cookieService.updatePortalCookie(request, response); Cookie[] cookies = response.getCookies(); Assert.assertNotNull(cookies); Assert.assertEquals(1, cookies.length); EasyMock.verify(portletCookieDao); } /** * Test {@link * PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}. * that results in creating a new PortalCookie. */ @Test public void testGetOrCreatePortalCookieCreate() { IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect( portletCookieDao.createPortalCookie( PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); EasyMock.replay(portletCookieDao); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); MockHttpServletRequest request = new MockHttpServletRequest(); cookieService.getOrCreatePortalCookie(request); EasyMock.verify(portletCookieDao); } /** * Test {@link * PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}. * that results in returning an existing portalcookie from the request cookies */ @Test public void testGetOrCreatePortalCookieGetExistingFromRequestCookies() { IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect(portletCookieDao.getPortalCookie("ABCDEF")).andReturn(portalCookie); EasyMock.replay(portletCookieDao); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); MockHttpServletRequest request = new MockHttpServletRequest(); Cookie[] cookies = new Cookie[1]; Cookie cookie = new Cookie(IPortletCookieService.DEFAULT_PORTAL_COOKIE_NAME, "ABCDEF"); cookies[0] = cookie; request.setCookies(cookies); IPortalCookie result = cookieService.getOrCreatePortalCookie(request); Assert.assertEquals(portalCookie, result); EasyMock.verify(portletCookieDao); } /** * Test {@link * PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}. * that results in returning an existing portalcookie from the id stored in the session. */ @Test public void testGetOrCreatePortalCookieGetExistingFromSession() { IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect(portletCookieDao.getPortalCookie("ABCDEF")).andReturn(portalCookie); EasyMock.replay(portletCookieDao); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); MockHttpServletRequest request = new MockHttpServletRequest(); request.getSession() .setAttribute( PortletCookieServiceImpl.SESSION_ATTRIBUTE__PORTAL_COOKIE_ID, "ABCDEF"); IPortalCookie result = cookieService.getOrCreatePortalCookie(request); Assert.assertEquals(portalCookie, result); EasyMock.verify(portletCookieDao); } /** * Control test for adding a portlet cookie: no existing portalCookie, portlet cookie requires * persistence. */ @Test public void testAddCookieControl() { Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue"); // max age will trigger persistence portletCookie.setMaxAge(360); IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect( portletCookieDao.createPortalCookie( PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); EasyMock.expect(portletCookieDao.addOrUpdatePortletCookie(portalCookie, portletCookie)) .andReturn(portalCookie); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class); EasyMock.replay(portletCookieDao, mockWindowId); MockHttpServletRequest request = new MockHttpServletRequest(); cookieService.addCookie(request, mockWindowId, portletCookie); EasyMock.verify(portletCookieDao, mockWindowId); } /** * Control test for removing a portlet cookie. Logic is nearly identical to create, as both * {@link IPortletCookieDao#addOrUpdatePortletCookie(IPortalCookie, Cookie)} is used in both * scenarios. */ @Test public void testAddCookieRemove() { Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue"); // max age will trigger persistence removal portletCookie.setMaxAge(0); IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect( portletCookieDao.createPortalCookie( PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); EasyMock.expect(portletCookieDao.addOrUpdatePortletCookie(portalCookie, portletCookie)) .andReturn(portalCookie); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class); EasyMock.replay(portletCookieDao, mockWindowId); MockHttpServletRequest request = new MockHttpServletRequest(); cookieService.addCookie(request, mockWindowId, portletCookie); EasyMock.verify(portletCookieDao, mockWindowId); } /** * Control test for adding a portlet cookie with maxAge == -1, which results in a session-only * cookie. */ @Test public void testAddCookieSessionOnly() { Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue"); // max age will trigger persistence portletCookie.setMaxAge(-1); IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class); MockPortalCookie portalCookie = new MockPortalCookie(); portalCookie.setValue("ABCDEF"); EasyMock.expect( portletCookieDao.createPortalCookie( PortletCookieServiceImpl.DEFAULT_MAX_AGE)) .andReturn(portalCookie); PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl(); cookieService.setPortletCookieDao(portletCookieDao); IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class); EasyMock.replay(portletCookieDao, mockWindowId); MockHttpServletRequest request = new MockHttpServletRequest(); cookieService.addCookie(request, mockWindowId, portletCookie); Map<String, SessionOnlyPortletCookieImpl> sessionOnlyMap = cookieService.getSessionOnlyPortletCookieMap(request); SessionOnlyPortletCookieImpl sessionOnlyCookie = sessionOnlyMap.get("somePortletCookieName"); Assert.assertNotNull(sessionOnlyCookie); Assert.assertEquals(-1, sessionOnlyCookie.getMaxAge()); Assert.assertEquals("somePortletCookieValue", sessionOnlyCookie.getValue()); EasyMock.verify(portletCookieDao, mockWindowId); } /** * Mock {@link IPortalCookie} used in these tests. * */ class MockPortalCookie implements IPortalCookie { private DateTime created = DateTime.now(); private DateTime expires = DateTime.now().plusHours(1); private Set<IPortletCookie> portletCookies = new HashSet<IPortletCookie>(); private String value; @Override public DateTime getCreated() { return this.created; } @Override public DateTime getExpires() { return this.expires; } @Override public Set<IPortletCookie> getPortletCookies() { return this.portletCookies; } @Override public String getValue() { return this.value; } @Override public void setExpires(DateTime expires) { this.expires = expires; } public void setCreated(DateTime created) { this.created = created; } public void setPortletCookies(Set<IPortletCookie> portletCookies) { this.portletCookies = portletCookies; } public void setValue(String value) { this.value = value; } } }