[ https://issues.apache.org/jira/browse/WICKET-5424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13832821#comment-13832821 ]
Sven Meier commented on WICKET-5424: ------------------------------------ Thanks Martin, I'll use WicketTesterLazyIsPageStatelessBase and subclasses in WICKET-5426. > 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 > Assignee: Sven Meier > Fix For: 6.13.0 > > Attachments: WICKET-5424-tester.patch, wicket-bug-test.zip > > > 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)