Author: pete
Date: Sat Jun 25 02:24:38 2011
New Revision: 1139481

URL: http://svn.apache.org/viewvc?rev=1139481&view=rev
Log:
WICKET-3834 WicketTester does not follow absolute redirects

Added:
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
      - copied, changed from r1139475, 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
    wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
    
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
 Sat Jun 25 02:24:38 2011
@@ -598,15 +598,31 @@ public class BaseWicketTester
 
                                if (newUrl.isAbsolute())
                                {
-                                       fail("Can not follow absolute redirect 
URL.");
+                                       request.setUrl(newUrl);
+
+                                       if (newUrl.getProtocol() != null)
+                                       {
+                                               
request.setScheme(newUrl.getProtocol());
+                                       }
+                                       if (newUrl.getHost() != null)
+                                       {
+                                               
request.setServerName(newUrl.getHost());
+                                       }
+                                       if (newUrl.getPort() != null)
+                                       {
+                                               
request.setServerPort(newUrl.getPort());
+                                       }
                                }
+                               else
+                               {
+                                       // append redirect URL to current URL 
(what browser would do)
+                                       Url mergedURL = new 
Url(lastRequest.getUrl().getSegments(),
+                                           newUrl.getQueryParameters());
+                                       
mergedURL.concatSegments(newUrl.getSegments());
 
-                               // append redirect URL to current URL (what 
browser would do)
-                               Url mergedURL = new 
Url(lastRequest.getUrl().getSegments(),
-                                       newUrl.getQueryParameters());
-                               mergedURL.concatSegments(newUrl.getSegments());
+                                       request.setUrl(mergedURL);
+                               }
 
-                               request.setUrl(mergedURL);
                                processRequest(null, null, true);
 
                                --redirectCount;

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html?rev=1139481&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
 Sat Jun 25 02:24:38 2011
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org";>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+    <title>Secure Page</title>
+</head>
+<body>
+    insecure page
+</body>
+</html>
\ No newline at end of file

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java?rev=1139481&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
 Sat Jun 25 02:24:38 2011
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.https;
+
+import org.apache.wicket.markup.html.WebPage;
+
+public class HttpPage extends WebPage
+{
+       private static final long serialVersionUID = 1L;
+}

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java?rev=1139481&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
 Sat Jun 25 02:24:38 2011
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.https;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.protocol.http.WebApplication;
+
+public class HttpsMapperApplication extends WebApplication
+{
+       private HttpsConfig config;
+
+       public HttpsMapperApplication(int httpPort, int httpsPort)
+       {
+               config = new HttpsConfig(httpPort, httpsPort);
+       }
+
+       public HttpsMapperApplication()
+       {
+               config = new HttpsConfig();
+       }
+
+       @Override
+       protected void init()
+       {
+               super.init();
+
+               mountPage("/secure", HttpsPage.class);
+               mountPage("/insecure", HttpPage.class);
+
+               setRootRequestMapper(new HttpsMapper(getRootRequestMapper(), 
config));
+       }
+       
+
+       @Override
+       public Class<? extends Page> getHomePage()
+       {
+               return HttpsPage.class;
+       }
+}

Copied: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
 (from r1139475, 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java)
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java?p2=wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java&p1=wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java&r1=1139475&r2=1139481&rev=1139481&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
 Sat Jun 25 02:24:38 2011
@@ -16,56 +16,103 @@
  */
 package org.apache.wicket.protocol.https;
 
-import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.Page;
+import org.apache.wicket.util.tester.WicketTester;
 import org.junit.Test;
-import org.mockito.Mockito;
+
+import static org.junit.Assert.*;
 
 /**
- * Test for {@link HttpsRequestChecker}
+ * Test for proper switching of http and https in {@link WicketTester}
  */
-public class HttpsRequestCheckerTest extends WicketTestCase
+public class HttpsMapperApplicationTest
 {
+       @SuppressWarnings({"unchecked"})
+       private <T extends Page> T requestPage(WicketTester tester, Class<T> 
pageClass)
+       {
+               Page page = tester.startPage(pageClass);
+               tester.assertRenderedPage(pageClass);
+               assertNotNull(page);
+               assertEquals(pageClass, page.getClass());
+               assertEquals(page, tester.getLastRenderedPage());
+               return (T)page;
+       }
+
+       @Test
+       public void switchDefaultToHttpsWithDefaultPorts()
+       {
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication());
+               
+               requestPage(tester, HttpsPage.class);
+               
+               assertEquals("https", tester.getLastRequest().getScheme());
+               assertEquals(443, tester.getLastRequest().getServerPort());
+       }
+
+       @Test
+       public void switchDefaultToHttpsWithCustomPort()
+       {
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication(123, 456));
+
+               requestPage(tester, HttpsPage.class);
+
+               assertEquals("https", tester.getLastRequest().getScheme());
+               assertEquals(456, tester.getLastRequest().getServerPort());
+       }
 
