package org.jacorb.test.orb;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import junit.framework.AssertionFailedError;
import org.jacorb.orb.CDROutputStream;
import org.jacorb.orb.ExceptionHolderImpl;
import org.jacorb.test.AMI_CallbackServerHandler;
import org.jacorb.test.AMI_CallbackServerHandlerOperations;
import org.jacorb.test.AMI_CallbackServerHandlerPOATie;
import org.jacorb.test.CallbackServer;
import org.jacorb.test.CallbackServerHelper;
import org.jacorb.test.EmptyException;
import org.jacorb.test.NonEmptyException;
import org.jacorb.test._CallbackServerStub;
import org.jacorb.test.harness.CallbackTestCase;
import org.jacorb.test.harness.ClientServerSetup;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.omg.CORBA.UserException;
import org.omg.Messaging.ExceptionHolder;
public class CallbackTest extends CallbackTestCase
{
private CallbackServer server;
private static final char EURO_SIGN = '\u20AC'; // not a CORBA char
@Before
public void setUp() throws Exception
{
server = CallbackServerHelper.narrow( setup.getServerObject() );
}
@BeforeClass
public static void beforeClassSetUp() throws Exception
{
setup = new ClientServerSetup( "org.jacorb.test.orb.CallbackServerImpl" );
}
private class ReplyHandler
extends CallbackTestCase.ReplyHandler
implements AMI_CallbackServerHandlerOperations
{
public void delayed_ping_excep(ExceptionHolder excep_holder)
{
wrong_exception( "delayed_ping_excep", excep_holder );
}
public void delayed_ping()
{
wrong_reply( "delayed_ping" );
}
public void operation_excep(ExceptionHolder excep_holder)
{
wrong_exception( "operation_excep", excep_holder );
}
public void operation(int ami_return_val, char p1, int p2)
{
wrong_reply( "operation" );
}
public void pass_in_char_excep(ExceptionHolder excep_holder)
{
wrong_exception( "pass_in_char_excep", excep_holder );
}
public void pass_in_char()
{
wrong_reply( "pass_in_char" );
}
public void ping_excep(ExceptionHolder excep_holder)
{
wrong_exception( "ping_excep", excep_holder );
}
public void ping()
{
wrong_reply( "ping" );
}
public void return_char_excep(ExceptionHolder excep_holder)
{
wrong_exception( "return_char_excep", excep_holder );
}
public void return_char(char ami_return_val)
{
wrong_reply( "return_char" );
}
public void ex_1_excep(ExceptionHolder excep_holder)
{
wrong_exception( "ex_1_excep", excep_holder );
}
public void ex_1()
{
wrong_reply( "ex_1" );
}
public void ex_2_excep(ExceptionHolder excep_holder)
{
wrong_exception( "ex_2_excep", excep_holder );
}
public void ex_2(int ami_return_val, int p)
{
wrong_reply( "ex_2" );
}
public void ex_3_excep(ExceptionHolder excep_holder)
{
wrong_exception( "ex_3_excep", excep_holder );
}
public void ex_3()
{
wrong_reply( "ex_3" );
}
}
private AMI_CallbackServerHandler ref ( ReplyHandler handler )
{
AMI_CallbackServerHandlerPOATie tie =
new AMI_CallbackServerHandlerPOATie( handler )
{
public org.omg.CORBA.portable.OutputStream
_invoke( String method,
org.omg.CORBA.portable.InputStream _input,
org.omg.CORBA.portable.ResponseHandler handler )
throws org.omg.CORBA.SystemException
{
try
{
return super._invoke( method, _input, handler );
}
catch( AssertionFailedError e )
{
return null;
}
}
};
return tie._this( setup.getClientOrb() );
}
@Test
public void test_sync_ping()
{
server.ping();
}
@Test
public void test_ping()
{
ReplyHandler handler = new ReplyHandler()
{
public void ping()
{
pass();
}
};
( ( _CallbackServerStub ) server ).sendc_ping( ref( handler ) );
handler.wait_for_reply( 1000 );
}
@Test
public void test_delayed_ping()
{
ReplyHandler handler = new ReplyHandler()
{
public void delayed_ping()
{
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_delayed_ping( ref( handler ), 500 );
handler.wait_for_reply( 700 );
}
@Test
public void test_pass_in_char()
{
ReplyHandler handler = new ReplyHandler()
{
public void pass_in_char()
{
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_pass_in_char( ref( handler ), 'x', 100 );
handler.wait_for_reply( 200 );
}
@Test
public void test_pass_in_illegal_char()
{
ReplyHandler handler = new ReplyHandler();
try
{
( ( _CallbackServerStub ) server )
.sendc_pass_in_char( ref( handler ), EURO_SIGN, 100 );
fail( "DATA_CONVERSION exception expected" );
}
catch( org.omg.CORBA.DATA_CONVERSION ex )
{
// ok
}
}
@Test
public void test_return_char()
{
ReplyHandler handler = new ReplyHandler()
{
public void return_char( char ami_return_val )
{
this.assertEquals( 'a', ami_return_val );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_return_char( ref( handler ), ( short ) 'a', 100 );
handler.wait_for_reply( 200 );
}
@Test
public void test_return_illegal_char()
{
ReplyHandler handler = new ReplyHandler()
{
public void return_char_excep( ExceptionHolder excep_holder )
{
this.assertEquals( org.omg.CORBA.DATA_CONVERSION.class,
getException( excep_holder ).getClass() );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_return_char( ref( handler ), ( short ) EURO_SIGN, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_complex_operation()
{
ReplyHandler handler = new ReplyHandler()
{
public void operation( int ami_return_val, char p1, int p2 )
{
this.assertEquals( 'A', p1 );
this.assertEquals( 4321, p2 );
this.assertEquals( p2, ami_return_val );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_operation( ref( handler ), 'a', false, 100 );
handler.wait_for_reply( 200 );
}
@Test
public void test_empty_exception()
{
ReplyHandler handler = new ReplyHandler()
{
public void ex_1_excep( ExceptionHolder excep_holder )
{
this.assertEquals( EmptyException.class,
getException( excep_holder ).getClass() );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_ex_1( ref( handler ), true, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_empty_exception_not_raised()
{
ReplyHandler handler = new ReplyHandler()
{
public void ex_1()
{
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_ex_1( ref( handler ), false, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_non_empty_exception()
{
ReplyHandler handler = new ReplyHandler()
{
public void ex_2_excep( ExceptionHolder excep_holder )
{
Exception ex = getException( excep_holder );
if ( !(ex instanceof NonEmptyException) )
{
this.fail( "wrong exception type: " + ex );
}
else
{
NonEmptyException nex = (NonEmptyException)ex;
// The CORBA Spec and the Java Mapping are not
// entirely clear whether the "_reason" parameter
// should be marshaled along with the id.
// JacORB doesn't do it, and hence we don't check
// for it here.
// assertTrue( nex.getMessage().endsWith( " just do it" ) );
this.assertEquals( 17, nex.field1 );
this.assertEquals( "xxx", nex.field2 );
pass();
}
}
};
( ( _CallbackServerStub ) server )
.sendc_ex_2( ref( handler ), 17, true, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_either_exception_1()
{
ReplyHandler handler = new ReplyHandler()
{
public void ex_3_excep( ExceptionHolder excep_holder )
{
this.assertEquals( EmptyException.class,
getException( excep_holder ).getClass() );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_ex_3( ref( handler ), false, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_either_exception_2()
{
ReplyHandler handler = new ReplyHandler()
{
public void ex_3_excep( ExceptionHolder excep_holder )
{
this.assertEquals( NonEmptyException.class,
getException( excep_holder ).getClass() );
pass();
}
};
( ( _CallbackServerStub ) server )
.sendc_ex_3( ref( handler ), true, 100 );
handler.wait_for_reply( 500 );
}
@Test
public void test_jac492_exceptionholderlogging()
{
// This decidely hacky set of code is to provoke a rather unlikely error
// from exception holder which in turn reveals that logging has not been
// configured which throws another error.
ExceptionHolder eh = new ExceptionHolderImpl ((org.jacorb.orb.ORB)setup.getClientOrb ());
try
{
final Field fields[] = ExceptionHolder.class.getDeclaredFields();
CDROutputStream cdr = new CDROutputStream (setup.getClientOrb ());
cdr.write_string ("Dummy_id");
for (int i = 0; i < fields.length; ++i)
{
if ("marshaled_exception".equals(fields[i].getName()))
{
Field f = fields[i];
f.setAccessible(true);
f.set (eh, cdr.getBufferCopy ());
break;
}
}
cdr.close();
eh.raise_exception ();
fail ("No exception raised");
}
catch (NullPointerException e)
{
fail ("Raised a null pointer exception" + e);
}
catch (org.omg.CORBA.UnknownUserException e)
{
// Success - expected exception.
}
catch (IllegalArgumentException e)
{
fail ("Wrong exception thrown" + e);
}
catch (IllegalAccessException e)
{
fail ("Wrong exception thrown" + e);
}
catch (UserException e)
{
fail ("Wrong exception thrown" + e);
}
}
}