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); + } }
