summaryrefslogtreecommitdiff
path: root/cppe
diff options
context:
space:
mode:
Diffstat (limited to 'cppe')
-rw-r--r--cppe/CHANGES3
-rw-r--r--cppe/src/IceE/Network.cpp2
-rw-r--r--cppe/src/IceE/Reference.cpp72
-rw-r--r--cppe/src/IceE/Reference.h11
-rw-r--r--cppe/test/IceE/operations/AllTests.cpp48
5 files changed, 111 insertions, 25 deletions
diff --git a/cppe/CHANGES b/cppe/CHANGES
index a4352e0e94b..b82f4b942f7 100644
--- a/cppe/CHANGES
+++ b/cppe/CHANGES
@@ -1,6 +1,9 @@
Changes since version 1.1.0
---------------------------
+- Fixed a bug where proxy operator< could return an incorrect result
+ for proxy of different types (e.g.: direct vs. indirect proxies).
+
- For object adapters without endpoints, Ice.Trace.Network >= 2 now
prints a trace message.
diff --git a/cppe/src/IceE/Network.cpp b/cppe/src/IceE/Network.cpp
index 6e78008c9b2..d19e05f67e9 100644
--- a/cppe/src/IceE/Network.cpp
+++ b/cppe/src/IceE/Network.cpp
@@ -972,7 +972,7 @@ IceInternal::getLocalHosts()
::freeifaddrs(ifap);
#else
- SOCKET fd = createSocket(false);
+ SOCKET fd = createSocket();
#ifdef _AIX
int cmd = CSIOCGIFCONF;
diff --git a/cppe/src/IceE/Reference.cpp b/cppe/src/IceE/Reference.cpp
index 3af3a3728b3..fe1883d318e 100644
--- a/cppe/src/IceE/Reference.cpp
+++ b/cppe/src/IceE/Reference.cpp
@@ -287,6 +287,11 @@ IceInternal::Reference::operator==(const Reference& r) const
//
// Note: if(this == &r) test is performed by each non-abstract derived class.
//
+
+ if(getType() != r.getType())
+ {
+ return false;
+ }
if(_mode != r._mode)
{
@@ -399,6 +404,15 @@ IceInternal::Reference::operator<(const Reference& r) const
}
}
+ if(getType() < r.getType())
+ {
+ return true;
+ }
+ else if(r.getType() < getType())
+ {
+ return false;
+ }
+
return false;
}
@@ -463,6 +477,12 @@ IceInternal::FixedReference::getFixedConnections() const
return _fixedConnections;
}
+Reference::Type
+IceInternal::FixedReference::getType() const
+{
+ return Fixed;
+}
+
vector<EndpointPtr>
IceInternal::FixedReference::getEndpoints() const
{
@@ -597,10 +617,8 @@ IceInternal::FixedReference::operator<(const Reference& r) const
if(Reference::operator==(r))
{
const FixedReference* rhs = dynamic_cast<const FixedReference*>(&r);
- if(rhs)
- {
- return _fixedConnections < rhs->_fixedConnections;
- }
+ assert(rhs);
+ return _fixedConnections < rhs->_fixedConnections;
}
return false;
}
@@ -690,10 +708,8 @@ IceInternal::RoutableReference::operator<(const Reference& r) const
if(Reference::operator==(r))
{
const RoutableReference* rhs = dynamic_cast<const RoutableReference*>(&r);
- if(rhs)
- {
- return _routerInfo < rhs->_routerInfo;
- }
+ assert(rhs);
+ return _routerInfo < rhs->_routerInfo;
}
return false;
}
@@ -735,6 +751,12 @@ IceInternal::DirectReference::DirectReference(const InstancePtr& inst, const Com
}
#endif
+Reference::Type
+IceInternal::DirectReference::getType() const
+{
+ return Direct;
+}
+
vector<EndpointPtr>
IceInternal::DirectReference::getEndpoints() const
{
@@ -895,10 +917,8 @@ IceInternal::DirectReference::operator<(const Reference& r) const
if(Parent::operator==(r))
{
const DirectReference* rhs = dynamic_cast<const DirectReference*>(&r);
- if(rhs)
- {
- return _endpoints < rhs->_endpoints;
- }
+ assert(rhs);
+ return _endpoints < rhs->_endpoints;
}
return false;
}
@@ -941,6 +961,12 @@ IceInternal::IndirectReference::IndirectReference(const InstancePtr& inst, const
}
#endif
+Reference::Type
+IceInternal::IndirectReference::getType() const
+{
+ return Indirect;
+}
+
vector<EndpointPtr>
IceInternal::IndirectReference::getEndpoints() const
{
@@ -1143,18 +1169,16 @@ IceInternal::IndirectReference::operator<(const Reference& r) const
if(Parent::operator==(r))
{
const IndirectReference* rhs = dynamic_cast<const IndirectReference*>(&r);
- if(rhs)
- {
- if(_adapterId < rhs->_adapterId)
- {
- return true;
- }
- else if(rhs->_adapterId < _adapterId)
- {
- return false;
- }
- return _locatorInfo < rhs->_locatorInfo;
- }
+ assert(rhs);
+ if(_adapterId < rhs->_adapterId)
+ {
+ return true;
+ }
+ else if(rhs->_adapterId < _adapterId)
+ {
+ return false;
+ }
+ return _locatorInfo < rhs->_locatorInfo;
}
return false;
}
diff --git a/cppe/src/IceE/Reference.h b/cppe/src/IceE/Reference.h
index 5557fbcef95..7c2de6714ed 100644
--- a/cppe/src/IceE/Reference.h
+++ b/cppe/src/IceE/Reference.h
@@ -47,6 +47,13 @@ public:
ModeLast = ModeBatchDatagram
};
+ enum Type
+ {
+ Fixed,
+ Direct,
+ Indirect
+ };
+
Mode getMode() const { return _mode; }
bool getSecure() const { return _secure; };
const Ice::Identity& getIdentity() const { return _identity; }
@@ -58,6 +65,7 @@ public:
Ice::CommunicatorPtr getCommunicator() const;
+ virtual Type getType() const = 0;
#ifdef ICEE_HAS_ROUTER
virtual RouterInfoPtr getRouterInfo() const { return 0; }
#endif
@@ -150,6 +158,7 @@ public:
const std::vector<Ice::ConnectionPtr>& getFixedConnections() const;
+ virtual Type getType() const;
virtual std::vector<EndpointPtr> getEndpoints() const;
#ifdef ICEE_HAS_ROUTER
@@ -229,6 +238,7 @@ public:
#endif
);
+ virtual Type getType() const;
virtual std::vector<EndpointPtr> getEndpoints() const;
DirectReferencePtr changeEndpoints(const std::vector<EndpointPtr>&) const;
@@ -285,6 +295,7 @@ public:
virtual LocatorInfoPtr getLocatorInfo() const { return _locatorInfo; }
+ virtual Type getType() const;
virtual std::vector<EndpointPtr> getEndpoints() const;
virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const;
diff --git a/cppe/test/IceE/operations/AllTests.cpp b/cppe/test/IceE/operations/AllTests.cpp
index 12562ad07c9..ffd8cd66a01 100644
--- a/cppe/test/IceE/operations/AllTests.cpp
+++ b/cppe/test/IceE/operations/AllTests.cpp
@@ -33,6 +33,54 @@ allTests(const Ice::CommunicatorPtr& communicator, const Ice::InitializationData
test(base->ice_batchOneway()->ice_isBatchOneway());
tprintf("ok\n");
+ tprintf("testing proxy comparison... ");
+
+ test(communicator->stringToProxy("foo") == communicator->stringToProxy("foo"));
+ test(communicator->stringToProxy("foo") != communicator->stringToProxy("foo2"));
+ test(communicator->stringToProxy("foo") < communicator->stringToProxy("foo2"));
+ test(!(communicator->stringToProxy("foo2") < communicator->stringToProxy("foo")));
+
+ Ice::ObjectPrx compObj = communicator->stringToProxy("foo");
+
+ test(compObj->ice_facet("facet") == compObj->ice_facet("facet"));
+ test(compObj->ice_facet("facet") != compObj->ice_facet("facet1"));
+ test(compObj->ice_facet("facet") < compObj->ice_facet("facet1"));
+ test(!(compObj->ice_facet("facet") < compObj->ice_facet("facet")));
+
+ test(compObj->ice_oneway() == compObj->ice_oneway());
+ test(compObj->ice_oneway() != compObj->ice_twoway());
+ test(compObj->ice_twoway() < compObj->ice_oneway());
+ test(!(compObj->ice_oneway() < compObj->ice_twoway()));
+
+ test(compObj->ice_timeout(20) == compObj->ice_timeout(20));
+ test(compObj->ice_timeout(10) != compObj->ice_timeout(20));
+ test(compObj->ice_timeout(10) < compObj->ice_timeout(20));
+ test(!(compObj->ice_timeout(20) < compObj->ice_timeout(10)));
+
+ Ice::ObjectPrx compObj1 = communicator->stringToProxy("foo:tcp -h 127.0.0.1 -p 10000");
+ Ice::ObjectPrx compObj2 = communicator->stringToProxy("foo:tcp -h 127.0.0.1 -p 10001");
+ test(compObj1 != compObj2);
+ test(compObj1 < compObj2);
+ test(!(compObj2 < compObj1));
+
+ compObj1 = communicator->stringToProxy("foo@MyAdapter1");
+ compObj2 = communicator->stringToProxy("foo@MyAdapter2");
+ test(compObj1 != compObj2);
+ test(compObj1 < compObj2);
+ test(!(compObj2 < compObj1));
+
+ compObj1 = communicator->stringToProxy("foo:tcp -h 127.0.0.1 -p 1000");
+ compObj2 = communicator->stringToProxy("foo@MyAdapter1");
+ test(compObj1 != compObj2);
+ test(compObj1 < compObj2);
+ test(!(compObj2 < compObj1));
+
+ //
+ // TODO: Ideally we should also test comparison of fixed proxies.
+ //
+
+ tprintf("ok\n");
+
tprintf("testing ice_getCommunicator... ");
test(base->ice_getCommunicator().get() == communicator.get());
tprintf("ok\n");