--- /dev/null
+package com.vaadin.tests.applicationcontext;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ChangeSessionIdTest extends MultiBrowserTest {
+
+ @Test
+ public void testSessionIdChange() throws Exception {
+ openTestURL();
+ checkLogMatches("1. Session id: .*");
+ $(ButtonElement.class).first().click();
+ checkLogMatches("2. Session id changed successfully from .* to .*");
+ $(ButtonElement.class).get(1).click();
+ checkLogMatches("3. Session id: .*");
+ }
+
+ private void checkLogMatches(String expected) {
+ String actual = getLogRow(0);
+ Assert.assertTrue(String.format(
+ "Unexpected log row.\n expected format: '%s'\n was: '%s'",
+ expected, actual), actual.matches(expected));
+ }
+}
--- /dev/null
+package com.vaadin.tests.applicationcontext;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import com.vaadin.tests.tb3.newelements.FixedNotificationElement;
+
+public class CloseSessionTest extends MultiBrowserTest {
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+ openTestURL();
+ }
+
+ /**
+ * Close, reload and assert there's a new VaadinServiceSession in the old
+ * HttpSession.
+ */
+ @Test
+ public void testCloseAndReopen() {
+ clickButton("Close VaadinServiceSession and reopen page");
+ assertLogText(2, "4. Same hash as current? false");
+ assertLogText(0, "6. Same WrappedSession id? true");
+ }
+
+ /**
+ * Invalidate, reload and assert there's a new VaadinServiceSession in a new
+ * HttpSession.
+ */
+ @Test
+ public void testInvalidateHttpSessionAndReopen() {
+ clickButton("Invalidate HttpSession and reopen page");
+ assertLogText(2, "4. Same hash as current? false");
+ assertLogText(0, "6. Same WrappedSession id? false");
+ }
+
+ /**
+ * Test closing session and redirecting to another page.
+ */
+ @Test
+ public void testCloseVaadinServiceAndRedirect() {
+ clickButton("Close VaadinServiceSession and redirect elsewhere");
+ Assert.assertEquals("Unexpected page contents,",
+ "This is a static file", findElement(By.xpath("//h1"))
+ .getText());
+ }
+
+ /**
+ * Verify we get a Session Expired error if doing something after closing
+ * the VaadinSession.
+ */
+ @Test
+ public void testCloseVaadinSession() {
+ String caption = "Just close VaadinSession";
+ clickButton(caption);
+ clickButton(caption);
+ assertSessionExpired();
+ }
+
+ /**
+ * Verify we get a Session Expired error if doing something after closing
+ * the HttpSession.
+ */
+ @Test
+ public void testCloseHttpSession() {
+ String caption = "Just close HttpSession";
+ clickButton(caption);
+ clickButton(caption);
+ assertSessionExpired();
+ }
+
+ /**
+ * Verify we get a Session Expired error if closing HttpSession in a
+ * background thread.
+ */
+ @Test
+ public void testBackgroundThreadHttpSessionInvalidation()
+ throws InterruptedException {
+ String caption = "Invalidate HttpSession in a background thread";
+ clickButton(caption);
+ sleep(2000);
+ clickButton(caption);
+ assertSessionExpired();
+ }
+
+ private void assertLogText(int index, String expected) {
+ Assert.assertEquals("Unexpected log text,", expected, getLogRow(index));
+ }
+
+ private void assertSessionExpired() {
+ String expected = "Session Expired";
+ String actual = $(FixedNotificationElement.class).first().getCaption();
+ Assert.assertEquals("Unexpected notification,", actual, expected);
+ }
+
+ public void clickButton(String caption) {
+ $(ButtonElement.class).caption(caption).first().click();
+ }
+}
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinService;
import com.vaadin.server.VaadinSession;
-import com.vaadin.tests.components.AbstractTestUI;
-import com.vaadin.tests.util.Log;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.UI;
-public class CloseUI extends AbstractTestUI {
+public class CloseUI extends AbstractTestUIWithLog {
private static final String OLD_HASH_PARAM = "oldHash";
private static final String OLD_SESSION_ID_PARAM = "oldSessionId";
- private final Log log = new Log(6);
-
@Override
protected void setup(VaadinRequest request) {
System.out.println("UI " + getUIId() + " inited");
final int sessionHash = getSession().hashCode();
final String sessionId = request.getWrappedSession().getId();
- log.log("Current session hashcode: " + sessionHash);
- log.log("Current WrappedSession id: " + sessionId);
+ log("Current session hashcode: " + sessionHash);
+ log("Current WrappedSession id: " + sessionId);
// Log previous values to make it easier to see what has changed
String oldHashValue = request.getParameter(OLD_HASH_PARAM);
if (oldHashValue != null) {
- log.log("Old session hashcode: " + oldHashValue);
- log.log("Same hash as current? "
+ log("Old session hashcode: " + oldHashValue);
+ log("Same hash as current? "
+ oldHashValue.equals(Integer.toString(sessionHash)));
}
String oldSessionId = request.getParameter(OLD_SESSION_ID_PARAM);
if (oldSessionId != null) {
- log.log("Old WrappedSession id: " + oldSessionId);
- log.log("Same WrappedSession id? " + oldSessionId.equals(sessionId));
+ log("Old WrappedSession id: " + oldSessionId);
+ log("Same WrappedSession id? " + oldSessionId.equals(sessionId));
}
- addComponent(log);
- addComponent(new Button("Log 'hello'", new Button.ClickListener() {
+ addButton("Log 'hello'", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
- log.log("Hello");
+ log("Hello");
}
- }));
- addComponent(new Button("Close UI", new Button.ClickListener() {
+ });
+ addButton("Close UI", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
close();
}
- }));
+ });
- addComponent(new Button("Close UI (background)",
- new Button.ClickListener() {
+ addButton("Close UI (background)", new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ new UIRunSafelyThread(CloseUI.this) {
@Override
- public void buttonClick(ClickEvent event) {
- new UIRunSafelyThread(CloseUI.this) {
- @Override
- protected void runSafely() {
- close();
- }
- }.start();
+ protected void runSafely() {
+ close();
}
- }));
- addComponent(new Button(
- "Close UI and redirect to /statictestfiles/static.html",
+ }.start();
+ }
+ });
+ addButton("Close UI and redirect to /statictestfiles/static.html",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
getPage().setLocation("/statictestfiles/static.html");
close();
}
- }));
- addComponent(new Button(
+ });
+ addButton(
"Close UI and redirect to /statictestfiles/static.html (background)",
new Button.ClickListener() {
@Override
}
}.start();
}
- }));
-
- }
-
- private abstract class RunSafelyThread extends Thread {
- private UI ui;
-
- public RunSafelyThread(UI ui) {
- this.ui = ui;
- }
-
- @Override
- public void run() {
- ui.accessSynchronously(new Runnable() {
-
- @Override
- public void run() {
- runSafely();
- }
- });
- }
+ });
- protected abstract void runSafely();
}
@Override
@Override
public void detach() {
super.detach();
- log.log("Detach of " + this + " (" + getUIId() + ")");
+ log("Detach of " + this + " (" + getUIId() + ")");
boolean correctUI = (UI.getCurrent() == this);
boolean correctPage = (Page.getCurrent() == getPage());
boolean correctVaadinSession = (VaadinSession.getCurrent() == getSession());
boolean correctVaadinService = (VaadinService.getCurrent() == getSession()
.getService());
- log.log("UI.current correct in detach: " + correctUI);
- log.log("Page.current correct in detach: " + correctPage);
- log.log("VaadinSession.current correct in detach: "
- + correctVaadinSession);
- log.log("VaadinService.current correct in detach: "
- + correctVaadinService);
+ log("UI.current correct in detach: " + correctUI);
+ log("Page.current correct in detach: " + correctPage);
+ log("VaadinSession.current correct in detach: " + correctVaadinSession);
+ log("VaadinService.current correct in detach: " + correctVaadinService);
}
}
--- /dev/null
+package com.vaadin.tests.applicationcontext;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class RpcForClosedUITest extends MultiBrowserTest {
+ @Override
+ protected Class<?> getUIClass() {
+ return CloseUI.class;
+ }
+
+ @Test
+ public void testRpcForUIClosedInBackground() throws Exception {
+ openTestURL();
+ /* Close the UI in a background thread */
+ clickButton("Close UI (background)");
+ /* Try to log 'hello' */
+ clickButton("Log 'hello'");
+ /* Ensure 'hello' was not logged */
+ checkLogMatches("2. Current WrappedSession id: .*");
+ Assert.assertFalse("Page contains word 'Hello'", driver.getPageSource()
+ .contains("Hello"));
+ }
+
+ private void clickButton(String caption) {
+ $(ButtonElement.class).caption(caption).first().click();
+ }
+
+ private void checkLogMatches(String expected) {
+ String actual = getLogRow(0);
+ Assert.assertTrue(String.format(
+ "Unexpected log row.\n expected format: '%s'\n was: '%s'",
+ expected, actual), actual.matches(expected));
+ }
+}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://arturwin.office.itmill.com:8888/" />
-<title>ChangeSessionId</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">ChangeSessionId</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.ChangeSessionId?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextChangeSessionId::PID_SLog_row_0</td>
- <td>1. Session id: *</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextChangeSessionId::/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextChangeSessionId::PID_SLog_row_0</td>
- <td>2. Session id changed successfully from * to *</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextChangeSessionId::/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextChangeSessionId::PID_SLog_row_0</td>
- <td>3. Session id: *</td>
-</tr>
-</tbody></table>
-</body>
-</html>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<!--Close, reload and assert there's a new VaadinServiceSession in the old HttpSession-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>clickAndWait</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::PID_SLog_row_2</td>
- <td>exact:4. Same hash as current? false</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::PID_SLog_row_0</td>
- <td>exact:6. Same WrappedSession id? true</td>
-</tr>
-<!--invalidate reload and assert there's a new VaadinServiceSession in a new HttpSession-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>clickAndWait</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[5]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::PID_SLog_row_2</td>
- <td>exact:4. Same hash as current? false</td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::PID_SLog_row_0</td>
- <td>exact:6. Same WrappedSession id? false</td>
-</tr>
-<!--Test closing session and redirecting to another page-->
-<tr>
- <td>clickAndWait</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>//h1</td>
- <td>This is a static file</td>
-</tr>
-<!--Open again and verify we get a Session Expired error if doing something after closing the VaadinSession-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::Root/VNotification[0]/HTML[0]/domChild[0]</td>
- <td>Session Expired</td>
-</tr>
-<!--Open again and verify we get a Session Expired error if doing something after closing the HttpSession-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::Root/VNotification[0]/HTML[0]/domChild[0]</td>
- <td>Session Expired</td>
-</tr>
-<!--Open again and verify we get a Session Expired error if closing HttpSession in a background thread-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[7]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>2000</td>
- <td>2000</td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[7]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::Root/VNotification[0]/HTML[0]/domChild[0]</td>
- <td>Session Expired</td>
-</tr>
-<!--Open again and test closing session and redirecting to another page-->
-<tr>
- <td>open</td>
- <td>/run/com.vaadin.tests.applicationcontext.CloseSession?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>clickAndWait</td>
- <td>vaadin=runcomvaadintestsapplicationcontextCloseSession::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<tr>
- <td>assertText</td>
- <td>//h1</td>
- <td>This is a static file</td>
-</tr>
-</tbody></table>
-</body>
-</html>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://192.168.2.75:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/CloseUI?restartApplication</td>
- <td></td>
-</tr>
-<!--Close the UI in a background thread-->
-<tr>
- <td>click</td>
- <td>vaadin=runCloseUI::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<!--Try to log 'hello'-->
-<tr>
- <td>click</td>
- <td>vaadin=runCloseUI::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<!--Ensure 'hello' was not logged-->
-<tr>
- <td>assertText</td>
- <td>vaadin=runCloseUI::PID_SLog_row_0</td>
- <td>2. Current WrappedSession id: *</td>
-</tr>
-<tr>
- <td>assertTextNotPresent</td>
- <td>Hello</td>
- <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>