Updated Branches:
  refs/heads/master 06a726a84 -> f4834654f

WICKET-4558 WicketTester shouldn't fail on external redirects


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f4834654
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4834654
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4834654

Branch: refs/heads/master
Commit: f4834654f80547aa40c7e5dd8593cf0ad6a676c4
Parents: 06a726a
Author: Carl-Eric Menzel <[email protected]>
Authored: Mon May 14 17:54:20 2012 +0200
Committer: Carl-Eric Menzel <[email protected]>
Committed: Mon May 14 18:15:32 2012 +0200

----------------------------------------------------------------------
 .../wicket/util/tester/BaseWicketTester.java       |   87 +++++++++----
 .../apache/wicket/util/tester/WicketTester.java    |   17 ++-
 .../wicket/util/tester/WicketTesterTest.java       |  103 ++++++++++++---
 3 files changed, 157 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/f4834654/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 1506180..5bed90a 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -41,6 +41,7 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpSession;
 
 import junit.framework.AssertionFailedError;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IPageManagerProvider;
@@ -183,7 +184,6 @@ public class BaseWicketTester
        private IRequestHandler forcedHandler;
 
        private IFeedbackMessageFilter originalFeedbackMessageCleanupFilter;
-
        // Simulates the cookies maintained by the browser
        private final List<Cookie> browserCookies = Generics.newArrayList();
 
@@ -302,7 +302,6 @@ public class BaseWicketTester
                        .getFeedbackMessageCleanupFilter();
                
application.getApplicationSettings().setFeedbackMessageCleanupFilter(
                        IFeedbackMessageFilter.NONE);
-
                IPageManagerProvider pageManagerProvider = 
