package org.jboss.seam.test.integration.synchronization;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOUtils;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.seam.test.integration.Deployments;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunAsClient
@RunWith(Arquillian.class)
public class SFSBSynchronizationTest
{
@Deployment(name="SFSBSynchronizationTest")
@OverProtocol("Servlet 3.0")
public static Archive<?> createDeployment()
{
// This is a client test, use a real (non-mocked) Seam deployment
return Deployments.realSeamDeployment()
.addClasses(TestAction.class, TestLocal.class)
.addAsWebResource(new StringAsset(
"<html xmlns=\"http://www.w3.org/1999/xhtml\"" +
" xmlns:s=\"http://jboss.org/schema/seam/taglib\"" +
" xmlns:h=\"http://java.sun.com/jsf/html\"" +
" xmlns:f=\"http://java.sun.com/jsf/core\">" +
"<h:head></h:head>" +
"<h:body>" +
"<h:outputText value=\"#{test.test1()} \" /><h:outputText value=\"#{test.test2()}\" />" +
"</h:body>" +
"</html>"), "test.xhtml");
}
@ArquillianResource
private URL deploymentUrl;
private volatile boolean exceptionOccured = false;
private class ClientThread extends Thread {
private String cookie;
private URL url;
private ClientThread(URL url, String cookie) {
this.url = url;
this.cookie = cookie;
}
@Override
public void run()
{
try
{
// 10 iterations are enough to be very likely to reproduce the lock and takes only 2 seconds
for (int i = 0; i < 10; ++i) {
URLConnection urlConn;
urlConn = url.openConnection();
urlConn.setRequestProperty("Cookie", cookie);
urlConn.connect();
String content = IOUtils.toString(urlConn.getInputStream());
assert content.contains("test1 test2");
}
}
catch (Throwable e)
{
e.printStackTrace();
exceptionOccured = true;
}
}
}
// JBPAPP-8869 (JBSEAM-4943)
@Test
public void synchronizationInterceptor()
throws Exception
{
System.out.println(deploymentUrl.toString());
// Initial request to get the session
URL testUrl = new URL(deploymentUrl.toString() + "/test.seam");
URLConnection urlConn = testUrl.openConnection();
urlConn.connect();
String cookie = urlConn.getHeaderField("Set-Cookie");
assert cookie != null;
assert cookie.startsWith("JSESSIONID=");
Thread thread1 = new ClientThread(testUrl, cookie);
Thread thread2 = new ClientThread(testUrl, cookie);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
assert !exceptionOccured;
}
}