package org.jacorb.test.harness;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.rules.TestName;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.rules.Timeout;
import org.junit.runner.Description;
import org.omg.CORBA.ORB;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
/**
* An abstract class for those tests that need a local client ORB. The
* ORB may be configured by implementing {@link ORBTestCase#patchORBProperties(Properties)}.
* <p>
* Normally the ORBID is set to the currently executing test. If {@link ORBTestCase#name}
* does not return a test name then it searches for a property {@link ClientServerSetup#SERVANT_NAME}
* in the properties. If that fails, the ID is set to "".
* <p>
* Note the ORB is setup and torn down once per test by the {@literal @}Before and {@literal @}After
* annotations.
*
* @author Nick Cross
*/
public abstract class ORBTestCase
{
@Rule
public TestName name = new TestName();
@Rule
public TestRule watcher = new TestWatcher()
{
@Override
protected void starting(Description description)
{
TestUtils.getLogger().debug("Starting test: {}:{}", description.getClassName(), description.getMethodName());
}
};
@ClassRule
public static Timeout globalTimeout = new Timeout(480000); // 8 minutes max per class tested
@Rule
public Timeout testTimeout = new Timeout(150000); // 2.5 minutes max per method tested
protected ORB orb;
protected POA rootPOA;
protected Properties orbProps = new Properties();
private ArrayList<ORBTestCase> otherORBs = new ArrayList<ORBTestCase>();
public ORBTestCase()
{
orbProps.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
orbProps.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
if (TestUtils.verbose)
{
orbProps.setProperty("jacorb.log.default.verbosity", "4");
}
else
{
orbProps.setProperty("jacorb.log.default.verbosity", "0");
}
if (TestUtils.isSSLEnabled)
{
TestUtils.getLogger().debug("ORBTestCase SSL enabled");
// In this case we have been configured to run all the tests
// in SSL mode. For simplicity, we will use the demo/ssl keystore
// and properties (partly to ensure that they always work)
Properties cp;
try
{
cp = CommonSetup.loadSSLProps("jsse_client_props", "jsse_client_ks");
orbProps.putAll(cp);
}
catch (IOException e)
{
assertFalse("Exception was thrown " + e, true);
}
}
}
@Before
public void ORBSetUp() throws Exception
{
patchORBProperties(orbProps);
String mn = (name.getMethodName() == null ?
orbProps.getProperty(ClientServerSetup.SERVANT_NAME, "") : name.getMethodName());
TestUtils.getLogger().debug("ORBTestCase::setUp for " + mn);
orb = ORB.init(new String[] { "-ORBID" , mn }, orbProps);
initialisePOA();
}
// Split out POA initialisation so getAnotherORB does not automatically initialise it.
void initialisePOA () throws Exception
{
rootPOA = POAHelper.narrow(orb.resolve_initial_references( "RootPOA" ));
rootPOA.the_POAManager().activate();
}
/**
* This method is called before the ORB is created and therefore allows ORB properties to
* be modified.
*
* @param props properties to modify
* @throws Exception if an error occurs
*/
protected void patchORBProperties(Properties props) throws Exception
{
TestUtils.getLogger().debug("ORBTestCase::patchORBProperties " + props);
}
@After
public void ORBTearDown() throws Exception
{
TestUtils.getLogger().debug("ORBTestCase::tearDown");
// Null check because its possible a POA initialise could have failed.
if (rootPOA != null)
{
rootPOA.destroy(true, true);
rootPOA = null;
}
// Null check because its possible an ORB initialise could have failed.
if (orb != null)
{
orb.shutdown(true);
orb = null;
}
Iterator<ORBTestCase> i = otherORBs.iterator();
while (i.hasNext())
{
ORBTestCase otc = i.next();
otc.ORBTearDown();
i.remove();
}
orbProps.clear();
orbProps.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
orbProps.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
}
/**
* Returns the ORB cast to a JacORB ORB.
*
* @return a JacORB ORB
*/
public org.jacorb.orb.ORB getORB ()
{
assertTrue ("ORB should be a JacORB ORB", orb instanceof org.jacorb.orb.ORB);
return (org.jacorb.orb.ORB)orb;
}
/**
* Returns another client ORB. The test case will automatically shut it down at
* the end of the test.
*
* @param override to supplement the ORB configuration.
* @return a pre-configured ORB to use.
* @throws Exception
*/
public ORB getAnotherORB(final Properties override) throws Exception
{
ORBTestCase otc = new ORBTestCase ()
{
@Override
protected void patchORBProperties (Properties p)
{
if (override != null)
{
p.putAll(override);
}
}
@Override
void initialisePOA () throws Exception
{
// Don't resolve the RootPOA
}
};
otherORBs.add(otc);
otc.ORBSetUp();
return otc.orb;
}
}