]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't report spurious errors from wxSocket in "no wait" mode.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 21 Aug 2010 23:33:40 +0000 (23:33 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 21 Aug 2010 23:33:40 +0000 (23:33 +0000)
In wxSOCKET_NOWAIT mode wxSOCKET_WOULDBLOCK is not a real error as it's
expected and should be just discarded. Failing to do this could result in the
following scenario:

1. Try to read a big buffer with wxSOCKET_NOWAIT (setting wxSocket error to
   wxSOCKET_WOULDBLOCK).
2. Process small part of it.
3. Read more data from wxSocket -- which now goes to the data containing
   already cached data without going to the socket itself and this without
   resetting the error.
4. Check wxSocket::Error() which turns out to be (still) true.

And this was exactly what happened in mysteriously failing unit test case
reading wxImage contents from a socket: the failure was difficult to reproduce
because it depended on how much data exactly did we read from the socket in
one go.

Fix this by resetting the error properly and reenable the unit test which was
previously disabled for the build bot, it should pass now.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/socket.cpp
tests/image/image.cpp

index c0c35df4e2e16bbfcf1e80a2cd0b6496a663a675..64803df7a4f527d76a9bfc4c280c64ed774b1dbd 100644 (file)
@@ -980,7 +980,11 @@ wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes)
             {
                 // if we don't want to wait, just return immediately
                 if ( m_flags & wxSOCKET_NOWAIT )
+                {
+                    // this shouldn't be counted as an error in this case
+                    SetError(wxSOCKET_NOERROR);
                     break;
+                }
 
                 // otherwise wait until the socket becomes ready for reading or
                 // an error occurs on it
index 0616c08bd23cd28cb122733edaa5d30c1bf0076e..644cc6c745e5a3e9614b7059d98e981ed316a349 100644 (file)
@@ -110,15 +110,6 @@ void ImageTestCase::LoadFromFile()
 
 void ImageTestCase::LoadFromSocketStream()
 {
-    // Skip this test when running on a build slave because it just keeps
-    // failing erratically and sends build failure notifications when it does.
-    //
-    // Of course, it would be even better to understand why does it fail but so
-    // far we didn't manage to do it so disable until someone can find the
-    // problem.
-    if ( wxGetUserId().Lower().Matches("buildslave*") )
-        return;
-
     if (!IsNetworkAvailable())      // implemented in test.cpp
     {
         wxLogWarning("No network connectivity; skipping the "
@@ -131,24 +122,37 @@ void ImageTestCase::LoadFromSocketStream()
         wxBitmapType type;
     } testData[] =
     {
-        { "http://wxwidgets.org/logo9.jpg", wxBITMAP_TYPE_JPEG },
-        { "http://wxwidgets.org/favicon.ico", wxBITMAP_TYPE_ICO }
+        { "http://www.wxwidgets.org/logo9.jpg", wxBITMAP_TYPE_JPEG },
+        { "http://www.wxwidgets.org/favicon.ico", wxBITMAP_TYPE_ICO }
     };
 
     for (unsigned int i=0; i<WXSIZEOF(testData); i++)
     {
         wxURL url(testData[i].url);
-        CPPUNIT_ASSERT(url.GetError() == wxURL_NOERR);
+        WX_ASSERT_EQUAL_MESSAGE
+        (
+            ("Constructing URL \"%s\" failed.", testData[i].url),
+            wxURL_NOERR,
+            url.GetError()
+        );
 
         wxInputStream *in_stream = url.GetInputStream();
-        CPPUNIT_ASSERT(in_stream && in_stream->IsOk());
+        WX_ASSERT_MESSAGE
+        (
+            ("Opening URL \"%s\" failed.", testData[i].url),
+            in_stream && in_stream->IsOk()
+        );
 
         wxImage img;
 
         // NOTE: it's important to inform wxImage about the type of the image being
         //       loaded otherwise it will try to autodetect the format, but that
         //       requires a seekable stream!
-        CPPUNIT_ASSERT(img.LoadFile(*in_stream, testData[i].type));
+        WX_ASSERT_MESSAGE
+        (
+            ("Loading image from \"%s\" failed.", testData[i].url),
+            img.LoadFile(*in_stream, testData[i].type)
+        );
 
         delete in_stream;
     }