/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.unit;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.FilterRegistration.Dynamic;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor;
import org.h2.api.ErrorCode;
import org.h2.server.web.DbStarter;
import org.h2.test.TestBase;
import org.h2.util.New;
/**
* Tests the DbStarter servlet.
* This test simulates a minimum servlet container environment.
*/
public class TestServlet extends TestBase {
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
/**
* Minimum ServletContext implementation.
* Most methods are not implemented.
*/
static class TestServletContext implements ServletContext {
private final Properties initParams = new Properties();
private final HashMap<String, Object> attributes = New.hashMap();
@Override
public void setAttribute(String key, Object value) {
attributes.put(key, value);
}
@Override
public Object getAttribute(String key) {
return attributes.get(key);
}
@Override
public boolean setInitParameter(String key, String value) {
initParams.setProperty(key, value);
return true;
}
@Override
public String getInitParameter(String key) {
return initParams.getProperty(key);
}
@Override
public Enumeration<String> getAttributeNames() {
throw new UnsupportedOperationException();
}
@Override
public ServletContext getContext(String string) {
throw new UnsupportedOperationException();
}
@Override
public Enumeration<String> getInitParameterNames() {
throw new UnsupportedOperationException();
}
@Override
public int getMajorVersion() {
throw new UnsupportedOperationException();
}
@Override
public String getMimeType(String string) {
throw new UnsupportedOperationException();
}
@Override
public int getMinorVersion() {
throw new UnsupportedOperationException();
}
@Override
public RequestDispatcher getNamedDispatcher(String string) {
throw new UnsupportedOperationException();
}
@Override
public String getRealPath(String string) {
throw new UnsupportedOperationException();
}
@Override
public RequestDispatcher getRequestDispatcher(String string) {
throw new UnsupportedOperationException();
}
@Override
public URL getResource(String string) {
throw new UnsupportedOperationException();
}
@Override
public InputStream getResourceAsStream(String string) {
throw new UnsupportedOperationException();
}
@Override
public Set<String> getResourcePaths(String string) {
throw new UnsupportedOperationException();
}
@Override
public String getServerInfo() {
throw new UnsupportedOperationException();
}
/**
* @deprecated as of servlet API 2.1
*/
@Override
@Deprecated
public Servlet getServlet(String string) {
throw new UnsupportedOperationException();
}
@Override
public String getServletContextName() {
throw new UnsupportedOperationException();
}
/**
* @deprecated as of servlet API 2.1
*/
@Deprecated
@Override
public Enumeration<String> getServletNames() {
throw new UnsupportedOperationException();
}
/**
* @deprecated as of servlet API 2.0
*/
@Deprecated
@Override
public Enumeration<Servlet> getServlets() {
throw new UnsupportedOperationException();
}
@Override
public void log(String string) {
throw new UnsupportedOperationException();
}
/**
* @deprecated as of servlet API 2.1
*/
@Deprecated
@Override
public void log(Exception exception, String string) {
throw new UnsupportedOperationException();
}
@Override
public void log(String string, Throwable throwable) {
throw new UnsupportedOperationException();
}
@Override
public void removeAttribute(String string) {
throw new UnsupportedOperationException();
}
@Override
public Dynamic addFilter(String arg0, String arg1) {
throw new UnsupportedOperationException();
}
@Override
public Dynamic addFilter(String arg0, Filter arg1) {
throw new UnsupportedOperationException();
}
@Override
public Dynamic addFilter(String arg0, Class<? extends Filter> arg1) {
throw new UnsupportedOperationException();
}
@Override
public void addListener(String arg0) {
throw new UnsupportedOperationException();
}
@Override
public <T extends EventListener> void addListener(T arg0) {
throw new UnsupportedOperationException();
}
@Override
public void addListener(Class<? extends EventListener> arg0) {
throw new UnsupportedOperationException();
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(
String arg0, String arg1) {
throw new UnsupportedOperationException();
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(
String arg0, Servlet arg1) {
throw new UnsupportedOperationException();
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(
String arg0, Class<? extends Servlet> arg1) {
throw new UnsupportedOperationException();
}
@Override
public <T extends Filter> T createFilter(Class<T> arg0)
throws ServletException {
throw new UnsupportedOperationException();
}
@Override
public <T extends EventListener> T createListener(Class<T> arg0)
throws ServletException {
throw new UnsupportedOperationException();
}
@Override
public <T extends Servlet> T createServlet(Class<T> arg0)
throws ServletException {
throw new UnsupportedOperationException();
}
@Override
public void declareRoles(String... arg0) {
throw new UnsupportedOperationException();
}
@Override
public ClassLoader getClassLoader() {
throw new UnsupportedOperationException();
}
@Override
public String getContextPath() {
throw new UnsupportedOperationException();
}
@Override
public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
throw new UnsupportedOperationException();
}
@Override
public int getEffectiveMajorVersion() {
throw new UnsupportedOperationException();
}
@Override
public int getEffectiveMinorVersion() {
throw new UnsupportedOperationException();
}
@Override
public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
throw new UnsupportedOperationException();
}
@Override
public FilterRegistration getFilterRegistration(String arg0) {
throw new UnsupportedOperationException();
}
@Override
public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
throw new UnsupportedOperationException();
}
@Override
public JspConfigDescriptor getJspConfigDescriptor() {
throw new UnsupportedOperationException();
}
@Override
public ServletRegistration getServletRegistration(String arg0) {
throw new UnsupportedOperationException();
}
@Override
public Map<String, ? extends ServletRegistration> getServletRegistrations() {
throw new UnsupportedOperationException();
}
@Override
public SessionCookieConfig getSessionCookieConfig() {
throw new UnsupportedOperationException();
}
@Override
public void setSessionTrackingModes(Set<SessionTrackingMode> arg0) {
throw new UnsupportedOperationException();
}
@Override
public String getVirtualServerName() {
throw new UnsupportedOperationException();
}
}
@Override
public void test() throws SQLException {
if (config.networked || config.memory) {
return;
}
DbStarter listener = new DbStarter();
TestServletContext context = new TestServletContext();
String url = getURL("servlet", true);
context.setInitParameter("db.url", url);
context.setInitParameter("db.user", getUser());
context.setInitParameter("db.password", getPassword());
context.setInitParameter("db.tcpServer", "-tcpPort 8888");
ServletContextEvent event = new ServletContextEvent(context);
listener.contextInitialized(event);
Connection conn1 = listener.getConnection();
Connection conn1a = (Connection) context.getAttribute("connection");
assertTrue(conn1 == conn1a);
Statement stat1 = conn1.createStatement();
stat1.execute("CREATE TABLE T(ID INT)");
String u2 = url.substring(url.indexOf("servlet"));
u2 = "jdbc:h2:tcp://localhost:8888/" + getBaseDir() + "/" + u2;
Connection conn2 = DriverManager.getConnection(
u2, getUser(), getPassword());
Statement stat2 = conn2.createStatement();
stat2.execute("SELECT * FROM T");
stat2.execute("DROP TABLE T");
assertThrows(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, stat1).
execute("SELECT * FROM T");
conn2.close();
listener.contextDestroyed(event);
// listener must be stopped
assertThrows(ErrorCode.CONNECTION_BROKEN_1, this).getConnection(
"jdbc:h2:tcp://localhost:8888/" + getBaseDir() + "/servlet",
getUser(), getPassword());
// connection must be closed
assertThrows(ErrorCode.OBJECT_CLOSED, stat1).
execute("SELECT * FROM DUAL");
deleteDb("servlet");
}
}