Updated Branches:
  refs/heads/wicket-1.5.x 8b32c3d62 -> 0c7903420

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/0c790342
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0c790342
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0c790342

Branch: refs/heads/wicket-1.5.x
Commit: 0c790342081abedc3677c3a5bd258664ebb96f88
Parents: 8b32c3d
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 17:54:20 2012 +0200

----------------------------------------------------------------------
 .../wicket/util/tester/BaseWicketTester.java       |   84 +++++++++----
 .../apache/wicket/util/tester/WicketTester.java    |   17 ++-
 .../wicket/util/tester/WicketTesterTest.java       |   96 ++++++++++++---
 3 files changed, 152 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0c790342/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 3ee10e2..2ab8058 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
@@ -16,8 +16,7 @@
  */
 package org.apache.wicket.util.tester;
 
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.fail;
+import static junit.framework.Assert.*;
 
 import java.io.IOException;
 import java.io.Serializable;
@@ -33,7 +32,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import javax.servlet.FilterConfig;
@@ -662,6 +660,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);
@@ -708,6 +714,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.
@@ -1266,10 +1301,10 @@ public class BaseWicketTester
         * Process a component. A web page will be automatically created with 
the markup created in
         * {@link #createPageMarkup(String)}.
         * <p>
-        *     <strong>Note</strong>: the instantiated component will have an 
auto-generated id. To
-        *     reach any of its children use their relative path to the 
component itself. For example
-        *     if the started component has a child a Link component with id 
"link" then after starting
-        *     the component you can click it with: 
<code>tester.clickLink("link")</code>
+        * <strong>Note</strong>: the instantiated component will have an 
auto-generated id. To reach
+        * any of its children use their relative path to the component itself. 
For example if the
+        * started component has a child a Link component with id "link" then 
after starting the
+        * component you can click it with: 
<code>tester.clickLink("link")</code>
         * </p>
         * 
         * @param <C>
@@ -1289,10 +1324,10 @@ public class BaseWicketTester
         * provided. In case pageMarkup is null, the markup will be 
automatically created with
         * {@link #createPageMarkup(String)}.
         * <p>
-        *     <strong>Note</strong>: the instantiated component will have an 
auto-generated id. To
-        *     reach any of its children use their relative path to the 
component itself. For example
-        *     if the started component has a child a Link component with id 
"link" then after starting
-        *     the component you can click it with: 
<code>tester.clickLink("link")</code>
+        * <strong>Note</strong>: the instantiated component will have an 
auto-generated id. To reach
+        * any of its children use their relative path to the component itself. 
For example if the
+        * started component has a child a Link component with id "link" then 
after starting the
+        * component you can click it with: 
<code>tester.clickLink("link")</code>
         * </p>
         * 
         * @param <C>
@@ -1322,7 +1357,8 @@ public class BaseWicketTester
                catch (Exception e)
                {
                        log.error(e.getMessage(), e);
-                       fail(String.format("Cannot instantiate component with 
type '%s' because of '%s'", componentClass.getName(), e.getMessage()));
+                       fail(String.format("Cannot instantiate component with 
type '%s' because of '%s'",
+                               componentClass.getName(), e.getMessage()));
                }
 
                // process the component
@@ -1333,10 +1369,10 @@ public class BaseWicketTester
         * Process a component. A web page will be automatically created with 
markup created by the
         * {@link #createPageMarkup(String)}.
         * <p>
-        *     <strong>Note</strong>: the component id is set by the user. To
-        *     reach any of its children use this id + their relative path to 
the component itself. For example
-        *     if the started component has id <em>compId</em> and a Link child 
component component with id "link"
-        *     then after starting the component you can click it with: 
<code>tester.clickLink("compId:link")</code>
+        * <strong>Note</strong>: the component id is set by the user. To reach 
any of its children use
+        * this id + their relative path to the component itself. For example 
if the started component
+        * has id <em>compId</em> and a Link child component component with id 
"link" then after
+        * starting the component you can click it with: 
<code>tester.clickLink("compId:link")</code>
         * </p>
         * 
         * @param <C>
@@ -1356,10 +1392,10 @@ public class BaseWicketTester
         * provided. In case {@code pageMarkup} is null, the markup will be 
automatically created with
         * {@link #createPageMarkup(String)}.
         * <p>
-        *     <strong>Note</strong>: the component id is set by the user. To
-        *     reach any of its children use this id + their relative path to 
the component itself. For example
-        *     if the started component has id <em>compId</em> and a Link child 
component component with id "link"
-        *     then after starting the component you can click it with: 
<code>tester.clickLink("compId:link")</code>
+        * <strong>Note</strong>: the component id is set by the user. To reach 
any of its children use
+        * this id + their relative path to the component itself. For example 
if the started component
+        * has id <em>compId</em> and a Link child component component with id 
"link" then after
+        * starting the component you can click it with: 
<code>tester.clickLink("compId:link")</code>
         * </p>
         * 
         * @param <C>
@@ -1546,7 +1582,7 @@ public class BaseWicketTester
                        String componentIdPageId = 
componentInPage.component.getId() + ':';
                        if (path.startsWith(componentIdPageId) == false)
                        {
-                               path =  componentIdPageId + path;
+                               path = componentIdPageId + path;
                        }
                }
 
@@ -2129,8 +2165,8 @@ public class BaseWicketTester
 
        /**
         * Tests that a <code>Component</code> has been added to a 
<code>AjaxRequestTarget</code>, using
-        * {@link AjaxRequestTarget#add(org.apache.wicket.Component...)}. This 
method actually tests that a
-        * <code>Component</code> is on the Ajax response sent back to the 
client.
+        * {@link AjaxRequestTarget#add(org.apache.wicket.Component...)}. This 
method actually tests
+        * that a <code>Component</code> is on the Ajax response sent back to 
the client.
         * <p>
         * PLEASE NOTE! This method doesn't actually insert the 
<code>Component</code> in the client DOM
         * tree, using JavaScript. But it shouldn't be needed because you have 
to trust that the Wicket
@@ -2215,7 +2251,7 @@ public class BaseWicketTester
         * Simulates the firing of all ajax timer behaviors on the page
         * 
         * @param page
-        *      the page which timers will be executed
+        *            the page which timers will be executed
         */
        public void executeAllTimerBehaviors(final MarkupContainer page)
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/0c790342/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 01c70b8..c4098de 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;
@@ -733,6 +730,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/0c790342/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 729ed9f..f3657e0 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
@@ -53,6 +53,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.request.flow.RedirectToUrlException;
 import org.apache.wicket.request.handler.BookmarkablePageRequestHandler;
 import org.apache.wicket.request.handler.IPageProvider;
 import org.apache.wicket.request.handler.PageProvider;
@@ -450,7 +451,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void assertComponentOnAjaxResponse()
@@ -684,7 +685,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void submittingFormWithAjaxEventSubmitsFormValues()
@@ -701,7 +702,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void redirectWithPageParameters()
@@ -832,7 +833,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);
        }
 
@@ -842,21 +844,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());
        }
 
        /**
@@ -895,7 +899,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundWhenAddedToRequest()
@@ -905,7 +909,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundWhenAddedToResponse()
@@ -917,7 +921,7 @@ public class WicketTesterTest extends WicketTestCase
        }
 
        /**
-        * 
+        *
         */
        @Test
        public void cookieIsFoundOnNextRequestWhenAddedToResponse()
@@ -1152,7 +1156,7 @@ public class WicketTesterTest extends WicketTestCase
 
        /**
         * https://issues.apache.org/jira/browse/WICKET-4437
-        *
+        * 
         * Clicking on ResourceLink should deliver the resource content
         */
        @Test
@@ -1160,7 +1164,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);
@@ -1171,9 +1176,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()
@@ -1193,4 +1198,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