/*
* Copyright (C) The Community OpenORB Project. All rights reserved.
*
* This software is published under the terms of The OpenORB Community Software
* License version 1.0, a copy of which has been included with this distribution
* in the LICENSE.txt file.
*/
package org.openorb.orb.test.pi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Properties;
import junit.framework.TestSuite;
import org.jacorb.test.harness.ORBTestCase;
import org.junit.After;
import org.junit.Test;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.NO_RESOURCES;
import org.omg.CORBA.Policy;
import org.omg.CORBA.UNKNOWN;
import org.omg.PortableInterceptor.Current;
import org.omg.PortableServer.ImplicitActivationPolicyValue;
import org.omg.PortableServer.POA;
import org.openorb.orb.test.adapter.poa.Hello;
import org.openorb.orb.test.adapter.poa.HelloHelper;
import org.openorb.orb.test.adapter.poa.HelloPOA;
/**
* Tests marshaling and unmarshaling of various iiop types.
*
* @author Chris Wood
*/
public class PITest extends ORBTestCase
{
private Hello svrRef = null;
private Hello m_cltRef = null;
private static final int SEND_REQ = 0x1;
private static final int SEND_POLL = 0x2;
private static final int SEND_SC = 0x8;
private static final int RECV_REQSC = 0x10;
private static final int RECV_REQ = 0x20;
private static final int RECV_SC = 0x80;
private static final int SEND_REPL = 0x100;
private static final int SEND_EXPT = 0x200;
private static final int SEND_OTHR = 0x400;
private static final int SEND_REPL_SC = 0x800;
private static final int RECV_REPL = 0x1000;
private static final int RECV_EXPT = 0x2000;
private static final int RECV_OTHR = 0x4000;
private static final int RECV_REPL_SC = 0x8000;
private static final int NOR_PATH = SEND_REQ | RECV_REQSC | RECV_REQ | SEND_REPL | RECV_REPL;
private static final int NOR_SC = SEND_SC | RECV_SC | SEND_REPL_SC | RECV_REPL_SC;
private static final int TEST_SCID = 0x444f7F01;
private static int s_throwExcept;
private static int s_visitMask;
private static int s_slotID;
private static org.omg.CORBA.Any s_any;
private void init ()
{
try
{
Policy [] pols = new Policy [1];
pols[0] = rootPOA.create_implicit_activation_policy
(ImplicitActivationPolicyValue.IMPLICIT_ACTIVATION);
POA newPOA = rootPOA.create_POA ("NewPOA",
rootPOA.the_POAManager (),
pols);
svrRef = ( new HelloImpl (newPOA))._this (orb);
m_cltRef = HelloHelper.narrow (svrRef);
s_any = orb.create_any();
s_any.insert_boolean (true);
s_slotID = 0;
s_visitMask = 0;
s_throwExcept = 0;
}
catch ( org.omg.CORBA.UserException ex )
{
fail( "exception during setup:" + ex.toString() );
}
}
@Override
protected void patchORBProperties (Properties props) throws Exception
{
props.setProperty( "org.omg.PortableInterceptor.ORBInitializerClass."
+ EmptyInitializer.class.getName(), "" );
props.setProperty ("jacorb.codeSet", "on");
props.setProperty ("org.omg.PortableInterceptor.ORBInitializerClass.standard_init",
"org.jacorb.orb.standardInterceptors.IORInterceptorInitializer");
}
@After
public void tearDown() throws Exception
{
svrRef._release ();
m_cltRef._release ();
svrRef = null;
m_cltRef = null;
}
/**
* Test complete request call.
*/
@Test
public void testCompleteCall()
{
init ();
s_throwExcept = 0;
try
{
m_cltRef.hello_op( "A Message from testCompleteCall()..." );
}
catch (UNKNOWN ex )
{
// The PI throws this exception by intention
}
assertEquals( "Complete call did not visit all interception points.",
NOR_PATH,
s_visitMask);
}
/**
* Test complete request call with service contexts.
*
* @exception org.omg.CORBA.UserException if any of the test cases fails
*/
@Test
public void testCompleteCallWithSCs()
throws org.omg.CORBA.UserException
{
init ();
s_throwExcept = 0;
Current curr = (Current) orb.resolve_initial_references ("PICurrent");
curr.set_slot( s_slotID, s_any );
try
{
m_cltRef.hello_op( "A message from testCompleteCallWithSCs()..." );
}
catch ( UNKNOWN ex )
{
// The PI throws this exception by intention
}
assertEquals( "Complete call did not visit all interception points.",
NOR_PATH | NOR_SC,
s_visitMask);
}
/**
* Abort at send_request.
*/
@Test
public void testToSendRequest()
{
init ();
s_throwExcept = SEND_REQ;
try
{
m_cltRef.hello_op( "A message from testToSendRequest()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
SEND_REQ,
ex.minor );
}
}
/**
* Abort at receive_request_service_contexts.
*/
@Test
public void testToRecvRequestSC()
{
init ();
s_throwExcept = RECV_REQSC;
try
{
m_cltRef.hello_op( "A message from testToRecvRequestSC()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ | RECV_REQSC | RECV_EXPT,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
RECV_REQSC,
ex.minor);
}
}
/**
* Abort at receive_request_service_contexts and recieve_exception.
*/
@Test
public void testToRecvRequestSCReceiveException()
{
init ();
s_throwExcept = RECV_REQSC | RECV_EXPT;
try
{
m_cltRef.hello_op( "A message from testToRecvRequestSCReceiveException()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ | RECV_REQSC | RECV_EXPT ,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
RECV_REQSC | RECV_EXPT,
ex.minor);
}
}
/**
* Abort at receive_request.
*/
@Test
public void testToRecvRequest()
{
init ();
s_throwExcept = RECV_REQ;
try
{
m_cltRef.hello_op( "A message from testToRecvRequest()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ | RECV_REQSC | RECV_REQ | SEND_EXPT | RECV_EXPT,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
RECV_REQ,
ex.minor);
}
}
/**
* Abort at receive_request and recieve_exception.
*/
@Test
public void testToRecvRequestRecvExcept()
{
init ();
s_throwExcept = RECV_REQ | RECV_EXPT;
try
{
m_cltRef.hello_op( "A message from testToRecvRequestRecvExcept()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ | RECV_REQSC | RECV_REQ | SEND_EXPT | RECV_EXPT ,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
RECV_REQ | RECV_EXPT,
ex.minor);
}
}
/**
* Abort at send_reply.
*/
@Test
public void testToSendReply()
{
init ();
s_throwExcept = SEND_REPL;
try
{
m_cltRef.hello_op( "A message from testToSendReply()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
SEND_REQ | RECV_REQSC | RECV_REQ | SEND_REPL | RECV_EXPT,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
SEND_REPL,
ex.minor);
}
}
/**
* Abort at send_reply.
*/
@Test
public void testToRecvReply()
{
init();
s_throwExcept = RECV_REPL;
try
{
m_cltRef.hello_op( "A message from testToRecvReply()..." );
fail( "expected exception" );
}
catch ( UNKNOWN ex )
{
assertEquals( "Complete call did not visit all interception points.",
NOR_PATH,
s_visitMask);
assertEquals( "Exception thrown in wrong place",
RECV_REPL,
ex.minor);
}
}
static class HelloImpl
extends HelloPOA
{
private POA m_poa;
HelloImpl( POA poa )
{
m_poa = poa;
}
@Override
public void hello_op( String msg )
{
}
@Override
public POA _default_POA()
{
return m_poa;
}
}
/**
* An empty ORB initializer class.
*/
public static class EmptyInitializer
extends org.omg.CORBA.LocalObject
implements org.omg.PortableInterceptor.ORBInitializer
{
/**
* Called before init of the actual ORB.
*
* @param info The ORB init info.
*/
@Override
public void pre_init( org.omg.PortableInterceptor.ORBInitInfo info )
{
try
{
s_slotID = info.allocate_slot_id();
info.add_server_request_interceptor( new EmptyServerInterceptor() );
info.add_client_request_interceptor( new EmptyClientInterceptor() );
info.add_ior_interceptor( new EmptyIORInterceptor() );
}
catch ( org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName ex )
{
fail( "unexpected exception received: " + ex );
}
}
/**
* Called after init of the actual ORB.
*
* @param info The ORB init info.
*/
@Override
public void post_init( org.omg.PortableInterceptor.ORBInitInfo info )
{
}
}
static class EmptyIORInterceptor
extends org.omg.CORBA.LocalObject
implements org.omg.PortableInterceptor.IORInterceptor
{
@Override
public String name()
{
return "";
}
@Override
public void destroy()
{
}
@Override
public void establish_components (org.omg.PortableInterceptor.IORInfo info)
{
info.add_ior_component (new org.omg.IOP.TaggedComponent (TEST_SCID, new byte[ 0 ]));
}
}
static class EmptyClientInterceptor
extends org.omg.CORBA.LocalObject
implements org.omg.PortableInterceptor.ClientRequestInterceptor
{
@Override
public String name()
{
return "";
}
@Override
public void destroy()
{
}
@Override
public void send_request( org.omg.PortableInterceptor.ClientRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = SEND_REQ;
if ( s_throwExcept == SEND_REQ )
{
throw new UNKNOWN( SEND_REQ,
CompletionStatus.COMPLETED_NO );
}
// add service context.
try
{
ri.get_slot (s_slotID);
ri.get_slot (s_slotID).type ();
ri.get_slot (s_slotID).type ().kind ();
if ( ri.get_slot( s_slotID ).type().kind() != org.omg.CORBA.TCKind.tk_null )
{
ri.add_request_service_context( new org.omg.IOP.ServiceContext( TEST_SCID,
new byte[ 0 ] ),
true );
s_visitMask = s_visitMask | SEND_SC;
}
}
catch ( org.omg.PortableInterceptor.InvalidSlot ex )
{
fail( ex.toString() );
}
// request information.
ri.request_id();
assertEquals( "Operation name not correct", "hello_op", ri.operation());
assertTrue( "No response expected for request with response",
ri.response_expected() );
assertEquals( "Incorrect sync scope", 3, ri.sync_scope() );
// target information
ri.target();
ri.effective_target();
ri.effective_profile();
ri.get_effective_component( org.omg.IOP.TAG_CODE_SETS.value );
ri.get_effective_components( org.omg.IOP.TAG_CODE_SETS.value );
try
{
ri.arguments();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.exceptions();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.contexts();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.operation_context();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
}
@Override
public void send_poll( org.omg.PortableInterceptor.ClientRequestInfo ri )
{
s_visitMask = s_visitMask | SEND_POLL;
if ( ( s_throwExcept & SEND_POLL ) != 0 )
{
throw new UNKNOWN( SEND_POLL,
CompletionStatus.COMPLETED_YES );
}
}
@Override
public void receive_reply (org.omg.PortableInterceptor.ClientRequestInfo ri )
{
s_visitMask = s_visitMask | RECV_REPL;
if ( 0 != ( s_throwExcept & RECV_REPL ) )
{
throw new UNKNOWN( RECV_REPL,
CompletionStatus.COMPLETED_YES );
}
try
{
ri.get_reply_service_context( TEST_SCID );
s_visitMask = s_visitMask | RECV_REPL_SC;
}
catch ( org.omg.CORBA.BAD_PARAM ex )
{
/**
* If a reply_service_context is not found for the request then
* a BAD_PARAM is thrown. This is OK for tests that don't have a
* service context but not for tests where a service context should
* have been found.
*/
}
try
{
ri.result();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request results. These will always fail
}
}
@Override
public void receive_other( org.omg.PortableInterceptor.ClientRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | RECV_OTHR;
if ( 0 != ( s_throwExcept & RECV_OTHR ) )
{
throw new UNKNOWN( RECV_OTHR,
CompletionStatus.COMPLETED_YES );
}
}
@Override
public void receive_exception( org.omg.PortableInterceptor.ClientRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | RECV_EXPT;
if ( ri.received_exception_id().equals( org.omg.CORBA.UNKNOWNHelper.id() )
&& 0 != ( s_throwExcept & RECV_EXPT ) )
{
UNKNOWN uex = org.omg.CORBA.UNKNOWNHelper.extract(
ri.received_exception() );
uex.minor = uex.minor | RECV_EXPT;
throw uex;
}
}
}
static class EmptyServerInterceptor
extends org.omg.CORBA.LocalObject
implements org.omg.PortableInterceptor.ServerRequestInterceptor
{
@Override
public java.lang.String name()
{
return "";
}
@Override
public void destroy()
{
}
@Override
public void receive_request_service_contexts(
org.omg.PortableInterceptor.ServerRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | RECV_REQSC;
if ( 0 != ( s_throwExcept & RECV_REQSC ) )
{
throw new UNKNOWN( RECV_REQSC,
CompletionStatus.COMPLETED_NO );
}
// request information.
ri.request_id();
assertEquals( "Operation name not correct", "hello_op", ri.operation());
assertTrue( "No response expected for request with response",
ri.response_expected() );
assertEquals( "Incorrect sync scope", 3, ri.sync_scope());
try
{
ri.get_request_service_context( TEST_SCID );
s_visitMask = s_visitMask | RECV_SC;
ri.set_slot( s_slotID, s_any );
}
catch ( org.omg.CORBA.BAD_PARAM ex )
{
// normal !?
}
catch ( org.omg.PortableInterceptor.InvalidSlot ex )
{
fail( "unexpected exception received: " + ex );
}
}
@Override
public void receive_request( org.omg.PortableInterceptor.ServerRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | RECV_REQ;
if ( 0 != ( s_throwExcept & RECV_REQ ) )
{
throw new UNKNOWN( RECV_REQ,
CompletionStatus.COMPLETED_NO );
}
// request information
ri.object_id();
byte []aid = ri.adapter_id();
assertTrue (aid != null);
assertTrue (aid.length != 0);
String adapters [] = ri.adapter_name ();
assertTrue (adapters != null);
assertTrue (adapters[0].equals ("RootPOA"));
assertTrue (adapters[1].equals ("NewPOA"));
ri.target_most_derived_interface();
assertTrue( "target does not implement object",
ri.target_is_a( "IDL:omg.org/CORBA/Object:1.0" ) );
try
{
ri.arguments();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.exceptions();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.contexts();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
try
{
ri.operation_context();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request parameters. These will always fail
}
}
@Override
public void send_reply( org.omg.PortableInterceptor.ServerRequestInfo ri )
{
s_visitMask = s_visitMask | SEND_REPL;
if ( 0 != ( s_throwExcept & SEND_REPL ) )
{
throw new UNKNOWN( SEND_REPL,
CompletionStatus.COMPLETED_YES );
}
try
{
if ( ri.get_slot( s_slotID ).type().kind() != org.omg.CORBA.TCKind.tk_null )
{
ri.add_reply_service_context( new org.omg.IOP.ServiceContext( TEST_SCID,
new byte[ 0 ] ),
true );
s_visitMask = s_visitMask | SEND_REPL_SC;
}
}
catch ( org.omg.PortableInterceptor.InvalidSlot ex )
{
fail( ex.toString() );
}
}
@Override
public void send_exception( org.omg.PortableInterceptor.ServerRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | SEND_EXPT;
org.omg.CORBA.Any any = ri.sending_exception();
if ( any.type().equals( org.omg.CORBA.UNKNOWNHelper.type() )
&& 0 != ( s_throwExcept & SEND_EXPT ) )
{
UNKNOWN uex = org.omg.CORBA.UNKNOWNHelper.extract(
ri.sending_exception() );
uex.minor = uex.minor | SEND_EXPT;
uex.completed = CompletionStatus.COMPLETED_YES;
throw uex;
}
try
{
ri.result();
}
catch ( NO_RESOURCES ex )
{
// test retrieving request results. These will always fail
}
catch (org.omg.CORBA.BAD_INV_ORDER bio)
{
// result is not available at send_exception point - the spec
// says throw BAD_INV_ORDER
}
}
@Override
public void send_other( org.omg.PortableInterceptor.ServerRequestInfo ri )
throws org.omg.PortableInterceptor.ForwardRequest
{
s_visitMask = s_visitMask | SEND_OTHR;
if ( 0 != ( s_throwExcept & SEND_OTHR ) )
{
throw new UNKNOWN( SEND_OTHR,
CompletionStatus.COMPLETED_YES );
}
}
}
/**
* The entry point of the test case.
*
* @param args The command line arguments.
*/
public static void main( String args[] )
{
junit.textui.TestRunner.run( new TestSuite( PITest.class ) );
}
}