@Test public void testClientDropsConnection() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(Bug58624Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); SimpleClient client = new SimpleClient(); URI uri = new URI("ws://localhost:" + getPort() + Bug58624Config.PATH); Session session = wsContainer.connectToServer(client, uri); // Break point A required on following line session.close(); }
@Test public void testConnectToRootEndpoint() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); Context ctx2 = tomcat.addContext("/foo", null); ctx2.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx2, "default", new DefaultServlet()); ctx2.addServletMapping("/", "default"); tomcat.start(); echoTester(""); echoTester("/"); // FIXME: The ws client doesn't handle any response other than the upgrade, // which may or may not be allowed. In that case, the server will return // a redirect to the root of the webapp to avoid possible broken relative // paths. // echoTester("/foo"); echoTester("/foo/"); }
@Override public void start() throws ServerException { synchronized (lifecycleLock) { if (isRunning()) throw new ServerException("Server is already running"); try { tomcat.setPort(8080); tomcat.setHostname("0.0.0.0"); Context context = tomcat.addWebapp("", Paths.get(".").toAbsolutePath().toString()); Tomcat.addServlet(context, "soklet-default", instanceProvider.provide(DefaultServlet.class)); context.addServletMapping("/static/*", "soklet-default"); Tomcat.addServlet(context, "routing", instanceProvider.provide(RoutingServlet.class)); context.addServletMapping("/*", "routing"); tomcat.start(); } catch (Exception e) { throw new ServerException(e); } } }
@Test public void testNoConnection() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketClient client= new WebSocketClient(getPort()); // Send the WebSocket handshake client.writer.write("GET " + TesterEchoServer.Config.PATH_BASIC + " HTTP/1.1" + CRLF); client.writer.write("Host: foo" + CRLF); client.writer.write("Upgrade: websocket" + CRLF); client.writer.write("Sec-WebSocket-Version: 13" + CRLF); client.writer.write("Sec-WebSocket-Key: TODO" + CRLF); client.writer.write(CRLF); client.writer.flush(); // Make sure we got an error response String responseLine = client.reader.readLine(); assertTrue(responseLine.startsWith("HTTP/1.1 400")); // Finished with the socket client.close(); }
@Test public void testNoUpgrade() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketClient client= new WebSocketClient(getPort()); // Send the WebSocket handshake client.writer.write("GET " + TesterEchoServer.Config.PATH_BASIC + " HTTP/1.1" + CRLF); client.writer.write("Host: foo" + CRLF); client.writer.write("Connection: upgrade" + CRLF); client.writer.write("Sec-WebSocket-Version: 13" + CRLF); client.writer.write("Sec-WebSocket-Key: TODO" + CRLF); client.writer.write(CRLF); client.writer.flush(); // Make sure we got an error response // No upgrade means it is not treated an as upgrade request so a 404 is // generated when the request reaches the Default Servlet.s String responseLine = client.reader.readLine(); assertTrue(responseLine.startsWith("HTTP/1.1 404")); // Finished with the socket client.close(); }
@Test public void testPingPongMessages() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider .getWebSocketContainer(); tomcat.start(); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, ClientEndpointConfig.Builder .create().build(), new URI("ws://localhost:" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(1); TesterEndpoint tep = (TesterEndpoint) wsSession.getUserProperties() .get("endpoint"); tep.setLatch(latch); PongMessageHandler handler = new PongMessageHandler(latch); wsSession.addMessageHandler(handler); wsSession.getBasicRemote().sendPing(applicationData); boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); Assert.assertArrayEquals(applicationData.array(), (handler.getMessages().peek()).getApplicationData().array()); }
@Test public void testBug54716() throws Exception { TestUtil.generateMask(); // Set up utility classes Bug54716 server = new Bug54716(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(Bug54716.class); Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(ServerConfigListener.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); wsContainer.connectToServer(client, uri); // Server should close the connection after the exception on open. boolean closed = client.waitForClose(5); Assert.assertTrue("Server failed to close connection", closed); }
@Test public void testOnOpenPojoMethod() throws Exception { // Set up utility classes OnOpenServerEndpoint server = new OnOpenServerEndpoint(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(OnOpenServerEndpoint.class); Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(ServerConfigListener.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); Session session = wsContainer.connectToServer(client, uri); client.waitForClose(5); Assert.assertTrue(session.isOpen()); }
@Test public void testUnsupportedObject() throws Exception{ Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(ProgramaticServerEndpointConfig.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + PATH_PROGRAMMATIC_EP); Session session = wsContainer.connectToServer(client, uri); // This should fail Object msg1 = new Object(); try { session.getBasicRemote().sendObject(msg1); Assert.fail("No exception thrown "); } catch (EncodeException e) { // Expected } catch (Throwable t) { Assert.fail("Wrong exception type"); } finally { session.close(); } }
@Test public void testBug54807() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(Bug54807Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); Assert.assertEquals(LifecycleState.STARTED, ctx.getState()); }
private Tomcat startServer( final Class<? extends WsContextListener> configClass) throws LifecycleException { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(configClass.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); return tomcat; }
@Test public void testConnectToServerEndpoint() throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); // Set this artificially small to trigger // https://bz.apache.org/bugzilla/show_bug.cgi?id=57054 wsContainer.setDefaultMaxBinaryMessageBufferSize(64); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, ClientEndpointConfig.Builder.create().build(), new URI("ws://" + getHostName() + ":" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(1); BasicText handler = new BasicText(latch); wsSession.addMessageHandler(handler); wsSession.getBasicRemote().sendText(MESSAGE_STRING_1); boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); Queue<String> messages = handler.getMessages(); Assert.assertEquals(1, messages.size()); Assert.assertEquals(MESSAGE_STRING_1, messages.peek()); ((WsWebSocketContainer) wsContainer).destroy(); }
private void doTestPerMessageDefalteClient(String msg, int count) throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); Extension perMessageDeflate = new WsExtension(PerMessageDeflate.NAME); List<Extension> extensions = new ArrayList<Extension>(1); extensions.add(perMessageDeflate); ClientEndpointConfig clientConfig = ClientEndpointConfig.Builder.create().extensions(extensions).build(); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, clientConfig, new URI("ws://" + getHostName() + ":" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(count); BasicText handler = new BasicText(latch, msg); wsSession.addMessageHandler(handler); for (int i = 0; i < count; i++) { wsSession.getBasicRemote().sendText(msg); } boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); ((WsWebSocketContainer) wsContainer).destroy(); }
public static void askForAuthentication(HttpServletResponse res) throws Exception { String nonce = DefaultServlet.generateNonce(); // determine the 'opaque' value which should be returned as-is by the client String opaque = DefaultServlet.generateOpaque(); res.setHeader( "WWW-Authenticate", "Digest realm=\"" + WebdavServlet.USER_REALM + "\", " + "nonce=\"" + nonce + "\", " + "opaque=\"" + opaque + "\""); res.sendError(HttpServletResponse.SC_UNAUTHORIZED); }
@Test public void testNoConnection() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketClient client= new WebSocketClient(getPort()); // Send the WebSocket handshake client.writer.write("GET " + TesterEchoServer.Config.PATH_BASIC + " HTTP/1.1" + CRLF); client.writer.write("Host: foo" + CRLF); client.writer.write("Upgrade: websocket" + CRLF); client.writer.write("Sec-WebSocket-Version: 13" + CRLF); client.writer.write("Sec-WebSocket-Key: TODO" + CRLF); client.writer.write(CRLF); client.writer.flush(); // Make sure we got an error response String responseLine = client.reader.readLine(); assertTrue(responseLine.startsWith("HTTP/1.1 400")); // Finished with the socket client.close(); }
@Test public void testNoUpgrade() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketClient client= new WebSocketClient(getPort()); // Send the WebSocket handshake client.writer.write("GET " + TesterEchoServer.Config.PATH_BASIC + " HTTP/1.1" + CRLF); client.writer.write("Host: foo" + CRLF); client.writer.write("Connection: upgrade" + CRLF); client.writer.write("Sec-WebSocket-Version: 13" + CRLF); client.writer.write("Sec-WebSocket-Key: TODO" + CRLF); client.writer.write(CRLF); client.writer.flush(); // Make sure we got an error response // No upgrade means it is not treated an as upgrade request so a 404 is // generated when the request reaches the Default Servlet.s String responseLine = client.reader.readLine(); assertTrue(responseLine.startsWith("HTTP/1.1 404")); // Finished with the socket client.close(); }
@Test public void testPingPongMessages() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider .getWebSocketContainer(); tomcat.start(); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, ClientEndpointConfig.Builder .create().build(), new URI("ws://localhost:" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(1); TesterEndpoint tep = (TesterEndpoint) wsSession.getUserProperties() .get("endpoint"); tep.setLatch(latch); PongMessageHandler handler = new PongMessageHandler(latch); wsSession.addMessageHandler(handler); wsSession.getBasicRemote().sendPing(applicationData); boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); Assert.assertArrayEquals(applicationData.array(), (handler.getMessages().peek()).getApplicationData().array()); }
@Test public void testBug54716() throws Exception { TestUtil.generateMask(); // Set up utility classes Bug54716 server = new Bug54716(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(Bug54716.class); Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( ServerConfigListener.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); wsContainer.connectToServer(client, uri); // Server should close the connection after the exception on open. boolean closed = client.waitForClose(5); Assert.assertTrue("Server failed to close connection", closed); }
@Test public void testOnOpenPojoMethod() throws Exception { // Set up utility classes OnOpenServerEndpoint server = new OnOpenServerEndpoint(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(OnOpenServerEndpoint.class); Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( ServerConfigListener.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); Session session = wsContainer.connectToServer(client, uri); client.waitForClose(5); Assert.assertTrue(session.isOpen()); }
@Test public void testBug54807() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( Bug54807Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); Assert.assertEquals(LifecycleState.STARTED, ctx.getState()); }
@Test public void testConnectToServerEndpoint() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, ClientEndpointConfig.Builder.create().build(), new URI("ws://localhost:" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(1); BasicText handler = new BasicText(latch); wsSession.addMessageHandler(handler); wsSession.getBasicRemote().sendText(MESSAGE_STRING_1); boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); Queue<String> messages = handler.getMessages(); Assert.assertEquals(1, messages.size()); Assert.assertEquals(MESSAGE_STRING_1, messages.peek()); }
private void doMaxMessageSize(String path, long size, boolean expectOpen) throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(new ApplicationListener( TesterEchoServer.Config.class.getName(), false)); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); Session s = connectToEchoServer(wsContainer, EndpointA.class, path); StringBuilder msg = new StringBuilder(); for (long i = 0; i < size; i++) { msg.append('x'); } s.getBasicRemote().sendText(msg.toString()); // Wait for up to 5 seconds for session to close boolean open = s.isOpen(); int count = 0; while (open != expectOpen && count < 50) { Thread.sleep(100); count++; open = s.isOpen(); } Assert.assertEquals(Boolean.valueOf(expectOpen), Boolean.valueOf(s.isOpen())); }
@Test public void testPingPongMessages() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); tomcat.start(); WebSocketContainer wsContainer = ContainerProvider .getWebSocketContainer(); tomcat.start(); Session wsSession = wsContainer.connectToServer( TesterProgrammaticEndpoint.class, ClientEndpointConfig.Builder .create().build(), new URI("ws://localhost:" + getPort() + TesterEchoServer.Config.PATH_ASYNC)); CountDownLatch latch = new CountDownLatch(1); TesterEndpoint tep = (TesterEndpoint) wsSession.getUserProperties() .get("endpoint"); tep.setLatch(latch); PongMessageHandler handler = new PongMessageHandler(latch); wsSession.addMessageHandler(handler); wsSession.getBasicRemote().sendPing(applicationData); boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS); Assert.assertTrue(latchResult); Assert.assertArrayEquals(applicationData.array(), (handler.getMessages().peek()).getApplicationData().array()); }
@Test public void testBug54716() throws Exception { TestUtil.generateMask(); // Set up utility classes Bug54716 server = new Bug54716(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(Bug54716.class); Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(ServerConfigListener.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); wsContainer.connectToServer(client, uri); // Server should close the connection after the exception on open. boolean closed = client.waitForClose(5); Assert.assertTrue("Server failed to close connection", closed); }
@Test public void testOnOpenPojoMethod() throws Exception { // Set up utility classes OnOpenServerEndpoint server = new OnOpenServerEndpoint(); SingletonConfigurator.setInstance(server); ServerConfigListener.setPojoClazz(OnOpenServerEndpoint.class); Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(ServerConfigListener.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + "/"); Session session = wsContainer.connectToServer(client, uri); client.waitForClose(5); Assert.assertTrue(session.isOpen()); }
@Test public void testUnsupportedObject() throws Exception{ Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir")); ctx.addApplicationListener(ProgramaticServerEndpointConfig.class.getName()); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMapping("/", "default"); WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); tomcat.start(); Client client = new Client(); URI uri = new URI("ws://localhost:" + getPort() + PATH_PROGRAMMATIC_EP); Session session = wsContainer.connectToServer(client, uri); // This should fail Object msg1 = new Object(); try { session.getBasicRemote().sendObject(msg1); Assert.fail("No exception thrown "); } catch (EncodeException e) { // Expected } catch (Throwable t) { Assert.fail("Wrong exception type"); } finally { session.close(); } }