package org.jacorb.test.dii; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; import java.util.HashMap; import org.jacorb.config.Configurable; import org.jacorb.orb.Delegate; import org.jacorb.orb.giop.ClientConnection; import org.jacorb.orb.giop.ClientConnectionManager; import org.jacorb.test.dii.DIIServerPackage.DIIException; import org.jacorb.test.dii.DIIServerPackage.DIIExceptionHelper; import org.jacorb.test.harness.ORBTestCase; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.omg.CORBA.Any; import org.omg.CORBA.BAD_INV_ORDER; import org.omg.CORBA.BAD_PARAM; import org.omg.CORBA.BAD_PARAMHelper; import org.omg.CORBA.WrongTransaction; import org.omg.ETF.Profile; /** * converted from demo.dii * * @author Alphonse Bendt */ public class DiiLocalTest extends ORBTestCase { private org.omg.CORBA.Object server; @Before public void setUp() throws Exception { DynamicServer ds = new DynamicServer(); ((Configurable)ds).configure (((org.jacorb.orb.ORB)orb).getConfiguration()); server = rootPOA.servant_to_reference(ds); } @After public void tearDown() throws Exception { server._release(); } @Test public void testSimpleRequest() { org.omg.CORBA.Request request = server._request("_get_long_number"); request.set_return_type( orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long)); request.invoke(); assertNull(request.env().exception()); assertEquals(47, request.return_value().extract_long()); } @Test public void testRequestConnectionClosed() throws Exception { org.omg.CORBA.Request request = server._request("_get_long_number"); request.set_return_type( orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long)); request.invoke(); server._release(); Field fconnmgr = Delegate.class.getDeclaredField("conn_mg"); fconnmgr.setAccessible(true); Delegate d = (Delegate) ((org.omg.CORBA.portable.ObjectImpl)server)._get_delegate(); ClientConnectionManager ccm = (ClientConnectionManager) fconnmgr.get(d); Field connections = ClientConnectionManager.class.getDeclaredField("connections"); connections.setAccessible(true); @SuppressWarnings("unchecked") HashMap<Profile, ClientConnection> c = (HashMap<Profile, ClientConnection>) connections.get(ccm); assertTrue (c.size() == 0); } @Test (expected = BAD_INV_ORDER.class) public void testDoubleInvoke() { org.omg.CORBA.Request request = server._request("_get_long_number"); request.set_return_type( orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long)); request.invoke(); request.invoke(); } @Test public void testRepositoryId() { org.omg.CORBA.Request request = server._request("_repository_id"); request.set_return_type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_string )); request.invoke(); assertNull(request.env().exception()); assertEquals("IDL:org/jacorb/test/dii/DIIServer:1.0", request.return_value().extract_string()); } @Test public void testRequestWithOutArgs() { org.omg.CORBA.Request request = server._request("add"); request.add_in_arg().insert_long( 3 ); request.add_in_arg().insert_long( 4 ); org.omg.CORBA.Any out_arg = request.add_out_arg(); out_arg.type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_long) ); request.set_return_type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_void)); request.invoke(); assertNull(request.env().exception()); assertEquals(7, out_arg.extract_long()); } @Test public void testSimpleRequestWithStringArgumentOneway() { org.omg.CORBA.Request request = server._request("notify"); request.add_in_arg().insert_string("hallo"); request.send_oneway(); } @Test public void testRequestWithReturnValue() { org.omg.CORBA.Request request = server._request("writeNumber"); request.add_in_arg().insert_long( 5 ); request.set_return_type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_string )); request.invoke(); assertNull(request.env().exception()); assertEquals("Number written", request.return_value().extract_string()); } @Test public void testDeferredAsyncOperationSyncWithResult() throws Exception { final boolean[] success = new boolean[1]; final Exception[] exception = new Exception[1]; final org.omg.CORBA.Request request = server._request("writeNumber"); request.add_in_arg().insert_long( 5 ); request.set_return_type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_string )); request.send_deferred(); Thread syncWithResult = new Thread() { @Override public void run() { try { request.get_response(); success[0] = true; } catch (WrongTransaction e) { exception[0] = e; } } }; syncWithResult.start(); syncWithResult.join(5000); assertNull(exception[0]); assertTrue("unable to sync with result within 5sec", success[0]); assertNull(request.env().exception()); assertEquals("Number written", request.return_value().extract_string()); } @Test public void testPollingUntilResponse() { long timeout = System.currentTimeMillis() + 5000; org.omg.CORBA.Request request = server._request("writeNumber"); request.add_in_arg().insert_long( 5 ); request.set_return_type( orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_string )); request.send_deferred(); while( ! request.poll_response() && System.currentTimeMillis() < timeout) { try { Thread.sleep(100); } catch ( InterruptedException i){ // ignored } } assertNull(request.env().exception()); assertEquals("Number written", request.return_value().extract_string()); } @Test public void testReMarshalException() { Any any = orb.create_any(); final String string = "bla bla bla"; DIIException ex = new DIIException(string); DIIExceptionHelper.insert(any, ex); DIIException ex2 = DIIExceptionHelper.extract(any); assertEquals(string, ex2.why); } @Test public void testSendRequestWhichCausesAnException() throws Exception { org.omg.CORBA.Request request = server._request("raiseException"); org.omg.CORBA.ExceptionList exceptions = request.exceptions(); org.omg.CORBA.TypeCode typeCode = orb.create_exception_tc( DIIExceptionHelper.id(), "e", new org.omg.CORBA.StructMember[]{ new org.omg.CORBA.StructMember( "why", orb.create_string_tc(0), null) } ); exceptions.add( typeCode ); request.invoke(); Exception exception = request.env().exception(); assertNotNull(exception); org.omg.CORBA.Any any = ((org.omg.CORBA.UnknownUserException) exception).except; DIIException ex = DIIExceptionHelper.extract(any); assertEquals("TestException", ex.why); } @Test public void testSendRequestWhichCausesASystemException() throws Exception { org.omg.CORBA.Request request = server._request("raiseSystemException"); request.add_in_arg().insert_boolean(false); request.invoke(); Exception exception = request.env().exception(); assertNotNull(exception); assertTrue (exception instanceof BAD_PARAM); } @Test public void testSendRequestWhichCausesAWrappedSystemException() throws Exception { org.omg.CORBA.Request request = server._request("raiseSystemException"); request.add_in_arg().insert_boolean(true); org.omg.CORBA.ExceptionList exceptions = request.exceptions(); org.omg.CORBA.TypeCode typeCode = BAD_PARAMHelper.type(); exceptions.add( typeCode ); request.invoke(); Exception exception = request.env().exception(); assertNotNull(exception); org.omg.CORBA.Any any = ((org.omg.CORBA.UnknownUserException) exception).except; BAD_PARAM ex = BAD_PARAMHelper.extract(any); assertTrue (ex != null); } }