From b691c43c58ce6b3430307b168f16879c6dfa928f Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 4 Dec 2013 00:45:58 +0100 Subject: [PATCH] testChannelAccess/testServer: stress testing --- testApp/remote/channelAccessIFTest.cpp | 14 ++++----- testApp/remote/testServer.cpp | 43 +++++++++++++++++++++----- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/testApp/remote/channelAccessIFTest.cpp b/testApp/remote/channelAccessIFTest.cpp index 63f129c..5f19858 100755 --- a/testApp/remote/channelAccessIFTest.cpp +++ b/testApp/remote/channelAccessIFTest.cpp @@ -41,7 +41,7 @@ std::string ChannelAccessIFTest::TEST_ARRAY_CHANNEL_NAME = "testArray1"; int ChannelAccessIFTest::runAllTest() { - testPlan(142); + testPlan(148); test_implementation(); test_providerName(); @@ -1891,7 +1891,7 @@ void ChannelAccessIFTest::test_stressConnectDisconnect() { for (int i = 0; i < count; i++) { Channel::shared_pointer channel = syncCreateChannel(TEST_VALUEONLY_CHANNEL_NAME, debug); if (!channel.get()) { - testFail("%s: channel not created ", CURRENT_FUNCTION); + testFail("%s: channel not created (%d) ", CURRENT_FUNCTION, i); return; } channel->destroy(); @@ -1916,20 +1916,20 @@ void ChannelAccessIFTest::test_stressConnectGetDisconnect() { Channel::shared_pointer channel = syncCreateChannel(TEST_VALUEONLY_CHANNEL_NAME, debug); if (!channel.get()) { - testFail("%s: channel not created ", CURRENT_FUNCTION); + testFail("%s: channel not created (%d) ", CURRENT_FUNCTION, i); return; } SyncChannelGetRequesterImpl::shared_pointer channelGetReq = syncCreateChannelGet(channel, request, debug); if (!channelGetReq.get()) { - testFail("%s: channel get not created ", CURRENT_FUNCTION); + testFail("%s: channel get not created (%d) ", CURRENT_FUNCTION, i); return; } bool succStatus = channelGetReq->syncGet(true, getTimeoutSec()); if (!succStatus) { - testFail("%s: sync get failed ", CURRENT_FUNCTION); + testFail("%s: sync get failed (%d) ", CURRENT_FUNCTION, i); return; } @@ -1947,7 +1947,7 @@ void ChannelAccessIFTest::test_stressMonitorAndProcess() { string request = "record[queueSize=3]field(timeStamp,value,alarm.severity.choices)"; bool debug = false; - Channel::shared_pointer channel = syncCreateChannel(TEST_COUNTER_CHANNEL_NAME, debug); + Channel::shared_pointer channel = syncCreateChannel(TEST_SIMPLECOUNTER_CHANNEL_NAME, debug); if (!channel.get()) { testFail("%s: channel not created ", CURRENT_FUNCTION); return; @@ -1997,7 +1997,7 @@ void ChannelAccessIFTest::test_stressMonitorAndProcess() { succStatus = channelProcessReq->syncProcess(false, getTimeoutSec()); if (!succStatus) { - testFail("%s: syncProcess failed ", CURRENT_FUNCTION); + testFail("%s: syncProcess failed (%d) ", CURRENT_FUNCTION, i); return; } diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 39f9c18..506aefc 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -45,7 +45,8 @@ public: virtual void structureChanged() = 0; }; -map > structureChangedListeners; +typedef map > StructureChangedListenersMap; +StructureChangedListenersMap structureChangedListeners; static void notifyStructureChanged(String const & name) { @@ -781,10 +782,13 @@ public: PVStructure::shared_pointer const & pvRequest) { ChannelGet::shared_pointer thisPtr(new MockChannelGet(channel, channelGetRequester, pvStructure, pvRequest)); + + // register + structureChangedListeners[channel->getChannelName()].push_back(std::tr1::dynamic_pointer_cast(thisPtr)); + channelGetRequester->channelGetConnect(Status::Ok, thisPtr, static_cast(thisPtr.get())->m_pvStructure, static_cast(thisPtr.get())->m_bitSet); - structureChangedListeners[channel->getChannelName()].push_back(std::tr1::dynamic_pointer_cast(thisPtr)); return thisPtr; } @@ -824,8 +828,19 @@ public: m_channelProcess->destroy(); // remove itself from listeners table - vector &vec = structureChangedListeners[m_channelName]; - vec.erase(find(vec.begin(), vec.end(), std::tr1::dynamic_pointer_cast(shared_from_this()))); + if (structureChangedListeners.count(m_channelName)) + { + vector &vec = structureChangedListeners[m_channelName]; + for (vector::iterator i = vec.begin(); + i != vec.end(); i++) + { + if (i->get() == this) + { + vec.erase(i); + break; + } + } + } } virtual void lock() @@ -1650,10 +1665,13 @@ public: PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) { Monitor::shared_pointer thisPtr(new MockMonitor(channelName, monitorRequester, pvStructure, pvRequest)); + + // register + structureChangedListeners[channelName].push_back(std::tr1::dynamic_pointer_cast(thisPtr)); + StructureConstPtr structurePtr = static_cast(thisPtr.get())->m_pvStructure->getStructure(); monitorRequester->monitorConnect(Status::Ok, thisPtr, structurePtr); - structureChangedListeners[channelName].push_back(std::tr1::dynamic_pointer_cast(thisPtr)); return thisPtr; } @@ -1717,8 +1735,19 @@ public: stop(); // remove itself from listeners table - vector &vec = structureChangedListeners[m_channelName]; - vec.erase(find(vec.begin(), vec.end(), std::tr1::dynamic_pointer_cast(shared_from_this()))); + if (structureChangedListeners.count(m_channelName)) + { + vector &vec = structureChangedListeners[m_channelName]; + for (vector::iterator i = vec.begin(); + i != vec.end(); i++) + { + if (i->get() == this) + { + vec.erase(i); + break; + } + } + } } virtual void lock()