package org.jacorb.test.bugs.bugjac200;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Properties;
import org.jacorb.test.harness.CommonSetup;
import org.jacorb.test.harness.TestUtils;
import org.junit.After;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.omg.CORBA.ORB;
import org.omg.PortableServer.POAHelper;
/**
* <code>AcceptorExceptionListenerTest</code> tests one of the two
* forms that can cause an infinite loop with IIOPListener.
*
* <p></p>
* 1. If security has been configured but the cipher suites are invalid
* a SSLExecption is thrown. However as the server socket cannot be
* opened properly this leads to an infinite loop. The AcceptorListener
* can detect this and shutdown the ORB.
* <p></p>
* 2. Alternatively if the ORB has been built with JDK13 and JSSE but is run
* without the JSSE jars this will lead to a NoClassDefError for the
* SSL jars from the listener. This, as above, also results in an infinite
* loop.
*/
public class AcceptorExceptionListenerTest
{
@Rule
public TestName name = new TestName();
private ORB orb;
private volatile boolean orbIsDown = false;
@BeforeClass
public static void beforeClassSetUp() throws Exception
{
Assume.assumeFalse(TestUtils.is17);
}
protected Properties initORBProperties() throws Exception
{
Properties props = new Properties ();
props.putAll(CommonSetup.loadSSLProps("jsse_client_props", "jsse_client_ks"));
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
props.put("jacorb.implname",
"org.jacorb.test.bugs.bugjac200.AcceptorExceptionListenerTest");
props.put("jacorb.security.ssl.server.cipher_suites",
"SSL_RSA_WITH_RC4_128_MD5");
props.put("jacorb.security.ssl.client.cipher_suites",
"SSL_RSA_WITH_RC4_128_MD5");
props.put("jacorb.acceptor_exception_listener",
TestAcceptorExceptionListener.class.getName());
return props;
}
@Before
public void setUp() throws Exception
{
orb = ORB.init(new String[] { "-ORBID" , name.getMethodName() }, initORBProperties());
TestAcceptorExceptionListener.reset();
new Thread()
{
@Override
public void run() {
orb.run();
orbIsDown = true;
};
}.start();
}
@After
public void tearDown() throws Exception
{
orb.shutdown(false);
}
@Test
public void testListener() throws Exception
{
TestAcceptorExceptionListener.doShutdown = false;
final Exception[] exception = new Exception[1];
startAcceptor(exception);
Thread.sleep(TestUtils.getMediumTimeout());
assertNull("exception during orb start: " + exception[0], exception[0]);
assertTrue("Acceptor was not created", TestAcceptorExceptionListener.hasBeenCreated);
assertTrue("Acceptor not called", TestAcceptorExceptionListener.getHasBeenCalled(TestUtils.getMediumTimeout(), true));
assertFalse(orbIsDown);
}
@Test
public void testShutdown() throws Exception
{
TestAcceptorExceptionListener.doShutdown = true;
final Exception[] exception = new Exception[1];
startAcceptor(exception);
Thread.sleep(TestUtils.getMediumTimeout());
assertNull("exception during orb start: " + exception[0], exception[0]);
assertTrue("Listener was not created", TestAcceptorExceptionListener.hasBeenCreated);
assertTrue("Listener was not invoked", TestAcceptorExceptionListener.getHasBeenCalled(TestUtils.getMediumTimeout(), true));
assertTrue("ORB was not shutdown", orbIsDown);
}
/**
* access the RootPOA thereby causing the Acceptors to be started
*/
private void startAcceptor(final Exception[] exception)
{
new Thread()
{
@Override
public void run()
{
try
{
//init POA
POAHelper.narrow(orb.resolve_initial_references( "RootPOA" ));
}
catch (Exception e)
{
exception[0] = e;
}
}
}.start();
}
}