Improving channel lifetime in HTTP-based tests.
Previously, closed channels were not cleaned up, which looks to be the caused of the test failures on Jenkins.
This commit is contained in:
parent
1492de4391
commit
cb80af0ebe
@ -577,7 +577,7 @@ cout << "testing proxy close" << endl;
|
||||
cout << "testing HTTP 1.1 pipelining" << endl;
|
||||
|
||||
{
|
||||
testServer.resetConnectCount();
|
||||
testServer.disconnectAll();
|
||||
cl.clearAllConnections();
|
||||
|
||||
cl.setProxy("", 80);
|
||||
@ -689,7 +689,7 @@ cout << "testing proxy close" << endl;
|
||||
// test cancel
|
||||
{
|
||||
cout << "cancel request" << endl;
|
||||
testServer.resetConnectCount();
|
||||
testServer.disconnectAll();
|
||||
cl.clearAllConnections();
|
||||
|
||||
cl.setProxy("", 80);
|
||||
@ -722,7 +722,7 @@ cout << "testing proxy close" << endl;
|
||||
// test cancel
|
||||
{
|
||||
cout << "cancel middle request" << endl;
|
||||
testServer.resetConnectCount();
|
||||
testServer.disconnectAll();
|
||||
cl.clearAllConnections();
|
||||
|
||||
cl.setProxy("", 80);
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define SIMGEAR_IO_TEST_HTTP_HXX
|
||||
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
#include <simgear/io/sg_netChat.hxx>
|
||||
#include <simgear/misc/strutils.hxx>
|
||||
@ -27,6 +28,11 @@ public:
|
||||
|
||||
}
|
||||
|
||||
virtual ~TestServerChannel()
|
||||
{
|
||||
std::cerr << "dtor test server channel" << std::endl;
|
||||
}
|
||||
|
||||
virtual void collectIncomingData(const char* s, int n)
|
||||
{
|
||||
buffer += std::string(s, n);
|
||||
@ -160,6 +166,13 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
virtual void handleClose (void)
|
||||
{
|
||||
std::cerr << "channel close" << std::endl;
|
||||
NetBufferChannel::handleClose();
|
||||
}
|
||||
|
||||
|
||||
State state;
|
||||
std::string buffer;
|
||||
std::string method;
|
||||
@ -170,17 +183,25 @@ public:
|
||||
int requestContentLength;
|
||||
};
|
||||
|
||||
class EraseIfClosed
|
||||
{
|
||||
public:
|
||||
bool operator()(simgear::NetChannel* chan) const
|
||||
{
|
||||
return chan->isClosed();
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class TestServer : public NetChannel
|
||||
{
|
||||
simgear::NetChannelPoller _poller;
|
||||
int _connectCount;
|
||||
std::vector<T*> _channels;
|
||||
public:
|
||||
TestServer()
|
||||
{
|
||||
Socket::initSockets();
|
||||
|
||||
_connectCount = 0;
|
||||
|
||||
open();
|
||||
bind(NULL, 2000); // localhost, any port
|
||||
@ -199,27 +220,43 @@ public:
|
||||
{
|
||||
simgear::IPAddress addr ;
|
||||
int handle = accept ( &addr ) ;
|
||||
TestServerChannel* chan = new T();
|
||||
T* chan = new T();
|
||||
chan->setHandle(handle);
|
||||
|
||||
_channels.push_back(chan);
|
||||
_poller.addChannel(chan);
|
||||
|
||||
_connectCount++;
|
||||
}
|
||||
|
||||
void poll()
|
||||
{
|
||||
_poller.poll();
|
||||
}
|
||||
|
||||
void resetConnectCount()
|
||||
{
|
||||
_connectCount = 0;
|
||||
typename std::vector<T*>::iterator it;
|
||||
it = std::remove_if(_channels.begin(), _channels.end(), EraseIfClosed());
|
||||
|
||||
for (typename std::vector<T*>::iterator it2 = it; it2 != _channels.end(); ++it2) {
|
||||
_poller.removeChannel(*it2);
|
||||
delete *it2;
|
||||
}
|
||||
|
||||
_channels.erase(it, _channels.end());
|
||||
|
||||
}
|
||||
|
||||
int connectCount()
|
||||
{
|
||||
return _connectCount;
|
||||
return _channels.size();
|
||||
}
|
||||
|
||||
void disconnectAll()
|
||||
{
|
||||
typename std::vector<T*>::iterator it;
|
||||
for (it = _channels.begin(); it != _channels.end(); ++it) {
|
||||
_poller.removeChannel(*it);
|
||||
delete *it;
|
||||
}
|
||||
|
||||
_channels.clear();
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user