/* * transportRegistryTest.cpp * */ #include #include #include #include #include #include #include namespace epics { namespace pvAccess { class TestTransport : public Transport{ public: typedef std::tr1::shared_ptr shared_pointer; typedef std::tr1::shared_ptr const_shared_pointer; TestTransport(string type, int16 priority, osiSockAddr* address): _type(type), _priority(priority), _address(address) {/*cout << "Transport::Transport" << endl;*/}; ~TestTransport(){/*cout << "Transport::~Transport" << endl;*/}; virtual const string getType() const {return _type;}; virtual int16 getPriority() const { return _priority;}; virtual const osiSockAddr* getRemoteAddress() const {return _address;}; virtual int8 getMajorRevision() const {return 0;}; virtual int8 getMinorRevision() const {return 0;}; virtual int getReceiveBufferSize() const {return 0;}; virtual int getSocketReceiveBufferSize() const {return 0;}; virtual void setRemoteMinorRevision(int8 minor) {}; virtual void setRemoteTransportReceiveBufferSize( int receiveBufferSize) {}; virtual void setRemoteTransportSocketReceiveBufferSize( int socketReceiveBufferSize){}; virtual void aliveNotification(){}; virtual void changedTransport(){}; virtual void close(bool force){}; virtual bool isClosed() {return false;}; virtual bool isVerified() {return false;}; virtual void verified(){}; virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender){}; virtual void ensureData(int) {}; virtual IntrospectionRegistry* getIntrospectionRegistry() {return NULL;}; private: string _type; int16 _priority; osiSockAddr* _address; }; } } using namespace epics::pvAccess; using namespace std; static TransportRegistry* registry; static const int16 address_max = 10; static const int16 priority_max = 100; typedef std::vector osiSockAddrVector_t; int main(int argc, char *argv[]) { registry = new TransportRegistry(); auto_ptr transportArrayOut; std::vector transportArrayIn (address_max * priority_max); osiSockAddrVector_t addrArray (address_max); //address for(int32 i = 0; i < address_max; i++) { osiSockAddr* addr = new osiSockAddr; addr->ia.sin_addr.s_addr = i; addr->ia.sin_port = i; addr->ia.sin_family = AF_INET; addrArray.at(i) = addr; //priority for(int16 j = 0; j < priority_max; j++) { Transport::shared_pointer testTransportIn(new TestTransport("tcp", j, addr)); transportArrayIn.at(i * priority_max + j) = testTransportIn; registry->put(testTransportIn); Transport::shared_pointer testTransportOut(registry->get("tcp",addr,(const int16)j)); assert(testTransportIn.get() == testTransportOut.get()); } transportArrayOut = registry->get("tcp",addr); assert((int16)transportArrayOut->size() == priority_max); for(int32 k = 0; k < priority_max; k++) { assert(transportArrayIn.at(i * priority_max + k).get() == transportArrayOut->at(k).get()); } } //add one transport which has same addr and priority as last one and check that the size does not increase osiSockAddr* addr = new osiSockAddr; addr->ia.sin_addr.s_addr = address_max - 1; addr->ia.sin_port = address_max - 1; addr->ia.sin_family = AF_INET; Transport::shared_pointer testTransportIn(new TestTransport("tcp", priority_max - 1, addr)); registry->put(testTransportIn); Transport::shared_pointer testTransportOut(registry->get("tcp",addr,(const int16)priority_max - 1)); assert(testTransportIn.get() == testTransportOut.get()); delete addr; //put back the old one registry->put(transportArrayIn.at((address_max - 1) * priority_max + priority_max - 1)); assert(registry->numberOfActiveTransports() == (address_max * priority_max)); transportArrayOut = registry->toArray("tcp"); assert((int16)transportArrayOut->size() == (address_max * priority_max)); for(int32 i = 0; i < address_max * priority_max; i++) { assert(transportArrayIn.at(i).get() == transportArrayOut->at(i).get()); } transportArrayOut = registry->toArray(); assert((int16)transportArrayOut->size() == (address_max * priority_max)); for(int32 i = 0; i < address_max * priority_max; i++) { assert(transportArrayIn.at(i).get() == transportArrayOut->at(i).get()); } for(int32 i = 0; i < address_max; i++) { for(int16 j = 0; j < priority_max; j++) { assert(transportArrayIn.at(i * priority_max + j) == registry->remove(transportArrayIn.at(i * priority_max + j))); } } assert(registry->numberOfActiveTransports() == 0); for(int32 i = 0; i < address_max; i++) { for(int16 j = 0; j < priority_max; j++) { registry->put(transportArrayIn.at(i * priority_max + j)); } } assert(registry->numberOfActiveTransports() == (priority_max * address_max)); registry->clear(); assert(registry->numberOfActiveTransports() == 0); for(osiSockAddrVector_t::iterator iter = addrArray.begin(); iter != addrArray.end(); iter++) { delete *iter; } addrArray.clear(); if(registry) delete registry; epicsExitCallAtExits(); epics::pvData::CDRMonitor::get().show(stdout, true); return 0; }