test82: share support functions in common.[ch] for test83

Change-Id: I3dfeacc3c2c143d3b696efa39a6f257d38281742
This commit is contained in:
Erik van der Kouwe 2015-07-22 21:33:28 +02:00
parent da32b6c32e
commit 17fbdaf514
3 changed files with 44 additions and 48 deletions

View file

@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <sys/statvfs.h>
#include <sys/syslimits.h>
@ -126,6 +127,24 @@ void cleanup()
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()
{
cleanup();

View file

@ -10,6 +10,7 @@
#define e(errn) e_f(__FILE__, __LINE__, (errn))
#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"
@ -17,6 +18,8 @@ void printprogress(char *msg, int i, int max);
void cleanup(void);
int does_fs_truncate(void);
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);
void quit(void);
void rm_rf_dir(int test_nr);

View file

@ -29,9 +29,8 @@
#include "common.h"
#define FAIL(...) fail(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#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) FAIL("realloc of %zu bytes failed", size); } while (0);
#define CLOSE(fd) do { assert(fd >= 0); if (close((fd)) != 0) efmt("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 HOST "test82.minix3.org"
#define PORT 80
@ -56,31 +55,6 @@ static const struct url urls[URL_COUNT] = {
{ 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) {
struct addrinfo *addr = NULL;
int fd = -1;
@ -96,18 +70,18 @@ static int http_connect(const char *host, int port) {
errno = 0;
if (getaddrinfo(host, serv, &hints, &addr) != 0 || !addr) {
FAIL("host %s not found", host);
efmt("host %s not found", host);
goto failure;
}
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
FAIL("cannot create socket");
efmt("cannot create socket");
goto failure;
}
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;
}
@ -140,7 +114,7 @@ static void write_chunked(
r = write(fd, data, s);
if (r <= 0 || (size_t) r > s) {
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;
}
@ -270,7 +244,7 @@ static int http_get_status_line(
if (index >= len) goto notfound;
if (!is_numeric(data[index])) {
errno = 0;
FAIL("HTTP error: bad status line: \"%.*s\"",
efmt("HTTP error: bad status line: \"%.*s\"",
(int) (index - *index_p), data + *index_p);
*error_p = 1;
goto notfound;
@ -350,7 +324,7 @@ static int http_parse_int_header(
if (index < index_end) {
errno = 0;
FAIL("HTTP error: bad numeric header value: \"%.*s\"",
efmt("HTTP error: bad numeric header value: \"%.*s\"",
(int) (index_end - index), data + index);
*error_p = 1;
return 0;
@ -402,7 +376,7 @@ static int http_response_complete(
/* do we know how long the response will be? */
if (content_length < 0) {
errno = 0;
FAIL("HTTP error: missing Content-Length header "
efmt("HTTP error: missing Content-Length header "
"(maybe Transfer-Encoding is specified instead "
"but this is currently unsupported)");
goto error;
@ -411,7 +385,7 @@ static int http_response_complete(
/* check whether the amount of data is correct */
if (len > index + content_length) {
errno = 0;
FAIL("HTTP error: more data received than expected");
efmt("HTTP error: more data received than expected");
goto error;
}
@ -452,7 +426,7 @@ static void http_recv_response(
errno = 0;
r = read(fd, data + datalen, 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);
goto cleanup;
}
@ -468,7 +442,7 @@ static void http_recv_response(
/* check for premature disconnection */
if (r == 0) {
errno = 0;
FAIL("server disconnected even though the response "
efmt("server disconnected even though the response "
"seems to be incomplete");
goto cleanup;
}
@ -481,7 +455,7 @@ static void http_recv_response(
callback_verify(data + index_body, datalen - index_body);
} else {
errno = 0;
FAIL("unexpected HTTP status code %d", code);
efmt("unexpected HTTP status code %d", code);
}
cleanup:
@ -511,7 +485,7 @@ static void http_test(
errno = 0;
if (withshutdown && shutdown(fd, SHUT_WR) != 0) {
FAIL("shutdown failed");
efmt("shutdown failed");
}
if (delay) sleep(1);
@ -539,7 +513,7 @@ static void http_test_fork(
errno = 0;
pid = fork();
if (pid < 0) {
FAIL("fork failed");
efmt("fork failed");
return;
}
@ -567,7 +541,7 @@ static void wait_all(void) {
errno = 0;
pid = waitpid(-1, &status, 0);
if (pid <= 0) {
FAIL("waitpid failed");
efmt("waitpid failed");
return;
}
if (WIFEXITED(status)) {
@ -577,24 +551,24 @@ static void wait_all(void) {
if (exitcode >= 0) {
errct += exitcode;
} else {
FAIL("child has negative exit code %d",
efmt("child has negative exit code %d",
exitcode);
}
} else if (WIFSIGNALED(status)) {
dbgprintf("child %d killed by signal %d\n",
(int) pid, WTERMSIG(status));
FAIL("child killed by signal %d", WTERMSIG(status));
efmt("child killed by signal %d", WTERMSIG(status));
} else {
dbgprintf("child %d gone with status 0x%x\n",
(int) pid, status);
FAIL("child gone, but neither exit nor signal");
efmt("child gone, but neither exit nor signal");
}
child_count--;
}
errno = 0;
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) {
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)",
HOST, PORT, path, httpsize, refsize);
} else if (memcmp(httpdata, refdata, refsize) != 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);
}
}