/* * This file is part of the Flowee project * Copyright (c) 2017 Nathan Osman * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "TestParser.h" #include #include #include #include #include #include typedef QList QByteArrayList; Q_DECLARE_METATYPE(HttpEngine::Socket::Method) Q_DECLARE_METATYPE(HttpEngine::Socket::QueryStringMap) Q_DECLARE_METATYPE(HttpEngine::Socket::HeaderMap) const HttpEngine::IByteArray Key1 = "a"; const QByteArray Value1 = "b"; const QByteArray Line1 = Key1 + ": " + Value1; const HttpEngine::IByteArray Key2 = "c"; const QByteArray Value2 = "d"; const QByteArray Line2 = Key2 + ": " + Value2; TestParser::TestParser() { headers.insert(Key1, Value1); headers.insert(Key2, Value2); } void TestParser::testSplit_data() { QTest::addColumn("data"); QTest::addColumn("delim"); QTest::addColumn("maxSplit"); QTest::addColumn("parts"); QTest::newRow("empty string") << QByteArray() << QByteArray(",") << 0 << (QByteArrayList() << ""); QTest::newRow("no delimiter") << QByteArray("a") << QByteArray(",") << 0 << (QByteArrayList() << "a"); QTest::newRow("delimiter") << QByteArray("a::b::c") << QByteArray("::") << 0 << (QByteArrayList() << "a" << "b" << "c"); QTest::newRow("empty parts") << QByteArray("a,,") << QByteArray(",") << 0 << (QByteArrayList() << "a" << "" << ""); QTest::newRow("maxSplit") << QByteArray("a,a,a") << QByteArray(",") << 1 << (QByteArrayList() << "a" << "a,a"); } void TestParser::testSplit() { QFETCH(QByteArray, data); QFETCH(QByteArray, delim); QFETCH(int, maxSplit); QFETCH(QByteArrayList, parts); QByteArrayList outParts; HttpEngine::Parser::split(data, delim, maxSplit, outParts); QCOMPARE(outParts, parts); } void TestParser::testParsePath_data() { QTest::addColumn("rawPath"); QTest::addColumn("path"); QTest::addColumn("map"); QTest::newRow("no query string") << QByteArray("/path") << QString("/path") << HttpEngine::Socket::QueryStringMap(); QTest::newRow("single parameter") << QByteArray("/path?a=b") << QString("/path") << HttpEngine::Socket::QueryStringMap{{"a", "b"}}; } void TestParser::testParsePath() { QFETCH(QByteArray, rawPath); QFETCH(QString, path); QFETCH(HttpEngine::Socket::QueryStringMap, map); QString outPath; HttpEngine::Socket::QueryStringMap outMap; QVERIFY(HttpEngine::Parser::parsePath(rawPath, outPath, outMap)); QCOMPARE(path, outPath); QCOMPARE(map, outMap); } void TestParser::testParseHeaderList_data() { QTest::addColumn("success"); QTest::addColumn("lines"); QTest::addColumn("headers"); QTest::newRow("empty line") << false << (QByteArrayList() << ""); QTest::newRow("multiple lines") << true << (QByteArrayList() << Line1 << Line2) << headers; } void TestParser::testParseHeaderList() { QFETCH(bool, success); QFETCH(QByteArrayList, lines); HttpEngine::Socket::HeaderMap outHeaders; QCOMPARE(HttpEngine::Parser::parseHeaderList(lines, outHeaders), success); if (success) { QFETCH(HttpEngine::Socket::HeaderMap, headers); QCOMPARE(outHeaders, headers); } } void TestParser::testParseHeaders_data() { QTest::addColumn("success"); QTest::addColumn("data"); QTest::addColumn("parts"); QTest::newRow("empty headers") << false << QByteArray(""); QTest::newRow("simple GET request") << true << QByteArray("GET / HTTP/1.0") << (QByteArrayList() << "GET" << "/" << "HTTP/1.0"); } void TestParser::testParseHeaders() { QFETCH(bool, success); QFETCH(QByteArray, data); QByteArrayList outParts; HttpEngine::Socket::HeaderMap outHeaders; QCOMPARE(HttpEngine::Parser::parseHeaders(data, outParts, outHeaders), success); if (success) { QFETCH(QByteArrayList, parts); QCOMPARE(outParts, parts); } } void TestParser::testParseRequestHeaders_data() { QTest::addColumn("success"); QTest::addColumn("data"); QTest::addColumn("method"); QTest::addColumn("path"); QTest::newRow("bad HTTP version") << false << QByteArray("GET / HTTP/0.9"); QTest::newRow("GET request") << true << QByteArray("GET / HTTP/1.0") << HttpEngine::Socket::GET << QByteArray("/"); } void TestParser::testParseRequestHeaders() { QFETCH(bool, success); QFETCH(QByteArray, data); HttpEngine::Socket::Method outMethod; QByteArray outPath; HttpEngine::Socket::HeaderMap outHeaders; QCOMPARE(HttpEngine::Parser::parseRequestHeaders(data, outMethod, outPath, outHeaders), success); if (success) { QFETCH(HttpEngine::Socket::Method, method); QFETCH(QByteArray, path); QCOMPARE(method, outMethod); QCOMPARE(path, outPath); } } void TestParser::testParseResponseHeaders_data() { QTest::addColumn("success"); QTest::addColumn("data"); QTest::addColumn("statusCode"); QTest::addColumn("statusReason"); QTest::newRow("invalid status code") << false << QByteArray("HTTP/1.0 600 BAD RESPONSE"); QTest::newRow("404 response") << true << QByteArray("HTTP/1.0 404 NOT FOUND") << 404 << QByteArray("NOT FOUND"); } void TestParser::testParseResponseHeaders() { QFETCH(bool, success); QFETCH(QByteArray, data); int outStatusCode; QByteArray outStatusReason; HttpEngine::Socket::HeaderMap outHeaders; QCOMPARE(HttpEngine::Parser::parseResponseHeaders(data, outStatusCode, outStatusReason, outHeaders), success); if (success) { QFETCH(int, statusCode); QFETCH(QByteArray, statusReason); QCOMPARE(statusCode, outStatusCode); QCOMPARE(statusReason, outStatusReason); } }