#include #include void log_message(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stderr, msg, args); fprintf(stderr, "\n"); fflush(stderr); } #include "url.c" /* yes, include the source file */ static int test_parse_content_length(const char *headers, unsigned long expected, int shouldfail) { int err; unsigned long val; err = parse_content_length(headers, &val); if (err < 0 && !shouldfail) { log_message("%s: unexpectedly failed on input '%s'", __func__, headers); return 2; } if (err == 0 && shouldfail) { log_message("%s: unexpectedly passed on invalid input '%s'", __func__, headers); return 3; } if (!shouldfail && val != expected) { log_message("%s: expected %lu, got %lu on input '%s'", __func__, expected, val, headers); return 5; } if (!shouldfail && val == expected) { log_message("%s: OK: '%s'", __func__, headers); } return 0; } #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) int main(int argc, char **argv) { int i, err = 0; const char *invalid_inputs[] = { "", /* empty */ "Abyrvalg: foobar", /* no Content-Length: */ "Content-Length: xyz", /* no digits */ "Content-Length: 12xyz", /* invalid characters */ "Content-Length: 12 34", /* stray symbols */ "Content-Length: 123456789012345678901234567890", /* too big */ }; const char *valid_inputs[] = { "Content-Length: 1234", "Content-Length: 1234", "Content-Length: 1234 ", "Content-Length: 1234 ", "Content-Length: 1234 \r\n\r\n", }; for (i = 0; i < ARRAY_SIZE(invalid_inputs); i++) { err += test_parse_content_length(invalid_inputs[i], 0, /* shouldfail = */ 1); } for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) { err += test_parse_content_length(valid_inputs[i], 1234, /* shouldfail = */ 0); } return err; } /* compile command: gcc -O2 -g -flto -o test_parse_content_length.c test_parse_content_length.c */