package org.jacorb.test.orb.listenendpoints;
/*
* 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.assertTrue;
import static org.junit.Assert.fail;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.jacorb.orb.iiop.IIOPAddress;
import org.jacorb.test.harness.ClientServerSetup;
import org.jacorb.test.harness.FixedPortClientServerTestCase;
import org.jacorb.test.harness.TestUtils;
import org.jacorb.test.listenendpoints.echo_corbaloc.EchoMessage;
import org.jacorb.test.listenendpoints.echo_corbaloc.EchoMessageHelper;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Tests -ORBListenEndpoints feature
*
*
*/
public class ListenEndpointsTest extends FixedPortClientServerTestCase
{
private static final String PROTOCOL = "iiop:";
private static final int CORRECT_PORT_1 = getNextAvailablePort();
private static final int CORRECT_PORT_2 = getNextAvailablePort();
private static final int CORRECT_PORT_3 = getNextAvailablePort();
private static final int WRONG_PORT = getNextAvailablePort();
private static final int WRONG_PORT_2 = getNextAvailablePort();
private static final String DEFAULT_LISTEN_EP = "iiop://:" + WRONG_PORT_2;
// wildcard listen endpoint
private static final String LISTEN_EP = "'iiop://:" + CORRECT_PORT_1 +
",iiop://:" + CORRECT_PORT_2 + ";iiop://:" + CORRECT_PORT_3 + "'";
@BeforeClass
public static void beforeClassSetUp() throws Exception
{
// If security is not disabled it will not use the above host/port
// combinations.
Assume.assumeFalse(TestUtils.isSSLEnabled);
Properties clientProps = new Properties();
clientProps.setProperty ("jacorb.retries", "3");
clientProps.setProperty ("jacorb.retry_interval", "500");
clientProps.setProperty ("jacorb.connection.client.connect_timeout","1000");
Properties serverProps = new Properties();
serverProps.setProperty ("OAAddress", DEFAULT_LISTEN_EP);
serverProps.put ("OAPort","0");
serverProps.put ("OASSLPort", "0");
setup = new ClientServerSetup ("org.jacorb.test.listenendpoints.echo_corbaloc.Server",
null,
new String[] {"-verbose", "-testmode", "P", "-ORBListenEndpoints", LISTEN_EP},
clientProps, serverProps);
}
@Test
public void test_ping()
{
EchoMessage server = null;
try
{
String ior = setup.getServerIOR();
assertTrue("test_ping: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_ping: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_ping: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
server =
EchoMessageHelper.narrow (setup.getServerObject());
server.ping();
}
catch (Exception e)
{
fail("test_ping: got an unexpected exception: <" + e.getMessage() + ">");
}
finally
{
server = null;
}
}
@Test
public void test_echo_simple()
{
EchoMessage server = null;
try
{
server =
EchoMessageHelper.narrow (setup.getServerObject());
String result = server.echo_simple();
TestUtils.getLogger().debug("AlternateEndpointTest: " + "test_echo_simple: got resp from server: <" + result + ">");
assertTrue("test_echo_simple: result is null", result != null);
assertTrue("test_echo_simple: unexpected result <" + result + ">",
result.startsWith("Simple greeting from"));
}
catch (Exception e)
{
fail("test_echo_simple: got an unexpected exception: <" + e.getMessage() + ">");
}
finally
{
server = null;
}
}
@Test
public void test_echo_string()
{
EchoMessage server = null;
try
{
String ior = setup.getServerIOR();
assertTrue("test_ping: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_ping: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_ping: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
server =
EchoMessageHelper.narrow (setup.getServerObject());
String outMsg = new String(Integer.toString(1)
+ "test_echo_string is hailing server with IOR <" + ior + ">");
long tms_out = System.currentTimeMillis();
String inMsg = server.echo_string(outMsg);
long tms_in = System.currentTimeMillis();
long tms_dif = tms_in - tms_out;
if (outMsg.equals(inMsg))
{
assertTrue("OK: " + tms_dif + "mSec <" + inMsg + ">", true);
}
else
{
fail("ERR: " + tms_dif + "mSec send: <" + outMsg + "> recv: <"
+ (inMsg == null? "null" : inMsg) + ">");
}
}
catch (Exception e)
{
fail("test_echo_string: got an unexpected exception: <" + e.getMessage() + ">");
}
finally
{
server = null;
}
}
@Test
public void test_echo_wide()
{
EchoMessage server = null;
try
{
String ior = setup.getServerIOR();
assertTrue("test_ping: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_ping: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_ping: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
server =
EchoMessageHelper.narrow (setup.getServerObject());
String outMsg = new String(Integer.toString(1) + "test_echo_wide is hailing server with IOR <" + ior + ">");
long tms_out = System.currentTimeMillis();
String inMsg = server.echo_string(outMsg);
long tms_in = System.currentTimeMillis();
long tms_dif = tms_in - tms_out;
if (outMsg.equals(inMsg))
{
assertTrue("OK: " + tms_dif + "mSec <" + inMsg + ">", true);
}
else
{
fail("ERR: " + tms_dif + "mSec send: <" + outMsg + "> recv: <"
+ (inMsg == null? "null" : inMsg) + ">");
}
}
catch (Exception e)
{
fail("test_echo_wide: got an unexpected exception: <" + e.getMessage() + ">");
}
finally
{
server = null;
}
}
/**
* This test would ping all listenable endpoints on CORRECT_PORT_1
*/
@Test
public void test_correct_port_1()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_correct_port_1: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_correct_port_1: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_correct_port_1: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> listen_eps = getListenEndpoints(CORRECT_PORT_1, corbalocObjId);
for (Iterator<String> x = listen_eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
// log("test_correct_port_1: ping endpoint: " + endpoint);
int cnt = send_msg(10, "test_correct_port_1", "hailing endpoint " + endpoint, server);
assertTrue("test_correct_port_1: got cnt=" + cnt + " (expected 10)", cnt == 10);
}
catch (Exception e)
{
fail("test_correct_port_1: got an unexpected exception : <" + e.getMessage() + ">");
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_correct_port_1: got an unexpected exception : <" + e.getMessage() + ">");
}
}
/**
* This test would ping all listenable endpoints on CORRECT_PORT_2
*/
@Test
public void test_correct_port_2()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_correct_port_2: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_correct_port_2: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_correct_port_2: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> listen_eps = getListenEndpoints(CORRECT_PORT_2, corbalocObjId);
for (Iterator<String> x = listen_eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
// log("test_correct_port_1: ping endpoint: " + endpoint);
int cnt = send_msg(10, "test_correct_port_2", "hailing endpoint " + endpoint, server);
assertTrue("test_correct_port_2: got cnt=" + cnt + " (expected 10)", cnt == 10);
}
catch (Exception e)
{
fail("test_correct_port_2: got an unexpected exception : <" + e.getMessage() + ">");
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_correct_port_2: got an unexpected exception : <" + e.getMessage() + ">");
}
}
/**
* This test would ping all listenable endpoints on CORRECT_PORT_3
*/
@Test
public void test_correct_port_3()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_correct_port_3: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_correct_port_3: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_correct_port_3: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> listen_eps = getListenEndpoints(CORRECT_PORT_3, corbalocObjId);
for (Iterator<String> x = listen_eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
// log("test_correct_port_1: ping endpoint: " + endpoint);
int cnt = send_msg(10, "test_correct_port_3", "hailing endpoint " + endpoint, server);
assertTrue("test_correct_port_3: got cnt=" + cnt + " (expected 10)", cnt == 10);
}
catch (Exception e)
{
fail("test_correct_port_3: got an unexpected exception : <" + e.getMessage() + ">");
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_correct_port_3: got an unexpected exception : <" + e.getMessage() + ">");
}
}
private int send_msg(int ntimes, String testName, String msg,
EchoMessage s)
{
String echoMsg = new String ((testName != null ? ": " + testName : "")
+ (msg != null ? ": " + msg : "") );
int successCnt = 0;
for (int n = 1; n <= ntimes; n++)
{
String outMsg = new String(Integer.toString(n) + echoMsg);
long tms_out = System.currentTimeMillis();
String inMsg = s.echo_string(outMsg);
long tms_in = System.currentTimeMillis();
long tms_dif = tms_in - tms_out;
if (inMsg != null && inMsg.equals(outMsg))
{
successCnt++;
TestUtils.getLogger().debug("AlternateEndpointTest: " + "OK: " + tms_dif + "mSec <" + inMsg + ">");
}
else
{
TestUtils.getLogger().debug("AlternateEndpointTest: " + "ERR: out: <" + outMsg + "> in: <"
+ (inMsg == null? "null" : inMsg) + ">");
}
}
return successCnt;
}
/**
* This test would ping all listenable addresses using a wrong port.
* It should fail.
*/
@Test
public void test_wrong_port_1()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_wrong_port: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_wrong_port: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_wrong_port: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> listen_eps = getListenEndpoints(WRONG_PORT, corbalocObjId);
for (Iterator<String> x = listen_eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
//log("test_wrong_port: ping endpoint: " + endpoint);
int cnt = 0;
cnt = send_msg(1, "test_wrong_port", "hailing endpoint " + endpoint, server);
assertTrue("test_wrong_port: got cnt=" + cnt + " (expected 0)", cnt != 1);
}
catch (Exception e)
{
// expected
//e.getMessage();
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_wrong_port: got an unexpected exception : <" + e.getMessage() + ">");
}
}
/**
* This test would ping all listenable addresses using the default port.
* It should fail.
*/
@Test
public void test_wrong_port_2()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_wrong_port: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_wrong_port: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_wrong_port: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> listen_eps = getListenEndpoints(WRONG_PORT_2, corbalocObjId);
for (Iterator<String> x = listen_eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
//log("test_wrong_port: ping endpoint: " + endpoint);
int cnt = 0;
cnt = send_msg(1, "test_wrong_port", "hailing endpoint " + endpoint, server);
assertTrue("test_wrong_port: got cnt=" + cnt + " (expected 0)", cnt != 1);
}
catch (Exception e)
{
// expected
//e.getMessage();
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_wrong_port: got an unexpected exception : <" + e.getMessage() + ">");
}
}
/**
* This test would ping the loopback endpoint which should pass.
*
*/
@Test
public void test_loopback()
{
try
{
String ior = setup.getServerIOR();
assertTrue("test_loopback: couldn't pickup server IOR", ior != null && ior.length() > 0);
int slash = ior.trim().indexOf("/");
String corbalocObjId = ior.trim().substring(slash);
assertTrue("test_loopback: corbaloc objectID is null", corbalocObjId != null);
assertTrue("test_loopback: corbaloc objID is malformed", corbalocObjId.equals("/EchoServer/EchoPOAP/EchoID") );
List<String> eps = getIsLoopbackEndpoints(corbalocObjId);
for (Iterator<String> x = eps.iterator(); x.hasNext();)
{
String endpoint = x.next();
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
org.omg.CORBA.ORB orb = setup.getAnotherORB(props);
EchoMessage server = null;
try
{
assertTrue(orb instanceof org.jacorb.orb.ORB);
server =
EchoMessageHelper.narrow(orb.string_to_object(endpoint));
TestUtils.getLogger().debug("AlternateEndpointTest: " + "test_loopback: ping endpoint: " + endpoint);
int cnt = 0;
cnt = send_msg(5, "test_loopback", "hailing server endpoint " + endpoint, server);
assertTrue("test_loopback: got cnt=" + cnt + " (expected 5)", cnt == 5);
}
catch (Exception e)
{
// not expected
//e.getMessage();
}
finally
{
orb.shutdown(true);
server = null;
}
}
}
catch (Exception e)
{
fail("test_loopback: got an unexpected exception : <" + e.getMessage() + ">");
}
}
private List<String> getListenEndpoints(int listen_port, String objId)
{
List<InetAddress> inets = IIOPAddress.getNetworkInetAddresses();
List<String> listen_eps = new ArrayList<String>();
for (Iterator<InetAddress> x = inets.iterator(); x.hasNext();)
{
InetAddress inetAddr = x.next();
String ipaddr = inetAddr.toString().substring(1);
String conHostName = inetAddr.getCanonicalHostName();
String hostName = inetAddr.getHostName();
if (!inetAddr.isLoopbackAddress() && !inetAddr.isLinkLocalAddress())
{
if (inetAddr instanceof Inet4Address)
{
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + ipaddr + ":" + listen_port +
objId)
);
if (!hostName.equals(ipaddr))
{
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + hostName + ":" + listen_port +
objId)
);
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + hostName + ":" + listen_port +
objId)
);
}
}
else if (inetAddr instanceof Inet6Address)
{
String ipv6 = ipaddr;
int zoneid_delim = ipv6.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = ipv6.substring(0, zoneid_delim);
}
TestUtils.getLogger().debug("getListenEndpoints: ipv6=<" + ipv6 + ">");
if (!ipv6.startsWith("fe80"))
{
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "[" + ipv6 + "]:" + listen_port +
objId)
);
}
if (!hostName.equals(ipaddr))
{
zoneid_delim = hostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = hostName.substring(0, zoneid_delim);
}
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "[" + ipv6 + "]:" + listen_port +
objId)
);
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
zoneid_delim = conHostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = conHostName.substring(0, zoneid_delim);
}
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "[" + ipv6 + "]:" + listen_port +
objId)
);
}
}
}
}
return listen_eps;
}
private List<String> getIsLoopbackEndpoints(String objId) throws SocketException
{
List<String> listen_eps = new ArrayList<String>();
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "127.0.0.1" + ":" + CORRECT_PORT_1 +
objId)
);
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "localhost" + ":" + CORRECT_PORT_1 +
objId)
);
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "127.0.0.1" + ":" + CORRECT_PORT_2 +
objId)
);
listen_eps.add(
new String ("corbaloc:" + PROTOCOL + "localhost" + ":" + CORRECT_PORT_2 +
objId)
);
return listen_eps;
}
}