浏览代码

Refactoring to reduce code duplication, remove config files and use JMock to enforce expectations on whether FilterChain proceeds or not.

Luke Taylor 19 年之前
父节点
当前提交
d7ae1ad21b

+ 12 - 11
core/src/main/java/org/acegisecurity/ui/digestauth/DigestProcessingFilter.java

@@ -404,20 +404,21 @@ public class DigestProcessingFilter implements Filter, InitializingBean,
      * <code>response</code> independently. Provided as a static method to
      * simplify the coding of user agents.
      *
-     * @param passwordAlreadyEncoded DOCUMENT ME!
-     * @param username DOCUMENT ME!
-     * @param realm DOCUMENT ME!
-     * @param password DOCUMENT ME!
-     * @param httpMethod DOCUMENT ME!
-     * @param uri DOCUMENT ME!
-     * @param qop DOCUMENT ME!
-     * @param nonce DOCUMENT ME!
-     * @param nc DOCUMENT ME!
-     * @param cnonce DOCUMENT ME!
+     * @param passwordAlreadyEncoded true if the password argument is already encoded in
+     *                               the correct format. False if it is plain text.
+     * @param username the user's login name.
+     * @param realm the name of the realm.
+     * @param password the user's password in plaintext or ready-encoded.
+     * @param httpMethod the HTTP request method (GET, POST etc.)
+     * @param uri the request URI.
+     * @param qop the qop directive, or null if not set.
+     * @param nonce the nonce supplied by the server
+     * @param nc the "nonce-count" as defined in RFC 2617.
+     * @param cnonce opaque string supplied by the client when qop is set.
      *
      * @return the MD5 of the digest authentication response, encoded in hex
      *
