You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
8.6 KiB
288 lines
8.6 KiB
#ifndef REQUEST_TEST |
|
#define REQUEST_TEST |
|
|
|
|
|
#include "munit/munit.h" |
|
|
|
#include "../src/util.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; |
|
} |
|
|
|
MunitResult testRequestFromString(const MunitParameter params[], |
|
void* user_data_or_fixture){ |
|
char testString[] = "GET / HTTP/1.1\r\nHost: example.com\r\nAccept: */*\r\n\r\n"; |
|
Request *req = newRequestFromString(testString); |
|
|
|
munit_assert_string_equal( req->method, "GET" ); |
|
munit_assert_string_equal( req->path, "/" ); |
|
munit_assert_string_equal( requestToString( req ), testString ); |
|
|
|
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 */ |
|
},{ |
|
"/fromstring", /* name */ |
|
testRequestFromString, /* 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 */
|
|
|