package org.jboss.resteasy.test.cdi.basic;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.logging.Logger;
import org.jboss.resteasy.test.cdi.basic.resource.EJBApplication;
import org.jboss.resteasy.test.cdi.basic.resource.EJBBook;
import org.jboss.resteasy.test.cdi.basic.resource.EJBBookReader;
import org.jboss.resteasy.test.cdi.basic.resource.EJBBookReaderImpl;
import org.jboss.resteasy.test.cdi.basic.resource.EJBBookResource;
import org.jboss.resteasy.test.cdi.basic.resource.EJBBookWriterImpl;
import org.jboss.resteasy.test.cdi.basic.resource.EJBLocalResource;
import org.jboss.resteasy.test.cdi.basic.resource.EJBRemoteResource;
import org.jboss.resteasy.test.cdi.basic.resource.EJBResourceParent;
import org.jboss.resteasy.test.cdi.util.Constants;
import org.jboss.resteasy.test.cdi.util.Counter;
import org.jboss.resteasy.test.cdi.util.Utilities;
import org.jboss.resteasy.test.cdi.util.UtilityProducer;
import org.jboss.resteasy.util.HttpResponseCodes;
import org.jboss.resteasy.utils.PermissionUtil;
import org.jboss.resteasy.utils.PortProviderUtil;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.inject.Inject;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import java.lang.reflect.ReflectPermission;
import java.util.Hashtable;
import java.util.PropertyPermission;
import static org.junit.Assert.assertEquals;
/**
* @tpSubChapter CDI
* @tpChapter Integration tests
* @tpTestCaseDetails EJB and RESTEasy integration test.
* @tpSince RESTEasy 3.0.16
*/
@RunWith(Arquillian.class)
public class EJBTest {
private static Logger log = Logger.getLogger(EJBTest.class);
@Inject
EJBLocalResource localResource;
/**
* value of DEPLOYMENT_NAME is also used in ejbtest_web.xml file
*/
public static final String DEPLOYMENT_NAME = "resteasy-ejb-test";
private Client client;
@Deployment
public static Archive<?> createTestArchive() {
WebArchive war = ShrinkWrap.create(WebArchive.class, DEPLOYMENT_NAME + ".war");
// test needs to use special annotations in Application class, TestApplication class could not be used
war.addClass(EJBApplication.class);
war.addClass(PortProviderUtil.class);
war.addClasses(EJBBook.class, Constants.class, Counter.class, UtilityProducer.class, Utilities.class)
.addClasses(EJBBookReader.class, EJBBookReaderImpl.class)
.addClasses(EJBBookWriterImpl.class)
.addClasses(EJBResourceParent.class, EJBLocalResource.class, EJBRemoteResource.class, EJBBookResource.class)
.setWebXML(EJBTest.class.getPackage(), "ejbtest_web.xml")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
// Arquillian in the deployment
war.addAsManifestResource(PermissionUtil.createPermissionsXmlAsset(new ReflectPermission("suppressAccessChecks"),
new RuntimePermission("accessDeclaredMembers"),
new PropertyPermission("arquillian.*", "read")), "permissions.xml");
return war;
}
private String generateURL(String path) {
return PortProviderUtil.generateURL(path, DEPLOYMENT_NAME);
}
/**
* client needs to be non-static. BeforeClass and AfterClass methods are not executed on server (@RunAsClient annotation is not used).
*/
@Before
public void init() {
client = ClientBuilder.newClient();
}
@After
public void close() {
client.close();
}
/**
* @tpTestDetails Verify that EJBBookReaderImpl, EJBBookWriterImpl, and EJBBookResource
* are placed in the correct scope.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyScopesJaxRs() throws Exception {
log.info("starting testVerifyScopesJaxRs()");
WebTarget base = client.target(generateURL("/verifyScopes/"));
Response response = base.request().get();
assertEquals("Wrong response status", HttpResponseCodes.SC_OK, response.getStatus());
assertEquals("Wrong response content", HttpResponseCodes.SC_OK, response.readEntity(Integer.class).intValue());
}
/**
* @tpTestDetails Verify that EJBBookReaderImpl, EJBBookWriterImpl, and EJBBookResource
* are placed in the correct scope on local.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyScopesLocalEJB() throws Exception {
log.info("starting testVerifyScopesLocalEJB()");
int result = localResource.verifyScopes();
assertEquals(HttpResponseCodes.SC_OK, result);
}
/**
* @tpTestDetails Verify that EJBBookReaderImpl, EJBBookWriterImpl, and EJBBookResource
* are placed in the correct scope on remote.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyScopesRemoteEJB() throws Exception {
log.info("starting testVerifyScopesRemoteEJB()");
// Get proxy to JAX-RS resource as EJB.
EJBRemoteResource remoteResource = getRemoteResource();
log.info("remote: " + remoteResource);
int result = remoteResource.verifyScopes();
log.info("result: " + result);
assertEquals(HttpResponseCodes.SC_OK, result);
}
/**
* @tpTestDetails Verify that EJBBookReader and EJBBookWriterImpl are correctly injected
* into EJBBookResource.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyInjectionJaxRs() throws Exception {
log.info("starting testVerifyInjectionJaxRs()");
WebTarget base = client.target(generateURL("/verifyInjection/"));
Response response = base.request().get();
assertEquals("Wrong response status", HttpResponseCodes.SC_OK, response.getStatus());
assertEquals("Wrong response content", HttpResponseCodes.SC_OK, response.readEntity(Integer.class).intValue());
}
/**
* @tpTestDetails Verify that EJBBookReader and EJBBookWriterImpl are correctly injected
* into EJBBookResource.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyInjectionLocalEJB() throws Exception {
log.info("starting testVerifyInjectionLocalEJB()");
int result = localResource.verifyInjection();
log.info("testVerifyInjectionLocalEJB result: " + result);
assertEquals(HttpResponseCodes.SC_OK, result);
}
/**
* @tpTestDetails Verify that EJBBookReader and EJBBookWriterImpl are correctly injected
* into EJBBookResource.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testVerifyInjectionRemoteEJB() throws Exception {
log.info("starting testVerifyInjectionRemoteEJB()");
// Get proxy to JAX-RS resource as EJB.
EJBRemoteResource remoteResource = getRemoteResource();
log.info("remote: " + remoteResource);
int result = remoteResource.verifyInjection();
log.info("result: " + result);
assertEquals(HttpResponseCodes.SC_OK, result);
}
/**
* @tpTestDetails Further addresses the use of EJBs as JAX-RS components.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testAsJaxRSResource() throws Exception {
log.info("entering testAsJaxRSResource()");
// Create book.
WebTarget base = client.target(generateURL("/create/"));
EJBBook book1 = new EJBBook("RESTEasy: the Sequel");
Response response = base.request().post(Entity.entity(book1, Constants.MEDIA_TYPE_TEST_XML));
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
int id1 = response.readEntity(int.class);
log.info("id: " + id1);
assertEquals("Wrong id of Book1 id", Counter.INITIAL_VALUE, id1);
// Create another book.
EJBBook book2 = new EJBBook("RESTEasy: It's Alive");
response = base.request().post(Entity.entity(book2, Constants.MEDIA_TYPE_TEST_XML));
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
int id2 = response.readEntity(int.class);
log.info("id: " + id2);
assertEquals("Wrong id of Book2 id", Counter.INITIAL_VALUE + 1, id2);
// Retrieve first book.
base = client.target(generateURL("/book/" + id1));
response = base.request().accept(Constants.MEDIA_TYPE_TEST_XML).get();
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
EJBBook result = response.readEntity(EJBBook.class);
log.info("book: " + book1);
assertEquals("Wrong book1 received from server", book1, result);
// Retrieve second book.
base = client.target(generateURL("/book/" + id2));
response = base.request().accept(Constants.MEDIA_TYPE_TEST_XML).get();
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
result = response.readEntity(EJBBook.class);
log.info("book: " + book2);
assertEquals("Wrong book2 received from server", book2, result);
// Verify that EJBBookReader and EJBBookWriter have been used, twice on each side.
base = client.target(generateURL("/uses/4"));
response = base.request().get();
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
response.close();
// Reset counter.
base = client.target(generateURL("/reset"));
response = base.request().get();
log.info("Status: " + response.getStatus());
assertEquals(HttpResponseCodes.SC_NO_CONTENT, response.getStatus());
response.close();
}
/**
* @tpTestDetails Invokes additional methods of JAX-RS resource as local EJB.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testAsLocalEJB() throws Exception {
log.info("entering testAsLocalEJB()");
// Create book.
EJBBook book1 = new EJBBook("RESTEasy: the Sequel");
int id1 = localResource.createBook(book1);
log.info("id1: " + id1);
assertEquals("Wrong id of Book1 id", Counter.INITIAL_VALUE, id1);
// Create another book.
EJBBook book2 = new EJBBook("RESTEasy: It's Alive");
int id2 = localResource.createBook(book2);
log.info("id2: " + id2);
assertEquals("Wrong id of Book2 id", Counter.INITIAL_VALUE + 1, id2);
// Retrieve first book.
EJBBook bookResponse1 = localResource.lookupBookById(id1);
log.info("book1 response: " + bookResponse1);
assertEquals("Wrong book1 received from server", book1, bookResponse1);
// Retrieve second book.
EJBBook bookResponse2 = localResource.lookupBookById(id2);
log.info("book2 response: " + bookResponse2);
assertEquals("Wrong book2 received from server", book2, bookResponse2);
// Verify that EJBBookReader and EJBBookWriter haven't been used.
localResource.testUse(0);
// Reset counter.
localResource.reset();
}
/**
* @tpTestDetails Invokes additional methods of JAX-RS resource as remote EJB.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testAsRemoteEJB() throws Exception {
log.info("entering testAsRemoteEJB()");
// Get proxy to JAX-RS resource as EJB.
EJBRemoteResource remoteResource = getRemoteResource();
log.info("remote: " + remoteResource);
// Create book.
EJBBook book1 = new EJBBook("RESTEasy: the Sequel");
int id1 = remoteResource.createBook(book1);
log.info("id1: " + id1);
assertEquals("Wrong id of Book1 id", Counter.INITIAL_VALUE, id1);
// Create another book.
EJBBook book2 = new EJBBook("RESTEasy: It's Alive");
int id2 = remoteResource.createBook(book2);
log.info("id2: " + id2);
assertEquals("Wrong id of Book2 id", Counter.INITIAL_VALUE + 1, id2);
// Retrieve first book.
EJBBook bookResponse1 = remoteResource.lookupBookById(id1);
log.info("book1 response: " + bookResponse1);
assertEquals("Wrong book1 received from server", book1, bookResponse1);
// Retrieve second book.
EJBBook bookResponse2 = remoteResource.lookupBookById(id2);
log.info("book2 response: " + bookResponse2);
assertEquals("Wrong book2 received from server", book2, bookResponse2);
// Verify that EJBBookReader and EJBBookWriter haven't been used.
remoteResource.testUse(0);
// Reset counter.
remoteResource.reset();
}
private static EJBRemoteResource getRemoteResource() throws Exception {
final Hashtable<String, String> jndiProperties = new Hashtable<>();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
String name = "ejb:/" + DEPLOYMENT_NAME + "/EJBBookResource!" + EJBRemoteResource.class.getName();
return EJBRemoteResource.class.cast(context.lookup(name));
}
}