test82: share support functions in common.[ch] for test83
Change-Id: I3dfeacc3c2c143d3b696efa39a6f257d38281742
This commit is contained in:
parent
da32b6c32e
commit
17fbdaf514
3 changed files with 44 additions and 48 deletions
|
@ -7,6 +7,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
#include <sys/syslimits.h>
|
#include <sys/syslimits.h>
|
||||||
|
@ -126,6 +127,24 @@ void cleanup()
|
||||||
if (chdir("..") == 0 && common_test_nr != -1) rm_rf_dir(common_test_nr);
|
if (chdir("..") == 0 && common_test_nr != -1) rm_rf_dir(common_test_nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fail_printf(const char *file, const char *func, int line,
|
||||||
|
const char *fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
char buf[1024];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = snprintf(buf, sizeof(buf), "[%s:%s:%d] ", file, func, line);
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
snprintf(buf + len, sizeof(buf) - len, " errno=%d error=%s",
|
||||||
|
errno, strerror(errno));
|
||||||
|
|
||||||
|
em(line, buf);
|
||||||
|
}
|
||||||
|
|
||||||
void quit()
|
void quit()
|
||||||
{
|
{
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#define e(errn) e_f(__FILE__, __LINE__, (errn))
|
#define e(errn) e_f(__FILE__, __LINE__, (errn))
|
||||||
#define em(errn,msg) do { fprintf(stderr, "%s\n", msg); e(errn); } while(0)
|
#define em(errn,msg) do { fprintf(stderr, "%s\n", msg); e(errn); } while(0)
|
||||||
|
#define efmt(...) fail_printf(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||||
|
|
||||||
#define BIGVARNAME "BIGTEST"
|
#define BIGVARNAME "BIGTEST"
|
||||||
|
|
||||||
|
@ -17,6 +18,8 @@ void printprogress(char *msg, int i, int max);
|
||||||
void cleanup(void);
|
void cleanup(void);
|
||||||
int does_fs_truncate(void);
|
int does_fs_truncate(void);
|
||||||
void e_f(char *file, int lineno, int n);
|
void e_f(char *file, int lineno, int n);
|
||||||
|
void fail_printf(const char *file, const char *func, int line,
|
||||||
|
const char *fmt, ...) __attribute__ ((format(printf, 4, 5)));
|
||||||
int name_max(char *path);
|
int name_max(char *path);
|
||||||
void quit(void);
|
void quit(void);
|
||||||
void rm_rf_dir(int test_nr);
|
void rm_rf_dir(int test_nr);
|
||||||
|
|
|
@ -29,9 +29,8 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#define FAIL(...) fail(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
#define CLOSE(fd) do { assert(fd >= 0); if (close((fd)) != 0) efmt("close failed"); } while (0);
|
||||||
#define CLOSE(fd) do { assert(fd >= 0); if (close((fd)) != 0) FAIL("close failed"); } while (0);
|
#define REALLOC(p, size) do { p = realloc(p, size); if (!p) efmt("realloc of %zu bytes failed", size); } while (0);
|
||||||
#define REALLOC(p, size) do { p = realloc(p, size); if (!p) FAIL("realloc of %zu bytes failed", size); } while (0);
|
|
||||||
|
|
||||||
#define HOST "test82.minix3.org"
|
#define HOST "test82.minix3.org"
|
||||||
#define PORT 80
|
#define PORT 80
|
||||||
|
@ -56,31 +55,6 @@ static const struct url urls[URL_COUNT] = {
|
||||||
{ HOST, PORT, PATH2, callback_verify_path2 },
|
{ HOST, PORT, PATH2, callback_verify_path2 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void fail(const char *file, const char *func, int line,
|
|
||||||
const char *fmt, ...) __attribute__ ((format(printf, 4, 5)));
|
|
||||||
|
|
||||||
static void fail(const char *file, const char *func, int line,
|
|
||||||
const char *fmt, ...) {
|
|
||||||
va_list ap;
|
|
||||||
char buf[1024];
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
assert(file);
|
|
||||||
assert(func);
|
|
||||||
assert(fmt);
|
|
||||||
|
|
||||||
len = snprintf(buf, sizeof(buf), "[%s:%s:%d] ", file, func, line);
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
snprintf(buf + len, sizeof(buf) - len, " errno=%d error=%s",
|
|
||||||
errno, strerror(errno));
|
|
||||||
|
|
||||||
em(line, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int http_connect(const char *host, int port) {
|
static int http_connect(const char *host, int port) {
|
||||||
struct addrinfo *addr = NULL;
|
struct addrinfo *addr = NULL;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
@ -96,18 +70,18 @@ static int http_connect(const char *host, int port) {
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (getaddrinfo(host, serv, &hints, &addr) != 0 || !addr) {
|
if (getaddrinfo(host, serv, &hints, &addr) != 0 || !addr) {
|
||||||
FAIL("host %s not found", host);
|
efmt("host %s not found", host);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = socket(AF_INET, SOCK_STREAM, 0);
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
FAIL("cannot create socket");
|
efmt("cannot create socket");
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(fd, addr->ai_addr, addr->ai_addrlen) != 0) {
|
if (connect(fd, addr->ai_addr, addr->ai_addrlen) != 0) {
|
||||||
FAIL("cannot connect to %s:%d", host, port);
|
efmt("cannot connect to %s:%d", host, port);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +114,7 @@ static void write_chunked(
|
||||||
r = write(fd, data, s);
|
r = write(fd, data, s);
|
||||||
if (r <= 0 || (size_t) r > s) {
|
if (r <= 0 || (size_t) r > s) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("write of %zu bytes failed with result %zd", s, r);
|
efmt("write of %zu bytes failed with result %zd", s, r);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +244,7 @@ static int http_get_status_line(
|
||||||
if (index >= len) goto notfound;
|
if (index >= len) goto notfound;
|
||||||
if (!is_numeric(data[index])) {
|
if (!is_numeric(data[index])) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("HTTP error: bad status line: \"%.*s\"",
|
efmt("HTTP error: bad status line: \"%.*s\"",
|
||||||
(int) (index - *index_p), data + *index_p);
|
(int) (index - *index_p), data + *index_p);
|
||||||
*error_p = 1;
|
*error_p = 1;
|
||||||
goto notfound;
|
goto notfound;
|
||||||
|
@ -350,7 +324,7 @@ static int http_parse_int_header(
|
||||||
|
|
||||||
if (index < index_end) {
|
if (index < index_end) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("HTTP error: bad numeric header value: \"%.*s\"",
|
efmt("HTTP error: bad numeric header value: \"%.*s\"",
|
||||||
(int) (index_end - index), data + index);
|
(int) (index_end - index), data + index);
|
||||||
*error_p = 1;
|
*error_p = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -402,7 +376,7 @@ static int http_response_complete(
|
||||||
/* do we know how long the response will be? */
|
/* do we know how long the response will be? */
|
||||||
if (content_length < 0) {
|
if (content_length < 0) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("HTTP error: missing Content-Length header "
|
efmt("HTTP error: missing Content-Length header "
|
||||||
"(maybe Transfer-Encoding is specified instead "
|
"(maybe Transfer-Encoding is specified instead "
|
||||||
"but this is currently unsupported)");
|
"but this is currently unsupported)");
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -411,7 +385,7 @@ static int http_response_complete(
|
||||||
/* check whether the amount of data is correct */
|
/* check whether the amount of data is correct */
|
||||||
if (len > index + content_length) {
|
if (len > index + content_length) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("HTTP error: more data received than expected");
|
efmt("HTTP error: more data received than expected");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,7 +426,7 @@ static void http_recv_response(
|
||||||
errno = 0;
|
errno = 0;
|
||||||
r = read(fd, data + datalen, chunksize);
|
r = read(fd, data + datalen, chunksize);
|
||||||
if (r < 0 || (size_t) r > chunksize) {
|
if (r < 0 || (size_t) r > chunksize) {
|
||||||
FAIL("read of %zu bytes failed with result %zd",
|
efmt("read of %zu bytes failed with result %zd",
|
||||||
chunksize, r);
|
chunksize, r);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -468,7 +442,7 @@ static void http_recv_response(
|
||||||
/* check for premature disconnection */
|
/* check for premature disconnection */
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("server disconnected even though the response "
|
efmt("server disconnected even though the response "
|
||||||
"seems to be incomplete");
|
"seems to be incomplete");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +455,7 @@ static void http_recv_response(
|
||||||
callback_verify(data + index_body, datalen - index_body);
|
callback_verify(data + index_body, datalen - index_body);
|
||||||
} else {
|
} else {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("unexpected HTTP status code %d", code);
|
efmt("unexpected HTTP status code %d", code);
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -511,7 +485,7 @@ static void http_test(
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (withshutdown && shutdown(fd, SHUT_WR) != 0) {
|
if (withshutdown && shutdown(fd, SHUT_WR) != 0) {
|
||||||
FAIL("shutdown failed");
|
efmt("shutdown failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delay) sleep(1);
|
if (delay) sleep(1);
|
||||||
|
@ -539,7 +513,7 @@ static void http_test_fork(
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
FAIL("fork failed");
|
efmt("fork failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,7 +541,7 @@ static void wait_all(void) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pid = waitpid(-1, &status, 0);
|
pid = waitpid(-1, &status, 0);
|
||||||
if (pid <= 0) {
|
if (pid <= 0) {
|
||||||
FAIL("waitpid failed");
|
efmt("waitpid failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (WIFEXITED(status)) {
|
if (WIFEXITED(status)) {
|
||||||
|
@ -577,24 +551,24 @@ static void wait_all(void) {
|
||||||
if (exitcode >= 0) {
|
if (exitcode >= 0) {
|
||||||
errct += exitcode;
|
errct += exitcode;
|
||||||
} else {
|
} else {
|
||||||
FAIL("child has negative exit code %d",
|
efmt("child has negative exit code %d",
|
||||||
exitcode);
|
exitcode);
|
||||||
}
|
}
|
||||||
} else if (WIFSIGNALED(status)) {
|
} else if (WIFSIGNALED(status)) {
|
||||||
dbgprintf("child %d killed by signal %d\n",
|
dbgprintf("child %d killed by signal %d\n",
|
||||||
(int) pid, WTERMSIG(status));
|
(int) pid, WTERMSIG(status));
|
||||||
FAIL("child killed by signal %d", WTERMSIG(status));
|
efmt("child killed by signal %d", WTERMSIG(status));
|
||||||
} else {
|
} else {
|
||||||
dbgprintf("child %d gone with status 0x%x\n",
|
dbgprintf("child %d gone with status 0x%x\n",
|
||||||
(int) pid, status);
|
(int) pid, status);
|
||||||
FAIL("child gone, but neither exit nor signal");
|
efmt("child gone, but neither exit nor signal");
|
||||||
}
|
}
|
||||||
child_count--;
|
child_count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (waitpid(-1, &status, 0) != -1 || errno != ECHILD) {
|
if (waitpid(-1, &status, 0) != -1 || errno != ECHILD) {
|
||||||
FAIL("waitpid should have returned ECHILD");
|
efmt("waitpid should have returned ECHILD");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -644,12 +618,12 @@ static void verify_data(
|
||||||
|
|
||||||
if (httpsize != refsize) {
|
if (httpsize != refsize) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("download from http://%s:%d%s returned wrong number "
|
efmt("download from http://%s:%d%s returned wrong number "
|
||||||
"of bytes: %zd (expected %zd)",
|
"of bytes: %zd (expected %zd)",
|
||||||
HOST, PORT, path, httpsize, refsize);
|
HOST, PORT, path, httpsize, refsize);
|
||||||
} else if (memcmp(httpdata, refdata, refsize) != 0) {
|
} else if (memcmp(httpdata, refdata, refsize) != 0) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
FAIL("download from http://%s:%d%s returned wrong data",
|
efmt("download from http://%s:%d%s returned wrong data",
|
||||||
HOST, PORT, path);
|
HOST, PORT, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue