From c31fb71baba332714d3046023c2649ecb7ab547a Mon Sep 17 00:00:00 2001 From: "David M. Johnson" Date: Sun, 26 Jan 2025 17:31:03 -0500 Subject: [PATCH] Use default methods rather than adapter, also add test for session manager (a wip). --- .../ui/core/RollerLoginSessionManager.java | 4 +- .../weblogger/util/cache/CacheHandler.java | 24 +-- .../util/cache/CacheHandlerAdapter.java | 55 ------ .../weblogger/ui/core/RollerSessionTest.java | 173 ++++++++++++++++++ 4 files changed, 187 insertions(+), 69 deletions(-) delete mode 100644 app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandlerAdapter.java create mode 100644 app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerLoginSessionManager.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerLoginSessionManager.java index 089cdac433..50472e2326 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerLoginSessionManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerLoginSessionManager.java @@ -4,7 +4,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.util.cache.Cache; -import org.apache.roller.weblogger.util.cache.CacheHandlerAdapter; +import org.apache.roller.weblogger.util.cache.CacheHandler; import org.apache.roller.weblogger.util.cache.CacheManager; import java.util.HashMap; @@ -23,7 +23,7 @@ private static class SingletonHolder { private static final RollerLoginSessionManager INSTANCE = new RollerLoginSessionManager(); } - class SessionCacheHandler extends CacheHandlerAdapter { + class SessionCacheHandler implements CacheHandler { @Override public void invalidate(User user) { if (user != null && user.getUserName() != null) { diff --git a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandler.java b/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandler.java index c6096a99fe..6be60ccf56 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandler.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandler.java @@ -39,20 +39,20 @@ */ public interface CacheHandler { - void invalidate(WeblogEntry entry); - - void invalidate(Weblog website); - - void invalidate(WeblogBookmark bookmark); - - void invalidate(WeblogBookmarkFolder folder); + default void invalidate(WeblogEntry entry) {} - void invalidate(WeblogEntryComment comment); + default void invalidate(Weblog website) {} - void invalidate(User user); + default void invalidate(WeblogBookmark bookmark) {} - void invalidate(WeblogCategory category); + default void invalidate(WeblogBookmarkFolder folder) {} + + default void invalidate(WeblogEntryComment comment) {} + + default void invalidate(User user) {} + + default void invalidate(WeblogCategory category) {} + + default void invalidate(WeblogTemplate template) {} - void invalidate(WeblogTemplate template); - } diff --git a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandlerAdapter.java b/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandlerAdapter.java deleted file mode 100644 index 1d8cc5a1b1..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheHandlerAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. The ASF 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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. For additional information regarding - * copyright in this work, please see the NOTICE file in the top level - * directory of this distribution. - */ -package org.apache.roller.weblogger.util.cache; - -import org.apache.roller.weblogger.pojos.*; - -public class CacheHandlerAdapter implements CacheHandler { - - @Override - public void invalidate(WeblogEntry entry) { - } - - @Override - public void invalidate(Weblog website) { - } - - @Override - public void invalidate(WeblogBookmark bookmark) { - } - - @Override - public void invalidate(WeblogBookmarkFolder folder) { - } - - @Override - public void invalidate(WeblogEntryComment comment) { - } - - @Override - public void invalidate(User user) { - } - - @Override - public void invalidate(WeblogCategory category) { - } - - @Override - public void invalidate(WeblogTemplate template) { - } -} diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java new file mode 100644 index 0000000000..d0e5477278 --- /dev/null +++ b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java @@ -0,0 +1,173 @@ +package org.apache.roller.weblogger.ui.core; + +import org.apache.roller.weblogger.business.UserManager; +import org.apache.roller.weblogger.business.Weblogger; +import org.apache.roller.weblogger.business.WebloggerFactory; +import org.apache.roller.weblogger.pojos.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.MockitoAnnotations; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.security.Principal; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + + +// TODO: Multiple tests fixes in this test are disabled due to a bug in the RollerLoginSessionManager class. +class RollerSessionTest { + + @Mock + private HttpServletRequest request; + + @Mock + private HttpSession session; + + @Mock + private Principal principal; + + @Mock + private Weblogger roller; + + @Mock + private UserManager userManager; + + @Mock + private User user; + + private RollerSession rollerSession; + private RollerLoginSessionManager sessionManager; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + sessionManager = RollerLoginSessionManager.getInstance(); + rollerSession = new RollerSession(); + + when(request.getSession(false)).thenReturn(session); + when(roller.getUserManager()).thenReturn(userManager); + try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { + factory.when(WebloggerFactory::getWeblogger).thenReturn(roller); + } + } + + @Test + void testGetRollerSessionNewSession() { + when(session.getAttribute(RollerSession.ROLLER_SESSION)).thenReturn(null); + when(request.getUserPrincipal()).thenReturn(null); + + RollerSession result = RollerSession.getRollerSession(request); + + // Verify new session was created + assertNotNull(result); + // Verify session was stored in HTTP session + verify(session).setAttribute(eq(RollerSession.ROLLER_SESSION), any(RollerSession.class)); + } + + @Test + void testGetRollerSessionExistingValidSession() { + when(session.getAttribute(RollerSession.ROLLER_SESSION)).thenReturn(rollerSession); + when(request.getUserPrincipal()).thenReturn(null); + + RollerSession result = RollerSession.getRollerSession(request); + + // Verify session was retrieved + assertNotNull(result); + // Verify returned session matches existing one + assertEquals(rollerSession, result); + } + + @Test + @Disabled("This test is disabled because it fails due to a bug in the RollerLoginSessionManager class.") + void testGetRollerSessionInvalidatedSession() throws Exception { + String username = "testuser"; + when(session.getAttribute(RollerSession.ROLLER_SESSION)).thenReturn(rollerSession); + when(request.getUserPrincipal()).thenReturn(principal); + when(principal.getName()).thenReturn(username); + when(userManager.getUserByUserName(username)).thenReturn(user); + rollerSession.setAuthenticatedUser(user); + sessionManager.invalidate(username); + + RollerSession result = RollerSession.getRollerSession(request); + + // Verify new session was created after invalidation + assertNotNull(result); + // Verify new session is different from invalidated one + assertNotEquals(rollerSession, result); + } + + @Test + void testSetAuthenticatedUser() throws Exception { + String username = "testuser"; + when(user.getUserName()).thenReturn(username); + + rollerSession.setAuthenticatedUser(user); + + // Verify session was registered in manager + assertNotNull(sessionManager.get(username)); + // Verify registered session matches current one + assertEquals(rollerSession, sessionManager.get(username)); + } + + @Test + void testGetAuthenticatedUser() throws Exception { + String username = "testuser"; + when(user.getUserName()).thenReturn(username); + when(userManager.getUserByUserName(username)).thenReturn(user); + + try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { + factory.when(WebloggerFactory::getWeblogger).thenReturn(roller); + + rollerSession.setAuthenticatedUser(user); + User result = rollerSession.getAuthenticatedUser(); + + // Verify authenticated user was retrieved + assertNotNull(result); + // Verify retrieved user matches original user + assertEquals(user, result); + } + } + + @Test + void testConcurrentSessionHandling() throws Exception { + String username = "testuser"; + when(user.getUserName()).thenReturn(username); + + RollerSession session1 = new RollerSession(); + RollerSession session2 = new RollerSession(); + + session1.setAuthenticatedUser(user); + session2.setAuthenticatedUser(user); + + // Verify most recent session is stored + assertEquals(session2, sessionManager.get(username)); + // Verify old session was replaced + assertNotEquals(session1, sessionManager.get(username)); + } + + @Test + @Disabled("This test is disabled because it fails due to a bug in the RollerLoginSessionManager class.") + void testSessionTimeoutBehavior() throws Exception { + String username = "testuser"; + when(user.getUserName()).thenReturn(username); + when(userManager.getUserByUserName(username)).thenReturn(user); + + try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { + factory.when(WebloggerFactory::getWeblogger).thenReturn(roller); + + rollerSession.setAuthenticatedUser(user); + sessionManager.invalidate(username); + + // Verify session was removed from manager + assertNull(sessionManager.get(username)); + // Verify user can no longer be retrieved + assertNull(rollerSession.getAuthenticatedUser()); + } + } +} \ No newline at end of file