-       /**
-        * Asserts that
-        * {@link 
HttpsRequestChecker#checkSecureIncoming(org.apache.wicket.request.IRequestHandler,
 HttpsConfig)}
-        * returns {@link SwitchProtocolRequestHandler} for pages annotated 
with {@link RequireHttps} or
-        * returns the original {@link IRequestHandler} for pages that are not 
annotated with
-        * {@link RequireHttps}
-        */
        @Test
-       public void checkSecureIncoming()
+       public void switchHttpsToHttpWithDefaultPorts()
        {
-               HttpsRequestChecker checker = new HttpsRequestChecker();
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication());
 
-               IPageRequestHandler httpsPageRequestHandler = 
Mockito.mock(IPageRequestHandler.class);
-               
Mockito.doReturn(HttpsPage.class).when(httpsPageRequestHandler).getPageClass();
+               tester.getRequest().setScheme("https");
+               tester.getRequest().setServerPort(443);
+               
+               requestPage(tester, HttpPage.class);
+               
+               assertEquals("http", tester.getLastRequest().getScheme());
+               assertEquals(80, tester.getLastRequest().getServerPort());
+       }
 
-               HttpsConfig httpsConfig = new HttpsConfig();
+       @Test
+       public void switchHttpsToHttpWithCustomPorts()
+       {
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication(123, 456));
 
-               IRequestHandler httpsPageSecureIncoming = 
checker.checkSecureIncoming(
-                       httpsPageRequestHandler, httpsConfig);
-               assertTrue(httpsPageSecureIncoming instanceof 
SwitchProtocolRequestHandler);
+               tester.getRequest().setScheme("https");
+               tester.getRequest().setServerPort(443);
 
-               IPageRequestHandler httpPageRequestHandler = 
Mockito.mock(IPageRequestHandler.class);
-               
Mockito.doReturn(HttpPage.class).when(httpsPageRequestHandler).getPageClass();
+               requestPage(tester, HttpPage.class);
 
-               IRequestHandler httpPageSecureIncoming = 
checker.checkSecureIncoming(
-                       httpPageRequestHandler, httpsConfig);
-               assertSame(httpPageRequestHandler, httpPageSecureIncoming);
+               assertEquals("http", tester.getLastRequest().getScheme());
+               assertEquals(123, tester.getLastRequest().getServerPort());
        }
 
-       @RequireHttps
-       private static class HttpsPage extends WebPage
+       @Test
+       public void switchHttpToHttpsWithDefaultPorts()
        {
-               private static final long serialVersionUID = 1L;
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication());
+
+               tester.getRequest().setScheme("http");
+               tester.getRequest().setServerPort(80);
+
+               requestPage(tester, HttpsPage.class);
+
+               assertEquals("https", tester.getLastRequest().getScheme());
+               assertEquals(443, tester.getLastRequest().getServerPort());
        }
 
-       private static class HttpPage extends WebPage
+       @Test
+       public void switchHttpToHttpsWithCustomPorts()
        {
-               private static final long serialVersionUID = 1L;
+               WicketTester tester = new WicketTester(new 
HttpsMapperApplication(123, 456));
+
+               tester.getRequest().setScheme("http");
+               tester.getRequest().setServerPort(123);
+
+               requestPage(tester, HttpsPage.class);
+
+               assertEquals("https", tester.getLastRequest().getScheme());
+               assertEquals(456, tester.getLastRequest().getServerPort());
        }
 }

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html?rev=1139481&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
 Sat Jun 25 02:24:38 2011
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org";>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+    <title>Secure Page</title>
+</head>
+<body>
+    secure page
+</body>
+</html>
\ No newline at end of file

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java?rev=1139481&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
 Sat Jun 25 02:24:38 2011
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.https;
+
+import org.apache.wicket.markup.html.WebPage;
+
+@RequireHttps
+public class HttpsPage extends WebPage
+{
+       private static final long serialVersionUID = 1L;
+}

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
 Sat Jun 25 02:24:38 2011
