Hi Andreas,

Can you shed some light on the intent of this famous test?

    s->write(HTTPREQUEST);
    s->waitForReadyRead();
    s->close();
    //What happens is that during waitForReadyRead() the write buffer is 
written out
    //completely so that the socket can shut down without having to wait for 
writeout.
    QCOMPARE(stateToString(s->state()), 
stateToString(KTcpSocket::UnconnectedState));

What the comment says above, doesn't appear to be true. We get "ClosingState" 
now and then.
If I check s->bytesAvailable() after waitForReadyRead(), it's 4344.

Here's debug output from when it works:

QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
emits stateChanged()(ClosingState)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
disconnecting immediately
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::resetSocketLayer()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::bytesAvailable() == 4344
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
disconnected!
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
closed!
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::~QAbstractSocket()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::~QAbstractSocket()

And here's debug output from when it fails:

QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
emits stateChanged()(ClosingState)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
delaying disconnect
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
return from delayed close
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
delaying disconnect
FAIL!  : KTcpSocketTest::statesIana() Compared values are not the same
   Actual (stateToString(s->state())): ClosingState
   Expected (stateToString(KTcpSocket::UnconnectedState)): UnconnectedState
   Loc: [/d/kde/src/4/kde/kdelibs/kdecore/tests/ktcpsockettest.cpp(245)]
PASS   : KTcpSocketTest::cleanupTestCase()

We go into "delaying disconnect" because  d->writeBuffer.size()==38 (the whole 
HTTP request
is still in the write buffer).

Hmm, isn't the problem that the test makes a first request, waits for data to 
be available, but doesn't read
it, so readyRead is still true when making the 2nd request? Added a 
s->readData() ... not better.
Here's the full log, please advise:

PASS   : KTcpSocketTest::initTestCase()
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocket::QAbstractSocket(TcpSocket, QAbstractSocketPrivate == 
0x1c50d90, parent == 0x0)
QDEBUG : KTcpSocketTest::statesIana() "ktcpsockettest"  ( 21234 ) connects to 
bus "qt_default_session_bus" QDBusConnectionPrivate(0x1cf3c90) 
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocket::QAbstractSocket(TcpSocket, QAbstractSocketPrivate == 
0x1cfdfb0, parent == 0x1c49de0)
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocket::connectToHost("www.iana.org", 80, 3)...
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocket::connectToHost("www.iana.org", 80) == false (connection in 
progress)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::writeData(0x1cff0e8 "GET 
/ HTTP/1.1\nHost: www.example...", 38) == 38
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForBytesWritten(2500)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForConnected(2500)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForConnected(2500) 
doing host name lookup
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::_q_startConnecting(hostInfo == {192.0.32.8, 
2620:0:2D0:200::8})
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::_q_connectToNextAddress(), connecting to 192.0.32.8:80, 
3 left to try
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::resetSocketLayer()
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::initSocketLayer(TcpSocket, IPv4Protocol) success
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForConnected(2500) 
waiting 2.50 secs for connection attempt #1
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::fetchConnectionParameters() connection to 192.0.32.8:80 
established
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForConnected(2500) 
== true
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::canWriteNotification() flushing
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::flush() 38 bytes 
written to the network
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForBytesWritten 
returns true
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForReadyRead(2500)
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::canReadNotification()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::readFromSocket() 
about to read 2896 bytes
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::readFromSocket() 
got 2896 bytes, buffer size = 2896
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::bytesAvailable() == 2896
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::readData(0x1d10058 'H 
(0x48)', 16384) == 2896 [buffer]
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::bytesAvailable() == 0
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::bytesAvailable() == 0
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::writeData(0x1cfe648 "GET 
/ HTTP/1.1\nHost: www.example...", 38) == 38
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::waitForReadyRead(2500)
QDEBUG : KTcpSocketTest::statesIana() 
QAbstractSocketPrivate::canReadNotification()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::readFromSocket() 
about to read 1448 bytes
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocketPrivate::readFromSocket() 
got 1448 bytes, buffer size = 1448
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::bytesAvailable() == 1448
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
emits stateChanged()(ClosingState)
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
delaying disconnect due to d->writeBuffer.size()= 38 
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::close()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost()
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
return from delayed close
QDEBUG : KTcpSocketTest::statesIana() QAbstractSocket::disconnectFromHost() 
delaying disconnect due to d->writeBuffer.size()= 38 
FAIL!  : KTcpSocketTest::statesIana() Compared values are not the same
   Actual (stateToString(s->state())): ClosingState

Clearly the 2nd request hasn't been written out, so I'm not sure why 
canReadNotification is called immediately.

But before I spend more time on this, I want to ask: why do we care for this 
specific behavior of QTcpSocket,
i.e. do we really care that closing is immediate in this unusual case? What's 
the purpose of the test?

-- 
David Faure, fa...@kde.org, http://www.davidfaure.fr
Sponsored by BlueSystems and KDAB to work on KDE Frameworks

_______________________________________________
Kde-frameworks-devel mailing list
Kde-frameworks-devel@kde.org
https://mail.kde.org/mailman/listinfo/kde-frameworks-devel

Reply via email to