/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed 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 com.vaadin.server;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSessionBindingEvent;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.shared.Registration;
import com.vaadin.util.CurrentInstance;
/**
*
* @author Vaadin Ltd
*/
public class VaadinServiceTest {
private class TestSessionDestroyListener implements SessionDestroyListener {
int callCount = 0;
@Override
public void sessionDestroy(SessionDestroyEvent event) {
callCount++;
}
}
private class TestServiceDestroyListener implements ServiceDestroyListener {
int callCount = 0;
@Override
public void serviceDestroy(ServiceDestroyEvent event) {
callCount++;
}
}
private String createCriticalNotification(String caption, String message,
String details, String url) {
return VaadinService.createCriticalNotificationJSON(caption, message,
details, url);
}
@Test
public void testFireSessionDestroy() throws ServletException {
VaadinService service = createService();
TestSessionDestroyListener listener = new TestSessionDestroyListener();
service.addSessionDestroyListener(listener);
MockVaadinSession vaadinSession = new MockVaadinSession(service);
service.fireSessionDestroy(vaadinSession);
Assert.assertEquals(
"'fireSessionDestroy' method doesn't call 'close' for the session",
1, vaadinSession.getCloseCount());
vaadinSession.valueUnbound(
EasyMock.createMock(HttpSessionBindingEvent.class));
Assert.assertEquals(
"'fireSessionDestroy' method may not call 'close' "
+ "method for closing session",
1, vaadinSession.getCloseCount());
Assert.assertEquals("SessionDestroyListeners not called exactly once",
1, listener.callCount);
}
@Test
public void captionIsSetToACriticalNotification() {
String notification = createCriticalNotification("foobar", "message",
"details", "url");
assertThat(notification, containsString("\"caption\":\"foobar\""));
}
@Test
public void nullCaptionIsSetToACriticalNotification() {
String notification = createCriticalNotification(null, "message",
"details", "url");
assertThat(notification, containsString("\"caption\":null"));
}
@Test
public void messageWithDetailsIsSetToACriticalNotification() {
String notification = createCriticalNotification("caption", "foo",
"bar", "url");
assertThat(notification, containsString("\"details\":\"bar\""));
}
@Test
public void nullMessageSentAsNullInACriticalNotification() {
String notification = createCriticalNotification("caption", null,
"foobar", "url");
assertThat(notification, containsString("\"message\":null"));
}
@Test
public void nullMessageIsSetToACriticalNotification() {
String notification = createCriticalNotification("caption", null, null,
"url");
assertThat(notification, containsString("\"message\":null"));
}
@Test
public void messageSetToACriticalNotification() {
String notification = createCriticalNotification("caption", "foobar",
null, "url");
assertThat(notification, containsString("\"message\":\"foobar\""));
}
@Test
public void urlIsSetToACriticalNotification() {
String notification = createCriticalNotification("caption", "message",
"details", "foobar");
assertThat(notification, containsString("\"url\":\"foobar\""));
}
@Test
public void nullUrlIsSetToACriticalNotification() {
String notification = createCriticalNotification("caption", "message",
"details", null);
assertThat(notification, containsString("\"url\":null"));
}
@Test
public void currentInstancesAfterPendingAccessTasks() {
VaadinService service = createService();
MockVaadinSession session = new MockVaadinSession(service);
session.lock();
service.accessSession(session, () -> {
CurrentInstance.set(String.class, "Set in task");
});
CurrentInstance.set(String.class, "Original value");
service.runPendingAccessTasks(session);
Assert.assertEquals(
"Original CurrentInstance should be set after the task has been run",
"Original value", CurrentInstance.get(String.class));
}
private static VaadinService createService() {
ServletConfig servletConfig = new MockServletConfig();
VaadinServlet servlet = new VaadinServlet();
try {
servlet.init(servletConfig);
} catch (ServletException e) {
throw new RuntimeException(e);
}
VaadinService service = servlet.getService();
return service;
}
@Test
public void fireServiceDestroy() {
VaadinService service = createService();
TestServiceDestroyListener listener = new TestServiceDestroyListener();
TestServiceDestroyListener listener2 = new TestServiceDestroyListener();
service.addServiceDestroyListener(listener);
Registration remover2 = service.addServiceDestroyListener(listener2);
service.destroy();
Assert.assertEquals(1, listener.callCount);
Assert.assertEquals(1, listener2.callCount);
service.removeServiceDestroyListener(listener);
remover2.remove();
service.destroy();
Assert.assertEquals(1, listener.callCount);
Assert.assertEquals(1, listener2.callCount);
}
}