package org.sdif4j.testing.cdi;
import org.sdif4j.InjectContext;
import org.sdif4j.cdi.CdiInjectContext;
import org.sdif4j.testing.TestEagerSingleton;
import org.sdif4j.testing.TestLazySingleton;
import org.sdif4j.testing.TestPrototype;
import org.sdif4j.testing.TestSingleton;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.testng.Assert.*;
/**
* TODO: this is simple manual test
* required to be refactored as standalone testng-based
*/
public class TestServlet extends HttpServlet {
@Inject
private BeanManager beanManager;
@Inject
private InjectContext injectContext;
@Inject
private InjectContext injectContext1;
@Inject
@Named("key")
private String testKey;
private final AtomicBoolean firstCall = new AtomicBoolean(true);
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected synchronized void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final boolean first = firstCall.compareAndSet(true, false);
resp.setContentType("text/plain");
final PrintWriter pw = resp.getWriter();
try {
pw.println("testAutoInject");
testAutoInject();
pw.println("testInjectContextInstance");
testInjectContextInstance();
pw.println("testNamed");
testNamed();
pw.println("testSingleton");
testSingleton(first);
pw.println("testLazySingleton");
testLazySingleton(first);
pw.println("testPrototype");
testPrototype();
pw.println("testInjectMembers");
testInjectMembers();
} catch (Throwable e) {
e.printStackTrace(pw);
}
}
// @Test
public void testAutoInject() {
assertEquals(testKey, "value");
}
// @Test
public void testInjectContextInstance() {
final InjectContext injectContext = this.injectContext;
assertTrue(injectContext instanceof CdiInjectContext);
assertTrue(this.injectContext.getInstance(InjectContext.class) == injectContext);
assertTrue(this.injectContext1 == injectContext);
final BeanManager beanManager = this.injectContext.getInstance(BeanManager.class);
assertTrue(this.beanManager == beanManager);
final BeanManager lookup = CdiInjectContext.lookupBeanManager();
// assertTrue(lookup.equals(beanManager));
}
// @Test
public void testNamed() {
assertEquals(injectContext.getInstance(String.class, "key"), "value");
}
// @Test
public void testSingleton(boolean first) {
assertEquals(TestEagerSingleton.getInstantCount(), first ? 0 : 1);
final TestSingleton is1 = injectContext.getInstance(TestSingleton.class);
final TestSingleton is2 = injectContext.getInstance(TestSingleton.class);
final TestEagerSingleton s1 = injectContext.getInstance(TestEagerSingleton.class);
final TestEagerSingleton s2 = injectContext.getInstance(TestEagerSingleton.class);
assertEquals(TestEagerSingleton.getInstantCount(), 1);
assertNotNull(is1);
assertTrue(is1 == is2);
assertTrue(is2 == s1);
assertTrue(s1 == s2);
}
// @Test
public void testLazySingleton(boolean first) {
assertEquals(TestLazySingleton.getInstantCount(), first ? 0 : 1);
final TestLazySingleton s1 = injectContext.getInstance(TestLazySingleton.class);
final TestLazySingleton s2 = injectContext.getInstance(TestLazySingleton.class);
assertEquals(TestLazySingleton.getInstantCount(), 1);
assertNotNull(s1);
assertTrue(s1 == s2);
}
// @Test
public void testPrototype() {
final TestPrototype testPrototype1 = injectContext.getInstance(TestPrototype.class);
final TestPrototype testPrototype2 = injectContext.getInstance(TestPrototype.class);
assertNotNull(testPrototype1);
assertNotNull(testPrototype2);
assertTrue(testPrototype1 != testPrototype2);
}
// @Test
public void testInjectMembers() {
class TestInjectable {
@Inject
@Named("key")
String testKey;
}
final TestInjectable testInjectable = new TestInjectable();
injectContext.injectMembers(testInjectable);
assertEquals(testInjectable.testKey, "value");
}
}