Make TestHTTPServer header comparison order independent.
authorJonas Gastal <jgastal@gmail.com>
Sun, 10 Feb 2013 03:31:51 +0000 (01:31 -0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 7 Jun 2013 00:14:33 +0000 (02:14 +0200)
The order of headers in an HTTP request is irrelevant and program
behavior should not depend on it.

Change-Id: I77e1b6265ceed8a38f04e425ba8e6eb70b5227f1
Reviewed-by: Richard J. Moore <rich@kde.org>
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
tests/auto/shared/testhttpserver.cpp
tests/auto/shared/testhttpserver.h

index 205d5ce..fd68171 100644 (file)
@@ -137,7 +137,19 @@ bool TestHTTPServer::wait(const QUrl &expect, const QUrl &reply, const QUrl &bod
         bodyData = bodyFile.readAll();
     }
 
-    waitData = expectFile.readAll();
+    QByteArray line;
+    bool headers_done = false;
+    while (!(line = expectFile.readLine()).isEmpty()) {
+        line.replace('\r', "");
+        if (line.at(0) == '\n') {
+            headers_done = true;
+            continue;
+        }
+        if (headers_done)
+            waitData.body.append(line);
+        else
+            waitData.headers.append(line);
+    }
     /*
     while (waitData.endsWith('\n'))
         waitData = waitData.left(waitData.count() - 1);
@@ -199,39 +211,38 @@ void TestHTTPServer::readyRead()
     QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
     if (!socket || socket->state() == QTcpSocket::ClosingState) return;
 
-    QByteArray ba = socket->readAll();
-
     if (!dirs.isEmpty()) {
-        serveGET(socket, ba);
+        serveGET(socket, socket->readAll());
         return;
     }
 
-    if (m_hasFailed || waitData.isEmpty()) {
-        qWarning() << "TestHTTPServer: Unexpected data" << ba;
+    if (m_hasFailed || (waitData.body.isEmpty() && waitData.headers.count() == 0)) {
+        qWarning() << "TestHTTPServer: Unexpected data" << socket->readAll();
         return;
     }
 
-    for (int ii = 0; ii < ba.count(); ++ii) {
-        const char c = ba.at(ii);
-        if (c == '\r' && waitData.isEmpty())
-           continue;
-        else if (!waitData.isEmpty() && c == waitData.at(0))
-            waitData = waitData.mid(1);
-        else if (c == '\r')
-            continue;
-        else {
-            QByteArray data = ba.mid(ii);
-            qWarning() << "TestHTTPServer: Unexpected data" << data << "\nExpected: " << waitData;
+    QByteArray line;
+    while (!(line = socket->readLine()).isEmpty()) {
+        line.replace('\r', "");
+        if (line.at(0) == '\n') {
+            QByteArray data = socket->readAll();
+            if (waitData.body != data) {
+                qWarning() << "TestHTTPServer: Unexpected data" << data << "\nExpected: " << waitData.body;
+                m_hasFailed = true;
+                socket->disconnectFromHost();
+                return;
+            }
+        }
+        else if (!waitData.headers.contains(line)) {
+            qWarning() << "TestHTTPServer: Unexpected header:" << line << "\nExpected headers: " << waitData.headers;
             m_hasFailed = true;
             socket->disconnectFromHost();
             return;
         }
     }
 
-    if (waitData.isEmpty()) {
-        socket->write(replyData);
-        socket->disconnectFromHost();
-    }
+    socket->write(replyData);
+    socket->disconnectFromHost();
 }
 
 bool TestHTTPServer::reply(QTcpSocket *socket, const QByteArray &fileName)
index 15e08af..ce0501f 100644 (file)
@@ -81,7 +81,10 @@ private:
     QHash<QTcpSocket *, QByteArray> dataCache;
     QList<QPair<QTcpSocket *, QByteArray> > toSend;
 
-    QByteArray waitData;
+    struct WaitData {
+        QList <QByteArray>headers;
+        QByteArray body;
+    } waitData;
     QByteArray replyData;
     QByteArray bodyData;
     bool m_hasFailed;