package org.jacorb.test.dii; import org.jacorb.orb.Delegate; import org.jacorb.orb.giop.ClientConnection; import org.jacorb.orb.giop.ClientConnectionManager; import org.jacorb.test.BasicServer; import org.jacorb.test.dii.DIIServerPackage.DIIException; import org.jacorb.test.dii.DIIServerPackage.DIIExceptionHelper; import org.jacorb.test.harness.ClientServerSetup; import org.jacorb.test.harness.ClientServerTestCase; import org.jacorb.test.harness.TestUtils; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.omg.CORBA.*; import org.omg.CORBA.Object; import org.omg.ETF.Profile; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; 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 static org.junit.Assert.fail; /** * converted from demo.dii * * @author Alphonse Bendt */ public class DiiTest extends ClientServerTestCase { private org.omg.CORBA.Object server; private org.omg.CORBA.ORB orb; @BeforeClass public static void beforeClassSetUp() throws Exception { Properties props = new Properties(); setup = new ClientServerSetup(DynamicServer.class.getName(), props, props); } @Before public void setUp() throws Exception { server = setup.getServerObject(); orb = setup.getClientOrb(); } @After public void tearDown() throws Exception { server = null; orb = null; } @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); } @Test public void testDiiSimpleMultiThread() throws Exception { final int SIZE = 2; ExecutorService executor = Executors.newFixedThreadPool(SIZE); class SimpleRequestor implements Callable<Integer> { org.omg.CORBA.Object server; SimpleRequestor(org.omg.CORBA.Object server) { this.server = server; } @Override public Integer call() throws Exception { int result = 0; for (int i = 0; i < 100; ++i) { TestUtils.getLogger().debug(this.toString() + ": iteration " + i); org.omg.CORBA.Request request = null; 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()); result = request.return_value().extract_long(); } return result; } } try { List<Future<Integer>> list = new ArrayList<Future<Integer>>(); for (int i = 0; i < SIZE; i++) { list.add(executor.submit(new SimpleRequestor(server))); } for (Future<Integer> b : list) { assertEquals(b.get().intValue(), 47); } } finally { executor.shutdown(); } } }