]> git.mxchange.org Git - simgear.git/commitdiff
Improving channel lifetime in HTTP-based tests.
authorJames Turner <zakalawe@mac.com>
Mon, 6 Jun 2016 16:26:50 +0000 (17:26 +0100)
committerRoland Haeder <roland@mxchange.org>
Sat, 13 Aug 2016 08:21:16 +0000 (10:21 +0200)
Previously, closed channels were not cleaned up, which looks to be
the caused of the test failures on Jenkins.

simgear/io/test_HTTP.cxx
simgear/io/test_HTTP.hxx

index 1c7dcf759bde4ccd89676aa69ca6c85cd70ec0cd..3aad760313930fce76130fda5ee7e331e3c70f66 100644 (file)
@@ -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);
index 9c75e134b3bd700dc5c9fe927aafe0dcba288d6e..257ced064d932ef20e8c1096eb72284e16df395f 100644 (file)
@@ -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();
+
+        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());
+
     }
 
-    void resetConnectCount()
+    int connectCount()
     {
-        _connectCount = 0;
+        return _channels.size();
     }
 
-    int connectCount()
+    void disconnectAll()
     {
-        return _connectCount;
+        typename std::vector<T*>::iterator it;
+        for (it = _channels.begin(); it != _channels.end(); ++it) {
+            _poller.removeChannel(*it);
+            delete *it;
+        }
+
+        _channels.clear();
     }
 };