Repository: wicket Updated Branches: refs/heads/master 541d5b395 -> c5a445504
WICKET-5898: Added two more failing tests These tests fail with a StackOverflowError with auto-added TWMCs or manually added TWMCs. Both situations could occur in a Wicket application. Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c5a44550 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c5a44550 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c5a44550 Branch: refs/heads/master Commit: c5a445504d1ba07bf8cb8f782187f6f003b64521 Parents: 541d5b3 Author: Martijn Dashorst <[email protected]> Authored: Tue May 12 14:54:45 2015 +0200 Committer: Martijn Dashorst <[email protected]> Committed: Tue May 12 14:55:14 2015 +0200 ---------------------------------------------------------------------- ...ntainerWithAutoTransparentContainerPage.html | 14 +++ ...ntainerWithAutoTransparentContainerPage.java | 82 ++++++++++++++++++ ...ainerWithManualTransparentContainerPage.html | 14 +++ ...ainerWithManualTransparentContainerPage.java | 89 ++++++++++++++++++++ .../html/TransparentWebMarkupContainerTest.java | 42 +++++++++ 5 files changed, 241 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/c5a44550/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.html new file mode 100644 index 0000000..3287346 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> +<body> + <h3 wicket:id="twmc"> + <span wicket:id="label"></span> + <span> + <a wicket:id="group1"><img alt="group1" src="group1.gif"></a> + <a wicket:id="group2"><img alt="group2" src="group2.gif"></a> + </span> + <span></span> + </h3> + <a href="#" wicket:id="link"></a> +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/c5a44550/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.java new file mode 100644 index 0000000..287adb4 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithAutoTransparentContainerPage.java @@ -0,0 +1,82 @@ +/* + * 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.markup.html; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.html.basic.Label; + +/** + * A test page for triggering a StackOverflowError when updating a component inside a + * {@link TransparentWebMarkupContainer}, with Wicket auto-adding TWMC's. + */ +public class TransparentContainerWithAutoTransparentContainerPage extends WebPage +{ + private static final long serialVersionUID = 1L; + + /** + * Constructor. + */ + public TransparentContainerWithAutoTransparentContainerPage() + { + final Label label = new Label("label", "Label"); + label.setOutputMarkupId(true); + add(label); + + // Letting Wicket auto-add a TransparentWebMarkupContainer to the AJAX link (due to relative + // URL rewriting) causes a StackOverflowException + add(new AjaxLink<Void>("group1") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget t) + { + } + }); + + // But you need two auto-added TWMCs to trigger the StackOverflowError + add(new AjaxLink<Void>("group2") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget t) + { + } + }); + + // a non-AJAX click on this link passes the test case, an AJAX request + // fails with a StackOverflowError + add(new AjaxFallbackLink<Void>("link") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) + { + if (target != null) + target.add(label); + } + }); + + // if you add this TransparentWebMarkupContainer as first component in + // the page, the test passes + add(new TransparentWebMarkupContainer("twmc")); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/c5a44550/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.html new file mode 100644 index 0000000..382dbec --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> +<body> + <h3 wicket:id="twmc"> + <span wicket:id="label"></span> + <span> + <a wicket:id="group1"><span wicket:id="twmc_group_1"></span></a> + <a wicket:id="group2"><span wicket:id="twmc_group_2"></span></a> + </span> + <span></span> + </h3> + <a href="#" wicket:id="link"></a> +</body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/c5a44550/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.java new file mode 100644 index 0000000..f2c2303 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentContainerWithManualTransparentContainerPage.java @@ -0,0 +1,89 @@ +/* + * 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.markup.html; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.html.basic.Label; + +/** + * A test page for triggering a StackOverflowError when updating a component inside a + * {@link TransparentWebMarkupContainer}, with manually added TWMCs to ensure we don't only check + * for auto-added components, but manually added TWMCs as well while fixing the StackOverflowError + * bug. + */ +public class TransparentContainerWithManualTransparentContainerPage extends WebPage +{ + private static final long serialVersionUID = 1L; + + /** + * Constructor. + */ + public TransparentContainerWithManualTransparentContainerPage() + { + final Label label = new Label("label", "Label"); + label.setOutputMarkupId(true); + add(label); + + // adding a TWMC to this link in itself is harmless, but when you have two of these + // constructions on your page, it causes a StackOverflowError. + AjaxLink<Void> group1 = new AjaxLink<Void>("group1") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget t) + { + } + }; + add(group1); + group1.add(new TransparentWebMarkupContainer("twmc_group_1")); + + // This is the second TWMC inside a container construct that triggers the + // StackOverflowError. + AjaxLink<Void> group2 = new AjaxLink<Void>("group2") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget t) + { + } + }; + add(group2); + group2.add(new TransparentWebMarkupContainer("twmc_group_2")); + + // a non-AJAX click on this link passes the test case, an AJAX request + // fails with a StackOverflowError + add(new AjaxFallbackLink<Void>("link") + { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) + { + if (target != null) + target.add(label); + } + }); + + // if you add this TransparentWebMarkupContainer as first component in + // the page, the test passes + add(new TransparentWebMarkupContainer("twmc")); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/c5a44550/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java index ef3607e..19db265 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java @@ -31,6 +31,7 @@ import org.apache.wicket.page.IPageManagerContext; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.tester.WicketTester; +import org.junit.Ignore; import org.junit.Test; /** @@ -188,6 +189,47 @@ public class TransparentWebMarkupContainerTest extends WicketTestCase tester.assertComponentOnAjaxResponse("label"); } + /** + * Tests the WICKET-5898 issue of triggering a StackOverflowError when a component inside nested + * TransparentWebMarkupContainers is updated. This particular test case is caused by having + * introduce automatic transparent containers inside some link components due to a + * {@code <img src="">} tag inside the link tags, and trying to update a label that was added to + * the outer TWMC. + */ + @Test + @Ignore("Fails due to WICKET-5898") + public void ajaxRequestForComponentInTransparentWebMarkupContainerShouldntCauseStackOverflow4() + { + tester.startPage(TransparentContainerWithAutoTransparentContainerPage.class); + + // the page renders normally using normal web requests + tester.assertRenderedPage(TransparentContainerWithAutoTransparentContainerPage.class); + + // without WICKET-5898 fixed the statement below causes a StackOverflowError + tester.clickLink("link", true); + tester.assertComponentOnAjaxResponse("label"); + } + + /** + * Tests the WICKET-5898 issue of triggering a StackOverflowError when a component inside nested + * TransparentWebMarkupContainers is updated. This particular test case is caused by having + * manually added transparent containers inside some link components, and trying to update a + * label that was added to the outer TWMC. + */ + @Test + @Ignore("Fails due to WICKET-5898") + public void ajaxRequestForComponentInTransparentWebMarkupContainerShouldntCauseStackOverflow5() + { + tester.startPage(TransparentContainerWithManualTransparentContainerPage.class); + + // the page renders normally using normal web requests + tester.assertRenderedPage(TransparentContainerWithManualTransparentContainerPage.class); + + // without WICKET-5898 fixed the statement below causes a StackOverflowError + tester.clickLink("link", true); + tester.assertComponentOnAjaxResponse("label"); + } + /** */ public static class TestPage extends WebPage implements IMarkupResourceStreamProvider {
