#include <memory>
#include <string>
#include <RCF/test/TestMinimal.hpp>
#include <RCF/Idl.hpp>
#include <RCF/RcfServer.hpp>
#include <RCF/test/TransportFactories.hpp>
#include <RCF/util/CommandLine.hpp>
#include <RCF/util/PortNumbers.hpp>
#include <RCF/util/Platform/OS/Sleep.hpp>
namespace Test_ClientConnectionDrop {
RCF_BEGIN(I_X, "I_X")
RCF_METHOD_R1(std::string, echo, std::string)
RCF_END(I_X)
struct X
{
std::string echo(const std::string &s)
{
return s;
}
};
}
int RCF_TEST_MAIN(int argc, char **argv)
{
printTestHeader(__FILE__);
using namespace Test_ClientConnectionDrop;
util::CommandLine::getSingleton().parse(argc, argv);
for (int i=0; i<RCF::getTransportFactories().size(); ++i)
{
RCF::TransportFactoryPtr transportFactoryPtr = RCF::getTransportFactories()[i];
std::pair<RCF::ServerTransportPtr, RCF::ClientTransportAutoPtrPtr> transports = transportFactoryPtr->createTransports();
RCF::ServerTransportPtr serverTransportPtr( transports.first );
RCF::ClientTransportAutoPtr clientTransportAutoPtr( *transports.second );
RCF::writeTransportTypes(std::cout, *serverTransportPtr, *clientTransportAutoPtr);
X x;
std::string s;
std::auto_ptr<RCF::RcfServer> server;
server.reset( new RCF::RcfServer(serverTransportPtr) );
//server->bind<I_X>(x);
server->bind( (I_X*) 0, x);
server->start();
RcfClient<I_X> client(clientTransportAutoPtr);
s = client.echo("abc");
BOOST_CHECK( s == "abc" );
s = client.echo("def");
BOOST_CHECK( s == "def" );
server->close();
server->start();
// client should detect that it's connection is dead at this point, and automatically create a new one
s = client.echo("abc");
BOOST_CHECK( s == "abc" );
s = client.echo("def");
BOOST_CHECK( s == "def" );
// only do the following on Windows (socket linger issue)
#ifdef BOOST_WINDOWS
server.reset();
server.reset( new RCF::RcfServer(serverTransportPtr) );
//server->bind<I_X>(x);
server->bind( (I_X*) 0, x);
server->start();
#endif
s = client.echo("abc");
BOOST_CHECK( s == "abc" );
s = client.echo("def");
BOOST_CHECK( s == "def" );
}
return boost::exit_success;
}