blob: d4795128689b6f95b38826e8bf994c698406bf14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jose Cabral - initial API and implementation and/or initial documentation
*******************************************************************************/
#include <boost/test/unit_test.hpp>
#include "../../../src/com/HTTP/httpparser.h"
using namespace std::string_literals;
BOOST_AUTO_TEST_SUITE (HTTPParser_function_test)
BOOST_AUTO_TEST_CASE(createGetRequest_test) {
const char* resultValid1 = "GET / HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
const char* resultValid2 = "GET / HTTP/1.1\r\nHost: 192.168.0.1\r\n\r\n";
const char* resultValid3 = "GET /lookFor HTTP/1.1\r\nHost: 192.168.0.1\r\n\r\n";
const char* resultValid4 = "GET /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\n\r\n";
std::string dest("random text"s);
std::string host("0.0.0.0"s);
std::string path("/"s);
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_TEST(dest == resultValid1);
host = std::string("192.168.0.1");
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_TEST(dest == resultValid2);
path = std::string("/lookFor");
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_TEST(dest == resultValid3);
path = std::string("/lookFor/something/else");
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_TEST(dest == resultValid4);
}
BOOST_AUTO_TEST_CASE(PUTPOST_test) {
const char* putResultValid1 = "PUT / HTTP/1.1\r\nHost: 0.0.0.0\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* putResultValid1Changed =
"PUT / HTTP/1.1\r\nHost: 0.0.0.0\r\nContent-type: text/xml\r\nContent-length: 33\r\n\r\nkey1=val1Changed;key2Changed=val2";
const char* putResultValid2 = "PUT / HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* putResultValid3 = "PUT /lookFor HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* putResultValid4 =
"PUT /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* putEmptyData = "PUT /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 0\r\n\r\n";
const char* putJSONType =
"PUT /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: application/json\r\nContent-length: 29\r\n\r\n{\"key1\" : val1,\"key2\" : val2}";
const char* postResultValid1 = "POST / HTTP/1.1\r\nHost: 0.0.0.0\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* postResultValid1Changed =
"POST / HTTP/1.1\r\nHost: 0.0.0.0\r\nContent-type: text/xml\r\nContent-length: 33\r\n\r\nkey1=val1Changed;key2Changed=val2";
const char* postResultValid2 = "POST / HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* postResultValid3 = "POST /lookFor HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* postResultValid4 =
"POST /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 19\r\n\r\nkey1=val1;key2=val2";
const char* postEmptyData = "POST /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: text/xml\r\nContent-length: 0\r\n\r\n";
const char* postJSONType =
"POST /lookFor/something/else HTTP/1.1\r\nHost: 192.168.0.1\r\nContent-type: application/json\r\nContent-length: 29\r\n\r\n{\"key1\" : val1,\"key2\" : val2}";
std::string dest("random text"s);
std::string destEmpty;
std::string host("0.0.0.0"s);
std::string path("/"s);
std::string data("key1=val1;key2=val2"s);
std::string dataChanged("key1=val1Changed;key2Changed=val2"s);
std::string contentType("text/xml"s);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putResultValid1);
BOOST_TEST(true == forte::com_infra::CHttpParser::changePutPostData(dest, dataChanged));
BOOST_TEST(dest == putResultValid1Changed);
BOOST_TEST(true == forte::com_infra::CHttpParser::changePutPostData(dest, data));
BOOST_TEST(dest == putResultValid1);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postResultValid1);
BOOST_TEST(true == forte::com_infra::CHttpParser::changePutPostData(dest, dataChanged));
BOOST_TEST(dest == postResultValid1Changed);
BOOST_TEST(true == forte::com_infra::CHttpParser::changePutPostData(dest, data));
BOOST_TEST(dest == postResultValid1);
BOOST_TEST(false == forte::com_infra::CHttpParser::changePutPostData(destEmpty, data));
dataChanged.clear();
BOOST_TEST(false == forte::com_infra::CHttpParser::changePutPostData(destEmpty, dataChanged));
host = std::string("192.168.0.1"s);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putResultValid2);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postResultValid2);
path = std::string("/lookFor"s);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putResultValid3);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postResultValid3);
path = std::string("/lookFor/something/else"s);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putResultValid4);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postResultValid4);
data.clear();
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putEmptyData);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postEmptyData);
contentType = std::string("application/json"s);
data = std::string("{\"key1\" : val1,\"key2\" : val2}"s);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_TEST(dest == putJSONType);
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_TEST(dest == postJSONType);
}
BOOST_AUTO_TEST_CASE(parseResponse_test) {
std::string validReponse("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nkey1=val1;key2=val2"s);
std::string validReponseNoBody("HTTP/1.1 200 OK\r\n"s);
std::string worngFirstLine("HTTP/1.1 200 OK\nContent-Type: text/html"s);
std::string worngStatusLine("HTTP/1.1 200OK\r\nContent-Type: text/html\r\n\r\nkey1=val1;key2=val2"s);
std::string body;
std::string responseCode;
BOOST_TEST(true == forte::com_infra::CHttpParser::parseResponse(body, responseCode, validReponse.data()));
BOOST_TEST(body == "key1=val1;key2=val2"s);
BOOST_TEST(responseCode == "200"s);
responseCode.clear();
BOOST_TEST(true == forte::com_infra::CHttpParser::parseResponse(body, responseCode, validReponseNoBody.data()));
BOOST_TEST(body == ""s);
BOOST_TEST(responseCode == "200"s);
BOOST_TEST(false == forte::com_infra::CHttpParser::parseResponse(body, responseCode, worngFirstLine.data()));
BOOST_TEST(false == forte::com_infra::CHttpParser::parseResponse(body, responseCode, worngStatusLine.data()));
}
BOOST_AUTO_TEST_CASE(createResponse_test) {
const char* validResult = "HTTP/1.1 200 OK\r\nContent-type: application/json\r\nContent-length: 29\r\n\r\n{\"key1\" : val1,\"key2\" : val2}";
const char* validResultNoBody = "HTTP/1.1 200 OK\r\n";
std::string dest;
std::string result("HTTP/1.1 200 OK"s);
std::string contentType("application/json"s);
std::string data("{\"key1\" : val1,\"key2\" : val2}"s);
forte::com_infra::CHttpParser::createResponse(dest, result, contentType, data);
BOOST_TEST(dest == validResult);
data.clear();
forte::com_infra::CHttpParser::createResponse(dest, result, contentType, data);
BOOST_TEST(dest == validResultNoBody);
}
BOOST_AUTO_TEST_CASE(parseGetRequest_test) {
std::string resultValidNoParameters("GET / HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string resultValidNoParameters2("GET /path/to/look HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string resultValidParam("GET /?key1=val1 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string resultValidParams("GET /?key1=val1&key2=val2 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string resultValidParam2("GET /path/to/look?key1=val1 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string resultValidParams2("GET /path/to/look?key1=val1&key2=val2 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string invalidGET("Get / HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n"s);
std::string invalidPath("GET /pathHTTP/1.1\r\n"s);
std::string path;
CSinglyLinkedList<std::string> parameterNames;
CSinglyLinkedList<std::string> parameterValues;
BOOST_TEST(true == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidNoParameters.data()));
BOOST_TEST(path == "/"s);
BOOST_TEST(true == parameterNames.isEmpty());
BOOST_TEST(true == parameterValues.isEmpty());
BOOST_TEST(true == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidNoParameters2.data()));
BOOST_TEST(path == "/path/to/look"s);
BOOST_TEST(true == parameterNames.isEmpty());
BOOST_TEST(true == parameterValues.isEmpty());
BOOST_TEST(true == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParam.data()));
BOOST_TEST(path == "/"s);
CSinglyLinkedList<std::string>::Iterator namesIter = parameterNames.begin();
CSinglyLinkedList<std::string>::Iterator valuesIter = parameterValues.begin();
BOOST_TEST((*namesIter) == "key1"s);
BOOST_TEST((*valuesIter) == "val1"s);
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_TEST(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParams.data()));
BOOST_TEST(path == "/");
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_TEST((*namesIter) == "key1"s);
BOOST_TEST((*valuesIter) == "val1"s);
++namesIter;
++valuesIter;
BOOST_TEST((*namesIter) == "key2"s);
BOOST_TEST((*valuesIter) == "val2"s);
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_TEST(true == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParam2.data()));
BOOST_TEST(path == "/path/to/look"s);
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_TEST((*namesIter) == "key1"s);
BOOST_TEST((*valuesIter) == "val1"s);
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_TEST(true == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParams2.data()));
BOOST_TEST(path == "/path/to/look"s);
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_TEST((*namesIter) == "key1"s);
BOOST_TEST((*valuesIter) == "val1");
++namesIter;
++valuesIter;
BOOST_TEST((*namesIter) == "key2"s);
BOOST_TEST((*valuesIter) == "val2"s);
BOOST_TEST(false == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, invalidGET.data()));
BOOST_TEST(false == forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, invalidPath.data()));
}
BOOST_AUTO_TEST_SUITE_END()