blob: 1df4b2df5be04c2cb7601189b04ab1133df61595 [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/modules/HTTP/httpparser.h"
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";
CIEC_STRING dest = "random text";
CIEC_STRING host = "0.0.0.0";
CIEC_STRING path = "/";
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), resultValid1));
host = "192.168.0.1";
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), resultValid2));
path = "/lookFor";
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), resultValid3));
path = "/lookFor/something/else";
forte::com_infra::CHttpParser::createGetRequest(dest, host, path);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), 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}";
CIEC_STRING dest = "random text";
CIEC_STRING destEmpty = "";
CIEC_STRING host = "0.0.0.0";
CIEC_STRING path = "/";
CIEC_STRING data = "key1=val1;key2=val2";
CIEC_STRING dataChanged = "key1=val1Changed;key2Changed=val2";
CIEC_STRING contentType = "text/xml";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid1));
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::changePutPostData(dest, dataChanged));
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid1Changed));
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::changePutPostData(dest, data));
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid1));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid1));
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::changePutPostData(dest, dataChanged));
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid1Changed));
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::changePutPostData(dest, data));
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid1));
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::changePutPostData(destEmpty, data));
dataChanged = "";
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::changePutPostData(destEmpty, dataChanged));
host = "192.168.0.1";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid2));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid2));
path = "/lookFor";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid3));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid3));
path = "/lookFor/something/else";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putResultValid4));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postResultValid4));
data = "";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putEmptyData));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postEmptyData));
contentType = "application/json";
data = "{\"key1\" : val1,\"key2\" : val2}";
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_PUT);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), putJSONType));
forte::com_infra::CHttpParser::createPutPostRequest(dest, host, path, data, contentType, forte::com_infra::CHttpComLayer::e_POST);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), postJSONType));
}
BOOST_AUTO_TEST_CASE(parseResponse_test) {
CIEC_STRING validReponse = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nkey1=val1;key2=val2";
CIEC_STRING validReponseNoBody = "HTTP/1.1 200 OK\r\n";
CIEC_STRING worngFirstLine = "HTTP/1.1 200 OK\nContent-Type: text/html";
CIEC_STRING worngStatusLine = "HTTP/1.1 200OK\r\nContent-Type: text/html\r\n\r\nkey1=val1;key2=val2";
CIEC_STRING body;
CIEC_STRING responseCode;
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseResponse(body, responseCode, validReponse.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(body.getValue(), "key1=val1;key2=val2"));
BOOST_CHECK_EQUAL(0, strcmp(responseCode.getValue(), "200"));
responseCode = "";
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseResponse(body, responseCode, validReponseNoBody.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(body.getValue(), ""));
BOOST_CHECK_EQUAL(0, strcmp(responseCode.getValue(), "200"));
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::parseResponse(body, responseCode, worngFirstLine.getValue()));
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::parseResponse(body, responseCode, worngStatusLine.getValue()));
}
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";
CIEC_STRING dest;
CIEC_STRING result = "HTTP/1.1 200 OK";
CIEC_STRING contentType = "application/json";
CIEC_STRING data = "{\"key1\" : val1,\"key2\" : val2}";
forte::com_infra::CHttpParser::createResponse(dest, result, contentType, data);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), validResult));
data = "";
forte::com_infra::CHttpParser::createResponse(dest, result, contentType, data);
BOOST_CHECK_EQUAL(0, strcmp(dest.getValue(), validResultNoBody));
}
BOOST_AUTO_TEST_CASE(parseGetRequest_test) {
CIEC_STRING resultValidNoParameters = "GET / HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING resultValidNoParameters2 = "GET /path/to/look HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING resultValidParam = "GET /?key1=val1 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING resultValidParams = "GET /?key1=val1&key2=val2 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING resultValidParam2 = "GET /path/to/look?key1=val1 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING resultValidParams2 = "GET /path/to/look?key1=val1&key2=val2 HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING invalidGET = "Get / HTTP/1.1\r\nHost: 0.0.0.0\r\n\r\n";
CIEC_STRING invalidPath = "GET /pathHTTP/1.1\r\n";
CIEC_STRING path;
CSinglyLinkedList<CIEC_STRING> parameterNames;
CSinglyLinkedList<CIEC_STRING> parameterValues;
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidNoParameters.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/"));
BOOST_CHECK_EQUAL(true, parameterNames.isEmpty());
BOOST_CHECK_EQUAL(true, parameterValues.isEmpty());
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidNoParameters2.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/path/to/look"));
BOOST_CHECK_EQUAL(true, parameterNames.isEmpty());
BOOST_CHECK_EQUAL(true, parameterValues.isEmpty());
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParam.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/"));
CSinglyLinkedList<CIEC_STRING>::Iterator namesIter = parameterNames.begin();
CSinglyLinkedList<CIEC_STRING>::Iterator valuesIter = parameterValues.begin();
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key1"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val1"));
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParams.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/"));
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key1"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val1"));
++namesIter;
++valuesIter;
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key2"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val2"));
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParam2.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/path/to/look"));
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key1"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val1"));
parameterNames.clearAll();
parameterValues.clearAll();
BOOST_CHECK_EQUAL(true, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, resultValidParams2.getValue()));
BOOST_CHECK_EQUAL(0, strcmp(path.getValue(), "/path/to/look"));
namesIter = parameterNames.begin();
valuesIter = parameterValues.begin();
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key1"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val1"));
++namesIter;
++valuesIter;
BOOST_CHECK_EQUAL(0, strcmp((*namesIter).getValue(), "key2"));
BOOST_CHECK_EQUAL(0, strcmp((*valuesIter).getValue(), "val2"));
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, invalidGET.getValue()));
BOOST_CHECK_EQUAL(false, forte::com_infra::CHttpParser::parseGetRequest(path, parameterNames, parameterValues, invalidPath.getValue()));
}
BOOST_AUTO_TEST_SUITE_END()