@@ -17,7 +17,6 @@
 package org.apache.wicket.protocol.https;
 
 import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.handler.IPageRequestHandler;
 import org.junit.Test;
@@ -57,15 +56,4 @@ public class HttpsRequestCheckerTest ext
                        httpPageRequestHandler, httpsConfig);
                assertSame(httpPageRequestHandler, httpPageSecureIncoming);
        }
-
-       @RequireHttps
-       private static class HttpsPage extends WebPage
-       {
-               private static final long serialVersionUID = 1L;
-       }
-
-       private static class HttpPage extends WebPage
-       {
-               private static final long serialVersionUID = 1L;
-       }
 }

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java 
(original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java 
Sat Jun 25 02:24:38 2011
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Generics;
@@ -105,6 +106,7 @@ public final class Url implements Serial
         * Parses the given URL string.
         * 
         * @param url
+        *           absolute or relative url with query string
         * @return Url object
         */
        public static Url parse(final String url)
@@ -116,7 +118,7 @@ public final class Url implements Serial
         * Parses the given URL string.
         * 
         * @param url
-        *           full absolute or relative url with query string
+        *           absolute or relative url with query string
         * @param charset
         * @return Url object
         */
@@ -154,12 +156,13 @@ public final class Url implements Serial
 
                if (protocolAt != -1)
                {
-                       result.protocol = absoluteUrl.substring(0, protocolAt);
+                       result.protocol = absoluteUrl.substring(0, 
protocolAt).toLowerCase(Locale.US);
                        final String afterProto = 
absoluteUrl.substring(protocolAt + 3);
                        final String hostAndPort;
 
                        int relativeAt = afterProto.indexOf('/');
-
+                       
+                       
                        if (relativeAt == -1)
                        {
                                relativeUrl = "";
@@ -176,7 +179,7 @@ public final class Url implements Serial
                        if (portAt == -1)
                        {
                                result.host = hostAndPort;
-                               result.port = null;
+                               result.port = 
getDefaultPortForProtocol(result.protocol);
                        }
                        else
                        {
@@ -230,6 +233,33 @@ public final class Url implements Serial
        }
 
        /**
+        * get default port number for protocol
+        * 
+        * @param protocol
+        *           name of protocol
+        * @return default port for protocol or <code>null</code> if unknown
+        */
+       private static Integer getDefaultPortForProtocol(String protocol)
+       {
+               if ("http".equals(protocol))
+               {
+                       return 80;
+               }
+               else if ("https".equals(protocol))
+               {
+                       return 443;
+               }
+               else if ("ftp".equals(protocol))
+               {
+                       return 21;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       /**
         * Construct.
         */
        public Url()
@@ -281,7 +311,7 @@ public final class Url implements Serial
         */
        public Url(final List<String> segments, final Charset charset)
        {
-               this(segments, Collections.<QueryParameter> emptyList(), 
charset);
+               this(segments, Collections.<QueryParameter>emptyList(), 
charset);
        }
 
        /**

Modified: 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
 (original)
+++ 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
 Sat Jun 25 02:24:38 2011
@@ -64,17 +64,31 @@ public class UrlTest extends Assert
                assertTrue(url.isAbsolute());
 
                url = Url.parse("https://myhost/foo";);
-               checkUrl(url, "https", "myhost", null, "", "foo");
+               checkUrl(url, "https", "myhost", 443, "", "foo");
                assertTrue(url.isAbsolute());
 
                url = Url.parse("https://myhost/foo:123";);
-               checkUrl(url, "https", "myhost", null, "", "foo:123");
+               checkUrl(url, "https", "myhost", 443, "", "foo:123");
                assertTrue(url.isAbsolute());
+
+               url = Url.parse("ftp://myhost/foo";);
+               checkUrl(url, "ftp", "myhost", 21, "", "foo");
+               assertTrue(url.isAbsolute());
+
+               url = Url.parse("FTp://myhost/foo");
+               checkUrl(url, "ftp", "myhost", 21, "", "foo");
+               assertTrue(url.isAbsolute());
+
+               url = Url.parse("unknown://myhost/foo");
+               checkUrl(url, "unknown", "myhost", null, "", "foo");
+               assertTrue(url.isAbsolute());
+
        }
 
        private void checkUrl(Url url, String protocol, String host, Integer 
port, String... segments)
        {
                assertNotNull(url);
+               assertEquals(protocol, url.getProtocol());
                assertEquals(host, url.getHost());
                assertEquals(port, url.getPort());
                assertEquals(Arrays.asList(segments), url.getSegments());


Reply via email to