newTestPageManagerProvider();
                if (pageManagerProvider != null)
                {
@@ -351,8 +350,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private void setupNextRequestCycle()
        {
                request = new MockHttpServletRequest(application, httpSession, 
servletContext);
@@ -455,12 +454,13 @@ public class BaseWicketTester
        private ServletWebRequest newServletWebRequest()
        {
 
+
                return (ServletWebRequest)application.newWebRequest(request, 
request.getFilterPrefix());
        }
 
        /**
-     *
-     */
+        *
+        */
        private void newSession()
        {
                ThreadContext.setSession(null);
@@ -656,6 +656,14 @@ public class BaseWicketTester
                                Url newUrl = 
Url.parse(lastResponse.getRedirectLocation(),
                                        
Charset.forName(request.getCharacterEncoding()));
 
+                               if (isExternalRedirect(lastRequest.getUrl(), 
newUrl))
+                               {
+                                       // we can't handle external redirects 
here
+                                       // just bail out here and let the 
user's test code
+                                       // check #assertRedirectUrl
+                                       return true;
+                               }
+
                                if (newUrl.isAbsolute())
                                {
                                        request.setUrl(newUrl);
@@ -702,6 +710,35 @@ public class BaseWicketTester
        }
 
        /**
+        * Determine whether a given response contains a redirect leading to an 
external site (which
+        * cannot be replicated in WicketTester). This is done by comparing the 
previous request's
+        * hostname with the hostname given in the redirect.
+        * 
+        * @param requestUrl
+        *            request...
+        * @param newUrl
+        *            ...and the redirect generated in its response
+        * @return true if there is a redirect and it is external, false 
otherwise
+        */
+       private boolean isExternalRedirect(Url requestUrl, Url newUrl)
+       {
+               String originalHost = requestUrl.getHost();
+               String redirectHost = newUrl.getHost();
+               if (originalHost == redirectHost)
+               {
+                       return false; // identical or both null
+               }
+               else if (redirectHost == null)
+               {
+                       return false; // no new host
+               }
+               else
+               {
+                       return !(redirectHost.equals(originalHost));
+               }
+       }
+
+       /**
         * Allows to set Request header value any time. They'll be applied 
(add/modify) on process
         * execution {@link #processRequest(MockHttpServletRequest, 
IRequestHandler, boolean)}. They are
         * reset immediately after and thus are not re-used for a sequence of 
requests.
@@ -726,8 +763,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private void recordRequestResponse()
        {
                lastRequest = request;
@@ -1986,7 +2023,6 @@ public class BaseWicketTester
         */
        public List<Serializable> getMessages(final int level)
        {
-
                List<FeedbackMessage> allMessages = new 
FeedbackCollector(getLastRenderedPage()).collect(new IFeedbackMessageFilter()
                {
 
@@ -1996,6 +2032,7 @@ public class BaseWicketTester
                                return message.getLevel() == level;
                        }
                });
+
                List<Serializable> actualMessages = Generics.newArrayList();
                for (FeedbackMessage message : allMessages)
                {
@@ -2542,8 +2579,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private class LastPageRecordingPageRendererProvider implements 
IPageRendererProvider
        {
                private final IPageRendererProvider delegate;
@@ -2571,8 +2608,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private class TestExceptionMapper implements IExceptionMapper
        {
                private final IExceptionMapper delegate;
@@ -2604,8 +2641,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private class TestRequestCycleProvider implements IRequestCycleProvider
        {
                private final IRequestCycleProvider delegate;
@@ -2626,8 +2663,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private class TestRequestMapper implements IRequestMapper
        {
                private final IRequestMapper delegate;
@@ -2666,12 +2703,12 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
 
        /**
-     *
-     */
+        *
+        */
        private static class TestPageManagerProvider implements 
IPageManagerProvider
        {
                @Override
@@ -2682,8 +2719,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private class TestFilterConfig implements FilterConfig
        {
                private final Map<String, String> initParameters = new 
HashMap<String, String>();
@@ -2719,8 +2756,8 @@ public class BaseWicketTester
        }
 
        /**
-     *
-     */
+        *
+        */
        private static class WicketTesterServletWebResponse extends 
ServletWebResponse
                implements
                        IMetaDataBufferingWebResponse

http://git-wip-us.apache.org/repos/asf/wicket/blob/f4834654/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
index 17eb055..a10eef8 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/WicketTester.java
@@ -16,10 +16,7 @@
  */
 package org.apache.wicket.util.tester;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
+import static junit.framework.Assert.*;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -724,6 +721,18 @@ public class WicketTester extends BaseWicketTester
        }
 
        /**
+        * Assert that the last request redirected to the given Url.
+        * 
+        * @param expectedRedirectUrl
+        *            expected
+        */
+       public void assertRedirectUrl(String expectedRedirectUrl)
+       {
+               String actualRedirectUrl = 
getLastResponse().getRedirectLocation();
+               assertEquals(expectedRedirectUrl, actualRedirectUrl);
+       }
+
+       /**
         * Returns the current Maven build directory taken from the 
<tt>basedir</tt> system property, or
         * null if not set
         * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/f4834654/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java 
b/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
index 71a63e2..6ea6bfd 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
@@ -37,6 +37,9 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authorization.Action;
 import org.apache.wicket.authorization.IAuthorizationStrategy;
+import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
+import org.apache.wicket.core.request.handler.IPageProvider;
+import org.apache.wicket.core.request.handler.PageProvider;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
@@ -52,9 +55,7 @@ import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.component.IRequestableComponent;
-import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
-import org.apache.wicket.core.request.handler.IPageProvider;
-import org.apache.wicket.core.request.handler.PageProvider;
+import org.apache.wicket.request.flow.RedirectToUrlException;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ByteArrayResource;
 import 
org.apache.wicket.request.resource.PackageResource.PackageResourceBlockedException;
@@ -449,7 +450,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void assertComponentOnAjaxResponse()
@@ -686,7 +687,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void submittingFormWithAjaxEventSubmitsFormValues()
@@ -703,7 +704,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void redirectWithPageParameters()
@@ -834,7 +835,8 @@ public class WicketTesterTest extends WicketTestCase
        @Test(expected = PackageResourceBlockedException.class)
        public void loadPageMarkupTemplate()
        {
-               String url = 
"wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/"+BlockedResourceLinkPage.class.getSimpleName()+".html";
+               String url = "wicket/resource/" + 
BlockedResourceLinkPage.class.getName() + "/" +
+                       BlockedResourceLinkPage.class.getSimpleName() + ".html";
                tester.executeUrl(url);
        }
 
@@ -844,21 +846,23 @@ public class WicketTesterTest extends WicketTestCase
        @Test
        public void loadNonPageMarkupTemplate()
        {
-               String url = 
"wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/test.html";
+               String url = "wicket/resource/" + 
BlockedResourceLinkPage.class.getName() + "/test.html";
                tester.executeUrl(url);
                assertEquals("This is a test!\n", 
tester.getLastResponseAsString());
        }
 
        /**
-        * Comma separated extensions should not be allowed.
-        * The result is kinda error code 404 (resource not found)
+        * Comma separated extensions should not be allowed. The result is 
kinda error code 404
+        * (resource not found)
         */
        @Test
        public void clickResourceLinkWithSomeCommaAppendedUrl()
        {
-               String url = 
"wicket/resource/"+BlockedResourceLinkPage.class.getName()+"/"+BlockedResourceLinkPage.class.getSimpleName()+".html,xml";
+               String url = "wicket/resource/" + 
BlockedResourceLinkPage.class.getName() + "/" +
+                       BlockedResourceLinkPage.class.getSimpleName() + 
".html,xml";
                tester.executeUrl(url);
-               assertNull("Comma separated extensions are not supported and 
wont find any resource", tester.getLastResponse());
+               assertNull("Comma separated extensions are not supported and 
wont find any resource",
+                       tester.getLastResponse());
        }
 
        /**
@@ -897,7 +901,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundWhenAddedToRequest()
@@ -907,7 +911,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundWhenAddedToResponse()
@@ -919,7 +923,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundOnNextRequestWhenAddedToResponse()
@@ -1121,7 +1125,6 @@ public class WicketTesterTest extends WicketTestCase
                assertNull(tester.getRequest().getCookies());
        }
 
-
        /**
         * Tests if the access-denied-page is rendered if a page is rerendered 
for which you don't have
         * permission anymore
@@ -1164,7 +1167,7 @@ public class WicketTesterTest extends WicketTestCase
 
        /**
         * https://issues.apache.org/jira/browse/WICKET-4437
-        *
+        * 
         * Clicking on ResourceLink should deliver the resource content
         */
        @Test
@@ -1172,7 +1175,8 @@ public class WicketTesterTest extends WicketTestCase
        {
                MockPageWithLink page = new MockPageWithLink();
                String content = "content";
-               ByteArrayResource resource = new 
ByteArrayResource("text/plain", content.getBytes(), "fileName.txt");
+               ByteArrayResource resource = new 
ByteArrayResource("text/plain", content.getBytes(),
+                       "fileName.txt");
                ResourceLink<Void> link = new 
ResourceLink<Void>(MockPageWithLink.LINK_ID, resource);
                page.add(link);
                tester.startPage(page);
@@ -1183,9 +1187,9 @@ public class WicketTesterTest extends WicketTestCase
 
        /**
         * https://issues.apache.org/jira/browse/WICKET-4507
-        *
-        * When WicketTester#startComponentInPage() is used then 
#getLastResponseAsString()
-        * should return only the component's markup, without the autogenerated 
markup for the page
+        * 
+        * When WicketTester#startComponentInPage() is used then 
#getLastResponseAsString() should
+        * return only the component's markup, without the autogenerated markup 
for the page
         */
        @Test
        public void renderOnlyComponentsMarkup()
@@ -1205,4 +1209,61 @@ public class WicketTesterTest extends WicketTestCase
                assertEquals("<span wicket:id=\"label\" 
test=\"123\">content</span>",
                        tester.getLastResponseAsString());
        }
+
+       @Test
+       public void catchExternalRedirect() throws Exception
+       {
+               class RedirectPage extends WebPage
+               {
+                       @Override
+                       protected void onConfigure()
+                       {
+                               throw new RedirectToUrlException(
+                                       
"https://issues.apache.org/jira/browse/WICKET-4558";);
+                       }
+               }
+               tester.startPage(new RedirectPage());
+               
tester.assertRedirectUrl("https://issues.apache.org/jira/browse/WICKET-4558";);
+       }
+
+       @Test
+       public void catchExternalRedirectFailure() throws Exception
+       {
+               class RedirectPage extends WebPage
+               {
+                       @Override
+                       protected void onConfigure()
+                       {
+                               throw new 
RedirectToUrlException("http://some.url/";);
+                       }
+               }
+               tester.startPage(new RedirectPage());
+               boolean caught;
+               try
+               {
+                       tester.assertRedirectUrl("http://this.did.not.happen";);
+                       caught = false;
+               }
+               catch (AssertionFailedError e)
+               {
+                       caught = true;
+               }
+               assertTrue(caught);
+       }
+
+       @Test
+       public void dontCatchInternalRedirect() throws Exception
+       {
+               class RedirectPage extends WebPage
+               {
+                       @Override
+                       protected void onConfigure()
+                       {
+                               throw new 
RedirectToUrlException("wicket/bookmarkable/" +
+                                       CreateBook.class.getName());
+                       }
+               }
+               tester.startPage(new RedirectPage());
+               tester.assertRenderedPage(CreateBook.class);
+       }
 }

Reply via email to