diff options
Diffstat (limited to 'cppe')
-rw-r--r-- | cppe/CHANGES | 3 | ||||
-rw-r--r-- | cppe/src/IceE/Network.cpp | 2 | ||||
-rw-r--r-- | cppe/src/IceE/Reference.cpp | 72 | ||||
-rw-r--r-- | cppe/src/IceE/Reference.h | 11 | ||||
-rw-r--r-- | cppe/test/IceE/operations/AllTests.cpp | 48 |
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"); |