|
|
|
#ifndef REQUEST_TEST
|
|
|
|
#define REQUEST_TEST
|
|
|
|
|
|
|
|
|
|
|
|
#include "munit/munit.h"
|
|
|
|
|
|
|
|
#include "../src/readline.h"
|
|
|
|
#include "../src/request.h"
|
|
|
|
#include "../src/requestresponse.h"
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
char *fullLine;
|
|
|
|
char *method;
|
|
|
|
char *host;
|
|
|
|
int port;
|
|
|
|
char *protocol;
|
|
|
|
double version;
|
|
|
|
char *path;
|
|
|
|
char *queryString;
|
|
|
|
} requestTestFirstLine;
|
|
|
|
|
|
|
|
|
|
|
|
static requestTestFirstLine requestLine1Examples[] = {
|
|
|
|
//Full Line, Method Host Port Protocol Version Path Query string
|
|
|
|
{ "GET /search?q=test HTTP/2", "GET", "", 80, "http", 2, "/search", "?q=test"},
|
|
|
|
{ "GET / HTTP/2", "GET", "", 80, "http", 2, "/", ""},
|
|
|
|
{ "POST http://example.com/test HTTP/1.1", "POST", "example.com", 80, "http", 1.1, "/test", "" },
|
|
|
|
{ "CONNECT example.com:443 HTTP/1.1", "CONNECT", "example.com", 443, "https", 1.1, "", "" },
|
|
|
|
{ "POST https://example.com/test/test2/test3 HTTP/1.1", "POST", "example.com", 443, "https", 1.1, "/test/test2/test3", ""},
|
|
|
|
{ "POST https://example.com:4444/test/ HTTP/1.1", "POST", "example.com", 4444, "https", 1.1, "/test/", ""},
|
|
|
|
{ NULL, NULL, NULL, 80, NULL, 0, NULL, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
requestTestFirstLine* getLineObj( const MunitParameter params[] ){
|
|
|
|
const char *firstLine = munit_parameters_get(params, "L1" );
|
|
|
|
requestTestFirstLine *line = requestLine1Examples;
|
|
|
|
|
|
|
|
while ( line->fullLine != NULL && strcmp( line->fullLine, firstLine ) != 0 )
|
|
|
|
line++;
|
|
|
|
|
|
|
|
return line;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLineProtocols(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_not_null( req->protocol );
|
|
|
|
munit_assert_string_equal( req->protocol, line->protocol );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLineMethod(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_not_null( req->method );
|
|
|
|
munit_assert_string_equal( req->method, line->method );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLineHosts(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_not_null( req->host );
|
|
|
|
munit_assert_string_equal( req->host, line->host );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLinePorts(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_int( req->port, ==, line->port );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLinePaths(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_not_null( req->path );
|
|
|
|
munit_assert_string_equal( req->path, line->path );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLineVersions(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
|
|
|
|
Request *req;
|
|
|
|
printf("\nI get here\n");
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_float( req->version, ==, line->version );
|
|
|
|
free( req );
|
|
|
|
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testFirstLineQueryString(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req;
|
|
|
|
requestTestFirstLine *line = getLineObj(params);
|
|
|
|
if ( line->fullLine == NULL ) return MUNIT_ERROR;
|
|
|
|
req = newRequest();
|
|
|
|
requestFirstLine( req, line->fullLine );
|
|
|
|
munit_assert_not_null( req->queryString );
|
|
|
|
munit_assert_string_equal( req->queryString, line->queryString );
|
|
|
|
free( req );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testRequestAddHeader(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req = newRequest();
|
|
|
|
munit_assert_null(req->headers);
|
|
|
|
requestAddHeader(req, "Content-Length: 0");
|
|
|
|
munit_assert_int( 1, ==, countHeaders(req->headers) );
|
|
|
|
requestAddHeader(req, "Test-header: 5");
|
|
|
|
munit_assert_int( 2, ==, countHeaders(req->headers) );
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitResult testRequestToString(const MunitParameter params[],
|
|
|
|
void* user_data_or_fixture){
|
|
|
|
Request *req = newRequest();
|
|
|
|
requestFirstLine( req, "GET /search?q=test HTTP/1.1" );
|
|
|
|
munit_assert_string_equal( requestToString( req ), "GET /search?q=test HTTP/1.1\r\n\r\n" );
|
|
|
|
requestAddHeader( req, "Host: example.com" );
|
|
|
|
munit_assert_string_equal( requestToString( req ), "GET /search?q=test HTTP/1.1\r\nHost: example.com\r\n\r\n" );
|
|
|
|
|
|
|
|
return MUNIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
MunitParameterEnum test_first_line_params[2] = {NULL, NULL};
|
|
|
|
|
|
|
|
static MunitTest request_tests[] = {
|
|
|
|
{
|
|
|
|
"/line1/versions", /* name */
|
|
|
|
testFirstLineVersions, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
}, {
|
|
|
|
"/line1/methods", /* name */
|
|
|
|
testFirstLineMethod, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/line1/protocols", /* name */
|
|
|
|
testFirstLineProtocols, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/line1/hosts", /* name */
|
|
|
|
testFirstLineHosts, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/line1/ports", /* name */
|
|
|
|
testFirstLinePorts, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/line1/paths", /* name */
|
|
|
|
testFirstLinePaths, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/line1/queryStrings", /* name */
|
|
|
|
testFirstLineQueryString, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
test_first_line_params /* parameters */
|
|
|
|
},{
|
|
|
|
"/headers/add", /* name */
|
|
|
|
testRequestAddHeader, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
NULL /* parameters */
|
|
|
|
},{
|
|
|
|
"/tostring", /* name */
|
|
|
|
testRequestToString, /* test */
|
|
|
|
NULL, /* setup */
|
|
|
|
NULL, /* tear_down */
|
|
|
|
MUNIT_TEST_OPTION_NONE, /* options */
|
|
|
|
NULL /* parameters */
|
|
|
|
},
|
|
|
|
/* Mark the end of the array with an entry where the test
|
|
|
|
* function is NULL */
|
|
|
|
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
MunitSuite request_test_suite = {
|
|
|
|
"/request", /* name */
|
|
|
|
request_tests, /* tests */
|
|
|
|
NULL, /* suites */
|
|
|
|
1, /* iterations */
|
|
|
|
MUNIT_SUITE_OPTION_NONE /* options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifndef MAINTEST
|
|
|
|
#define MAINTEST
|
|
|
|
|
|
|
|
int main (int argc, char* argv[]) {
|
|
|
|
static char** firstLines;
|
|
|
|
unsigned int count = 1;
|
|
|
|
requestTestFirstLine *current = requestLine1Examples;
|
|
|
|
while ( current->fullLine != NULL ){
|
|
|
|
count++;
|
|
|
|
current++;
|
|
|
|
}
|
|
|
|
printf("There are %i request lines to test", count);
|
|
|
|
firstLines = malloc( sizeof( char * ) * ( count ) );
|
|
|
|
|
|
|
|
for( unsigned int i = 0; i < count; i++ ){
|
|
|
|
firstLines[i] = requestLine1Examples[i].fullLine;
|
|
|
|
}
|
|
|
|
|
|
|
|
test_first_line_params[0].name = "L1";
|
|
|
|
test_first_line_params[0].values = firstLines;
|
|
|
|
|
|
|
|
|
|
|
|
return munit_suite_main(&request_test_suite, NULL, argc, argv);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* ifndef MAINTEST */
|
|
|
|
#endif /* ifndef REQUEST_TEST */
|