-     * @throws IllegalArgumentException DOCUMENT ME!
+     * @throws IllegalArgumentException if the supplied qop value is unsupported.
      */
     public static String generateDigest(boolean passwordAlreadyEncoded,
         String username, String realm, String password, String httpMethod,

+ 72 - 141
core/src/test/java/org/acegisecurity/ui/basicauth/BasicProcessingFilterTests.java

@@ -15,32 +15,37 @@
 
 package org.acegisecurity.ui.basicauth;
 
-import junit.framework.TestCase;
-
 import org.acegisecurity.MockAuthenticationEntryPoint;
 import org.acegisecurity.MockAuthenticationManager;
 import org.acegisecurity.MockFilterConfig;
+import org.acegisecurity.MockFilterChain;
+import org.acegisecurity.providers.dao.DaoAuthenticationProvider;
+import org.acegisecurity.providers.ProviderManager;
 import org.acegisecurity.context.SecurityContextHolder;
 import org.acegisecurity.context.SecurityContextImpl;
 import org.acegisecurity.userdetails.UserDetails;
+import org.acegisecurity.userdetails.memory.InMemoryDaoImpl;
+import org.acegisecurity.userdetails.memory.UserMapEditor;
+import org.acegisecurity.userdetails.memory.UserMap;
 
 import org.apache.commons.codec.binary.Base64;
 
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationEvent;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.mock.web.MockHttpSession;
 
+import org.jmock.MockObjectTestCase;
+import org.jmock.Mock;
+
 import java.io.IOException;
+import java.util.Arrays;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 
 
 /**
@@ -49,7 +54,8 @@ import javax.servlet.ServletResponse;
  * @author Ben Alex
  * @version $Id$
  */
-public class BasicProcessingFilterTests extends TestCase {
+public class BasicProcessingFilterTests extends MockObjectTestCase {
+    private BasicProcessingFilter filter;
     //~ Constructors ===========================================================
 
     public BasicProcessingFilterTests() {
@@ -66,6 +72,34 @@ public class BasicProcessingFilterTests extends TestCase {
         junit.textui.TestRunner.run(BasicProcessingFilterTests.class);
     }
 
+    protected void setUp() throws Exception {
+        super.setUp();
+        SecurityContextHolder.setContext(new SecurityContextImpl());
+
+        // Create User Details Service, provider and authentication manager
+        InMemoryDaoImpl dao = new InMemoryDaoImpl();
+        UserMapEditor editor = new UserMapEditor();
+        editor.setAsText("marissa=koala,ROLE_ONE,ROLE_TWO,enabled\r\n");
+        dao.setUserMap((UserMap)editor.getValue());
+
+        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
+        provider.setUserDetailsService(dao);
+
+        ProviderManager manager = new ProviderManager();
+        manager.setProviders(Arrays.asList(new Object[] {provider}));
+        manager.setApplicationEventPublisher(new MockApplicationEventPublisher());
+        manager.afterPropertiesSet();
+
+        filter = new BasicProcessingFilter();
+        filter.setAuthenticationManager(manager);
+        filter.setAuthenticationEntryPoint(new BasicProcessingFilterEntryPoint());
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        SecurityContextHolder.setContext(new SecurityContextImpl());
+    }
+
     public void testDoFilterWithNonHttpServletRequestDetected()
         throws Exception {
         BasicProcessingFilter filter = new BasicProcessingFilter();
@@ -100,22 +134,8 @@ public class BasicProcessingFilterTests extends TestCase {
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setServletPath("/some_file.html");
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
         // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
@@ -140,22 +160,8 @@ public class BasicProcessingFilterTests extends TestCase {
         request.setServletPath("/some_file.html");
         request.setSession(new MockHttpSession());
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        // The filter chain shouldn't proceed
+        executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
@@ -169,23 +175,9 @@ public class BasicProcessingFilterTests extends TestCase {
         request.setServletPath("/some_file.html");
         request.setSession(new MockHttpSession());
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
         // Test
         assertNull(SecurityContextHolder.getContext().getAuthentication());
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNotNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals("marissa",
@@ -200,22 +192,8 @@ public class BasicProcessingFilterTests extends TestCase {
         request.addHeader("Authorization", "SOME_OTHER_AUTHENTICATION_SCHEME");
         request.setServletPath("/some_file.html");
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
         // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
@@ -237,8 +215,8 @@ public class BasicProcessingFilterTests extends TestCase {
         throws Exception {
         try {
             BasicProcessingFilter filter = new BasicProcessingFilter();
-            filter.setAuthenticationEntryPoint(new MockAuthenticationEntryPoint(
-                    "x"));
+            filter.setAuthenticationEntryPoint(
+                    new MockAuthenticationEntryPoint("x"));
             filter.afterPropertiesSet();
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -257,22 +235,8 @@ public class BasicProcessingFilterTests extends TestCase {
         request.setServletPath("/some_file.html");
         request.setSession(new MockHttpSession());
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
         // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNotNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals("marissa",
@@ -288,13 +252,9 @@ public class BasicProcessingFilterTests extends TestCase {
         request.setServletPath("/some_file.html");
         request.setSession(new MockHttpSession());
 
-        // Setup our expectation that the filter chain will not be invoked, as we get a 403 forbidden response
-        chain = new MockFilterChain(false);
-        response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        // Test - the filter chain will not be invoked, as we get a 403 forbidden response
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -309,65 +269,36 @@ public class BasicProcessingFilterTests extends TestCase {
         request.setServletPath("/some_file.html");
         request.setSession(new MockHttpSession());
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/basicauth/filtertest-valid.xml");
-        BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean(
-                "basicProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will not be invoked, as we get a 403 forbidden response
-        MockFilterChain chain = new MockFilterChain(false);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        // Test - the filter chain will not be invoked, as we get a 403 forbidden response
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
     }
 
-    protected void setUp() throws Exception {
-        super.setUp();
-        SecurityContextHolder.setContext(new SecurityContextImpl());
-    }
+    private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter,
+            ServletRequest request, boolean expectChainToProceed)
+            throws ServletException, IOException {
+        filter.init(new MockFilterConfig());
+        MockHttpServletResponse response = new MockHttpServletResponse();
+        Mock mockChain = mock(FilterChain.class);
+        FilterChain chain = (FilterChain)mockChain.proxy();
 
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SecurityContextHolder.setContext(new SecurityContextImpl());
-    }
+        mockChain.expects( expectChainToProceed ? once() : never() ).method("doFilter");
 
-    private void executeFilterInContainerSimulator(FilterConfig filterConfig,
-        Filter filter, ServletRequest request, ServletResponse response,
-        FilterChain filterChain) throws ServletException, IOException {
-        filter.init(filterConfig);
-        filter.doFilter(request, response, filterChain);
+        filter.doFilter(request, response, chain);
         filter.destroy();
-    }
 
-    //~ Inner Classes ==========================================================
+        return response;
+    }
 
-    private class MockFilterChain implements FilterChain {
-        private boolean expectToProceed;
+    private class MockApplicationEventPublisher implements ApplicationEventPublisher {
 
-        public MockFilterChain(boolean expectToProceed) {
-            this.expectToProceed = expectToProceed;
-        }
+		public MockApplicationEventPublisher() {
+		}
 
-        private MockFilterChain() {
-            super();
-        }
-
-        public void doFilter(ServletRequest request, ServletResponse response)
-            throws IOException, ServletException {
-            if (expectToProceed) {
-                assertTrue(true);
-            } else {
-                fail("Did not expect filter chain to proceed");
-            }
-        }
+    	public void publishEvent(ApplicationEvent event) {
+		}
     }
 }

+ 161 - 562
core/src/test/java/org/acegisecurity/ui/digestauth/DigestProcessingFilterTests.java

@@ -15,56 +15,63 @@
 
 package org.acegisecurity.ui.digestauth;
 
-import junit.framework.TestCase;
-
-import org.acegisecurity.DisabledException;
 import org.acegisecurity.MockFilterConfig;
-
+import org.acegisecurity.MockFilterChain;
 import org.acegisecurity.context.SecurityContextHolder;
 import org.acegisecurity.context.SecurityContextImpl;
-
-import org.acegisecurity.providers.dao.UserCache;
-
-import org.acegisecurity.userdetails.UserDetailsService;
+import org.acegisecurity.providers.dao.cache.NullUserCache;
 import org.acegisecurity.userdetails.UserDetails;
-import org.acegisecurity.userdetails.UsernameNotFoundException;
+import org.acegisecurity.userdetails.memory.InMemoryDaoImpl;
+import org.acegisecurity.userdetails.memory.UserMapEditor;
+import org.acegisecurity.userdetails.memory.UserMap;
 import org.acegisecurity.util.StringSplitUtils;
 
 import org.apache.commons.codec.binary.Base64;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-import org.springframework.dao.DataAccessException;
+import org.apache.commons.codec.digest.DigestUtils;
 
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
-
 import org.springframework.util.StringUtils;
 
-import java.io.IOException;
+import org.jmock.MockObjectTestCase;
+import org.jmock.Mock;
 
+import java.io.IOException;
 import java.util.Map;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
 
 /**
  * Tests {@link DigestProcessingFilter}.
  *
  * @author Ben Alex
+ * @author Luke Taylor
  * @version $Id$
  */
-public class DigestProcessingFilterTests extends TestCase {
+public class DigestProcessingFilterTests extends MockObjectTestCase {
+    private static final String NC = "00000002";
+    private static final String CNONCE = "c822c727a648aba7";
+    private static final String REALM = "The Correct Realm Name";
+    private static final String KEY = "acegi";
+    private static final String QOP = "auth";
+    private static final String USERNAME = "marissa";
+    private static final String PASSWORD = "koala";
+    private static final String REQUEST_URI = "/some_file.html";
+    /** A standard valid nonce with a validity period of 60 seconds */
+    private static final String NONCE = generateNonce(60);
+
+
+    //~ Instance Fields ========================================================
+//    private ApplicationContext ctx;
+    private DigestProcessingFilter filter;
+    private MockHttpServletRequest request;
+
     //~ Constructors ===========================================================
 
     public DigestProcessingFilterTests() {
-        super();
     }
 
     public DigestProcessingFilterTests(String arg0) {
@@ -77,6 +84,32 @@ public class DigestProcessingFilterTests extends TestCase {
         junit.textui.TestRunner.run(DigestProcessingFilterTests.class);
     }
 
+    protected void setUp() throws Exception {
+        super.setUp();
+        SecurityContextHolder.setContext(new SecurityContextImpl());
+        // Create User Details Service
+        InMemoryDaoImpl dao = new InMemoryDaoImpl();
+        UserMapEditor editor = new UserMapEditor();
+        editor.setAsText("marissa=koala,ROLE_ONE,ROLE_TWO,enabled\r\n");
+        dao.setUserMap((UserMap)editor.getValue());
+
+        DigestProcessingFilterEntryPoint ep = new DigestProcessingFilterEntryPoint();
+        ep.setRealmName(REALM);
+        ep.setKey(KEY);
+
+        filter = new DigestProcessingFilter();
+        filter.setUserDetailsService(dao);
+        filter.setAuthenticationEntryPoint(ep);
+
+        request = new MockHttpServletRequest("GET", REQUEST_URI);
+        request.setServletPath(REQUEST_URI);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        SecurityContextHolder.setContext(new SecurityContextImpl());
+    }
+
     public void testDoFilterWithNonHttpServletRequestDetected()
         throws Exception {
         DigestProcessingFilter filter = new DigestProcessingFilter();
@@ -107,43 +140,18 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testExpiredNonceReturnsForbiddenWithStaleHeader()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(0);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
+
+        String nonce = generateNonce(0);
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
+            createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
         Thread.sleep(1000); // ensures token expired
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -158,33 +166,15 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testFilterIgnoresRequestsContainingNoAuthorizationHeader()
         throws Exception {
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
 
     public void testGettersSetters() {
         DigestProcessingFilter filter = new DigestProcessingFilter();
-        filter.setUserDetailsService(new MockAuthenticationDao());
+        filter.setUserDetailsService(new InMemoryDaoImpl());
         assertTrue(filter.getUserDetailsService() != null);
 
         filter.setAuthenticationEntryPoint(new DigestProcessingFilterEntryPoint());
@@ -192,63 +182,29 @@ public class DigestProcessingFilterTests extends TestCase {
 
         filter.setUserCache(null);
         assertNull(filter.getUserCache());
-        filter.setUserCache(new MockUserCache());
+        filter.setUserCache(new NullUserCache());
         assertNotNull(filter.getUserCache());
     }
 
     public void testInvalidDigestAuthorizationTokenGeneratesError()
         throws Exception {
-        // Setup our HTTP request
         String token = "NOT_A_VALID_TOKEN_AS_MISSING_COLON";
 
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization",
             "Digest " + new String(Base64.encodeBase64(token.getBytes())));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(false);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
         assertEquals(401, response.getStatus());
-
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
 
     public void testMalformedHeaderReturnsForbidden() throws Exception {
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization", "Digest scsdcsdc");
-        request.setServletPath("/some_file.html");
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -256,42 +212,17 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testNonBase64EncodedNonceReturnsForbidden()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
         String nonce = "NOT_BASE_64_ENCODED";
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
+
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
+            createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -299,43 +230,18 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testNonceWithIncorrectSignatureForNumericFieldReturnsForbidden()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
 
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
         String nonce = new String(Base64.encodeBase64(
                     "123456:incorrectStringPassword".getBytes()));
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(false);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+            createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -343,43 +249,18 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testNonceWithNonNumericFirstElementReturnsForbidden()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
 
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
         String nonce = new String(Base64.encodeBase64(
                     "hello:ignoredSecondElement".getBytes()));
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
+            createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -387,43 +268,18 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testNonceWithoutTwoColonSeparatedElementsReturnsForbidden()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
 
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
         String nonce = new String(Base64.encodeBase64(
                     "a base 64 string without a colon".getBytes()));
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
+            createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+            executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
@@ -431,118 +287,48 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testNormalOperationWhenPasswordIsAlreadyEncoded()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = DigestProcessingFilter.encodePasswordInA1Format(username,
-                realm, "koala");
+
+        String encodedPassword = DigestProcessingFilter.encodePasswordInA1Format(USERNAME,
+                REALM, PASSWORD);
         String responseDigest = DigestProcessingFilter.generateDigest(true,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, encodedPassword, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNotNull(SecurityContextHolder.getContext().getAuthentication());
-        assertEquals("marissa",
+        assertEquals(USERNAME,
             ((UserDetails) SecurityContextHolder.getContext().getAuthentication()
                                                 .getPrincipal()).getUsername());
     }
 
     public void testNormalOperationWhenPasswordNotAlreadyEncoded()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
+
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNotNull(SecurityContextHolder.getContext().getAuthentication());
-        assertEquals("marissa",
+        assertEquals(USERNAME,
             ((UserDetails) SecurityContextHolder.getContext().getAuthentication()
                                                 .getPrincipal()).getUsername());
     }
 
     public void testOtherAuthorizationSchemeIsIgnored()
         throws Exception {
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest();
-        request.addHeader("Authorization", "SOME_OTHER_AUTHENTICATION_SCHEME");
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+        request.addHeader("Authorization", "SOME_OTHER_AUTHENTICATION_SCHEME");
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
     }
@@ -564,7 +350,7 @@ public class DigestProcessingFilterTests extends TestCase {
         throws Exception {
         try {
             DigestProcessingFilter filter = new DigestProcessingFilter();
-            filter.setUserDetailsService(new MockAuthenticationDao());
+            filter.setUserDetailsService(new InMemoryDaoImpl());
             filter.afterPropertiesSet();
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -573,58 +359,30 @@ public class DigestProcessingFilterTests extends TestCase {
         }
     }
 
-    public void testSuccessLoginThenFailureLoginResultsInSessionLoosingToken()
+    public void testSuccessLoginThenFailureLoginResultsInSessionLosingToken()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
+
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        executeFilterInContainerSimulator(filter, request, true);
 
         assertNotNull(SecurityContextHolder.getContext().getAuthentication());
 
         // Now retry, giving an invalid nonce
-        password = "WRONG_PASSWORD";
-        responseDigest = DigestProcessingFilter.generateDigest(false, username,
-                realm, password, "GET", uri, qop, nonce, nc, cnonce);
+        responseDigest = DigestProcessingFilter.generateDigest(false, USERNAME,
+                REALM, "WRONG_PASSWORD", "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE);
 
         request = new MockHttpServletRequest();
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
+        MockHttpServletResponse response =
+                executeFilterInContainerSimulator(filter, request, false);
 
         // Check we lost our previous authentication
         assertNull(SecurityContextHolder.getContext().getAuthentication());
@@ -633,263 +391,104 @@ public class DigestProcessingFilterTests extends TestCase {
 
     public void testWrongCnonceBasedOnDigestReturnsForbidden()
         throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
+
         String cnonce = "NOT_SAME_AS_USED_FOR_DIGEST_COMPUTATION";
-        String password = "koala";
+
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc,
+                USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC,
                 "DIFFERENT_CNONCE");
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, cnonce));
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+                executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
     }
 
     public void testWrongDigestReturnsForbidden() throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
+
         String password = "WRONG_PASSWORD";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, REALM, password, "GET", REQUEST_URI, QOP, NONCE, NC,
+                CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+                executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
     }
 
     public void testWrongRealmReturnsForbidden() throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "marissa";
         String realm = "WRONG_REALM";
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                USERNAME, realm, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC,
+                CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
+            createAuthorizationHeader(USERNAME, realm, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
-
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+             executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
     }
 
     public void testWrongUsernameReturnsForbidden() throws Exception {
-        Map responseHeaderMap = generateValidHeaders(60);
-
-        String username = "NOT_A_KNOWN_USER";
-        String realm = (String) responseHeaderMap.get("realm");
-        String nonce = (String) responseHeaderMap.get("nonce");
-        String uri = "/some_file.html";
-        String qop = (String) responseHeaderMap.get("qop");
-        String nc = "00000002";
-        String cnonce = "c822c727a648aba7";
-        String password = "koala";
         String responseDigest = DigestProcessingFilter.generateDigest(false,
-                username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
+                "NOT_A_KNOWN_USER", REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC,
+                CNONCE);
 
-        // Setup our HTTP request
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
         request.addHeader("Authorization",
-            createAuthorizationHeader(username, realm, nonce, uri,
-                responseDigest, qop, nc, cnonce));
-        request.setServletPath("/some_file.html");
-
-        // Launch an application context and access our bean
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean(
-                "digestProcessingFilter");
-
-        // Setup our filter configuration
-        MockFilterConfig config = new MockFilterConfig();
-
-        // Setup our expectation that the filter chain will be invoked
-        MockFilterChain chain = new MockFilterChain(true);
-        MockHttpServletResponse response = new MockHttpServletResponse();
+            createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI,
+                responseDigest, QOP, NC, CNONCE));
 
-        // Test
-        executeFilterInContainerSimulator(config, filter, request, response,
-            chain);
+        MockHttpServletResponse response =
+                executeFilterInContainerSimulator(filter, request, false);
 
         assertNull(SecurityContextHolder.getContext().getAuthentication());
         assertEquals(401, response.getStatus());
     }
 
-    protected void setUp() throws Exception {
-        super.setUp();
-        SecurityContextHolder.setContext(new SecurityContextImpl());
-    }
-
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SecurityContextHolder.setContext(new SecurityContextImpl());
-    }
-
     private String createAuthorizationHeader(String username, String realm,
-        String nonce, String uri, String responseDigest, String qop, String nc,
-        String cnonce) {
+                                             String nonce, String uri, String responseDigest, String qop, String nc,
+                                             String cnonce) {
         return "Digest username=\"" + username + "\", realm=\"" + realm
         + "\", nonce=\"" + nonce + "\", uri=\"" + uri + "\", response=\""
         + responseDigest + "\", qop=" + qop + ", nc=" + nc + ", cnonce=\""
         + cnonce + "\"";
     }
 
-    private void executeFilterInContainerSimulator(FilterConfig filterConfig,
-        Filter filter, ServletRequest request, ServletResponse response,
-        FilterChain filterChain) throws ServletException, IOException {
-        filter.init(filterConfig);
-        filter.doFilter(request, response, filterChain);
-        filter.destroy();
-    }
-
-    private Map generateValidHeaders(int nonceValidityPeriod)
-        throws Exception {
-        ApplicationContext ctx = new ClassPathXmlApplicationContext(
-                "org/acegisecurity/ui/digestauth/filtertest-valid.xml");
-        DigestProcessingFilterEntryPoint ep = (DigestProcessingFilterEntryPoint) ctx
-            .getBean("digestProcessingFilterEntryPoint");
-        ep.setNonceValiditySeconds(nonceValidityPeriod);
-
-        MockHttpServletRequest request = new MockHttpServletRequest();
-        request.setRequestURI("/some_path");
-
+    private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter,
+            ServletRequest request, boolean expectChainToProceed)
+            throws ServletException, IOException {
+        filter.init(new MockFilterConfig());
         MockHttpServletResponse response = new MockHttpServletResponse();
+        Mock mockChain = mock(FilterChain.class);
+        FilterChain chain = (FilterChain)mockChain.proxy();
 
-        ep.commence(request, response, new DisabledException("foobar"));
-
-        // Break up response header
-        String header = response.getHeader("WWW-Authenticate").toString()
-                                .substring(7);
-        String[] headerEntries = StringUtils.commaDelimitedListToStringArray(header);
-        Map headerMap = StringSplitUtils.splitEachArrayElementAndCreateMap(headerEntries,
-                "=", "\"");
-
-        return headerMap;
-    }
-
-    //~ Inner Classes ==========================================================
-
-    private class MockAuthenticationDao implements UserDetailsService {
-        public UserDetails loadUserByUsername(String username)
-            throws UsernameNotFoundException, DataAccessException {
-            return null;
-        }
-    }
-
-    private class MockFilterChain implements FilterChain {
-        private boolean expectToProceed;
+        mockChain.expects( expectChainToProceed ? once() : never() ).method("doFilter");
 
-        public MockFilterChain(boolean expectToProceed) {
-            this.expectToProceed = expectToProceed;
-        }
-
-        private MockFilterChain() {
-            super();
-        }
+        filter.doFilter(request, response, chain);
+        filter.destroy();
 
-        public void doFilter(ServletRequest request, ServletResponse response)
-            throws IOException, ServletException {
-            if (expectToProceed) {
-                assertTrue(true);
-            } else {
-                fail("Did not expect filter chain to proceed");
-            }
-        }
+        return response;
     }
 
-    private class MockUserCache implements UserCache {
-        public UserDetails getUserFromCache(String username) {
-            return null;
-        }
-
-        public void putUserInCache(UserDetails user) {}
-
-        public void removeUserFromCache(String username) {}
+    private static String generateNonce(int validitySeconds) {
+        long expiryTime = System.currentTimeMillis() + (validitySeconds * 1000);
+        String signatureValue = new String(DigestUtils.md5Hex(expiryTime + ":" + KEY));
+        String nonceValue = expiryTime + ":" + signatureValue;
+        return new String(Base64.encodeBase64( nonceValue.getBytes() ));
     }
 }

+ 0 - 59
core/src/test/resources/org/acegisecurity/ui/basicauth/filtertest-valid.xml

@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<!--
- * Copyright 2004 Acegi Technology Pty Limited
- *
- * Licensed 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.
- *
- *
- * $Id$
--->
-
-<beans>
-
-	<!-- Data access object which stores authentication information -->
-	<bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
-  		<property name="userMap">
-			<value>
-				marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR
-				dianne=emu,ROLE_TELLER
-				scott=wombat,ROLE_TELLER
-				peter=opal,disabled,ROLE_TELLER
-			</value>
-		</property>
-	</bean>
-	
-	<!-- Authentication provider that queries our data access object  -->
-	<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
-     	<property name="userDetailsService"><ref bean="inMemoryDaoImpl"/></property>
-	</bean>
-
-	<!-- The authentication manager that iterates through our only authentication provider -->
-	<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
-		<property name="providers">
-		  <list>
-		    <ref bean="daoAuthenticationProvider"/>
-		  </list>
-		</property>
-	</bean>
-
-	<bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
-		<property name="authenticationManager"><ref bean="authenticationManager"/></property>
-		<property name="authenticationEntryPoint"><ref bean="basicProcessingFilterEntryPoint"/></property>
-	</bean>
-
-	<bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
-		<property name="realmName"><value>Test Suite Realm</value></property>
-	</bean>
-
-</beans>

+ 0 - 61
core/src/test/resources/org/acegisecurity/ui/digestauth/filtertest-valid.xml

@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<!--
- * Copyright 2004 Acegi Technology Pty Limited
- *
- * Licensed 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.
- *
- *
- * $Id$
--->
-
-<beans>
-
-	<!-- Data access object which stores authentication information -->
-	<bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
-  		<property name="userMap">
-			<value>
-				marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR
-				dianne=emu,ROLE_TELLER
-				scott=wombat,ROLE_TELLER
-				peter=opal,disabled,ROLE_TELLER
-			</value>
-		</property>
-	</bean>
-	
-	<!-- Authentication provider that queries our data access object  -->
-	<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
-     	<property name="userDetailsService"><ref bean="inMemoryDaoImpl"/></property>
-	</bean>
-
-	<!-- The authentication manager that iterates through our only authentication provider -->
-	<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
-		<property name="providers">
-		  <list>
-		    <ref bean="daoAuthenticationProvider"/>
-		  </list>
-		</property>
-	</bean>
-
-   <bean id="digestProcessingFilter" class="org.acegisecurity.ui.digestauth.DigestProcessingFilter">
-      <property name="userDetailsService"><ref local="inMemoryDaoImpl"/></property>
-      <property name="authenticationEntryPoint"><ref local="digestProcessingFilterEntryPoint"/></property>
-   </bean>
-
-   <bean id="digestProcessingFilterEntryPoint" class="org.acegisecurity.ui.digestauth.DigestProcessingFilterEntryPoint">
-      <property name="realmName"><value>Contacts Realm via Digest Authentication</value></property>
-      <property name="key"><value>acegi</value></property>
-      <property name="nonceValiditySeconds"><value>1000</value></property>
-   </bean>
-
-</beans>