diff options
Diffstat (limited to 'source/tests/test_http.c')
-rw-r--r-- | source/tests/test_http.c | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/source/tests/test_http.c b/source/tests/test_http.c new file mode 100644 index 0000000..e4882a4 --- /dev/null +++ b/source/tests/test_http.c @@ -0,0 +1,279 @@ +#include <unistd.h> +#include <time.h> + +#include "tests.h" + +#include "http.h" +#include "math.h" +#include "utils.h" + + +BOOL addPkg(SIZE_T sizA, SIZE_T sizB, struct http_resp* hresp, rrbuff* dst_buf, rrsize* dst_siz) +{ + ERRETCP( dst_buf != NULL && dst_siz != NULL && hresp != NULL ); + + rrsize new_siz = *dst_siz + sizA + sizeof(*hresp) + sizB; + *dst_buf = realloc(*dst_buf, new_siz*sizeof(**dst_buf)); + + rrbuff new_buf = *dst_buf + *dst_siz; + memset(new_buf, 'A', sizA); + memcpy(new_buf + sizA, hresp, sizeof(*hresp)); + memset(new_buf + sizA + sizeof(*hresp), 'B', sizB); + + *dst_siz = new_siz; + return TRUE; +} + +#define PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp) \ + if (pkgbuf != NULL) free(pkgbuf); \ + pkgbuf = NULL; \ + pkgsiz = 0; \ + pkg_count = 0; \ + memset(&hresp, 0, sizeof(hresp)); \ + memset(&hresp.startMarker[0], 'c', MARKER_SIZ); + +BOOL test_http(void) +{ + DWORD init_ret = ERR_HTTP_PRE; + ERRETCPDW( (init_ret = initHttp(LoadLibraryA, GetProcAddress)) == ERR_HTTP_OK, init_ret ); + + uint64_t sizA = __rdtsc() % 256; + uint64_t sizB = __rdtsc() % 512; + struct http_resp hresp = { {0}, 0, 0, 0 }; + rrbuff pkgbuf = NULL; + rrsize pkgsiz = 0; + DWORD pkg_count = 0; + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + hresp.respCode = RC_REGISTER; + ERRETCP( addPkg(sizA, sizB, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + ERRETCP( addPkg(sizA, sizB, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + hresp.respCode = RC_PING; + ERRETCP( addPkg(sizA, sizB, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + pkg_count = 3; + } + + { + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK ) { + ERRETCP( tmp_hresp != NULL ); + pkg_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d", ret); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + rflags all_flags[] = RF_ALL; + rrcode all_codes[] = RC_ALL; + for (DWORD i = 0; i < SIZEOF(all_codes); ++i) { + for (DWORD j = 0; j < SIZEOF(all_flags); ++j) { + hresp.respFlags = all_flags[j]; + hresp.respCode = all_codes[i]; + ERRETCP( addPkg(sizA, sizB, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + pkg_count++; + } + } + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK ) { + ERRETCP( tmp_hresp != NULL ); + pkg_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d", ret); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + DWORD maxPkgs = 64; + for (DWORD i = 0; i < maxPkgs; ++i) { + hresp.respCode = RC_PING; + ERRETCP( addPkg(sizA, sizB, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + pkg_count++; + } + ERRETCPLD( pkg_count == maxPkgs, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + int abs_count = 0; + rrcode all_codes[] = RC_ALL; + DWORD maxPkgs = 64; + DWORD validPkgs = 0; + for (DWORD i = 0; i < maxPkgs; ++i) { + rrcode rc; + int rnd; + while ((rnd = __rdtsc()) == 0) {} + if (rnd % 2 == 0) + rc = all_codes[ __rdtsc() % SIZEOF(all_codes) ]; + else + rc = (rrcode)__rdtsc(); + for (DWORD j = 0; j < SIZEOF(all_codes); ++j) { + if (all_codes[j] == rc) { + pkg_count++; + validPkgs++; + break; + } + } + abs_count++; + hresp.respCode = rc; + ERRETCP( addPkg(0, 0, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + } + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while (abs_count > 0) { + if ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK) { + pkg_count--; + } + abs_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d (validPkgs/maxPkgs: %lu/%lu)", ret, validPkgs, maxPkgs); + ERRETCPLD( abs_count == 0, abs_count ); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + DWORD maxPkgs = 64; + for (DWORD i = 0; i < maxPkgs; ++i) { + hresp.respCode = RC_PING; + ERRETCP( addPkg(0, 0, &hresp, &pkgbuf, &pkgsiz) == TRUE ); + pkg_count++; + } + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK) { + pkg_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d (maxPkgs: %lu)", ret, maxPkgs); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + hresp.respCode = RC_PING; + ERRETCP( addRequest(&pkgbuf, &pkgsiz, &hresp) == RSP_OK ); + int ret = -1; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + ERRETCPLD( (ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK, ret ); + } + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + { + hresp.respCode = 0; + ERRETCP( addRequest(&pkgbuf, &pkgsiz, &hresp) == RSP_OK ); + int ret = -1; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + ERRETCPLD( (ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) != RSP_OK, ret ); + } + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + int abs_count = 0; + rrcode all_codes[] = RC_ALL; + DWORD maxPkgs = 64; + DWORD validPkgs = 0; + for (DWORD i = 0; i < maxPkgs; ++i) { + rrcode rc; + int rnd; + while ((rnd = __rdtsc()) == 0) {} + if (rnd % 2 == 0) + rc = all_codes[ __rdtsc() % SIZEOF(all_codes) ]; + else + rc = (rrcode)__rdtsc(); + for (DWORD j = 0; j < SIZEOF(all_codes); ++j) { + if (all_codes[j] == rc) { + pkg_count++; + validPkgs++; + break; + } + } + abs_count++; + hresp.respCode = rc; + ERRETCP( addRequest(&pkgbuf, &pkgsiz, &hresp) == RSP_OK ); + } + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while (abs_count > 0) { + if ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK) { + pkg_count--; + } + abs_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d (validPkgs/maxPkgs: %lu/%lu)", ret, validPkgs, maxPkgs); + ERRETCPLD( abs_count == 0, abs_count ); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + + { + int abs_count = 0; + rrcode all_codes[] = RC_ALL; + DWORD maxPkgs = 64; + DWORD validPkgs = 0; + for (DWORD i = 0; i < maxPkgs; ++i) { + rrcode rc; + int rnd; + while ((rnd = __rdtsc()) == 0) {} + if (rnd % 2 == 0) + rc = all_codes[ __rdtsc() % SIZEOF(all_codes) ]; + else + rc = (rrcode)__rdtsc(); + for (DWORD j = 0; j < SIZEOF(all_codes); ++j) { + if (all_codes[j] == rc) { + pkg_count++; + validPkgs++; + break; + } + } + abs_count++; + + rrsize psiz = __rdtsc() % 512; + struct http_resp* nresp = calloc(sizeof(*nresp) + pkgsiz, 1); + memcpy(&nresp->startMarker[0], &hresp.startMarker[0], MARKER_SIZ); + nresp->pkgsiz = psiz; + nresp->respCode = rc; + ERRETCP( addRequest(&pkgbuf, &pkgsiz, nresp) == RSP_OK ); + free(nresp); + } + + int ret; + struct http_resp* tmp_hresp = NULL; + size_t pkgoff = 0; + while (abs_count > 0) { + if ((ret = parseResponse(pkgbuf, pkgsiz, &tmp_hresp, &pkgoff, &hresp.startMarker[0])) == RSP_OK) { + pkg_count--; + } + abs_count--; + } + if (pkg_count != 0) + ERRPRINT_BOTH("Last parseResponse returned: %d (validPkgs/maxPkgs: %lu/%lu)", ret, validPkgs, maxPkgs); + ERRETCPLD( abs_count == 0, abs_count ); + ERRETCPLD( pkg_count == 0, pkg_count ); + } + + PARSE_RESPONSE_CLEANUP(pkgbuf, pkgsiz, pkg_count, hresp); + return TRUE; +} |