You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Martin Grigorov (JIRA)" <ji...@apache.org> on 2013/11/25 08:39:36 UTC

[jira] [Commented] (WICKET-5424) Page.isPageStateless() returning true in regular run but false in WicketTester

    [ https://issues.apache.org/jira/browse/WICKET-5424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13831230#comment-13831230 ] 

Martin Grigorov commented on WICKET-5424:
-----------------------------------------

Could you please attach a failing test case ?
Thank you! 

> Page.isPageStateless() returning true in regular run but false in WicketTester
> ------------------------------------------------------------------------------
>
>                 Key: WICKET-5424
>                 URL: https://issues.apache.org/jira/browse/WICKET-5424
>             Project: Wicket
>          Issue Type: Bug
>    Affects Versions: 6.8.0, 6.12.0
>            Reporter: Jyri-Matti Lähteenmäki
>
> Motivation:
> Healthcheck/heartbeat pages must always be stateless to prevent significant amounts of session creation and storage.
> Also each anonymously accessed page in a public site should be stateless due to the same reason (otherwise the site could easily be DoSsed down).
> It would be nice to verify these requirements by tests.
> If I create an ought-to-be-stateless page with an AjaxLink which is hidden by a behavior:
> public class MyPage extends WebPage {
>     public MyPage() {
>         add(new AjaxLink<Void>("link") {
>             @Override
>             public void onClick(AjaxRequestTarget target) {
>                 //
>             }
>         }.add(new Behavior() {
>             @Override
>             public void onConfigure(Component c) {
>                 c.setVisible(false);
>             }
>         }));
>         add(new Label("isPageStateless", new AbstractReadOnlyModel<Boolean>() {
>             @Override
>             public Boolean getObject() {
>                 return MyPage.this.isPageStateless();
>             }
>         }));
>     }
> }
> then checking through a web server the page correctly prints "true", and no HttpSessions are created.
> However, when I try to verify statelessness through WicketTester, the following test passes:
> @Test
> public void testName() throws Exception {
>     WicketTester tester = new WicketTester(new WebApplication() {
>         @Override
>         public Class<? extends Page> getHomePage() {
>             return MyPage.class;
>         }
>     });
>     tester.startPage(MyPage.class);
>     tester.assertLabel("isPageStateless", "false");
>     assertFalse(tester.getLastRenderedPage().isPageStateless());
> }
> It seems that somehow due to WicketTester, isPageStateless() is being invoked before any behaviors are run (and thus the AjaxLink is still visible), and since stateless-flag for the page is cached, it remains false.
> If it's by design that isPageStateless should always return the same result during each request, then I guess that the statelessness resolution process must not depend on anything happening after the page constructor? I assume it's not by design.
> Suggestions:
> A) Obvious fix would be to remove stateless-flag caching, since apparently it is causing problems, as also suggested by a hackish comment in Page.init(). In general, caching should always be used sparingly.
> B) Or maybe whoever is invoking isPageStateless() at an early stage should actually be using Page.peekPageStateless()? But this doesn't really seem like a real fix, more like a temporary hack.
> C) All caching could also be disabled during test runs, but this would not be a good thing since tests should reproduce the actual behavior as closely as possible.
> D) In case this is a known issue without a proper fix, how then could I verify page statelessness through WicketTester? Currently I'm clearing the stateless-cache by reflection, which feels kind of bad...



--
This message was sent by Atlassian JIRA
(v6.1#6144)