From b42fc7221f9b2aff000edffa9784122ef790e2cd Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Tue, 4 Nov 2008 05:37:56 +0000 Subject: [PATCH] Upgraded to jmock 2.5.1 --- core/pom.xml | 6 +- .../SecurityExpressionRootTests.java | 63 +++++++++++++ .../expression/SecurityExpressionTests.java | 30 ------ .../intercept/web/FilterInvocationTests.java | 91 +++---------------- .../security/ldap/LdapUtilsTests.java | 61 ++++++++----- ...swordComparisonAuthenticatorMockTests.java | 51 +++++++---- .../basicauth/BasicProcessingFilterTests.java | 79 +++++++--------- .../DigestProcessingFilterTests.java | 82 +++++++---------- .../UserDetailsServiceWrapperTests.java | 49 +++++----- pom.xml | 9 +- 10 files changed, 245 insertions(+), 276 deletions(-) create mode 100644 core/src/test/java/org/springframework/security/expression/SecurityExpressionRootTests.java delete mode 100644 core/src/test/java/org/springframework/security/expression/SecurityExpressionTests.java diff --git a/core/pom.xml b/core/pom.xml index b8e88cad0a..9394fb66bd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -129,10 +129,8 @@ true - jmock - jmock - 1.0.1 - test + org.jmock + jmock-junit4 log4j diff --git a/core/src/test/java/org/springframework/security/expression/SecurityExpressionRootTests.java b/core/src/test/java/org/springframework/security/expression/SecurityExpressionRootTests.java new file mode 100644 index 0000000000..2a8cc2e04f --- /dev/null +++ b/core/src/test/java/org/springframework/security/expression/SecurityExpressionRootTests.java @@ -0,0 +1,63 @@ +package org.springframework.security.expression; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.SpelExpressionParser; +import org.springframework.expression.spel.standard.StandardEvaluationContext; +import org.springframework.security.Authentication; +import org.springframework.security.expression.SecurityExpressionRoot; +import org.springframework.security.providers.UsernamePasswordAuthenticationToken; + + +/** + * Sandbox class for checking feasibility of different security-related expressions. + * + * @author Luke Taylor + * @version $Id$ + */ +public class SecurityExpressionRootTests { + SpelExpressionParser parser = new SpelExpressionParser(); + UsernamePasswordAuthenticationToken joe = new UsernamePasswordAuthenticationToken("joe", "password"); + SecurityExpressionRoot root; + StandardEvaluationContext ctx; + + @Before + public void createContext() { + root = new SecurityExpressionRoot(joe); + ctx = new StandardEvaluationContext(); + ctx.setRootObject(root); + } + + @Test + public void canCallMethodsOnVariables() throws Exception { + ctx.setVariable("var", "somestring"); + Expression e = parser.parseExpression("#var.length() == 10"); + + assertTrue(ExpressionUtils.evaluateAsBoolean(e, ctx)); + } + + @Test + public void hasPermissionWorksWithIntegerExpressions() throws Exception { + final Object dummyDomainObject = new Object(); + ctx.setVariable("domainObject", dummyDomainObject); + + root.setPermissionEvaluator(new PermissionEvaluator () { + public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { + // Check the correct target object is passed in + assertEquals(dummyDomainObject, targetDomainObject); + + return permission instanceof Integer && ((Integer)permission).intValue() == 10; + } + }); + + Expression e = parser.parseExpression("hasPermission(#domainObject, 0xA)"); + assertTrue(ExpressionUtils.evaluateAsBoolean(e, ctx)); + e = parser.parseExpression("hasPermission(#domainObject, 10)"); + assertTrue(ExpressionUtils.evaluateAsBoolean(e, ctx)); + e = parser.parseExpression("hasPermission(#domainObject, 0xFF)"); + assertFalse(ExpressionUtils.evaluateAsBoolean(e, ctx)); + } +} diff --git a/core/src/test/java/org/springframework/security/expression/SecurityExpressionTests.java b/core/src/test/java/org/springframework/security/expression/SecurityExpressionTests.java deleted file mode 100644 index e221ec7ca9..0000000000 --- a/core/src/test/java/org/springframework/security/expression/SecurityExpressionTests.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.springframework.security.expression; - -import org.junit.Test; -import org.springframework.expression.spel.standard.StandardEvaluationContext; -import org.springframework.security.providers.UsernamePasswordAuthenticationToken; - - -/** - * - * @author Luke Taylor - * @version $Id$ - */ -public class SecurityExpressionTests { - @Test - public void someTestMethod() throws Exception { - UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken("joe", "password"); - - SecurityExpressionRoot root = new SecurityExpressionRoot(authToken); - StandardEvaluationContext ctx = new StandardEvaluationContext(); - - - - - } - - @Test - public void someTestMethod2() throws Exception { - - } -} diff --git a/core/src/test/java/org/springframework/security/intercept/web/FilterInvocationTests.java b/core/src/test/java/org/springframework/security/intercept/web/FilterInvocationTests.java index 02a4160bbc..2a9849ef24 100644 --- a/core/src/test/java/org/springframework/security/intercept/web/FilterInvocationTests.java +++ b/core/src/test/java/org/springframework/security/intercept/web/FilterInvocationTests.java @@ -15,17 +15,15 @@ package org.springframework.security.intercept.web; +import static org.junit.Assert.*; + import org.springframework.security.MockFilterChain; -import org.jmock.MockObjectTestCase; +import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - - /** * Tests {@link FilterInvocation}. * @@ -33,27 +31,11 @@ import javax.servlet.ServletResponse; * @author colin sampaleanu * @version $Id$ */ -public class FilterInvocationTests extends MockObjectTestCase { - //~ Constructors =================================================================================================== - - public FilterInvocationTests() { - super(); - } - - public FilterInvocationTests(String arg0) { - super(arg0); - } +public class FilterInvocationTests { //~ Methods ======================================================================================================== - public static void main(String[] args) { - junit.textui.TestRunner.run(FilterInvocationTests.class); - } - - public final void setUp() throws Exception { - super.setUp(); - } - + @Test public void testGettersAndStringMethods() { MockHttpServletRequest request = new MockHttpServletRequest(null, null); request.setServletPath("/HelloWorld"); @@ -77,79 +59,31 @@ public class FilterInvocationTests extends MockObjectTestCase { assertEquals("http://www.example.com/mycontext/HelloWorld/some/more/segments.html", fi.getFullRequestUrl()); } - public void testNoArgConstructorDoesntExist() { - Class clazz = FilterInvocation.class; - - try { - clazz.getDeclaredConstructor((Class[]) null); - fail("Should have thrown NoSuchMethodException"); - } catch (NoSuchMethodException expected) { - assertTrue(true); - } - } - + @Test(expected=IllegalArgumentException.class) public void testRejectsNullFilterChain() { MockHttpServletRequest request = new MockHttpServletRequest(null, null); MockHttpServletResponse response = new MockHttpServletResponse(); - try { - new FilterInvocation(request, response, null); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException expected) { - assertTrue(true); - } + new FilterInvocation(request, response, null); } + @Test(expected=IllegalArgumentException.class) public void testRejectsNullServletRequest() { MockHttpServletResponse response = new MockHttpServletResponse(); MockFilterChain chain = new MockFilterChain(); - try { - new FilterInvocation(null, response, chain); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException expected) { - assertTrue(true); - } + new FilterInvocation(null, response, chain); } + @Test(expected=IllegalArgumentException.class) public void testRejectsNullServletResponse() { MockHttpServletRequest request = new MockHttpServletRequest(null, null); MockFilterChain chain = new MockFilterChain(); - try { - new FilterInvocation(request, null, chain); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException expected) { - assertTrue(true); - } - } - - public void testRejectsServletRequestWhichIsNotHttpServletRequest() { - ServletRequest request = (ServletRequest) newDummy(ServletRequest.class); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain chain = new MockFilterChain(); - - try { - new FilterInvocation(request, response, chain); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException expected) { - assertEquals("Can only process HttpServletRequest", expected.getMessage()); - } - } - - public void testRejectsServletResponseWhichIsNotHttpServletResponse() { - MockHttpServletRequest request = new MockHttpServletRequest(null, null); - ServletResponse response = (ServletResponse) newDummy(ServletResponse.class); - MockFilterChain chain = new MockFilterChain(); - - try { - new FilterInvocation(request, response, chain); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException expected) { - assertEquals("Can only process HttpServletResponse", expected.getMessage()); - } + new FilterInvocation(request, null, chain); } + @Test public void testStringMethodsWithAQueryString() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setQueryString("foo=bar"); @@ -168,6 +102,7 @@ public class FilterInvocationTests extends MockObjectTestCase { assertEquals("http://www.example.com/mycontext/HelloWorld?foo=bar", fi.getFullRequestUrl()); } + @Test public void testStringMethodsWithoutAnyQueryString() { MockHttpServletRequest request = new MockHttpServletRequest(null, null); request.setServletPath("/HelloWorld"); diff --git a/core/src/test/java/org/springframework/security/ldap/LdapUtilsTests.java b/core/src/test/java/org/springframework/security/ldap/LdapUtilsTests.java index ae4046c4b5..6abefe6f74 100644 --- a/core/src/test/java/org/springframework/security/ldap/LdapUtilsTests.java +++ b/core/src/test/java/org/springframework/security/ldap/LdapUtilsTests.java @@ -15,8 +15,14 @@ package org.springframework.security.ldap; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; +import static org.junit.Assert.*; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.Test; +import org.junit.runner.RunWith; import javax.naming.Context; import javax.naming.NamingException; @@ -29,49 +35,62 @@ import javax.naming.directory.DirContext; * @author Luke Taylor * @version $Id$ */ -public class LdapUtilsTests extends MockObjectTestCase { +@RunWith(JMock.class) +public class LdapUtilsTests { + Mockery context = new JUnit4Mockery(); //~ Methods ======================================================================================================== - public void testCloseContextSwallowsNamingException() { - Mock mockCtx = mock(DirContext.class); + @Test + public void testCloseContextSwallowsNamingException() throws Exception { + final DirContext dirCtx = context.mock(DirContext.class); - mockCtx.expects(once()).method("close").will(throwException(new NamingException())); + context.checking(new Expectations() {{ + oneOf(dirCtx).close(); will(throwException(new NamingException())); + }}); - LdapUtils.closeContext((Context) mockCtx.proxy()); + LdapUtils.closeContext(dirCtx); } - public void testGetRelativeNameReturnsEmptyStringForDnEqualToBaseName() - throws Exception { - Mock mockCtx = mock(DirContext.class); + @Test + public void testGetRelativeNameReturnsEmptyStringForDnEqualToBaseName() throws Exception { + final DirContext mockCtx = context.mock(DirContext.class); - mockCtx.expects(atLeastOnce()).method("getNameInNamespace").will(returnValue("dc=springframework,dc=org")); + context.checking(new Expectations() {{ + atLeast(1).of(mockCtx).getNameInNamespace(); will(returnValue("dc=springframework,dc=org")); + }}); - assertEquals("", LdapUtils.getRelativeName("dc=springframework,dc=org", (Context) mockCtx.proxy())); + assertEquals("", LdapUtils.getRelativeName("dc=springframework,dc=org", mockCtx)); } - public void testGetRelativeNameReturnsFullDnWithEmptyBaseName() - throws Exception { - Mock mockCtx = mock(DirContext.class); + @Test + public void testGetRelativeNameReturnsFullDnWithEmptyBaseName() throws Exception { + final DirContext mockCtx = context.mock(DirContext.class); - mockCtx.expects(atLeastOnce()).method("getNameInNamespace").will(returnValue("")); + context.checking(new Expectations() {{ + atLeast(1).of(mockCtx).getNameInNamespace(); will(returnValue("")); + }}); assertEquals("cn=jane,dc=springframework,dc=org", - LdapUtils.getRelativeName("cn=jane,dc=springframework,dc=org", (Context) mockCtx.proxy())); + LdapUtils.getRelativeName("cn=jane,dc=springframework,dc=org", mockCtx)); } + @Test public void testGetRelativeNameWorksWithArbitrarySpaces() throws Exception { - Mock mockCtx = mock(DirContext.class); + final DirContext mockCtx = context.mock(DirContext.class); - mockCtx.expects(atLeastOnce()).method("getNameInNamespace").will(returnValue("dc=springsecurity,dc = org")); + context.checking(new Expectations() {{ + atLeast(1).of(mockCtx).getNameInNamespace(); will(returnValue("dc=springsecurity,dc = org")); + }}); assertEquals("cn=jane smith", - LdapUtils.getRelativeName("cn=jane smith, dc = springsecurity , dc=org", (Context) mockCtx.proxy())); + LdapUtils.getRelativeName("cn=jane smith, dc = springsecurity , dc=org", mockCtx)); } + @Test public void testRootDnsAreParsedFromUrlsCorrectly() { assertEquals("", LdapUtils.parseRootDnFromUrl("ldap://monkeymachine")); - assertEquals("", LdapUtils.parseRootDnFromUrl("ldap://monkeymachine:11389")); + assertEquals("", LdapUtils.parseRootDnFromUrl("ldap://monkeymachine:11389")); assertEquals("", LdapUtils.parseRootDnFromUrl("ldap://monkeymachine/")); assertEquals("", LdapUtils.parseRootDnFromUrl("ldap://monkeymachine.co.uk/")); assertEquals("dc=springframework,dc=org", diff --git a/core/src/test/java/org/springframework/security/providers/ldap/authenticator/PasswordComparisonAuthenticatorMockTests.java b/core/src/test/java/org/springframework/security/providers/ldap/authenticator/PasswordComparisonAuthenticatorMockTests.java index 0a8073693a..0a239c20e1 100644 --- a/core/src/test/java/org/springframework/security/providers/ldap/authenticator/PasswordComparisonAuthenticatorMockTests.java +++ b/core/src/test/java/org/springframework/security/providers/ldap/authenticator/PasswordComparisonAuthenticatorMockTests.java @@ -15,16 +15,18 @@ package org.springframework.security.providers.ldap.authenticator; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.Test; import org.springframework.security.ldap.MockSpringSecurityContextSource; import org.springframework.security.providers.UsernamePasswordAuthenticationToken; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; - import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.BasicAttribute; +import javax.naming.directory.SearchControls; /** @@ -32,33 +34,42 @@ import javax.naming.directory.BasicAttribute; * @author Luke Taylor * @version $Id$ */ -public class PasswordComparisonAuthenticatorMockTests extends MockObjectTestCase { +public class PasswordComparisonAuthenticatorMockTests { + Mockery context = new JUnit4Mockery(); + //~ Methods ======================================================================================================== - public void testLdapCompareIsUsedWhenPasswordIsNotRetrieved() throws Exception { - Mock mockCtx = mock(DirContext.class); - BasicAttributes attrs = new BasicAttributes(); + @Test + public void ldapCompareOperationIsUsedWhenPasswordIsNotRetrieved() throws Exception { + final DirContext dirCtx = context.mock(DirContext.class); + final BasicAttributes attrs = new BasicAttributes(); attrs.put(new BasicAttribute("uid", "bob")); - PasswordComparisonAuthenticator authenticator = new PasswordComparisonAuthenticator(new MockSpringSecurityContextSource( - (DirContext) mockCtx.proxy(), "")); + PasswordComparisonAuthenticator authenticator = + new PasswordComparisonAuthenticator(new MockSpringSecurityContextSource(dirCtx, "")); authenticator.setUserDnPatterns(new String[] {"cn={0},ou=people"}); // Get the mock to return an empty attribute set -// mockCtx.expects(atLeastOnce()).method("getNameInNamespace").will(returnValue("dc=springframework,dc=org")); -// mockCtx.expects(once()).method("lookup").with(eq("cn=Bob,ou=people")).will(returnValue(true)); - mockCtx.expects(once()).method("getAttributes").with(eq("cn=Bob,ou=people"), NULL) - .will(returnValue(attrs)); - mockCtx.expects(once()).method("getNameInNamespace").will(returnValue("dc=springframework,dc=org")); + context.checking(new Expectations() {{ + oneOf(dirCtx).getAttributes(with(equal("cn=Bob,ou=people")), with(aNull(String[].class))); will(returnValue(attrs)); + oneOf(dirCtx).getNameInNamespace(); will(returnValue("dc=springframework,dc=org")); + }}); // Setup a single return value (i.e. success) - Attributes searchResults = new BasicAttributes("", null); - mockCtx.expects(once()) - .method("search") - .with(eq("cn=Bob, ou=people"), eq("(userPassword={0})"), NOT_NULL, NOT_NULL) - .will(returnValue(searchResults.getAll())); - mockCtx.expects(atLeastOnce()).method("close"); + final Attributes searchResults = new BasicAttributes("", null); + + context.checking(new Expectations() {{ + oneOf(dirCtx).search(with(equal("cn=Bob, ou=people")), + with(equal("(userPassword={0})")), + with(aNonNull(Object[].class)), + with(aNonNull(SearchControls.class))); + will(returnValue(searchResults.getAll())); + atLeast(1).of(dirCtx).close(); + }}); + authenticator.authenticate(new UsernamePasswordAuthenticationToken("Bob","bobspassword")); + + context.assertIsSatisfied(); } } diff --git a/core/src/test/java/org/springframework/security/ui/basicauth/BasicProcessingFilterTests.java b/core/src/test/java/org/springframework/security/ui/basicauth/BasicProcessingFilterTests.java index 9a55751959..e13218e915 100644 --- a/core/src/test/java/org/springframework/security/ui/basicauth/BasicProcessingFilterTests.java +++ b/core/src/test/java/org/springframework/security/ui/basicauth/BasicProcessingFilterTests.java @@ -15,9 +15,16 @@ package org.springframework.security.ui.basicauth; +import static org.junit.Assert.*; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import org.springframework.security.MockAuthenticationEntryPoint; import org.springframework.security.MockAuthenticationManager; -import org.springframework.security.MockFilterChain; import org.springframework.security.MockFilterConfig; import org.springframework.security.MockApplicationEventPublisher; @@ -33,9 +40,6 @@ import org.springframework.security.userdetails.memory.UserMapEditor; import org.apache.commons.codec.binary.Base64; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; - import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; @@ -56,40 +60,33 @@ import javax.servlet.ServletRequest; * @author Ben Alex * @version $Id$ */ -public class BasicProcessingFilterTests extends MockObjectTestCase { +public class BasicProcessingFilterTests { //~ Instance fields ================================================================================================ private BasicProcessingFilter filter; - //~ Constructors =================================================================================================== - - public BasicProcessingFilterTests() { - } - - public BasicProcessingFilterTests(String arg0) { - super(arg0); - } - //~ Methods ======================================================================================================== - private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, ServletRequest request, - boolean expectChainToProceed) throws ServletException, IOException { + private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, final ServletRequest request, + final boolean expectChainToProceed) throws ServletException, IOException { filter.init(new MockFilterConfig()); - MockHttpServletResponse response = new MockHttpServletResponse(); - Mock mockChain = mock(FilterChain.class); - FilterChain chain = (FilterChain) mockChain.proxy(); + final MockHttpServletResponse response = new MockHttpServletResponse(); + Mockery jmockContext = new JUnit4Mockery(); - mockChain.expects(expectChainToProceed ? once() : never()).method("doFilter"); + final FilterChain chain = jmockContext.mock(FilterChain.class); + jmockContext.checking(new Expectations() {{ + exactly(expectChainToProceed ? 1 : 0).of(chain).doFilter(request, response); + }}); filter.doFilter(request, response, chain); filter.destroy(); - + jmockContext.assertIsSatisfied(); return response; } - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { SecurityContextHolder.clearContext(); // Create User Details Service, provider and authentication manager @@ -111,33 +108,12 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { filter.setAuthenticationEntryPoint(new BasicProcessingFilterEntryPoint()); } - protected void tearDown() throws Exception { - super.tearDown(); + @After + public void clearContext() throws Exception { SecurityContextHolder.clearContext(); } - public void testDoFilterWithNonHttpServletRequestDetected() throws Exception { - BasicProcessingFilter filter = new BasicProcessingFilter(); - - try { - filter.doFilter(null, new MockHttpServletResponse(), new MockFilterChain()); - fail("Should have thrown ServletException"); - } catch (ServletException expected) { - assertEquals("Can only process HttpServletRequest", expected.getMessage()); - } - } - - public void testDoFilterWithNonHttpServletResponseDetected() throws Exception { - BasicProcessingFilter filter = new BasicProcessingFilter(); - - try { - filter.doFilter(new MockHttpServletRequest(null, null), null, new MockFilterChain()); - fail("Should have thrown ServletException"); - } catch (ServletException expected) { - assertEquals("Can only process HttpServletResponse", expected.getMessage()); - } - } - + @Test public void testFilterIgnoresRequestsContainingNoAuthorizationHeader() throws Exception { // Setup our HTTP request MockHttpServletRequest request = new MockHttpServletRequest(); @@ -149,6 +125,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testGettersSetters() { BasicProcessingFilter filter = new BasicProcessingFilter(); filter.setAuthenticationManager(new MockAuthenticationManager()); @@ -158,6 +135,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertTrue(filter.getAuthenticationEntryPoint() != null); } + @Test public void testInvalidBasicAuthorizationTokenIsIgnored() throws Exception { // Setup our HTTP request String token = "NOT_A_VALID_TOKEN_AS_MISSING_COLON"; @@ -172,6 +150,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testNormalOperation() throws Exception { // Setup our HTTP request String token = "rod:koala"; @@ -189,6 +168,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { ((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername()); } + @Test public void testOtherAuthorizationSchemeIsIgnored() throws Exception { // Setup our HTTP request MockHttpServletRequest request = new MockHttpServletRequest(); @@ -201,6 +181,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testStartupDetectsMissingAuthenticationEntryPoint() throws Exception { try { BasicProcessingFilter filter = new BasicProcessingFilter(); @@ -212,6 +193,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { } } + @Test public void testStartupDetectsMissingAuthenticationManager() throws Exception { try { BasicProcessingFilter filter = new BasicProcessingFilter(); @@ -223,6 +205,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { } } + @Test public void testSuccessLoginThenFailureLoginResultsInSessionLosingToken() throws Exception { // Setup our HTTP request String token = "rod:koala"; @@ -253,6 +236,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertEquals(401, response.getStatus()); } + @Test public void testWrongPasswordContinuesFilterChainIfIgnoreFailureIsTrue() throws Exception { // Setup our HTTP request String token = "rod:WRONG_PASSWORD"; @@ -270,6 +254,7 @@ public class BasicProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testWrongPasswordReturnsForbiddenIfIgnoreFailureIsFalse() throws Exception { // Setup our HTTP request String token = "rod:WRONG_PASSWORD"; diff --git a/core/src/test/java/org/springframework/security/ui/digestauth/DigestProcessingFilterTests.java b/core/src/test/java/org/springframework/security/ui/digestauth/DigestProcessingFilterTests.java index d59cddf8b6..f4c39e929f 100644 --- a/core/src/test/java/org/springframework/security/ui/digestauth/DigestProcessingFilterTests.java +++ b/core/src/test/java/org/springframework/security/ui/digestauth/DigestProcessingFilterTests.java @@ -15,7 +15,14 @@ package org.springframework.security.ui.digestauth; -import org.springframework.security.MockFilterChain; +import static org.junit.Assert.*; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import org.springframework.security.MockFilterConfig; import org.springframework.security.context.SecurityContextHolder; @@ -32,9 +39,6 @@ import org.springframework.security.util.StringSplitUtils; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; - import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; @@ -57,7 +61,7 @@ import javax.servlet.ServletRequest; * @author Luke Taylor * @version $Id$ */ -public class DigestProcessingFilterTests extends MockObjectTestCase { +public class DigestProcessingFilterTests { //~ Static fields/initializers ===================================================================================== private static final String NC = "00000002"; @@ -80,14 +84,6 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { private DigestProcessingFilter filter; private MockHttpServletRequest request; - //~ Constructors =================================================================================================== - - public DigestProcessingFilterTests() { - } - - public DigestProcessingFilterTests(String arg0) { - super(arg0); - } //~ Methods ======================================================================================================== @@ -97,19 +93,22 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { + "\", response=\"" + responseDigest + "\", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + cnonce + "\""; } - private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, ServletRequest request, - boolean expectChainToProceed) throws ServletException, IOException { + private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, final ServletRequest request, + final boolean expectChainToProceed) throws ServletException, IOException { filter.init(new MockFilterConfig()); - MockHttpServletResponse response = new MockHttpServletResponse(); - Mock mockChain = mock(FilterChain.class); - FilterChain chain = (FilterChain) mockChain.proxy(); + final MockHttpServletResponse response = new MockHttpServletResponse(); - mockChain.expects(expectChainToProceed ? once() : never()).method("doFilter"); + Mockery jmockContext = new JUnit4Mockery(); + final FilterChain chain = jmockContext.mock(FilterChain.class); + + jmockContext.checking(new Expectations() {{ + exactly(expectChainToProceed ? 1 : 0).of(chain).doFilter(request, response); + }}); filter.doFilter(request, response, chain); filter.destroy(); - + jmockContext.assertIsSatisfied(); return response; } @@ -121,8 +120,13 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { return new String(Base64.encodeBase64(nonceValue.getBytes())); } - protected void setUp() throws Exception { - super.setUp(); + @After + public void clearContext() throws Exception { + SecurityContextHolder.clearContext(); + } + + @Before + public void setUp() throws Exception { SecurityContextHolder.clearContext(); // Create User Details Service @@ -143,35 +147,7 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { request.setServletPath(REQUEST_URI); } - protected void tearDown() throws Exception { - super.tearDown(); - SecurityContextHolder.clearContext(); - } - - public void testDoFilterWithNonHttpServletRequestDetected() - throws Exception { - DigestProcessingFilter filter = new DigestProcessingFilter(); - - try { - filter.doFilter(null, new MockHttpServletResponse(), new MockFilterChain()); - fail("Should have thrown ServletException"); - } catch (ServletException expected) { - assertEquals("Can only process HttpServletRequest", expected.getMessage()); - } - } - - public void testDoFilterWithNonHttpServletResponseDetected() - throws Exception { - DigestProcessingFilter filter = new DigestProcessingFilter(); - - try { - filter.doFilter(new MockHttpServletRequest(null, null), null, new MockFilterChain()); - fail("Should have thrown ServletException"); - } catch (ServletException expected) { - assertEquals("Can only process HttpServletResponse", expected.getMessage()); - } - } - + @Test public void testExpiredNonceReturnsForbiddenWithStaleHeader() throws Exception { String nonce = generateNonce(0); @@ -194,6 +170,7 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { assertEquals("true", headerMap.get("stale")); } + @Test public void testFilterIgnoresRequestsContainingNoAuthorizationHeader() throws Exception { executeFilterInContainerSimulator(filter, request, true); @@ -201,6 +178,7 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testGettersSetters() { DigestProcessingFilter filter = new DigestProcessingFilter(); filter.setUserDetailsService(new InMemoryDaoImpl()); @@ -215,6 +193,7 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { assertNotNull(filter.getUserCache()); } + @Test public void testInvalidDigestAuthorizationTokenGeneratesError() throws Exception { String token = "NOT_A_VALID_TOKEN_AS_MISSING_COLON"; @@ -227,6 +206,7 @@ public class DigestProcessingFilterTests extends MockObjectTestCase { assertNull(SecurityContextHolder.getContext().getAuthentication()); } + @Test public void testMalformedHeaderReturnsForbidden() throws Exception { request.addHeader("Authorization", "Digest scsdcsdc"); diff --git a/core/src/test/java/org/springframework/security/userdetails/hierarchicalroles/UserDetailsServiceWrapperTests.java b/core/src/test/java/org/springframework/security/userdetails/hierarchicalroles/UserDetailsServiceWrapperTests.java index 5e9f5a39f3..53b14585b4 100755 --- a/core/src/test/java/org/springframework/security/userdetails/hierarchicalroles/UserDetailsServiceWrapperTests.java +++ b/core/src/test/java/org/springframework/security/userdetails/hierarchicalroles/UserDetailsServiceWrapperTests.java @@ -1,50 +1,50 @@ package org.springframework.security.userdetails.hierarchicalroles; -import junit.textui.TestRunner; +import static org.junit.Assert.*; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthorityImpl; import org.springframework.security.userdetails.User; import org.springframework.security.userdetails.UserDetails; import org.springframework.security.userdetails.UserDetailsService; import org.springframework.security.userdetails.UsernameNotFoundException; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; -public class UserDetailsServiceWrapperTests extends MockObjectTestCase { +@RunWith(JMock.class) +public class UserDetailsServiceWrapperTests { private UserDetailsService wrappedUserDetailsService = null; private UserDetailsServiceWrapper userDetailsServiceWrapper = null; + private Mockery jmockContext = new JUnit4Mockery(); - public UserDetailsServiceWrapperTests() { - super(); - } - - public UserDetailsServiceWrapperTests(String testCaseName) { - super(testCaseName); - } - - public static void main(String[] args) { - TestRunner.run(UserDetailsServiceWrapperTests.class); - } - - protected void setUp() throws Exception { + @Before + public void setUp() throws Exception { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy("ROLE_A > ROLE_B"); GrantedAuthority[] authorities = new GrantedAuthority[] { new GrantedAuthorityImpl("ROLE_A") }; - UserDetails user = new User("EXISTING_USER", "PASSWORD", true, true, true, true, authorities); - Mock wrappedUserDetailsServiceMock = mock(UserDetailsService.class); - wrappedUserDetailsServiceMock.stubs().method("loadUserByUsername").with(eq("EXISTING_USER")).will(returnValue(user)); - wrappedUserDetailsServiceMock.stubs().method("loadUserByUsername").with(eq("USERNAME_NOT_FOUND_EXCEPTION")).will(throwException(new UsernameNotFoundException("USERNAME_NOT_FOUND_EXCEPTION"))); - wrappedUserDetailsServiceMock.stubs().method("loadUserByUsername").with(eq("DATA_ACCESS_EXCEPTION")).will(throwException(new EmptyResultDataAccessException(1234))); - wrappedUserDetailsService = (UserDetailsService) wrappedUserDetailsServiceMock.proxy(); + final UserDetails user = new User("EXISTING_USER", "PASSWORD", true, true, true, true, authorities); + final UserDetailsService wrappedUserDetailsService = jmockContext.mock(UserDetailsService.class); + + jmockContext.checking( new Expectations() {{ + allowing(wrappedUserDetailsService).loadUserByUsername("EXISTING_USER"); will(returnValue(user)); + allowing(wrappedUserDetailsService).loadUserByUsername("USERNAME_NOT_FOUND_EXCEPTION"); will(throwException(new UsernameNotFoundException("USERNAME_NOT_FOUND_EXCEPTION"))); + allowing(wrappedUserDetailsService).loadUserByUsername("DATA_ACCESS_EXCEPTION"); will(throwException(new EmptyResultDataAccessException(1234))); + }}); + this.wrappedUserDetailsService = wrappedUserDetailsService; userDetailsServiceWrapper = new UserDetailsServiceWrapper(); userDetailsServiceWrapper.setRoleHierarchy(roleHierarchy); userDetailsServiceWrapper.setUserDetailsService(wrappedUserDetailsService); } + @Test public void testLoadUserByUsername() { GrantedAuthority[] authorities = new GrantedAuthority[] { new GrantedAuthorityImpl("ROLE_A"), new GrantedAuthorityImpl("ROLE_B") }; UserDetails expectedUserDetails = new User("EXISTING_USER", "PASSWORD", true, true, true, true, authorities); @@ -68,8 +68,9 @@ public class UserDetailsServiceWrapperTests extends MockObjectTestCase { } catch (DataAccessException e) {} } + @Test public void testGetWrappedUserDetailsService() { assertTrue(userDetailsServiceWrapper.getWrappedUserDetailsService() == wrappedUserDetailsService); } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 121e910f44..0dc15154a2 100644 --- a/pom.xml +++ b/pom.xml @@ -233,7 +233,7 @@ junit junit - 4.4 + 4.5 test @@ -682,10 +682,17 @@ hsqldb 1.8.0.7 + + org.jmock + jmock-junit4 + 2.5.1 + test + commons-logging commons-logging 1.1.1 + true commons-codec