@@ -12,6 +12,7 @@ INCLUDES=\
|
||||
include include \
|
||||
include/sys include/sys \
|
||||
include/test include/test \
|
||||
include/test161 include/test161 \
|
||||
include/types include/types
|
||||
|
||||
INCLUDELINKS=\
|
||||
|
@@ -56,6 +56,11 @@ int vprintf(const char *fmt, __va_list ap);
|
||||
int snprintf(char *buf, size_t len, const char *fmt, ...);
|
||||
int vsnprintf(char *buf, size_t len, const char *fmt, __va_list ap);
|
||||
|
||||
/* Automated testing extensions. */
|
||||
|
||||
int tprintf(const char *fmt, ...);
|
||||
int nprintf(const char *fmt, ...);
|
||||
|
||||
/* Print the argument string and then a newline. Returns 0 or -1 on error. */
|
||||
int puts(const char *);
|
||||
|
||||
|
@@ -8,6 +8,6 @@
|
||||
TOP=../..
|
||||
.include "$(TOP)/mk/os161.config.mk"
|
||||
|
||||
SUBDIRS=crt0 libc libtest hostcompat
|
||||
SUBDIRS=crt0 libc libtest libtest161 hostcompat
|
||||
|
||||
.include "$(TOP)/mk/os161.subdir.mk"
|
||||
|
@@ -22,6 +22,11 @@ TOP=../../..
|
||||
LIB=hostcompat
|
||||
SRCS=err.c ntohll.c time.c hostcompat.c
|
||||
|
||||
# printf
|
||||
COMMON=$(TOP)/common/libc
|
||||
SRCS+=\
|
||||
$(COMMON)/printf/tprintf.c
|
||||
|
||||
HOST_CFLAGS+=$(COMPAT_CFLAGS)
|
||||
|
||||
MKDIRS=$(INSTALLTOP)/hostinclude
|
||||
|
@@ -35,6 +35,11 @@ void hostcompat_init(int argc, char **argv);
|
||||
|
||||
time_t __time(time_t *secs, unsigned long *nsecs);
|
||||
|
||||
/* Automated testing extensions. */
|
||||
|
||||
int tprintf(const char *fmt, ...);
|
||||
int nprintf(const char *fmt, ...);
|
||||
|
||||
#ifdef DECLARE_NTOHLL
|
||||
uint64_t ntohll(uint64_t);
|
||||
#define htonll(x) (ntohll(x))
|
||||
|
@@ -10,7 +10,8 @@ COMMON=$(TOP)/common/libc
|
||||
# printf
|
||||
SRCS+=\
|
||||
$(COMMON)/printf/__printf.c \
|
||||
$(COMMON)/printf/snprintf.c
|
||||
$(COMMON)/printf/snprintf.c \
|
||||
$(COMMON)/printf/tprintf.c
|
||||
|
||||
# stdio
|
||||
SRCS+=\
|
||||
|
@@ -31,6 +31,8 @@
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <kern/secret.h>
|
||||
|
||||
/*
|
||||
* printf - C standard I/O function.
|
||||
|
@@ -139,6 +139,7 @@ verr(int exitcode, const char *fmt, va_list ap)
|
||||
{
|
||||
__printerr(1, fmt, ap);
|
||||
exit(exitcode);
|
||||
// exit() didn't work.
|
||||
}
|
||||
|
||||
/* errx/verrx: don't use errno, but do then exit */
|
||||
@@ -147,6 +148,7 @@ verrx(int exitcode, const char *fmt, va_list ap)
|
||||
{
|
||||
__printerr(0, fmt, ap);
|
||||
exit(exitcode);
|
||||
// exit() didn't work.
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -7,11 +7,12 @@ TOP=../..
|
||||
|
||||
SUBDIRS=add argtest badcall bigexec bigfile bigfork bigseek bloat conman \
|
||||
crash ctest dirconc dirseek dirtest f_test factorial farm faulter \
|
||||
filetest forkbomb forktest frack guzzle hash hog huge kitchen \
|
||||
filetest fileonlytest forkbomb forktest frack guzzle hash hog huge kitchen \
|
||||
malloctest matmult multiexec palin parallelvm poisondisk psort \
|
||||
quinthuge quintmat quintsort randcall redirect rmdirtest rmtest \
|
||||
sbrktest schedpong sink sort sparsefile sty tail tictac triplehuge \
|
||||
triplemat triplesort usemtest zero
|
||||
sbrktest schedpong shll sink sort sparsefile spinner sty tail tictac \
|
||||
triplehuge triplemat triplesort usemtest waiter zero \
|
||||
consoletest shelltest opentest readwritetest closetest stacktest
|
||||
|
||||
# But not:
|
||||
# userthreads (no support in kernel API in base system)
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@@ -51,7 +52,9 @@ main(int argc, char *argv[])
|
||||
i = atoi(argv[1]);
|
||||
j = atoi(argv[2]);
|
||||
|
||||
printf("Answer: %d\n", i+j);
|
||||
|
||||
tprintf("Answer: %d\n", i+j);
|
||||
char buf[16];
|
||||
snprintf(buf, 16, "%d", i+j);
|
||||
secprintf(SECRET, buf, "/testbin/add");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@@ -43,14 +44,18 @@ main(int argc, char *argv[])
|
||||
const char *tmp;
|
||||
int i;
|
||||
|
||||
printf("argc: %d\n", argc);
|
||||
tprintf("argc: %d\n", argc);
|
||||
char buf[16];
|
||||
snprintf(buf, 16, "argc: %d", argc);
|
||||
secprintf(SECRET, buf, "/testbin/argtest");
|
||||
|
||||
for (i=0; i<=argc; i++) {
|
||||
tmp = argv[i];
|
||||
if (tmp==NULL) {
|
||||
tmp = "[NULL]";
|
||||
}
|
||||
printf("argv[%d]: %s\n", i, tmp);
|
||||
tprintf("argv[%d]: %s\n", i, tmp);
|
||||
secprintf(SECRET, tmp, "/testbin/argtest");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -38,7 +38,7 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
chdir_empty(void)
|
||||
{
|
||||
int rv;
|
||||
@@ -49,13 +49,20 @@ chdir_empty(void)
|
||||
|
||||
report_begin("chdir to empty string");
|
||||
rv = chdir("");
|
||||
report_check2(rv, errno, EINVAL, 0);
|
||||
return report_check2(rv, errno, EINVAL, 0);
|
||||
}
|
||||
|
||||
void
|
||||
test_chdir(void)
|
||||
{
|
||||
test_chdir_path();
|
||||
chdir_empty();
|
||||
int ntests = 0, result = 0, lost_points = 0;
|
||||
test_chdir_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = chdir_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -36,5 +36,9 @@
|
||||
void
|
||||
test_close(void)
|
||||
{
|
||||
test_close_fd();
|
||||
int ntests = 0, lost_points = 0;
|
||||
test_close_fd(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -45,27 +45,29 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
dup2_fd2(int fd, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
int rv, failure;
|
||||
|
||||
report_begin("%s", desc);
|
||||
rv = dup2(STDIN_FILENO, fd);
|
||||
report_check(rv, errno, EBADF);
|
||||
failure = report_check(rv, errno, EBADF);
|
||||
|
||||
if (rv != -1) {
|
||||
close(fd); /* just in case */
|
||||
}
|
||||
return failure;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
dup2_self(void)
|
||||
{
|
||||
struct stat sb;
|
||||
int rv;
|
||||
int testfd;
|
||||
int failure;
|
||||
|
||||
/* use fd that isn't in use */
|
||||
testfd = CLOSED_FD;
|
||||
@@ -75,22 +77,23 @@ dup2_self(void)
|
||||
rv = dup2(STDIN_FILENO, testfd);
|
||||
if (rv == -1) {
|
||||
report_result(rv, errno);
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&failure);
|
||||
return failure;
|
||||
}
|
||||
|
||||
report_begin("dup2 to same fd");
|
||||
rv = dup2(testfd, testfd);
|
||||
if (rv == testfd) {
|
||||
report_passed();
|
||||
report_passed(&failure);
|
||||
}
|
||||
else if (rv<0) {
|
||||
report_result(rv, errno);
|
||||
report_failure();
|
||||
report_failure(&failure);
|
||||
}
|
||||
else {
|
||||
report_warnx("returned %d instead", rv);
|
||||
report_failure();
|
||||
report_failure(&failure);
|
||||
failure = FAILED;
|
||||
}
|
||||
|
||||
report_begin("fstat fd after dup2 to itself");
|
||||
@@ -100,43 +103,60 @@ dup2_self(void)
|
||||
}
|
||||
report_result(rv, errno);
|
||||
if (rv==0) {
|
||||
report_passed();
|
||||
report_passed(&failure);
|
||||
}
|
||||
else if (errno != ENOSYS) {
|
||||
report_failure();
|
||||
report_failure(&failure);
|
||||
}
|
||||
else {
|
||||
report_skipped();
|
||||
report_skipped(&failure);
|
||||
/* no support for fstat; try lseek */
|
||||
report_begin("lseek fd after dup2 to itself");
|
||||
rv = lseek(testfd, 0, SEEK_CUR);
|
||||
report_result(rv, errno);
|
||||
if (rv==0 || (rv==-1 && errno==ESPIPE)) {
|
||||
report_passed();
|
||||
report_passed(&failure);
|
||||
}
|
||||
else {
|
||||
report_failure();
|
||||
report_failure(&failure);
|
||||
}
|
||||
}
|
||||
|
||||
close(testfd);
|
||||
return failure;
|
||||
}
|
||||
|
||||
void
|
||||
test_dup2(void)
|
||||
{
|
||||
int ntests = 0, failure, lost_points = 0;
|
||||
/* This does the first fd. */
|
||||
test_dup2_fd();
|
||||
test_dup2_fd(&ntests, &lost_points);
|
||||
|
||||
/* Any interesting cases added here should also go in common_fds.c */
|
||||
dup2_fd2(-1, "dup2 to -1");
|
||||
dup2_fd2(-5, "dup2 to -5");
|
||||
dup2_fd2(IMPOSSIBLE_FD, "dup2 to impossible fd");
|
||||
ntests++;
|
||||
failure = dup2_fd2(-1, "dup2 to -1");
|
||||
handle_result(failure, &lost_points);
|
||||
|
||||
ntests++;
|
||||
failure = dup2_fd2(-5, "dup2 to -5");
|
||||
handle_result(failure, &lost_points);
|
||||
|
||||
ntests++;
|
||||
failure = dup2_fd2(IMPOSSIBLE_FD, "dup2 to impossible fd");
|
||||
handle_result(failure, &lost_points);
|
||||
#ifdef OPEN_MAX
|
||||
dup2_fd2(OPEN_MAX, "dup2 to OPEN_MAX");
|
||||
ntests++;
|
||||
failure = dup2_fd2(OPEN_MAX, "dup2 to OPEN_MAX");
|
||||
handle_result(failure, &lost_points);
|
||||
#else
|
||||
warnx("Warning: OPEN_MAX not defined - test skipped");
|
||||
#endif
|
||||
|
||||
dup2_self();
|
||||
ntests++;
|
||||
failure = dup2_self();
|
||||
handle_result(failure, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -32,6 +32,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
@@ -42,7 +43,7 @@
|
||||
|
||||
static
|
||||
int
|
||||
exec_common_fork(void)
|
||||
exec_common_fork(int *result)
|
||||
{
|
||||
int pid, rv, status, err;
|
||||
|
||||
@@ -56,7 +57,7 @@ exec_common_fork(void)
|
||||
err = errno;
|
||||
report_begin("forking for test");
|
||||
report_result(pid, err);
|
||||
report_aborted();
|
||||
report_aborted(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -70,10 +71,11 @@ exec_common_fork(void)
|
||||
err = errno;
|
||||
report_begin("waiting for test subprocess");
|
||||
report_result(rv, err);
|
||||
report_failure();
|
||||
report_failure(result);
|
||||
return -1;
|
||||
}
|
||||
if (WIFEXITED(status) && WEXITSTATUS(status) == MAGIC_STATUS) {
|
||||
*result = SUCCESS;
|
||||
return 1;
|
||||
}
|
||||
/* Oops... */
|
||||
@@ -84,98 +86,134 @@ exec_common_fork(void)
|
||||
else {
|
||||
report_warnx("exit %d", WEXITSTATUS(status));
|
||||
}
|
||||
report_failure();
|
||||
report_failure(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
exec_badprog(const void *prog, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
char *args[2];
|
||||
args[0] = (char *)"foo";
|
||||
args[1] = NULL;
|
||||
|
||||
if (exec_common_fork() != 0) {
|
||||
return;
|
||||
if (exec_common_fork(&result) != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
report_begin(desc);
|
||||
rv = execv(prog, args);
|
||||
report_check(rv, errno, EFAULT);
|
||||
exit(MAGIC_STATUS);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
int code = result ? result : MAGIC_STATUS;
|
||||
exit(code);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
exec_emptyprog(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
char *args[2];
|
||||
args[0] = (char *)"foo";
|
||||
args[1] = NULL;
|
||||
|
||||
if (exec_common_fork() != 0) {
|
||||
return;
|
||||
if (exec_common_fork(&result) != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
report_begin("exec the empty string");
|
||||
rv = execv("", args);
|
||||
report_check2(rv, errno, EINVAL, EISDIR);
|
||||
exit(MAGIC_STATUS);
|
||||
result = report_check2(rv, errno, EINVAL, EISDIR);
|
||||
int code = result ? result : MAGIC_STATUS;
|
||||
exit(code);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
exec_badargs(void *args, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
if (exec_common_fork() != 0) {
|
||||
return;
|
||||
int result;
|
||||
if (exec_common_fork(&result) != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
report_begin(desc);
|
||||
rv = execv("/bin/true", args);
|
||||
report_check(rv, errno, EFAULT);
|
||||
exit(MAGIC_STATUS);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
int code = result ? result : MAGIC_STATUS;
|
||||
exit(code);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
exec_onearg(void *ptr, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
char *args[3];
|
||||
args[0] = (char *)"foo";
|
||||
args[1] = (char *)ptr;
|
||||
args[2] = NULL;
|
||||
|
||||
if (exec_common_fork() != 0) {
|
||||
return;
|
||||
if (exec_common_fork(&result) != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
report_begin(desc);
|
||||
rv = execv("/bin/true", args);
|
||||
report_check(rv, errno, EFAULT);
|
||||
exit(MAGIC_STATUS);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
int code = result ? result : MAGIC_STATUS;
|
||||
exit(code);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
test_execv(void)
|
||||
{
|
||||
exec_badprog(NULL, "exec with NULL program");
|
||||
exec_badprog(INVAL_PTR, "exec with invalid pointer program");
|
||||
exec_badprog(KERN_PTR, "exec with kernel pointer program");
|
||||
int ntests = 0, result = 0, lost_points = 0;
|
||||
ntests++;
|
||||
result = exec_badprog(NULL, "exec with NULL program");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
exec_emptyprog();
|
||||
ntests++;
|
||||
result = exec_badprog(INVAL_PTR, "exec with invalid pointer program");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
exec_badargs(NULL, "exec with NULL arglist");
|
||||
exec_badargs(INVAL_PTR, "exec with invalid pointer arglist");
|
||||
exec_badargs(KERN_PTR, "exec with kernel pointer arglist");
|
||||
ntests++;
|
||||
result = exec_badprog(KERN_PTR, "exec with kernel pointer program");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
exec_onearg(INVAL_PTR, "exec with invalid pointer arg");
|
||||
exec_onearg(KERN_PTR, "exec with kernel pointer arg");
|
||||
ntests++;
|
||||
result = exec_emptyprog();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = exec_badargs(NULL, "exec with NULL arglist");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = exec_badargs(INVAL_PTR, "exec with invalid pointer arglist");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = exec_badargs(KERN_PTR, "exec with kernel pointer arglist");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
|
||||
ntests++;
|
||||
result = exec_onearg(INVAL_PTR, "exec with invalid pointer arg");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = exec_onearg(KERN_PTR, "exec with kernel pointer arg");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -36,6 +36,11 @@
|
||||
void
|
||||
test_fsync(void)
|
||||
{
|
||||
test_fsync_fd();
|
||||
int ntests = 0, lost_points = 0;
|
||||
|
||||
test_fsync_fd(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -44,52 +44,67 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
ftruncate_fd_device(void)
|
||||
{
|
||||
int rv, fd;
|
||||
int result;
|
||||
|
||||
report_begin("ftruncate on device");
|
||||
|
||||
fd = open("null:", O_RDWR);
|
||||
if (fd<0) {
|
||||
report_warn("opening null: failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = ftruncate(fd, 6);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
|
||||
close(fd);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
ftruncate_size_neg(void)
|
||||
{
|
||||
int rv, fd;
|
||||
int result;
|
||||
|
||||
report_begin("ftruncate to negative size");
|
||||
|
||||
fd = open_testfile(NULL);
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = ftruncate(fd, -60);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
|
||||
close(fd);
|
||||
remove(TESTFILE);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_ftruncate(void)
|
||||
{
|
||||
test_ftruncate_fd();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
ftruncate_fd_device();
|
||||
ftruncate_size_neg();
|
||||
test_ftruncate_fd(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = ftruncate_fd_device();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = ftruncate_size_neg();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -36,5 +36,9 @@
|
||||
void
|
||||
test_getcwd(void)
|
||||
{
|
||||
test_getcwd_buf();
|
||||
int ntests = 0, lost_points = 0;
|
||||
test_getcwd_buf(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -36,6 +36,11 @@
|
||||
void
|
||||
test_getdirentry(void)
|
||||
{
|
||||
test_getdirentry_fd();
|
||||
test_getdirentry_buf();
|
||||
int ntests = 0, lost_points = 0;
|
||||
|
||||
test_getdirentry_fd(&ntests, &lost_points);
|
||||
test_getdirentry_buf(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -41,30 +41,34 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
one_ioctl_badbuf(int fd, int code, const char *codename,
|
||||
void *ptr, const char *ptrdesc)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("ioctl %s with %s", codename, ptrdesc);
|
||||
rv = ioctl(fd, code, ptr);
|
||||
report_check(rv, errno, EFAULT);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
any_ioctl_badbuf(int fd, int code, const char *codename)
|
||||
{
|
||||
one_ioctl_badbuf(fd, code, codename, NULL, "NULL pointer");
|
||||
one_ioctl_badbuf(fd, code, codename, INVAL_PTR, "invalid pointer");
|
||||
one_ioctl_badbuf(fd, code, codename, KERN_PTR, "kernel pointer");
|
||||
int result;
|
||||
result = one_ioctl_badbuf(fd, code, codename, NULL, "NULL pointer");
|
||||
result |= one_ioctl_badbuf(fd, code, codename, INVAL_PTR, "invalid pointer");
|
||||
result |= one_ioctl_badbuf(fd, code, codename, KERN_PTR, "kernel pointer");
|
||||
return result;
|
||||
}
|
||||
|
||||
#define IOCTL(fd, sym) any_ioctl_badbuf(fd, sym, #sym)
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
ioctl_badbuf(void)
|
||||
{
|
||||
/*
|
||||
@@ -79,25 +83,39 @@ ioctl_badbuf(void)
|
||||
|
||||
/* suppress gcc warning */
|
||||
(void)any_ioctl_badbuf;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
ioctl_badcode(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("invalid ioctl");
|
||||
rv = ioctl(STDIN_FILENO, NONEXIST_IOCTL, NULL);
|
||||
report_check(rv, errno, EIOCTL);
|
||||
result = report_check(rv, errno, EIOCTL);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_ioctl(void)
|
||||
{
|
||||
test_ioctl_fd();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
test_ioctl_fd(&ntests, &lost_points);
|
||||
|
||||
/* Since we don't actually define any ioctls, this is not meaningful */
|
||||
ioctl_badcode();
|
||||
ioctl_badbuf();
|
||||
ntests++;
|
||||
result = ioctl_badcode();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = ioctl_badbuf();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -37,52 +37,70 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
link_dir(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("hard link of .");
|
||||
rv = link(".", TESTDIR);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
if (rv==0) {
|
||||
/* this might help recover... maybe */
|
||||
remove(TESTDIR);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
link_empty1(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("hard link of empty string");
|
||||
rv = link("", TESTDIR);
|
||||
report_check(rv, errno, EINVAL);
|
||||
return report_check(rv, errno, EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
link_empty2(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
int result = FAILED;
|
||||
report_begin("hard link to empty string");
|
||||
if (create_testdir()<0) {
|
||||
/*report_aborted();*/ /* XXX in create_testdir */
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
rv = link(TESTDIR, "");
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
rmdir(TESTDIR);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_link(void)
|
||||
{
|
||||
test_link_paths();
|
||||
link_dir();
|
||||
link_empty1();
|
||||
link_empty2();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
test_link_paths(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = link_dir();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = link_empty1();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = link_empty2();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,34 +44,38 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
lseek_fd_device(void)
|
||||
{
|
||||
int fd, rv;
|
||||
int result;
|
||||
|
||||
report_begin("lseek on device");
|
||||
|
||||
fd = open("null:", O_RDONLY);
|
||||
if (fd<0) {
|
||||
report_warn("opening null: failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = lseek(fd, 309, SEEK_SET);
|
||||
report_check(rv, errno, ESPIPE);
|
||||
result = report_check(rv, errno, ESPIPE);
|
||||
|
||||
close(fd);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
lseek_file_stdin(void)
|
||||
{
|
||||
int fd, fd2, rv, status;
|
||||
const char slogan[] = "There ain't no such thing as a free lunch";
|
||||
size_t len = strlen(slogan);
|
||||
pid_t pid;
|
||||
int result = 0;
|
||||
|
||||
report_begin("lseek stdin when open on file");
|
||||
|
||||
@@ -79,27 +83,27 @@ lseek_file_stdin(void)
|
||||
pid = fork();
|
||||
if (pid<0) {
|
||||
report_warn("fork failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
else if (pid!=0) {
|
||||
/* parent */
|
||||
rv = waitpid(pid, &status, 0);
|
||||
if (rv<0) {
|
||||
report_warn("waitpid failed");
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
}
|
||||
if (WIFSIGNALED(status)) {
|
||||
report_warnx("subprocess exited with signal %d",
|
||||
WTERMSIG(status));
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
}
|
||||
else if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {
|
||||
report_warnx("subprocess exited with code %d",
|
||||
WEXITSTATUS(status));
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
}
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* child */
|
||||
@@ -146,133 +150,159 @@ lseek_file_stdin(void)
|
||||
}
|
||||
|
||||
/* blah */
|
||||
report_skipped();
|
||||
report_skipped(&result);
|
||||
|
||||
rv = lseek(STDIN_FILENO, 0, SEEK_SET);
|
||||
report_begin("try 1: SEEK_SET");
|
||||
report_check(rv, errno, 0);
|
||||
result = report_check(rv, errno, 0);
|
||||
|
||||
rv = lseek(STDIN_FILENO, 0, SEEK_END);
|
||||
report_begin("try 2: SEEK_END");
|
||||
report_check(rv, errno, 0);
|
||||
result = report_check(rv, errno, 0);
|
||||
|
||||
remove(TESTFILE);
|
||||
_exit(0);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
lseek_loc_negative(void)
|
||||
{
|
||||
int fd, rv;
|
||||
int result;
|
||||
|
||||
report_begin("lseek to negative offset");
|
||||
|
||||
fd = open_testfile(NULL);
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = lseek(fd, -309, SEEK_SET);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
|
||||
close(fd);
|
||||
remove(TESTFILE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
lseek_whence_inval(void)
|
||||
{
|
||||
int fd, rv;
|
||||
int result;
|
||||
|
||||
report_begin("lseek with invalid whence code");
|
||||
|
||||
fd = open_testfile(NULL);
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = lseek(fd, 0, 3594);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
|
||||
close(fd);
|
||||
remove(TESTFILE);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
lseek_loc_pasteof(void)
|
||||
{
|
||||
const char *message = "blahblah";
|
||||
int fd;
|
||||
off_t pos;
|
||||
int result;
|
||||
|
||||
report_begin("seek past/to EOF");
|
||||
|
||||
fd = open_testfile(message);
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
pos = lseek(fd, 5340, SEEK_SET);
|
||||
if (pos == -1) {
|
||||
report_warn("lseek past EOF failed");
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
if (pos != 5340) {
|
||||
report_warnx("lseek to 5340 got offset %lld", (long long) pos);
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
|
||||
pos = lseek(fd, -50, SEEK_CUR);
|
||||
if (pos == -1) {
|
||||
report_warn("small seek beyond EOF failed");
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
if (pos != 5290) {
|
||||
report_warnx("SEEK_CUR to 5290 got offset %lld",
|
||||
(long long) pos);
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
|
||||
pos = lseek(fd, 0, SEEK_END);
|
||||
if (pos == -1) {
|
||||
report_warn("seek to EOF failed");
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (pos != (off_t) strlen(message)) {
|
||||
report_warnx("seek to EOF got %lld (should be %zu)",
|
||||
(long long) pos, strlen(message));
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
goto out;
|
||||
}
|
||||
|
||||
report_passed();
|
||||
report_passed(&result);
|
||||
|
||||
out:
|
||||
close(fd);
|
||||
remove(TESTFILE);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_lseek(void)
|
||||
{
|
||||
test_lseek_fd();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
lseek_fd_device();
|
||||
lseek_file_stdin();
|
||||
lseek_loc_negative();
|
||||
lseek_loc_pasteof();
|
||||
lseek_whence_inval();
|
||||
test_lseek_fd(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = lseek_fd_device();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = lseek_file_stdin();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = lseek_loc_negative();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = lseek_loc_pasteof();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = lseek_whence_inval();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,44 +44,58 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
mkdir_dot(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("mkdir .");
|
||||
rv = mkdir(".", 0775);
|
||||
report_check(rv, errno, EEXIST);
|
||||
return report_check(rv, errno, EEXIST);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
mkdir_dotdot(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("mkdir ..");
|
||||
rv = mkdir("..", 0775);
|
||||
report_check(rv, errno, EEXIST);
|
||||
return report_check(rv, errno, EEXIST);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
mkdir_empty(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("mkdir of empty string");
|
||||
rv = mkdir("", 0775);
|
||||
report_check(rv, errno, EINVAL);
|
||||
return report_check(rv, errno, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_mkdir(void)
|
||||
{
|
||||
test_mkdir_path();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
mkdir_dot();
|
||||
test_mkdir_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = mkdir_dot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
mkdir_dotdot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
mkdir_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,35 +44,48 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
open_badflags(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
report_begin("open null: with bad flags");
|
||||
fd = open("null:", 309842);
|
||||
report_check(fd, errno, EINVAL);
|
||||
return report_check(fd, errno, EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
open_empty(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("open empty string");
|
||||
rv = open("", O_RDONLY);
|
||||
report_check2(rv, errno, 0, EINVAL);
|
||||
result = report_check2(rv, errno, 0, EINVAL);
|
||||
if (rv>=0) {
|
||||
close(rv);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_open(void)
|
||||
{
|
||||
test_open_path();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
open_badflags();
|
||||
open_empty();
|
||||
test_open_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = open_badflags();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = open_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,22 +44,23 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
pipe_badptr(void *ptr, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("%s", desc);
|
||||
rv = pipe(ptr);
|
||||
report_check(rv, errno, EFAULT);
|
||||
return report_check(rv, errno, EFAULT);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
pipe_unaligned(void)
|
||||
{
|
||||
int fds[3], rv;
|
||||
char *ptr;
|
||||
int result;
|
||||
|
||||
report_begin("pipe with unaligned pointer");
|
||||
|
||||
@@ -67,15 +68,32 @@ pipe_unaligned(void)
|
||||
ptr++;
|
||||
|
||||
rv = pipe((int *)ptr);
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_pipe(void)
|
||||
{
|
||||
pipe_badptr(NULL, "pipe with NULL pointer");
|
||||
pipe_badptr(INVAL_PTR, "pipe with invalid pointer");
|
||||
pipe_badptr(KERN_PTR, "pipe with kernel pointer");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
pipe_unaligned();
|
||||
ntests++;
|
||||
result = pipe_badptr(NULL, "pipe with NULL pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = pipe_badptr(INVAL_PTR, "pipe with invalid pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = pipe_badptr(KERN_PTR, "pipe with kernel pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = pipe_unaligned();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -36,7 +36,13 @@
|
||||
void
|
||||
test_read(void)
|
||||
{
|
||||
test_read_fd();
|
||||
test_read_buf();
|
||||
int ntests = 0, lost_points = 0;
|
||||
|
||||
test_read_fd(&ntests, &lost_points);
|
||||
test_read_buf(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
|
||||
}
|
||||
|
||||
|
@@ -37,26 +37,28 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
readlink_file(void)
|
||||
{
|
||||
char buf[128];
|
||||
int fd, rv;
|
||||
int result;
|
||||
|
||||
report_begin("readlink on file");
|
||||
fd = open_testfile("the question contains an invalid assumption");
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
close(fd);
|
||||
rv = readlink(TESTFILE, buf, sizeof(buf));
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
remove(TESTFILE);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
readlink_dir(void)
|
||||
{
|
||||
char buf[128];
|
||||
@@ -64,11 +66,11 @@ readlink_dir(void)
|
||||
|
||||
report_begin("readlink on .");
|
||||
rv = readlink(".", buf, sizeof(buf));
|
||||
report_check(rv, errno, EISDIR);
|
||||
return report_check(rv, errno, EISDIR);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
readlink_empty(void)
|
||||
{
|
||||
char buf[128];
|
||||
@@ -76,17 +78,31 @@ readlink_empty(void)
|
||||
|
||||
report_begin("readlink on empty string");
|
||||
rv = readlink("", buf, sizeof(buf));
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
return report_check2(rv, errno, EISDIR, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_readlink(void)
|
||||
{
|
||||
test_readlink_path();
|
||||
test_readlink_buf();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
readlink_file();
|
||||
readlink_dir();
|
||||
readlink_empty();
|
||||
test_readlink_path(&ntests, &lost_points);
|
||||
test_readlink_buf(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = readlink_file();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = readlink_dir();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = readlink_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -44,19 +44,27 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
reboot_badflags(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
printf("(This should not kill the system...)\n");
|
||||
tprintf("(This should not kill the system...)\n");
|
||||
report_begin("reboot with invalid flags");
|
||||
rv = reboot(15353);
|
||||
report_check(rv, errno, EINVAL);
|
||||
return report_check(rv, errno, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_reboot(void)
|
||||
{
|
||||
reboot_badflags();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
ntests++;
|
||||
result = reboot_badflags();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,63 +44,83 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
remove_dir(void)
|
||||
{
|
||||
int rv;
|
||||
int result = FAILED;
|
||||
|
||||
report_begin("remove() on a directory");
|
||||
|
||||
if (create_testdir() < 0) {
|
||||
/*report_aborted();*/ /* XXX in create_testdir */
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
rv = remove(TESTDIR);
|
||||
report_check(rv, errno, EISDIR);
|
||||
result = report_check(rv, errno, EISDIR);
|
||||
rmdir(TESTDIR);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
remove_dot(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("remove() on .");
|
||||
rv = remove(".");
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
return report_check2(rv, errno, EISDIR, EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
remove_dotdot(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("remove() on ..");
|
||||
rv = remove("..");
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
return report_check2(rv, errno, EISDIR, EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
remove_empty(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("remove() on empty string");
|
||||
rv = remove("");
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
return report_check2(rv, errno, EISDIR, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_remove(void)
|
||||
{
|
||||
test_remove_path();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
remove_dir();
|
||||
remove_dot();
|
||||
remove_dotdot();
|
||||
remove_empty();
|
||||
test_remove_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = remove_dir();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = remove_dot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = remove_dotdot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = remove_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -37,75 +37,100 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rename_dot(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("rename .");
|
||||
|
||||
rv = rename(".", TESTDIR);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
if (rv==0) {
|
||||
/* oops... put it back */
|
||||
rename(TESTDIR, ".");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rename_dotdot(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("rename ..");
|
||||
rv = rename("..", TESTDIR);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
if (rv==0) {
|
||||
/* oops... put it back */
|
||||
rename(TESTDIR, "..");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rename_empty1(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("rename empty string");
|
||||
rv = rename("", TESTDIR);
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
result = report_check2(rv, errno, EISDIR, EINVAL);
|
||||
if (rv==0) {
|
||||
/* don't try to remove it */
|
||||
rename(TESTDIR, TESTDIR "-foo");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rename_empty2(void)
|
||||
{
|
||||
int rv;
|
||||
int result = FAILED;
|
||||
|
||||
report_begin("rename to empty string");
|
||||
if (create_testdir()<0) {
|
||||
/*report_aborted();*/ /* XXX in create_testdir */
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
rv = rename(TESTDIR, "");
|
||||
report_check2(rv, errno, EISDIR, EINVAL);
|
||||
result = report_check2(rv, errno, EISDIR, EINVAL);
|
||||
rmdir(TESTDIR);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
test_rename(void)
|
||||
{
|
||||
test_rename_paths();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
rename_dot();
|
||||
rename_dotdot();
|
||||
rename_empty1();
|
||||
rename_empty2();
|
||||
test_rename_paths(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rename_dot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rename_dotdot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rename_empty1();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rename_empty2();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -44,61 +44,83 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rmdir_file(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("rmdir a file");
|
||||
if (create_testfile()<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
rv = rmdir(TESTFILE);
|
||||
report_check(rv, errno, ENOTDIR);
|
||||
result = report_check(rv, errno, ENOTDIR);
|
||||
remove(TESTFILE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rmdir_dot(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("rmdir .");
|
||||
rv = rmdir(".");
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rmdir_dotdot(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("rmdir ..");
|
||||
rv = rmdir("..");
|
||||
report_check2(rv, errno, EINVAL, ENOTEMPTY);
|
||||
return report_check2(rv, errno, EINVAL, ENOTEMPTY);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
rmdir_empty(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("rmdir empty string");
|
||||
rv = rmdir("");
|
||||
report_check(rv, errno, EINVAL);
|
||||
return report_check(rv, errno, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_rmdir(void)
|
||||
{
|
||||
test_rmdir_path();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
rmdir_file();
|
||||
rmdir_dot();
|
||||
rmdir_dotdot();
|
||||
rmdir_empty();
|
||||
test_rmdir_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rmdir_file();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rmdir_dot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rmdir_dotdot();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = rmdir_empty();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -59,7 +59,7 @@ try_sbrk(long val)
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
enforce_sbrk(long val, const char *desc, int err)
|
||||
{
|
||||
int result;
|
||||
@@ -67,59 +67,79 @@ enforce_sbrk(long val, const char *desc, int err)
|
||||
report_begin("sbrk %s", desc);
|
||||
|
||||
result = try_sbrk(val);
|
||||
report_check(result, errno, err);
|
||||
return report_check(result, errno, err);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
sbrk_bigpos(void)
|
||||
{
|
||||
enforce_sbrk(4096*1024*256, "huge positive", ENOMEM);
|
||||
return enforce_sbrk(1024*1024*1024 + (1024*1024*1024 - 4096*17), "huge positive", ENOMEM);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
sbrk_bigneg(void)
|
||||
{
|
||||
enforce_sbrk(-4096*1024*256, "huge negative", EINVAL);
|
||||
return enforce_sbrk(-4096*1024*256, "huge negative", EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
sbrk_neg(void)
|
||||
{
|
||||
enforce_sbrk(-8192, "too-large negative", EINVAL);
|
||||
return enforce_sbrk(-8192, "too-large negative", EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
sbrk_unalignedpos(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
report_begin("sbrk unaligned positive");
|
||||
result = try_sbrk(17);
|
||||
report_check2(result, errno, 0, EINVAL);
|
||||
return report_check2(result, errno, 0, EINVAL);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
sbrk_unalignedneg(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
report_begin("sbrk unaligned negative");
|
||||
result = try_sbrk(-17);
|
||||
report_check2(result, errno, 0, EINVAL);
|
||||
return report_check2(result, errno, 0, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_sbrk(void)
|
||||
{
|
||||
sbrk_neg();
|
||||
sbrk_bigpos();
|
||||
sbrk_bigneg();
|
||||
sbrk_unalignedpos();
|
||||
sbrk_unalignedneg();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
ntests++;
|
||||
result = sbrk_neg();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = sbrk_bigpos();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = sbrk_bigneg();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = sbrk_unalignedpos();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = sbrk_unalignedneg();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -67,7 +67,7 @@ badbuf_stat(struct stat *sb)
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
common_badbuf(int (*statfunc)(struct stat *), void *ptr,
|
||||
const char *call, const char *ptrdesc)
|
||||
{
|
||||
@@ -75,22 +75,24 @@ common_badbuf(int (*statfunc)(struct stat *), void *ptr,
|
||||
|
||||
report_begin("%s with %s buf", call, ptrdesc);
|
||||
rv = statfunc(ptr);
|
||||
report_check(rv, errno, EFAULT);
|
||||
return report_check(rv, errno, EFAULT);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
any_badbuf(int (*statfunc)(struct stat *), const char *call)
|
||||
{
|
||||
common_badbuf(statfunc, NULL, call, "NULL");
|
||||
common_badbuf(statfunc, INVAL_PTR, call, "invalid pointer");
|
||||
common_badbuf(statfunc, KERN_PTR, call, "kernel pointer");
|
||||
int result;
|
||||
result = common_badbuf(statfunc, NULL, call, "NULL");
|
||||
result |= common_badbuf(statfunc, INVAL_PTR, call, "invalid pointer");
|
||||
result |= common_badbuf(statfunc, KERN_PTR, call, "kernel pointer");
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
any_empty(int (*statfunc)(const char *, struct stat *), const char *call)
|
||||
{
|
||||
struct stat sb;
|
||||
@@ -98,7 +100,7 @@ any_empty(int (*statfunc)(const char *, struct stat *), const char *call)
|
||||
|
||||
report_begin("%s on empty string", call);
|
||||
rv = statfunc("", &sb);
|
||||
report_check2(rv, errno, 0, EINVAL);
|
||||
return report_check2(rv, errno, 0, EINVAL);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -106,23 +108,56 @@ any_empty(int (*statfunc)(const char *, struct stat *), const char *call)
|
||||
void
|
||||
test_fstat(void)
|
||||
{
|
||||
test_fstat_fd();
|
||||
any_badbuf(badbuf_fstat, "fstat");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
test_fstat_fd(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = any_badbuf(badbuf_fstat, "fstat");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
void
|
||||
test_lstat(void)
|
||||
{
|
||||
test_lstat_path();
|
||||
any_empty(lstat, "lstat");
|
||||
any_badbuf(badbuf_lstat, "lstat");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
test_lstat_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = any_empty(lstat, "lstat");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = any_badbuf(badbuf_lstat, "lstat");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
void
|
||||
test_stat(void)
|
||||
{
|
||||
test_stat_path();
|
||||
any_empty(stat, "stat");
|
||||
any_badbuf(badbuf_stat, "stat");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
test_stat_path(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = any_empty(stat, "stat");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = any_badbuf(badbuf_stat, "stat");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
||||
|
@@ -37,32 +37,47 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
symlink_empty1(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("symlink -> empty string");
|
||||
rv = symlink("", TESTLINK);
|
||||
report_check2(rv, errno, 0, EINVAL);
|
||||
result = report_check2(rv, errno, 0, EINVAL);
|
||||
remove(TESTLINK);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
symlink_empty2(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("symlink named empty string");
|
||||
rv = symlink("foo", "");
|
||||
report_check(rv, errno, EINVAL);
|
||||
return report_check(rv, errno, EINVAL);
|
||||
}
|
||||
|
||||
void
|
||||
test_symlink(void)
|
||||
{
|
||||
test_symlink_paths();
|
||||
symlink_empty1();
|
||||
symlink_empty2();
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
|
||||
test_symlink_paths(&ntests, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = symlink_empty1();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = symlink_empty2();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -44,33 +44,49 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
time_badsecs(void *ptr, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("%s", desc);
|
||||
rv = __time(ptr, NULL);
|
||||
report_check(rv, errno, EFAULT);
|
||||
return report_check(rv, errno, EFAULT);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
time_badnsecs(void *ptr, const char *desc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
report_begin("%s", desc);
|
||||
rv = __time(NULL, ptr);
|
||||
report_check(rv, errno, EFAULT);
|
||||
return report_check(rv, errno, EFAULT);
|
||||
}
|
||||
|
||||
void
|
||||
test_time(void)
|
||||
{
|
||||
time_badsecs(INVAL_PTR, "__time with invalid seconds pointer");
|
||||
time_badsecs(KERN_PTR, "__time with kernel seconds pointer");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
time_badnsecs(INVAL_PTR, "__time with invalid nsecs pointer");
|
||||
time_badnsecs(KERN_PTR, "__time with kernel nsecs pointer");
|
||||
ntests++;
|
||||
result = time_badsecs(INVAL_PTR, "__time with invalid seconds pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = time_badsecs(KERN_PTR, "__time with kernel seconds pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = time_badnsecs(INVAL_PTR, "__time with invalid nsecs pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = time_badnsecs(KERN_PTR, "__time with kernel nsecs pointer");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -42,7 +42,7 @@
|
||||
#include "test.h"
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_badpid(pid_t pid, const char *desc)
|
||||
{
|
||||
pid_t rv;
|
||||
@@ -59,23 +59,24 @@ wait_badpid(pid_t pid, const char *desc)
|
||||
else if (err == ENOSYS) {
|
||||
report_saw_enosys();
|
||||
}
|
||||
report_check2(rv, err, ESRCH, ECHILD);
|
||||
return report_check2(rv, err, ESRCH, ECHILD);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_nullstatus(void)
|
||||
{
|
||||
pid_t pid, rv;
|
||||
int x;
|
||||
int result;
|
||||
|
||||
report_begin("wait with NULL status");
|
||||
|
||||
pid = fork();
|
||||
if (pid<0) {
|
||||
report_warn("fork failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
if (pid==0) {
|
||||
exit(0);
|
||||
@@ -83,50 +84,54 @@ wait_nullstatus(void)
|
||||
|
||||
/* POSIX explicitly says passing NULL for status is allowed */
|
||||
rv = waitpid(pid, NULL, 0);
|
||||
report_check(rv, errno, 0);
|
||||
result = report_check(rv, errno, 0);
|
||||
waitpid(pid, &x, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_badstatus(void *ptr, const char *desc)
|
||||
{
|
||||
pid_t pid, rv;
|
||||
int x;
|
||||
int result;
|
||||
|
||||
report_begin(desc);
|
||||
|
||||
pid = fork();
|
||||
if (pid<0) {
|
||||
report_warn("fork failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
if (pid==0) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
rv = waitpid(pid, ptr, 0);
|
||||
report_check(rv, errno, EFAULT);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
waitpid(pid, &x, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_unaligned(void)
|
||||
{
|
||||
pid_t pid, rv;
|
||||
int x;
|
||||
int status[2]; /* will have integer alignment */
|
||||
char *ptr;
|
||||
int result;
|
||||
|
||||
report_begin("wait with unaligned status");
|
||||
|
||||
pid = fork();
|
||||
if (pid<0) {
|
||||
report_warn("fork failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
if (pid==0) {
|
||||
exit(0);
|
||||
@@ -139,55 +144,61 @@ wait_unaligned(void)
|
||||
ptr++;
|
||||
|
||||
rv = waitpid(pid, (int *)ptr, 0);
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
if (rv<0) {
|
||||
waitpid(pid, &x, 0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_badflags(void)
|
||||
{
|
||||
pid_t pid, rv;
|
||||
int x;
|
||||
int result;
|
||||
|
||||
report_begin("wait with bad flags");
|
||||
|
||||
pid = fork();
|
||||
if (pid<0) {
|
||||
report_warn("fork failed");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
if (pid==0) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
rv = waitpid(pid, &x, 309429);
|
||||
report_check(rv, errno, EINVAL);
|
||||
result = report_check(rv, errno, EINVAL);
|
||||
waitpid(pid, &x, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_self(void)
|
||||
{
|
||||
pid_t rv;
|
||||
int x;
|
||||
int result;
|
||||
|
||||
report_begin("wait for self");
|
||||
|
||||
rv = waitpid(getpid(), &x, 0);
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_parent(void)
|
||||
{
|
||||
pid_t mypid, childpid, rv;
|
||||
int x;
|
||||
int result;
|
||||
|
||||
report_begin("wait for parent");
|
||||
report_hassubs();
|
||||
@@ -196,30 +207,32 @@ wait_parent(void)
|
||||
childpid = fork();
|
||||
if (childpid<0) {
|
||||
report_warn("can't fork");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
if (childpid==0) {
|
||||
/* Child. Wait for parent. */
|
||||
rv = waitpid(mypid, &x, 0);
|
||||
report_beginsub("from child:");
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
_exit(0);
|
||||
}
|
||||
rv = waitpid(childpid, &x, 0);
|
||||
rv = waitpid(mypid, &x, 0);
|
||||
report_beginsub("from parent:");
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_siblings_child(const char *semname)
|
||||
{
|
||||
pid_t pids[2], mypid, otherpid;
|
||||
int rv, fd, semfd, x;
|
||||
char c;
|
||||
int result;
|
||||
|
||||
mypid = getpid();
|
||||
|
||||
@@ -244,7 +257,7 @@ wait_siblings_child(const char *semname)
|
||||
if (fd<0) {
|
||||
report_warn("child process (pid %d) can't open %s",
|
||||
mypid, TESTFILE);
|
||||
return;
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -257,13 +270,13 @@ wait_siblings_child(const char *semname)
|
||||
if (rv<0) {
|
||||
report_warn("child process (pid %d) lseek error",
|
||||
mypid);
|
||||
return;
|
||||
return FAILED;
|
||||
}
|
||||
rv = read(fd, pids, sizeof(pids));
|
||||
if (rv<0) {
|
||||
report_warn("child process (pid %d) read error",
|
||||
mypid);
|
||||
return;
|
||||
return FAILED;
|
||||
}
|
||||
} while (rv < (int)sizeof(pids));
|
||||
|
||||
@@ -276,23 +289,25 @@ wait_siblings_child(const char *semname)
|
||||
else {
|
||||
report_warn("child process (pid %d) got garbage in comm file",
|
||||
mypid);
|
||||
return;
|
||||
return FAILED;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
rv = waitpid(otherpid, &x, 0);
|
||||
report_beginsub("sibling (pid %d)", mypid);
|
||||
report_survival(rv, errno);
|
||||
report_survival(rv, errno, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
wait_siblings(void)
|
||||
{
|
||||
pid_t pids[2];
|
||||
int rv, fd, semfd, x;
|
||||
int bad = 0;
|
||||
char semname[32];
|
||||
int result;
|
||||
|
||||
/* This test may also blow up if FS synchronization is substandard */
|
||||
|
||||
@@ -303,26 +318,26 @@ wait_siblings(void)
|
||||
semfd = open(semname, O_WRONLY|O_CREAT|O_TRUNC, 0664);
|
||||
if (semfd < 0) {
|
||||
report_warn("can't make semaphore");
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
fd = open_testfile(NULL);
|
||||
if (fd<0) {
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
pids[0] = fork();
|
||||
if (pids[0]<0) {
|
||||
report_warn("can't fork");
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
close(fd);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
if (pids[0]==0) {
|
||||
close(fd);
|
||||
@@ -334,12 +349,12 @@ wait_siblings(void)
|
||||
pids[1] = fork();
|
||||
if (pids[1]<0) {
|
||||
report_warn("can't fork");
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
/* abandon the other child process :( */
|
||||
close(fd);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
if (pids[1]==0) {
|
||||
close(fd);
|
||||
@@ -351,21 +366,21 @@ wait_siblings(void)
|
||||
rv = write(fd, pids, sizeof(pids));
|
||||
if (rv < 0) {
|
||||
report_warn("write error on %s", TESTFILE);
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
/* abandon child procs :( */
|
||||
close(fd);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
if (rv != (int)sizeof(pids)) {
|
||||
report_warnx("write error on %s: short count", TESTFILE);
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
/* abandon child procs :( */
|
||||
close(fd);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* gate the child procs */
|
||||
@@ -388,15 +403,17 @@ wait_siblings(void)
|
||||
}
|
||||
if (bad) {
|
||||
/* XXX: aborted, or failure, or what? */
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
}
|
||||
else {
|
||||
report_passed();
|
||||
report_passed(&result);
|
||||
}
|
||||
close(fd);
|
||||
close(semfd);
|
||||
remove(semname);
|
||||
remove(TESTFILE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -404,20 +421,61 @@ wait_siblings(void)
|
||||
void
|
||||
test_waitpid(void)
|
||||
{
|
||||
wait_badpid(-8, "wait for pid -8");
|
||||
wait_badpid(-1, "wait for pid -1");
|
||||
wait_badpid(0, "pid zero");
|
||||
wait_badpid(NONEXIST_PID, "nonexistent pid");
|
||||
int ntests = 0, lost_points = 0;
|
||||
int result;
|
||||
|
||||
wait_nullstatus();
|
||||
wait_badstatus(INVAL_PTR, "wait with invalid pointer status");
|
||||
wait_badstatus(KERN_PTR, "wait with kernel pointer status");
|
||||
ntests++;
|
||||
result = wait_badpid(-8, "wait for pid -8");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
wait_unaligned();
|
||||
ntests++;
|
||||
result = wait_badpid(-1, "wait for pid -1");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
wait_badflags();
|
||||
ntests++;
|
||||
result = wait_badpid(0, "pid zero");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
wait_self();
|
||||
wait_parent();
|
||||
wait_siblings();
|
||||
ntests++;
|
||||
result = wait_badpid(NONEXIST_PID, "nonexistent pid");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
|
||||
ntests++;
|
||||
result = wait_nullstatus();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = wait_badstatus(INVAL_PTR, "wait with invalid pointer status");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = wait_badstatus(KERN_PTR, "wait with kernel pointer status");
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
|
||||
ntests++;
|
||||
result = wait_unaligned();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
|
||||
ntests++;
|
||||
result = wait_badflags();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
|
||||
ntests++;
|
||||
result = wait_self();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = wait_parent();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
ntests++;
|
||||
result = wait_siblings();
|
||||
handle_result(result, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -36,6 +36,11 @@
|
||||
void
|
||||
test_write(void)
|
||||
{
|
||||
test_write_fd();
|
||||
test_write_buf();
|
||||
int ntests = 0, lost_points = 0;
|
||||
|
||||
test_write_fd(&ntests, &lost_points);
|
||||
test_write_buf(&ntests, &lost_points);
|
||||
|
||||
if(!lost_points)
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/badcall");
|
||||
}
|
||||
|
@@ -175,33 +175,46 @@ getcwd_badbuf(void *buf)
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
common_badbuf(struct buftest *info, void *buf, const char *bufdesc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
int result;
|
||||
|
||||
report_begin("%s with %s buffer", info->name, bufdesc);
|
||||
info->setup();
|
||||
rv = info->op(buf);
|
||||
report_check(rv, errno, EFAULT);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
info->cleanup();
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
any_badbuf(struct buftest *info)
|
||||
int
|
||||
any_badbuf(struct buftest *info, int *ntests, int *lost_points)
|
||||
{
|
||||
common_badbuf(info, NULL, "NULL");
|
||||
common_badbuf(info, INVAL_PTR, "invalid");
|
||||
common_badbuf(info, KERN_PTR, "kernel-space");
|
||||
int result;
|
||||
|
||||
*ntests += 1;
|
||||
result = common_badbuf(info, NULL, "NULL");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
*ntests += 1;
|
||||
result = common_badbuf(info, INVAL_PTR, "invalid");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
*ntests += 1;
|
||||
result = common_badbuf(info, KERN_PTR, "kernel-space");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
#define T(call) \
|
||||
void \
|
||||
test_##call##_buf(void) \
|
||||
test_##call##_buf(int *ntests, int *lost_points) \
|
||||
{ \
|
||||
static struct buftest info = { \
|
||||
call##_setup, \
|
||||
@@ -209,7 +222,7 @@ any_badbuf(struct buftest *info)
|
||||
call##_cleanup, \
|
||||
#call, \
|
||||
}; \
|
||||
any_badbuf(&info); \
|
||||
any_badbuf(&info, ntests, lost_points); \
|
||||
}
|
||||
|
||||
T(read);
|
||||
|
@@ -138,46 +138,58 @@ dup2_cleanup(void)
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
any_badfd(int (*func)(int fd), void (*cleanup)(void), const char *callname,
|
||||
int fd, const char *fddesc)
|
||||
{
|
||||
int rv;
|
||||
|
||||
int result;
|
||||
report_begin("%s using %s", callname, fddesc);
|
||||
rv = func(fd);
|
||||
report_check(rv, errno, EBADF);
|
||||
result = report_check(rv, errno, EBADF);
|
||||
if (cleanup) {
|
||||
cleanup();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
runtest(int (*func)(int fd), void (*cleanup)(void), const char *callname,
|
||||
enum rwtestmodes rw)
|
||||
enum rwtestmodes rw, int *ntests, int *lost_points)
|
||||
{
|
||||
int fd;
|
||||
int result;
|
||||
|
||||
/*
|
||||
* If adding cases, also see bad_dup2.c
|
||||
*/
|
||||
|
||||
/* basic invalid case: fd -1 */
|
||||
any_badfd(func, cleanup, callname, -1, "fd -1");
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, -1, "fd -1");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
/* also try -5 in case -1 is special somehow */
|
||||
any_badfd(func, cleanup, callname, -5, "fd -5");
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, -5, "fd -5");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
/* try a fd we know is closed */
|
||||
any_badfd(func, cleanup, callname, CLOSED_FD, "closed fd");
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, CLOSED_FD, "closed fd");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
/* try a positive fd we know is out of range */
|
||||
any_badfd(func, cleanup, callname, IMPOSSIBLE_FD, "impossible fd");
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, IMPOSSIBLE_FD, "impossible fd");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
/* test for off-by-one errors */
|
||||
#ifdef OPEN_MAX
|
||||
any_badfd(func, cleanup, callname, OPEN_MAX, "fd OPEN_MAX");
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, OPEN_MAX, "fd OPEN_MAX");
|
||||
handle_result(result, lost_points);
|
||||
#else
|
||||
warnx("Warning: OPEN_MAX not defined, test skipped");
|
||||
#endif
|
||||
@@ -188,8 +200,10 @@ runtest(int (*func)(int fd), void (*cleanup)(void), const char *callname,
|
||||
/* already printed a message */
|
||||
}
|
||||
else {
|
||||
any_badfd(func, cleanup, callname, fd,
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, fd,
|
||||
"fd opened read-only");
|
||||
handle_result(result, lost_points);
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
@@ -199,8 +213,10 @@ runtest(int (*func)(int fd), void (*cleanup)(void), const char *callname,
|
||||
/* already printed a message */
|
||||
}
|
||||
else {
|
||||
any_badfd(func, cleanup, callname, fd,
|
||||
*ntests += 1;
|
||||
result = any_badfd(func, cleanup, callname, fd,
|
||||
"fd opened write-only");
|
||||
handle_result(result, lost_points);
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
@@ -208,18 +224,18 @@ runtest(int (*func)(int fd), void (*cleanup)(void), const char *callname,
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
#define T(call, rw) \
|
||||
void \
|
||||
test_##call##_fd(void) \
|
||||
{ \
|
||||
runtest(call##_badfd, NULL, #call, rw); \
|
||||
#define T(call, rw) \
|
||||
void \
|
||||
test_##call##_fd(int *ntests, int *lost_points) \
|
||||
{ \
|
||||
runtest(call##_badfd, NULL, #call, rw, ntests, lost_points); \
|
||||
}
|
||||
|
||||
#define TC(call, rw) \
|
||||
void \
|
||||
test_##call##_fd(void) \
|
||||
{ \
|
||||
runtest(call##_badfd, call##_cleanup, #call, rw);\
|
||||
#define TC(call, rw) \
|
||||
void \
|
||||
test_##call##_fd(int *ntests, int *lost_points) \
|
||||
{ \
|
||||
runtest(call##_badfd, call##_cleanup, #call, rw, ntests, lost_points); \
|
||||
}
|
||||
|
||||
T(read, RW_TEST_WRONLY);
|
||||
|
@@ -148,46 +148,58 @@ stat_badpath(const char *name)
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
common_badpath(int (*func)(const char *path), int mk, int rm, const char *path,
|
||||
const char *call, const char *pathdesc)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
report_begin("%s with %s path", call, pathdesc);
|
||||
|
||||
if (mk) {
|
||||
if (create_testfile()<0) {
|
||||
report_aborted();
|
||||
return;
|
||||
report_aborted(&result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
rv = func(path);
|
||||
report_check(rv, errno, EFAULT);
|
||||
result = report_check(rv, errno, EFAULT);
|
||||
|
||||
if (mk || rm) {
|
||||
remove(TESTFILE);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
any_badpath(int (*func)(const char *path), const char *call, int mk, int rm)
|
||||
any_badpath(int (*func)(const char *path), const char *call, int mk, int rm,
|
||||
int *ntests, int *lost_points)
|
||||
{
|
||||
common_badpath(func, mk, rm, NULL, call, "NULL");
|
||||
common_badpath(func, mk, rm, INVAL_PTR, call, "invalid-pointer");
|
||||
common_badpath(func, mk, rm, KERN_PTR, call, "kernel-pointer");
|
||||
int result;
|
||||
// We have a total of 3 tests
|
||||
*ntests = *ntests + 3;
|
||||
|
||||
result = common_badpath(func, mk, rm, NULL, call, "NULL");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
result = common_badpath(func, mk, rm, INVAL_PTR, call, "invalid-pointer");
|
||||
handle_result(result, lost_points);
|
||||
|
||||
result = common_badpath(func, mk, rm, KERN_PTR, call, "kernel-pointer");
|
||||
handle_result(result, lost_points);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/* functions with one pathname */
|
||||
#define T(call) \
|
||||
void \
|
||||
test_##call##_path(void) \
|
||||
{ \
|
||||
any_badpath(call##_badpath, #call, 0, 0); \
|
||||
#define T(call) \
|
||||
void \
|
||||
test_##call##_path(int *ntests, int *lost_points) \
|
||||
{ \
|
||||
any_badpath(call##_badpath, #call, 0, 0, ntests, lost_points); \
|
||||
}
|
||||
|
||||
T(open);
|
||||
@@ -200,12 +212,12 @@ T(stat);
|
||||
T(lstat);
|
||||
|
||||
/* functions with two pathnames */
|
||||
#define T2(call) \
|
||||
void \
|
||||
test_##call##_paths(void) \
|
||||
{ \
|
||||
any_badpath(call##_badpath1, #call "(arg1)", 0, 1); \
|
||||
any_badpath(call##_badpath2, #call "(arg2)", 1, 1); \
|
||||
#define T2(call) \
|
||||
void \
|
||||
test_##call##_paths(int *ntests, int *lost_points) \
|
||||
{ \
|
||||
any_badpath(call##_badpath1, #call "(arg1)", 0, 1, ntests, lost_points); \
|
||||
any_badpath(call##_badpath2, #call "(arg2)", 1, 1, ntests, lost_points); \
|
||||
}
|
||||
|
||||
T2(rename);
|
||||
|
@@ -121,16 +121,18 @@ int
|
||||
create_testdir(void)
|
||||
{
|
||||
int rv;
|
||||
int result;
|
||||
|
||||
rv = mkdir(TESTDIR, 0775);
|
||||
if (rv<0) {
|
||||
if (errno == ENOSYS) {
|
||||
report_saw_enosys();
|
||||
report_warnx("mkdir unimplemented; cannot run test");
|
||||
report_skipped();
|
||||
report_skipped(&result);
|
||||
}
|
||||
else {
|
||||
report_warn("mkdir %s failed", TESTDIR);
|
||||
report_aborted();
|
||||
report_aborted(&result);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -198,20 +200,20 @@ menu(void)
|
||||
{
|
||||
int i;
|
||||
for (i=0; ops[i].name; i++) {
|
||||
printf("[%c] %-24s", ops[i].ch, ops[i].name);
|
||||
tprintf("[%c] %-24s", ops[i].ch, ops[i].name);
|
||||
if (i%2==1) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
}
|
||||
if (i%2==1) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
printf("[1] %-24s", "asst1");
|
||||
printf("[2] %-24s\n", "asst2");
|
||||
printf("[3] %-24s", "asst3");
|
||||
printf("[4] %-24s\n", "asst4");
|
||||
printf("[*] %-24s", "all");
|
||||
printf("[!] %-24s\n", "quit");
|
||||
tprintf("[1] %-24s", "asst1");
|
||||
tprintf("[2] %-24s\n", "asst2");
|
||||
tprintf("[3] %-24s", "asst3");
|
||||
tprintf("[4] %-24s\n", "asst4");
|
||||
tprintf("[*] %-24s", "all");
|
||||
tprintf("[!] %-24s\n", "quit");
|
||||
}
|
||||
|
||||
static
|
||||
@@ -231,7 +233,7 @@ runit(int op)
|
||||
|
||||
if (op=='*') {
|
||||
for (i=0; ops[i].name; i++) {
|
||||
printf("[%s]\n", ops[i].name);
|
||||
tprintf("[%s]\n", ops[i].name);
|
||||
ops[i].f();
|
||||
}
|
||||
return;
|
||||
@@ -241,7 +243,7 @@ runit(int op)
|
||||
k = op-'0';
|
||||
for (i=0; ops[i].name; i++) {
|
||||
if (ops[i].asst <= k) {
|
||||
printf("[%s]\n", ops[i].name);
|
||||
tprintf("[%s]\n", ops[i].name);
|
||||
ops[i].f();
|
||||
}
|
||||
}
|
||||
@@ -249,7 +251,7 @@ runit(int op)
|
||||
}
|
||||
|
||||
if (op < LOWEST || op > HIGHEST) {
|
||||
printf("Invalid request %c\n", op);
|
||||
tprintf("Invalid request %c\n", op);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -261,12 +263,12 @@ main(int argc, char **argv)
|
||||
{
|
||||
int op, i, j;
|
||||
|
||||
printf("[%c-%c, 1-4, *, ?=menu, !=quit]\n", LOWEST, HIGHEST);
|
||||
tprintf("[%c-%c, 1-4, *, ?=menu, !=quit]\n", LOWEST, HIGHEST);
|
||||
|
||||
if (argc > 1) {
|
||||
for (i=1; i<argc; i++) {
|
||||
for (j=0; argv[i][j]; j++) {
|
||||
printf("Choose: %c\n",
|
||||
tprintf("Choose: %c\n",
|
||||
argv[i][j]);
|
||||
runit(argv[i][j]);
|
||||
}
|
||||
@@ -275,12 +277,12 @@ main(int argc, char **argv)
|
||||
else {
|
||||
menu();
|
||||
while (1) {
|
||||
printf("Choose: ");
|
||||
tprintf("Choose: ");
|
||||
op = getchar();
|
||||
if (op==EOF) {
|
||||
break;
|
||||
}
|
||||
printf("%c\n", op);
|
||||
tprintf("%c\n", op);
|
||||
runit(op);
|
||||
}
|
||||
}
|
||||
|
@@ -251,27 +251,31 @@ report_end(const char *msg)
|
||||
}
|
||||
|
||||
void
|
||||
report_passed(void)
|
||||
report_passed(int *status)
|
||||
{
|
||||
report_end("passed");
|
||||
*status = SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
report_failure(void)
|
||||
report_failure(int *status)
|
||||
{
|
||||
report_end("FAILURE");
|
||||
*status = FAILED;
|
||||
}
|
||||
|
||||
void
|
||||
report_skipped(void)
|
||||
report_skipped(int *status)
|
||||
{
|
||||
report_end("------");
|
||||
*status = SKIPPED;
|
||||
}
|
||||
|
||||
void
|
||||
report_aborted(void)
|
||||
report_aborted(int *status)
|
||||
{
|
||||
report_end("ABORTED");
|
||||
*status = ABORTED;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -283,18 +287,19 @@ report_aborted(void)
|
||||
*/
|
||||
|
||||
void
|
||||
report_survival(int rv, int error)
|
||||
report_survival(int rv, int error, int *result)
|
||||
{
|
||||
/* allow any error as long as we survive */
|
||||
report_result(rv, error);
|
||||
report_passed();
|
||||
report_passed(result);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
int
|
||||
report_checkN(int rv, int error, int *right_errors, int right_num)
|
||||
{
|
||||
int i, goterror;
|
||||
int result = 1;
|
||||
|
||||
if (rv==-1) {
|
||||
goterror = error;
|
||||
@@ -306,39 +311,40 @@ report_checkN(int rv, int error, int *right_errors, int right_num)
|
||||
for (i=0; i<right_num; i++) {
|
||||
if (goterror == right_errors[i]) {
|
||||
report_result(rv, error);
|
||||
report_passed();
|
||||
return;
|
||||
report_passed(&result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
if (goterror == ENOSYS) {
|
||||
report_saw_enosys();
|
||||
say("(unimplemented) ");
|
||||
report_skipped();
|
||||
report_skipped(&result);
|
||||
}
|
||||
else {
|
||||
report_result(rv, error);
|
||||
report_failure();
|
||||
report_failure(&result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
report_check(int rv, int error, int right_error)
|
||||
{
|
||||
report_checkN(rv, error, &right_error, 1);
|
||||
return report_checkN(rv, error, &right_error, 1);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
report_check2(int rv, int error, int okerr1, int okerr2)
|
||||
{
|
||||
int ok[2];
|
||||
|
||||
ok[0] = okerr1;
|
||||
ok[1] = okerr2;
|
||||
report_checkN(rv, error, ok, 2);
|
||||
return report_checkN(rv, error, ok, 2);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
report_check3(int rv, int error, int okerr1, int okerr2, int okerr3)
|
||||
{
|
||||
int ok[3];
|
||||
@@ -346,5 +352,13 @@ report_check3(int rv, int error, int okerr1, int okerr2, int okerr3)
|
||||
ok[0] = okerr1;
|
||||
ok[1] = okerr2;
|
||||
ok[2] = okerr3;
|
||||
report_checkN(rv, error, ok, 3);
|
||||
return report_checkN(rv, error, ok, 3);
|
||||
}
|
||||
|
||||
void
|
||||
handle_result(int result, int *lost_points)
|
||||
{
|
||||
if(result)
|
||||
*lost_points = *lost_points + 1;
|
||||
}
|
||||
|
||||
|
@@ -27,6 +27,8 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define TESTFILE "badcallfile"
|
||||
#define TESTDIR "badcalldir"
|
||||
#define TESTLINK "badcalllink"
|
||||
@@ -37,6 +39,11 @@
|
||||
#define PF(a, b)
|
||||
#endif
|
||||
|
||||
#define SUCCESS 0
|
||||
#define SKIPPED 1
|
||||
#define FAILED 2
|
||||
#define ABORTED 3
|
||||
|
||||
/* driver.c */
|
||||
int open_testfile(const char *str);
|
||||
int reopen_testfile(int openflags);
|
||||
@@ -52,46 +59,46 @@ PF(1, 2) void report_warn(const char *fmt, ...);
|
||||
PF(1, 2) void report_warnx(const char *fmt, ...);
|
||||
void report_result(int rv, int error);
|
||||
void report_saw_enosys(void);
|
||||
void report_passed(void);
|
||||
void report_failure(void);
|
||||
void report_skipped(void);
|
||||
void report_aborted(void);
|
||||
void report_survival(int rv, int error);
|
||||
void report_check(int rv, int error, int right_error);
|
||||
void report_check2(int rv, int error, int okerr1, int okerr2);
|
||||
void report_check3(int rv, int error, int okerr1, int okerr2, int okerr3);
|
||||
void report_passed(int *result);
|
||||
void report_failure(int *result);
|
||||
void report_skipped(int *result);
|
||||
void report_aborted(int *result);
|
||||
void report_survival(int rv, int error, int *result);
|
||||
int report_check(int rv, int error, int right_error);
|
||||
int report_check2(int rv, int error, int okerr1, int okerr2);
|
||||
int report_check3(int rv, int error, int okerr1, int okerr2, int okerr3);
|
||||
|
||||
/* common_buf.c */
|
||||
void test_read_buf(void);
|
||||
void test_write_buf(void);
|
||||
void test_getdirentry_buf(void);
|
||||
void test_getcwd_buf(void);
|
||||
void test_readlink_buf(void);
|
||||
void test_read_buf(int *ntests, int *lost_points);
|
||||
void test_write_buf(int *ntests, int *lost_points);
|
||||
void test_getdirentry_buf(int *ntests, int *lost_points);
|
||||
void test_getcwd_buf(int *ntests, int *lost_points);
|
||||
void test_readlink_buf(int *ntests, int *lost_points);
|
||||
|
||||
/* common_fds.c */
|
||||
void test_read_fd(void);
|
||||
void test_write_fd(void);
|
||||
void test_close_fd(void);
|
||||
void test_ioctl_fd(void);
|
||||
void test_lseek_fd(void);
|
||||
void test_fsync_fd(void);
|
||||
void test_ftruncate_fd(void);
|
||||
void test_fstat_fd(void);
|
||||
void test_getdirentry_fd(void);
|
||||
void test_dup2_fd(void);
|
||||
void test_read_fd(int *ntests, int *lost_points);
|
||||
void test_write_fd(int *ntests, int *lost_points);
|
||||
void test_close_fd(int *ntests, int *lost_points);
|
||||
void test_ioctl_fd(int *ntests, int *lost_points);
|
||||
void test_lseek_fd(int *ntests, int *lost_points);
|
||||
void test_fsync_fd(int *ntests, int *lost_points);
|
||||
void test_ftruncate_fd(int *ntests, int *lost_points);
|
||||
void test_fstat_fd(int *ntests, int *lost_points);
|
||||
void test_getdirentry_fd(int *ntests, int *lost_points);
|
||||
void test_dup2_fd(int *ntests, int *lost_points);
|
||||
|
||||
/* common_path.c */
|
||||
void test_open_path(void);
|
||||
void test_remove_path(void);
|
||||
void test_rename_paths(void);
|
||||
void test_link_paths(void);
|
||||
void test_mkdir_path(void);
|
||||
void test_rmdir_path(void);
|
||||
void test_chdir_path(void);
|
||||
void test_symlink_paths(void);
|
||||
void test_readlink_path(void);
|
||||
void test_stat_path(void);
|
||||
void test_lstat_path(void);
|
||||
void test_open_path(int *ntests, int *lost_points);
|
||||
void test_remove_path(int *ntests, int *lost_points);
|
||||
void test_rename_paths(int *ntests, int *lost_points);
|
||||
void test_link_paths(int *ntests, int *lost_points);
|
||||
void test_mkdir_path(int *ntests, int *lost_points);
|
||||
void test_rmdir_path(int *ntests, int *lost_points);
|
||||
void test_chdir_path(int *ntests, int *lost_points);
|
||||
void test_symlink_paths(int *ntests, int *lost_points);
|
||||
void test_readlink_path(int *ntests, int *lost_points);
|
||||
void test_stat_path(int *ntests, int *lost_points);
|
||||
void test_lstat_path(int *ntests, int *lost_points);
|
||||
|
||||
/* bad_*.c */
|
||||
void test_execv(void);
|
||||
@@ -122,3 +129,6 @@ void test_time(void);
|
||||
void test_getcwd(void);
|
||||
void test_stat(void);
|
||||
void test_lstat(void); /* in bad_stat.c */
|
||||
|
||||
void handle_result(int result, int *lost_points);
|
||||
|
||||
|
@@ -36,11 +36,13 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define _PATH_MYSELF "/testbin/bigexec"
|
||||
|
||||
@@ -110,6 +112,7 @@ try(const char *first, ...)
|
||||
va_list ap;
|
||||
int num;
|
||||
|
||||
nprintf(".");
|
||||
assert(first != NULL);
|
||||
args[0] = _PATH_MYSELF;
|
||||
args[1] = first;
|
||||
@@ -124,6 +127,7 @@ try(const char *first, ...)
|
||||
assert(num < 20);
|
||||
args[num++] = s;
|
||||
}
|
||||
nprintf("\n");
|
||||
assert(num < 20);
|
||||
args[num] = NULL;
|
||||
execv(_PATH_MYSELF, (char **)args);
|
||||
@@ -137,9 +141,12 @@ trymany(int num, const char *word)
|
||||
const char *args[num+2];
|
||||
int i;
|
||||
|
||||
nprintf(".");
|
||||
args[0] = _PATH_MYSELF;
|
||||
for (i=0; i<num; i++) {
|
||||
args[i+1] = word;
|
||||
if(i%10)
|
||||
nprintf(".");
|
||||
}
|
||||
args[num+1] = NULL;
|
||||
execv(_PATH_MYSELF, (char **)args);
|
||||
@@ -376,7 +383,9 @@ main(int argc, char *argv[])
|
||||
}
|
||||
else if (checkmany(argc, argv, 1000, word8)) {
|
||||
#endif
|
||||
nprintf("\n");
|
||||
warnx("Complete.");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/bigexec");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
@@ -384,4 +393,5 @@ main(int argc, char *argv[])
|
||||
dumpargs(argc, argv);
|
||||
return 1;
|
||||
}
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/bigexec");
|
||||
}
|
||||
|
@@ -78,7 +78,7 @@ main(int argc, char *argv[])
|
||||
/* round size up */
|
||||
size = ((size + chunksize - 1) / chunksize) * chunksize;
|
||||
|
||||
printf("Creating a file of size %d in %d-byte chunks\n",
|
||||
tprintf("Creating a file of size %d in %d-byte chunks\n",
|
||||
size, chunksize);
|
||||
|
||||
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC);
|
||||
|
@@ -44,6 +44,8 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <test/test.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define BRANCHES 6
|
||||
|
||||
@@ -54,6 +56,8 @@
|
||||
*/
|
||||
#define DIM 64
|
||||
|
||||
#define PROGRESS_INTERVAL 25000
|
||||
|
||||
static int m1[DIM*DIM], m2[DIM*DIM], m3[DIM*DIM], m4[DIM*DIM];
|
||||
static const int right[BRANCHES] = {
|
||||
536763422,
|
||||
@@ -76,7 +80,9 @@ init(void)
|
||||
for (j=0; j<DIM; j++) {
|
||||
m1[i*DIM+j] = random() % 11 - 5;
|
||||
}
|
||||
TEST161_LPROGRESS(0);
|
||||
}
|
||||
nprintf("\n");
|
||||
}
|
||||
|
||||
static
|
||||
@@ -96,12 +102,15 @@ static
|
||||
void
|
||||
mul(int *x, const int *a, const int *b)
|
||||
{
|
||||
unsigned i, j, k;
|
||||
unsigned i, j, k, tot;
|
||||
|
||||
tot = 0;
|
||||
for (i=0; i<DIM; i++) {
|
||||
for (j=0; j<DIM; j++) {
|
||||
x[i*DIM+j] = 0;
|
||||
for (k=0; k<DIM; k++) {
|
||||
TEST161_LPROGRESS_N(tot, PROGRESS_INTERVAL);
|
||||
tot++;
|
||||
x[i*DIM+j] += a[i*DIM+k] * b[k*DIM+j];
|
||||
}
|
||||
}
|
||||
@@ -177,11 +186,15 @@ dowait(pid_t pid)
|
||||
exit(failures);
|
||||
}
|
||||
else {
|
||||
// If the child crashes or waitpid returns -1, we don't know how many errors
|
||||
// resulted (if any), but it's an error if we can't tell.
|
||||
if (waitpid(pid, &status, 0) < 0) {
|
||||
warn("waitpid(%d)", pid);
|
||||
failures += 1;
|
||||
}
|
||||
else if (WIFSIGNALED(status)) {
|
||||
warnx("pid %d: signal %d", pid, WTERMSIG(status));
|
||||
failures += 1;
|
||||
}
|
||||
else if (WEXITSTATUS(status) > 0) {
|
||||
failures += WEXITSTATUS(status);
|
||||
@@ -196,7 +209,6 @@ dotest(void)
|
||||
unsigned i, me;
|
||||
pid_t pids[BRANCHES];
|
||||
int t;
|
||||
char msg[128];
|
||||
|
||||
me = 0;
|
||||
for (i=0; i<BRANCHES; i++) {
|
||||
@@ -207,26 +219,28 @@ dotest(void)
|
||||
grind();
|
||||
t = trace();
|
||||
if (t == right[i]) {
|
||||
snprintf(msg, sizeof(msg),
|
||||
"Stage %u #%u done: %d\n", i, me, trace());
|
||||
lsay("\nStage %u #%u done: %d\n", i, me, trace());
|
||||
}
|
||||
else {
|
||||
snprintf(msg, sizeof(msg),
|
||||
"Stage %u #%u FAILED: got %d, expected %d\n",
|
||||
lsay("Stage %u #%u FAILED: got %d, expected %d\n",
|
||||
i, me, t, right[i]);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/bigfork");
|
||||
failures++;
|
||||
}
|
||||
(void)write(STDOUT_FILENO, msg, strlen(msg));
|
||||
TEST161_LPROGRESS(0);
|
||||
}
|
||||
|
||||
for (i=BRANCHES; i-- > 0; ) {
|
||||
dowait(pids[i]);
|
||||
}
|
||||
|
||||
if (failures > 0) {
|
||||
printf("%u failures.\n", failures);
|
||||
tprintf("%u failures.\n", failures);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/bigfork");
|
||||
}
|
||||
else {
|
||||
printf("Done.\n");
|
||||
tprintf("Done.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/bigfork");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -182,7 +182,7 @@ static
|
||||
void
|
||||
try_seeking(int fd, off_t pos, off_t cursize)
|
||||
{
|
||||
printf("Seeking to (and near) 0x%llx\n", pos);
|
||||
tprintf("Seeking to (and near) 0x%llx\n", pos);
|
||||
|
||||
/* Go to the place. */
|
||||
dolseek(fd, pos, SEEK_SET, "SEEK_SET", pos);
|
||||
@@ -215,30 +215,30 @@ main(void)
|
||||
off_t cursize;
|
||||
int fd;
|
||||
|
||||
printf("Creating file...\n");
|
||||
tprintf("Creating file...\n");
|
||||
fd = open(TESTFILE, O_RDWR|O_CREAT|O_TRUNC, 0664);
|
||||
if (fd < 0) {
|
||||
err(1, "%s", TESTFILE);
|
||||
}
|
||||
|
||||
printf("Writing something at offset 0\n");
|
||||
tprintf("Writing something at offset 0\n");
|
||||
write_slogan(fd, 0, false);
|
||||
cursize = strlen(slogans[0]);
|
||||
|
||||
try_seeking(fd, (off_t)0x1000LL, cursize);
|
||||
|
||||
printf("Writing something else\n");
|
||||
tprintf("Writing something else\n");
|
||||
write_slogan(fd, 1, false);
|
||||
cursize = (off_t)0x1000LL + strlen(slogans[1]);
|
||||
|
||||
try_seeking(fd, (off_t)0, cursize);
|
||||
|
||||
/* If seek is totally bust, this will fail. */
|
||||
printf("Checking what we wrote\n");
|
||||
tprintf("Checking what we wrote\n");
|
||||
check_slogan(fd, 0);
|
||||
|
||||
try_seeking(fd, (off_t)0x1000LL, cursize);
|
||||
printf("Checking the other thing we wrote\n");
|
||||
tprintf("Checking the other thing we wrote\n");
|
||||
check_slogan(fd, 1);
|
||||
|
||||
try_seeking(fd, (off_t)0x20LL, cursize);
|
||||
@@ -250,19 +250,19 @@ main(void)
|
||||
try_seeking(fd, (off_t)0x180000000LL, cursize);
|
||||
try_seeking(fd, (off_t)0x180000020LL, cursize);
|
||||
|
||||
printf("Now trying to read (should get EOF)\n");
|
||||
tprintf("Now trying to read (should get EOF)\n");
|
||||
try_reading(fd);
|
||||
|
||||
printf("Now trying to write (should get EFBIG)\n");
|
||||
tprintf("Now trying to write (should get EFBIG)\n");
|
||||
try_writing(fd);
|
||||
|
||||
try_seeking(fd, (off_t)0x100000000LL, cursize);
|
||||
|
||||
/* If seek truncates to 32 bits, this might read the slogan instead */
|
||||
printf("Trying to read again (should get EOF)\n");
|
||||
tprintf("Trying to read again (should get EOF)\n");
|
||||
try_reading(fd);
|
||||
|
||||
printf("Passed.\n");
|
||||
tprintf("Passed.\n");
|
||||
|
||||
close(fd);
|
||||
remove(TESTFILE);
|
||||
|
@@ -131,11 +131,11 @@ static
|
||||
void
|
||||
printsettings(void)
|
||||
{
|
||||
printf("Page size: %u\n", PAGE_SIZE);
|
||||
printf("Allocating %u pages and touching %u pages on each cycle.\n",
|
||||
tprintf("Page size: %u\n", PAGE_SIZE);
|
||||
tprintf("Allocating %u pages and touching %u pages on each cycle.\n",
|
||||
allocs, touchpages);
|
||||
printf("Page selection bias: %u\n", bias);
|
||||
printf("\n");
|
||||
tprintf("Page selection bias: %u\n", bias);
|
||||
tprintf("\n");
|
||||
}
|
||||
|
||||
static
|
||||
|
@@ -46,6 +46,8 @@
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
|
||||
#if defined(__mips__)
|
||||
#define KERNEL_ADDR 0x80000000
|
||||
@@ -292,7 +294,7 @@ runop(int op)
|
||||
/* intentionally don't check if op is in bounds :) */
|
||||
opindex = op-'a';
|
||||
|
||||
printf("Running: [%c] %s\n", ops[opindex].ch, ops[opindex].name);
|
||||
tprintf("Running: [%c] %s\n", ops[opindex].ch, ops[opindex].name);
|
||||
|
||||
if (forking) {
|
||||
pid = fork();
|
||||
@@ -307,25 +309,25 @@ runop(int op)
|
||||
}
|
||||
ok = 0;
|
||||
if (WIFSIGNALED(status)) {
|
||||
printf("Signal %d\n", WTERMSIG(status));
|
||||
tprintf("Signal %d\n", WTERMSIG(status));
|
||||
if (WTERMSIG(status) == ops[opindex].sig) {
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("Exit %d\n", WEXITSTATUS(status));
|
||||
tprintf("Exit %d\n", WEXITSTATUS(status));
|
||||
if (WEXITSTATUS(status) == MAGIC) {
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
if (ok) {
|
||||
printf("Ok.\n");
|
||||
tprintf("Ok.\n");
|
||||
}
|
||||
else {
|
||||
printf("FAILED: expected signal %d\n",
|
||||
tprintf("FAILED: expected signal %d\n",
|
||||
ops[opindex].sig);
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -351,14 +353,14 @@ ask(void)
|
||||
while (1) {
|
||||
|
||||
for (i=0; ops[i].name; i++) {
|
||||
printf("[%c] %s\n", ops[i].ch, ops[i].name);
|
||||
tprintf("[%c] %s\n", ops[i].ch, ops[i].name);
|
||||
}
|
||||
printf("[-] Disable forking\n");
|
||||
printf("[+] Enable forking (default)\n");
|
||||
printf("[*] Run everything\n");
|
||||
printf("[!] Quit\n");
|
||||
tprintf("[-] Disable forking\n");
|
||||
tprintf("[+] Enable forking (default)\n");
|
||||
tprintf("[*] Run everything\n");
|
||||
tprintf("[!] Quit\n");
|
||||
|
||||
printf("Choose: ");
|
||||
tprintf("Choose: ");
|
||||
op = getchar();
|
||||
|
||||
if (op == '!') {
|
||||
@@ -384,5 +386,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Should print success\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/crash");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -38,6 +38,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
/*
|
||||
* SIZE is the amount of memory used.
|
||||
@@ -64,12 +65,12 @@ main(int argc, char **argv)
|
||||
stride = atoi(argv[1]);
|
||||
}
|
||||
if (stride <= 0 || argc > 2) {
|
||||
printf("Usage: ctest [stridesize]\n");
|
||||
printf(" stridesize should not be a multiple of 2.\n");
|
||||
tprintf("Usage: ctest [stridesize]\n");
|
||||
tprintf(" stridesize should not be a multiple of 2.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Starting ctest: stride %d\n", stride);
|
||||
tprintf("Starting ctest: stride %d\n", stride);
|
||||
|
||||
/*
|
||||
* Generate a huge linked list, with each entry pointing to
|
||||
@@ -90,12 +91,11 @@ main(int argc, char **argv)
|
||||
*/
|
||||
e = &array[0];
|
||||
for (i=0; i<SIZE; i++) {
|
||||
if (i % stride == 0) {
|
||||
putchar('.');
|
||||
}
|
||||
TEST161_LPROGRESS_N(i, stride);
|
||||
e = e->e;
|
||||
}
|
||||
|
||||
printf("\nDone!\n");
|
||||
// Success is not crashing
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/ctest");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -84,7 +84,7 @@ choose_name(char *buf, size_t len)
|
||||
|
||||
/*
|
||||
* The purpose of this is to be atomic. In our world, straight
|
||||
* printf tends not to be.
|
||||
* tprintf tends not to be.
|
||||
*/
|
||||
static
|
||||
void
|
||||
|
@@ -205,7 +205,7 @@ firstread(void)
|
||||
errx(1, ".: File position after open not 0");
|
||||
}
|
||||
|
||||
printf("Scanning directory...\n");
|
||||
tprintf("Scanning directory...\n");
|
||||
|
||||
readit();
|
||||
}
|
||||
@@ -216,7 +216,7 @@ doreadat0(void)
|
||||
{
|
||||
off_t pos;
|
||||
|
||||
printf("Rewinding directory and reading it again...\n");
|
||||
tprintf("Rewinding directory and reading it again...\n");
|
||||
|
||||
pos = lseek(dirfd, 0, SEEK_SET);
|
||||
if (pos < 0) {
|
||||
@@ -274,7 +274,7 @@ readallonebyone(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("Trying to read each entry again...\n");
|
||||
tprintf("Trying to read each entry again...\n");
|
||||
for (i=0; testfiles[i].name; i++) {
|
||||
doreadone(i);
|
||||
}
|
||||
@@ -286,7 +286,7 @@ readallrandomly(void)
|
||||
{
|
||||
int n, i, x;
|
||||
|
||||
printf("Trying to read a bunch of entries randomly...\n");
|
||||
tprintf("Trying to read a bunch of entries randomly...\n");
|
||||
|
||||
for (i=0; testfiles[i].name; i++);
|
||||
n = i;
|
||||
@@ -327,7 +327,7 @@ doreadateof(void)
|
||||
off_t pos;
|
||||
int i;
|
||||
|
||||
printf("Trying to read after going to EOF...\n");
|
||||
tprintf("Trying to read after going to EOF...\n");
|
||||
|
||||
pos = lseek(dirfd, 0, SEEK_END);
|
||||
if (pos<0) {
|
||||
@@ -364,7 +364,7 @@ dobadreads(void)
|
||||
off_t pos, pos2, eof;
|
||||
int valid, i, k=0;
|
||||
|
||||
printf("Trying some possibly invalid reads...\n");
|
||||
tprintf("Trying some possibly invalid reads...\n");
|
||||
|
||||
eof = lseek(dirfd, 0, SEEK_END);
|
||||
if (eof < 0) {
|
||||
@@ -394,13 +394,13 @@ dobadreads(void)
|
||||
}
|
||||
|
||||
if (k>0) {
|
||||
printf("Survived %d invalid reads...\n", k);
|
||||
tprintf("Survived %d invalid reads...\n", k);
|
||||
}
|
||||
else {
|
||||
printf("Couldn't find any invalid offsets to try...\n");
|
||||
tprintf("Couldn't find any invalid offsets to try...\n");
|
||||
}
|
||||
|
||||
printf("Trying to read beyond EOF...\n");
|
||||
tprintf("Trying to read beyond EOF...\n");
|
||||
pos2 = lseek(dirfd, eof + 1000, SEEK_SET);
|
||||
if (pos2 < 0) {
|
||||
/* this is ok */
|
||||
@@ -414,10 +414,10 @@ static
|
||||
void
|
||||
dotest(void)
|
||||
{
|
||||
printf("Opening directory...\n");
|
||||
tprintf("Opening directory...\n");
|
||||
openit();
|
||||
|
||||
printf("Running tests...\n");
|
||||
tprintf("Running tests...\n");
|
||||
|
||||
/* read the whole directory */
|
||||
firstread();
|
||||
@@ -443,7 +443,7 @@ dotest(void)
|
||||
/* rewind again to make sure the invalid attempts didn't break it */
|
||||
doreadat0();
|
||||
|
||||
printf("Closing directory...\n");
|
||||
tprintf("Closing directory...\n");
|
||||
closeit();
|
||||
}
|
||||
|
||||
@@ -489,7 +489,7 @@ setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("Making directory %s...\n", TESTDIR);
|
||||
tprintf("Making directory %s...\n", TESTDIR);
|
||||
|
||||
/* Create a directory */
|
||||
if (mkdir(TESTDIR, 0775)<0) {
|
||||
@@ -501,7 +501,7 @@ setup(void)
|
||||
err(1, "%s: chdir", TESTDIR);
|
||||
}
|
||||
|
||||
printf("Making some files...\n");
|
||||
tprintf("Making some files...\n");
|
||||
|
||||
/* Populate it */
|
||||
for (i=0; testfiles[i].name; i++) {
|
||||
@@ -518,7 +518,7 @@ cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("Cleaning up...\n");
|
||||
tprintf("Cleaning up...\n");
|
||||
|
||||
/* Remove the files */
|
||||
for (i=0; testfiles[i].name; i++) {
|
||||
|
@@ -58,7 +58,7 @@ main(void)
|
||||
strcpy(dirname, onename);
|
||||
|
||||
for (i=0; i<MAXLEVELS; i++) {
|
||||
printf("Creating directory: %s\n", dirname);
|
||||
tprintf("Creating directory: %s\n", dirname);
|
||||
|
||||
if (mkdir(dirname, 0755)) {
|
||||
err(1, "%s: mkdir", dirname);
|
||||
@@ -68,18 +68,18 @@ main(void)
|
||||
strcat(dirname, onename);
|
||||
}
|
||||
|
||||
printf("Passed directory creation test.\n");
|
||||
tprintf("Passed directory creation test.\n");
|
||||
|
||||
for (i=0; i<MAXLEVELS; i++) {
|
||||
dirname[strlen(dirname) - strlen(onename) - 1] = 0;
|
||||
|
||||
printf("Removing directory: %s\n", dirname);
|
||||
tprintf("Removing directory: %s\n", dirname);
|
||||
|
||||
if (rmdir(dirname)) {
|
||||
err(1, "%s: rmdir", dirname);
|
||||
}
|
||||
}
|
||||
printf("Passed directory removal test.\n");
|
||||
tprintf("Passed directory removal test.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -79,7 +79,7 @@ subproc_read(void)
|
||||
int fd;
|
||||
int i, res;
|
||||
|
||||
printf("File Reader starting ...\n\n");
|
||||
tprintf("File Reader starting ...\n\n");
|
||||
|
||||
fd = open(FNAME, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
@@ -102,5 +102,5 @@ subproc_read(void)
|
||||
|
||||
close(fd);
|
||||
|
||||
printf("File Read exited successfully!\n");
|
||||
tprintf("File Read exited successfully!\n");
|
||||
}
|
||||
|
@@ -124,8 +124,8 @@ big_file(int size)
|
||||
{
|
||||
int i, j, fileid;
|
||||
|
||||
printf("[BIGFILE] test starting :\n");
|
||||
printf("\tCreating a file of size: %d\n", size);
|
||||
tprintf("[BIGFILE] test starting :\n");
|
||||
tprintf("\tCreating a file of size: %d\n", size);
|
||||
|
||||
fileid = open(BIGFILE_NAME, O_WRONLY|O_CREAT|O_TRUNC, 0664);
|
||||
if (fileid < 0) {
|
||||
@@ -136,16 +136,16 @@ big_file(int size)
|
||||
fbuffer[i] = LETTER(i);
|
||||
}
|
||||
|
||||
printf("\tWriting to file.\n");
|
||||
tprintf("\tWriting to file.\n");
|
||||
for (i = 0; i < size; i += BUFFER_SIZE) {
|
||||
write(fileid, fbuffer, BUFFER_SIZE);
|
||||
|
||||
if (!(i % (10 * BUFFER_SIZE))) {
|
||||
printf("\rBW : %d", i);
|
||||
tprintf("\rBW : %d", i);
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n\tReading from file.\n");
|
||||
tprintf("\n\tReading from file.\n");
|
||||
close(fileid);
|
||||
|
||||
fileid = open(BIGFILE_NAME, O_RDONLY);
|
||||
@@ -164,7 +164,7 @@ big_file(int size)
|
||||
}
|
||||
|
||||
if (!(i % (10 * BUFFER_SIZE))) {
|
||||
printf("\rBR : %d", i);
|
||||
tprintf("\rBR : %d", i);
|
||||
}
|
||||
|
||||
/* Check to see that the data is consistent : */
|
||||
@@ -181,7 +181,7 @@ big_file(int size)
|
||||
err(1, "[BIGFILE]: %s: remove", BIGFILE_NAME);
|
||||
}
|
||||
|
||||
printf("\n[BIGFILE] : Success!\n");
|
||||
tprintf("\n[BIGFILE] : Success!\n");
|
||||
}
|
||||
|
||||
/* ===================================================
|
||||
@@ -195,7 +195,7 @@ concur(void)
|
||||
int i, fd;
|
||||
int r1, r2, w1;
|
||||
|
||||
printf("Spawning 2 readers, 1 writer.\n");
|
||||
tprintf("Spawning 2 readers, 1 writer.\n");
|
||||
|
||||
|
||||
fd = open(FNAME, O_WRONLY|O_CREAT|O_TRUNC, 0664);
|
||||
@@ -203,7 +203,7 @@ concur(void)
|
||||
err(1, "[CONCUR]: %s: open", FNAME);
|
||||
}
|
||||
|
||||
printf("Initializing test file: ");
|
||||
tprintf("Initializing test file: ");
|
||||
|
||||
for (i = 0; i < SECTOR_SIZE + 1; i++) {
|
||||
cbuffer[i] = READCHAR;
|
||||
@@ -216,13 +216,13 @@ concur(void)
|
||||
|
||||
close(fd);
|
||||
|
||||
printf("Done initializing. Starting processes...\n");
|
||||
tprintf("Done initializing. Starting processes...\n");
|
||||
|
||||
r1 = forkoff(subproc_read);
|
||||
w1 = forkoff(subproc_write);
|
||||
r2 = forkoff(subproc_read);
|
||||
|
||||
printf("Waiting for processes.\n");
|
||||
tprintf("Waiting for processes.\n");
|
||||
|
||||
dowait(r1);
|
||||
dowait(r2);
|
||||
@@ -232,7 +232,7 @@ concur(void)
|
||||
err(1, "[CONCUR]: %s: remove", FNAME);
|
||||
}
|
||||
|
||||
printf("[CONCUR] Done!\n");
|
||||
tprintf("[CONCUR] Done!\n");
|
||||
}
|
||||
|
||||
/* ===================================================
|
||||
@@ -253,14 +253,14 @@ dir_test(int depth)
|
||||
for (i = 0; i < depth; i++) {
|
||||
strcat(dirname, tmp);
|
||||
|
||||
printf("\tCreating dir : %s\n", dirname);
|
||||
tprintf("\tCreating dir : %s\n", dirname);
|
||||
|
||||
if (mkdir(dirname, 0775) < 0) {
|
||||
err(1, "[DIRTEST]: %s: mkdir", dirname);
|
||||
}
|
||||
|
||||
strcat(dirname, fmp);
|
||||
printf("\tCreating file: %s\n", dirname);
|
||||
tprintf("\tCreating file: %s\n", dirname);
|
||||
|
||||
fd = open(dirname, O_WRONLY|O_CREAT|O_TRUNC, 0664);
|
||||
if (fd<0) {
|
||||
@@ -270,19 +270,19 @@ dir_test(int depth)
|
||||
dirname[strlen(dirname) - strlen(fmp)] = '\0';
|
||||
}
|
||||
|
||||
printf("[DIRTEST] : Passed directory creation test.\n");
|
||||
tprintf("[DIRTEST] : Passed directory creation test.\n");
|
||||
|
||||
for (i = 0; i < depth; i++) {
|
||||
strcat(dirname, fmp);
|
||||
|
||||
printf("\tDeleting file: %s\n", dirname);
|
||||
tprintf("\tDeleting file: %s\n", dirname);
|
||||
|
||||
if (remove(dirname)) {
|
||||
err(1, "[DIRTEST]: %s: remove", dirname);
|
||||
}
|
||||
|
||||
dirname[strlen(dirname) - strlen(fmp)] = '\0';
|
||||
printf("\tRemoving dir : %s\n", dirname);
|
||||
tprintf("\tRemoving dir : %s\n", dirname);
|
||||
|
||||
if (rmdir(dirname)) {
|
||||
err(1, "[DIRTEST]: %s: rmdir", dirname);
|
||||
@@ -291,8 +291,8 @@ dir_test(int depth)
|
||||
dirname[strlen(dirname) - strlen(tmp)] = '\0';
|
||||
}
|
||||
|
||||
printf("[DIRTEST] : Passed directory removal test.\n");
|
||||
printf("[DIRTEST] : Success!\n");
|
||||
tprintf("[DIRTEST] : Passed directory removal test.\n");
|
||||
tprintf("[DIRTEST] : Success!\n");
|
||||
}
|
||||
|
||||
/* ===================================================
|
||||
@@ -325,21 +325,21 @@ main(int argc, char * argv[])
|
||||
}
|
||||
|
||||
if (tv & RUNBIGFILE) {
|
||||
printf("[BIGFILE] : Run #1\n");
|
||||
tprintf("[BIGFILE] : Run #1\n");
|
||||
big_file(BIGFILE_SIZE);
|
||||
printf("[BIGFILE] : Run #2\n");
|
||||
tprintf("[BIGFILE] : Run #2\n");
|
||||
big_file(BIGFILE_SIZE);
|
||||
}
|
||||
|
||||
if (tv & RUNDIRTEST) {
|
||||
printf("[DIRTEST] : Run #1\n");
|
||||
tprintf("[DIRTEST] : Run #1\n");
|
||||
dir_test(DIR_DEPTH);
|
||||
printf("[DIRTEST] : Run #2\n");
|
||||
tprintf("[DIRTEST] : Run #2\n");
|
||||
dir_test(DIR_DEPTH);
|
||||
}
|
||||
|
||||
if (tv & RUNCONCUR) {
|
||||
printf("[CONCUR]\n");
|
||||
tprintf("[CONCUR]\n");
|
||||
concur();
|
||||
}
|
||||
return 0;
|
||||
|
@@ -67,7 +67,7 @@ subproc_write(void)
|
||||
buffer[i] = WRITECHAR;
|
||||
}
|
||||
|
||||
printf("File Writer starting ...\n");
|
||||
tprintf("File Writer starting ...\n");
|
||||
|
||||
fd = open(FNAME, O_WRONLY);
|
||||
if (fd < 0) {
|
||||
@@ -81,5 +81,5 @@ subproc_write(void)
|
||||
|
||||
close(fd);
|
||||
|
||||
printf("File Write exited successfully!\n");
|
||||
tprintf("File Write exited successfully!\n");
|
||||
}
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define _PATH_SELF "/testbin/factorial"
|
||||
|
||||
@@ -245,9 +246,12 @@ main(int argc, char *argv[])
|
||||
}
|
||||
else if (argc == 3) {
|
||||
if (!strcmp(argv[1], "1") || !strcmp(argv[1], "0")) {
|
||||
printf("%s\n", argv[2]);
|
||||
nprintf("\n");
|
||||
tprintf("%s\n", argv[2]);
|
||||
secprintf(SECRET, argv[2], "/testbin/factorial");
|
||||
}
|
||||
else {
|
||||
nprintf(".");
|
||||
number_init(&n1, argv[1]);
|
||||
number_init(&n2, argv[2]);
|
||||
number_init(&multbuf, "0");
|
||||
|
@@ -45,12 +45,12 @@ main(void)
|
||||
{
|
||||
volatile int i;
|
||||
|
||||
printf("\nEntering the faulter program - I should die immediately\n");
|
||||
tprintf("\nEntering the faulter program - I should die immediately\n");
|
||||
i = *(int *)REALLY_BIG_ADDRESS;
|
||||
|
||||
// gcc 4.8 improperly demands this
|
||||
(void)i;
|
||||
|
||||
printf("I didn't get killed! Program has a bug\n");
|
||||
tprintf("I didn't get killed! Program has a bug\n");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -103,6 +103,6 @@ main(int argc, char *argv[])
|
||||
if (rv<0) {
|
||||
err(1, "%s: remove", file);
|
||||
}
|
||||
printf("Passed filetest.\n");
|
||||
tprintf("Passed filetest.\n");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -49,6 +49,11 @@
|
||||
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <time.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define TEST_DURATION 10
|
||||
#define LOCAL_SUCCESS "SUCCESS"
|
||||
|
||||
static volatile int pid;
|
||||
|
||||
@@ -57,8 +62,40 @@ main(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
time_t start_time_s, time_now_s;
|
||||
unsigned long start_time_ns, time_now_ns;
|
||||
__time(&start_time_s, &start_time_ns);
|
||||
int parent_pid = getpid();
|
||||
int did_print = 0;
|
||||
int iters = 0;
|
||||
|
||||
// Do not remove!
|
||||
// We need to cause page faults on the static secprintf buffers so the
|
||||
// pages are available when we print success. With on-demand page allocation,
|
||||
// we will probably be out of pages by the time we try to print success.
|
||||
secprintf(SECRET, "!!< Starting Forkbbbboooommmmbbbb >!!", "/testbin/forkbomb");
|
||||
|
||||
// And now for the success string
|
||||
printf("This should print %s after 10s\n", LOCAL_SUCCESS);
|
||||
|
||||
while (1) {
|
||||
fork();
|
||||
// Only parent gets to print
|
||||
if(getpid() == parent_pid) {
|
||||
TEST161_LPROGRESS(0);
|
||||
if (iters > 0 && iters % 20 == 0) {
|
||||
putchar('\n');
|
||||
}
|
||||
iters++;
|
||||
|
||||
__time(&time_now_s, &time_now_ns);
|
||||
if (time_now_s - start_time_s > TEST_DURATION && !did_print) {
|
||||
did_print = 1;
|
||||
// We need to print this using secprintf so that it uses
|
||||
// the same page we warmed up earlier.
|
||||
secprintf(SECRET, LOCAL_SUCCESS, "/testbin/forkbomb");
|
||||
}
|
||||
}
|
||||
|
||||
pid = getpid();
|
||||
|
||||
|
@@ -37,10 +37,16 @@
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define FORKTEST_FILENAME_BASE "forktest"
|
||||
|
||||
static char filename[32];
|
||||
|
||||
/*
|
||||
* This is used by all processes, to try to help make sure all
|
||||
@@ -48,6 +54,18 @@
|
||||
*/
|
||||
static volatile int mypid;
|
||||
|
||||
/*
|
||||
* Helper function to do pow()
|
||||
*/
|
||||
static
|
||||
int pow_int(int x, int y) {
|
||||
int i;
|
||||
int result = 1;
|
||||
for(i = 0; i < y; i++)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for fork that prints a warning on error.
|
||||
*/
|
||||
@@ -77,6 +95,7 @@ check(void)
|
||||
mypid = getpid();
|
||||
|
||||
/* Make sure each fork has its own address space. */
|
||||
nprintf(".");
|
||||
for (i=0; i<800; i++) {
|
||||
volatile int seenpid;
|
||||
seenpid = mypid;
|
||||
@@ -114,13 +133,13 @@ dowait(int nowait, int pid)
|
||||
|
||||
if (!nowait) {
|
||||
if (waitpid(pid, &x, 0)<0) {
|
||||
warn("waitpid");
|
||||
errx(1, "waitpid");
|
||||
}
|
||||
else if (WIFSIGNALED(x)) {
|
||||
warnx("pid %d: signal %d", pid, WTERMSIG(x));
|
||||
errx(1, "pid %d: signal %d", pid, WTERMSIG(x));
|
||||
}
|
||||
else if (WEXITSTATUS(x) != 0) {
|
||||
warnx("pid %d: exit %d", pid, WEXITSTATUS(x));
|
||||
errx(1, "pid %d: exit %d", pid, WEXITSTATUS(x));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -141,17 +160,42 @@ test(int nowait)
|
||||
* to prevent wait/exit problems if fork corrupts memory.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Guru: We have a problem here.
|
||||
* We need to write the output to a file since test161 is
|
||||
* supposed to be as simple as possible. This requires the
|
||||
* test to tell test161 whether it passed or succeeded.
|
||||
* We cannot lseek and read stdout, to check the output,
|
||||
* so we need to write the output to a file and then check it later.
|
||||
*
|
||||
* So far so good. However, if in the future, forktest is
|
||||
* going to be combined with triple/quint/etc, then the filename
|
||||
* cannot be the same across multiple copies. So we need a
|
||||
* unique filename per instance of forktest.
|
||||
* So...
|
||||
*/
|
||||
snprintf(filename, 32, "%s-%d.bin", FORKTEST_FILENAME_BASE, getpid());
|
||||
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
|
||||
if(fd < 3) {
|
||||
// 0, 1, 2 are stdin, stdout, stderr
|
||||
err(1, "Failed to open file to write data into\n");
|
||||
}
|
||||
|
||||
pid0 = dofork();
|
||||
putchar('A');
|
||||
nprintf(".");
|
||||
write(fd, "A", 1);
|
||||
check();
|
||||
pid1 = dofork();
|
||||
putchar('B');
|
||||
nprintf(".");
|
||||
write(fd, "B", 1);
|
||||
check();
|
||||
pid2 = dofork();
|
||||
putchar('C');
|
||||
nprintf(".");
|
||||
write(fd, "C", 1);
|
||||
check();
|
||||
pid3 = dofork();
|
||||
putchar('D');
|
||||
nprintf(".");
|
||||
write(fd, "D", 1);
|
||||
check();
|
||||
|
||||
/*
|
||||
@@ -159,11 +203,57 @@ test(int nowait)
|
||||
* improperly.
|
||||
*/
|
||||
dowait(nowait, pid3);
|
||||
nprintf(".");
|
||||
dowait(nowait, pid2);
|
||||
nprintf(".");
|
||||
dowait(nowait, pid1);
|
||||
nprintf(".");
|
||||
dowait(nowait, pid0);
|
||||
nprintf(".");
|
||||
|
||||
putchar('\n');
|
||||
// Check if file contents are correct
|
||||
// lseek may not be implemented..so close and reopen
|
||||
close(fd);
|
||||
fd = open(filename, O_RDONLY);
|
||||
if(fd < 3) {
|
||||
err(1, "Failed to open file for verification\n");
|
||||
}
|
||||
nprintf(".");
|
||||
|
||||
char buffer[30];
|
||||
int len;
|
||||
int char_idx, i;
|
||||
int observed, expected;
|
||||
char character = 'A';
|
||||
|
||||
memset(buffer, 0, 30);
|
||||
len = read(fd, buffer, 30);
|
||||
printf("\n%s\n", buffer);
|
||||
if(len != 30) {
|
||||
err(1, "Did not get expected number of characters\n");
|
||||
}
|
||||
nprintf(".");
|
||||
// Check if number of instances of each character is correct
|
||||
// 2As; 4Bs; 8Cs; 16Ds
|
||||
for(char_idx = 0; char_idx < 4; char_idx++) {
|
||||
nprintf(".");
|
||||
observed = 0;
|
||||
expected = pow_int(2, char_idx + 1);
|
||||
for(i = 0; i < 30; i++) {
|
||||
// In C, char can be directly converted to an ASCII index
|
||||
// So, A is 65, B is 66, ...
|
||||
if(buffer[i] == character + char_idx) {
|
||||
observed++;
|
||||
}
|
||||
}
|
||||
if(observed != expected) {
|
||||
// Failed
|
||||
err(1, "Failed! Expected %d%cs..observed: %d\n", expected, character + char_idx, observed);
|
||||
}
|
||||
}
|
||||
nprintf("\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/forktest");
|
||||
close(fd);
|
||||
}
|
||||
|
||||
int
|
||||
|
@@ -2148,7 +2148,7 @@ doindent(unsigned depth)
|
||||
unsigned i;
|
||||
|
||||
for (i=0; i<depth; i++) {
|
||||
printf(" ");
|
||||
tprintf(" ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2174,17 +2174,17 @@ printdiffs(unsigned indent, struct fsobject *obja, struct fsobject *objb)
|
||||
entb = entb->next) {
|
||||
if (enta->name == entb->name) {
|
||||
doindent(indent);
|
||||
printf("%s", name_get(enta->name));
|
||||
tprintf("%s", name_get(enta->name));
|
||||
if (enta->obj->isdir &&
|
||||
!entb->obj->isdir) {
|
||||
printf(": expected dir, found file;");
|
||||
printf(" %u names missing.\n",
|
||||
tprintf(": expected dir, found file;");
|
||||
tprintf(" %u names missing.\n",
|
||||
count_subtree(enta->obj) - 1);
|
||||
}
|
||||
else if (!enta->obj->isdir &&
|
||||
entb->obj->isdir) {
|
||||
printf(": expected file, found dir;");
|
||||
printf(" %u extra names.\n",
|
||||
tprintf(": expected file, found dir;");
|
||||
tprintf(" %u extra names.\n",
|
||||
count_subtree(entb->obj) - 1);
|
||||
}
|
||||
else if (!enta->obj->isdir &&
|
||||
@@ -2194,18 +2194,18 @@ printdiffs(unsigned indent, struct fsobject *obja, struct fsobject *objb)
|
||||
alen = enta->obj->obj_file.len;
|
||||
blen = entb->obj->obj_file.len;
|
||||
if (alen == blen) {
|
||||
printf("\t\t%lld bytes (ok)\n",
|
||||
tprintf("\t\t%lld bytes (ok)\n",
|
||||
alen);
|
||||
}
|
||||
else {
|
||||
printf(": found %lld bytes, "
|
||||
tprintf(": found %lld bytes, "
|
||||
"expected %lld "
|
||||
"bytes.\n",
|
||||
blen, alen);
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("/\n");
|
||||
tprintf("/\n");
|
||||
printdiffs(indent + 1,
|
||||
enta->obj, entb->obj);
|
||||
}
|
||||
@@ -2215,13 +2215,13 @@ printdiffs(unsigned indent, struct fsobject *obja, struct fsobject *objb)
|
||||
}
|
||||
if (!found) {
|
||||
doindent(indent);
|
||||
printf("%s: missing ", name_get(enta->name));
|
||||
tprintf("%s: missing ", name_get(enta->name));
|
||||
if (enta->obj->isdir) {
|
||||
printf("subtree with %u names.\n",
|
||||
tprintf("subtree with %u names.\n",
|
||||
count_subtree(enta->obj) - 1);
|
||||
}
|
||||
else {
|
||||
printf("file\n");
|
||||
tprintf("file\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2238,13 +2238,13 @@ printdiffs(unsigned indent, struct fsobject *obja, struct fsobject *objb)
|
||||
}
|
||||
if (!found) {
|
||||
doindent(indent);
|
||||
printf("%s: extra ", name_get(entb->name));
|
||||
tprintf("%s: extra ", name_get(entb->name));
|
||||
if (entb->obj->isdir) {
|
||||
printf("subtree with %u names.\n",
|
||||
tprintf("subtree with %u names.\n",
|
||||
count_subtree(entb->obj) - 1);
|
||||
}
|
||||
else {
|
||||
printf("file\n");
|
||||
tprintf("file\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2326,7 +2326,7 @@ checkfilezeros(int fd, const char *namestr, off_t start, off_t end)
|
||||
unsigned poison = 0, trash = 0;
|
||||
off_t origstart = start;
|
||||
|
||||
printf(" %lld - %lld (expecting zeros)\n", start, end);
|
||||
tprintf(" %lld - %lld (expecting zeros)\n", start, end);
|
||||
|
||||
if (lseek(fd, start, SEEK_SET) == -1) {
|
||||
err(1, "%s: lseek to %lld", namestr, start);
|
||||
@@ -2356,19 +2356,19 @@ checkfilezeros(int fd, const char *namestr, off_t start, off_t end)
|
||||
start += ret;
|
||||
}
|
||||
if (poison > 0 || trash > 0) {
|
||||
printf("ERROR: File %s: expected zeros from %lld to %lld; "
|
||||
tprintf("ERROR: File %s: expected zeros from %lld to %lld; "
|
||||
"found",
|
||||
namestr, origstart, end);
|
||||
if (poison > 0) {
|
||||
printf(" %u poison bytes", poison);
|
||||
tprintf(" %u poison bytes", poison);
|
||||
if (trash > 0) {
|
||||
printf(" and");
|
||||
tprintf(" and");
|
||||
}
|
||||
}
|
||||
if (trash > 0) {
|
||||
printf(" %u trash bytes", trash);
|
||||
tprintf(" %u trash bytes", trash);
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2440,7 +2440,7 @@ checkfiledata(int fd, const char *namestr, unsigned code, unsigned seq,
|
||||
checkend = regionend;
|
||||
}
|
||||
|
||||
printf(" %lld - %lld\n", checkstart, checkend);
|
||||
tprintf(" %lld - %lld\n", checkstart, checkend);
|
||||
|
||||
readfiledata(fd, namestr,
|
||||
regionstart, checkstart, checkend, regionend);
|
||||
@@ -2695,7 +2695,7 @@ checkonefilecontents(const char *namestr, struct fsobject *file,
|
||||
return;
|
||||
}
|
||||
assert(change->type == FC_WRITE);
|
||||
printf("ERROR: File %s is zero length but was expected to "
|
||||
tprintf("ERROR: File %s is zero length but was expected to "
|
||||
"contain at least %lld bytes at offset %lld!\n",
|
||||
namestr, change->fc_write.pos, change->fc_write.len);
|
||||
close(fd);
|
||||
@@ -2704,7 +2704,7 @@ checkonefilecontents(const char *namestr, struct fsobject *file,
|
||||
|
||||
/* XXX: this check is wrong too. */
|
||||
if (change->type == FC_CREAT) {
|
||||
printf("ERROR: File %s was never written to but has "
|
||||
tprintf("ERROR: File %s was never written to but has "
|
||||
"length %lld\n",
|
||||
namestr, file->obj_file.len);
|
||||
close(fd);
|
||||
@@ -2741,12 +2741,12 @@ checkonefilecontents(const char *namestr, struct fsobject *file,
|
||||
*/
|
||||
while (!change_is_present(fd, namestr, file->obj_file.len, change)) {
|
||||
if (change->version < okversion) {
|
||||
printf("File %s: change for version %u is missing\n",
|
||||
tprintf("File %s: change for version %u is missing\n",
|
||||
namestr, change->version);
|
||||
}
|
||||
change = backup_for_file(change->prev,file->obj_file.identity);
|
||||
if (change == NULL) {
|
||||
printf("File %s: no matching version found\n",
|
||||
tprintf("File %s: no matching version found\n",
|
||||
namestr);
|
||||
close(fd);
|
||||
return;
|
||||
@@ -2781,18 +2781,18 @@ checkallfilecontents(struct fsobject *dir, struct fschange *change)
|
||||
for (de = dir->obj_dir.entries; de != NULL; de = de->next) {
|
||||
namestr = name_get(de->name);
|
||||
if (de->obj->isdir) {
|
||||
printf(" >>> Entering %s\n", namestr);
|
||||
tprintf(" >>> Entering %s\n", namestr);
|
||||
if (chdir(namestr)) {
|
||||
err(1, "%s: chdir", namestr);
|
||||
}
|
||||
checkallfilecontents(de->obj, change);
|
||||
printf(" <<< Leaving %s\n", namestr);
|
||||
tprintf(" <<< Leaving %s\n", namestr);
|
||||
if (chdir("..")) {
|
||||
err(1, "..: chdir");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("%s...\n", namestr);
|
||||
tprintf("%s...\n", namestr);
|
||||
checkonefilecontents(namestr, de->obj, change);
|
||||
}
|
||||
}
|
||||
@@ -2813,7 +2813,7 @@ checkfs(void)
|
||||
/*
|
||||
* We just built the model; talk about it.
|
||||
*/
|
||||
printf("Established %u versions across %u directories and %u files\n",
|
||||
tprintf("Established %u versions across %u directories and %u files\n",
|
||||
changes->version + 1, nextdirnum, nextfilenum);
|
||||
|
||||
/*
|
||||
@@ -2821,7 +2821,7 @@ checkfs(void)
|
||||
* FOUND holding the found volume state.
|
||||
*/
|
||||
inspectfs();
|
||||
printf("Found %u subdirs and %u files on the volume\n",
|
||||
tprintf("Found %u subdirs and %u files on the volume\n",
|
||||
found_subdirs, found_files);
|
||||
|
||||
/*
|
||||
@@ -2856,7 +2856,7 @@ checkfs(void)
|
||||
best = change;
|
||||
bestscore = score;
|
||||
}
|
||||
//printf("version %u score %u\n", change->version, score);
|
||||
//tprintf("version %u score %u\n", change->version, score);
|
||||
change = change->next;
|
||||
}
|
||||
assert(best != NULL);
|
||||
@@ -2874,9 +2874,9 @@ checkfs(void)
|
||||
* differences. XXX: this results in not checking file
|
||||
* data...
|
||||
*/
|
||||
printf("FAILURE: Directory tree does not match on any "
|
||||
tprintf("FAILURE: Directory tree does not match on any "
|
||||
"version.\n");
|
||||
printf("Best version is %u; describing differences:\n",
|
||||
tprintf("Best version is %u; describing differences:\n",
|
||||
best->version);
|
||||
printdiffs(1, state, found);
|
||||
return;
|
||||
@@ -2886,9 +2886,9 @@ checkfs(void)
|
||||
* Ok, we did get an exact match. Print it.
|
||||
*/
|
||||
|
||||
printf("Directory tree matched in version %u.\n", best->version);
|
||||
tprintf("Directory tree matched in version %u.\n", best->version);
|
||||
if (best->partial) {
|
||||
printf("WARNING: this is a version from a partially committed "
|
||||
tprintf("WARNING: this is a version from a partially committed "
|
||||
"operation.\n");
|
||||
}
|
||||
|
||||
@@ -2905,7 +2905,7 @@ checkfs(void)
|
||||
|
||||
/* now check the file contents */
|
||||
|
||||
printf("Checking file contents...\n");
|
||||
tprintf("Checking file contents...\n");
|
||||
checkallfilecontents(state, best);
|
||||
printf("Done.\n");
|
||||
tprintf("Done.\n");
|
||||
}
|
||||
|
@@ -165,7 +165,7 @@ data_matches(const char *namestr, off_t regionoffset,
|
||||
}
|
||||
else if (zero_at(where, howmuch)) {
|
||||
if (where >= zerostart) {
|
||||
printf("WARNING: file %s range %lld-%lld is "
|
||||
tprintf("WARNING: file %s range %lld-%lld is "
|
||||
"zeroed\n",
|
||||
namestr, regionoffset + where,
|
||||
regionoffset + where + howmuch);
|
||||
@@ -176,7 +176,7 @@ data_matches(const char *namestr, off_t regionoffset,
|
||||
}
|
||||
else if (poison_at(where, howmuch)) {
|
||||
if (where >= zerostart) {
|
||||
printf("ERROR: file %s range %lld-%lld is "
|
||||
tprintf("ERROR: file %s range %lld-%lld is "
|
||||
"poisoned\n",
|
||||
namestr, regionoffset + where,
|
||||
regionoffset + where + howmuch);
|
||||
@@ -205,7 +205,7 @@ data_check(const char *namestr, off_t regionoffset,
|
||||
|
||||
if (!data_matches(namestr, regionoffset,
|
||||
code, seq, zerostart, len, checkstart, checklen)) {
|
||||
printf("ERROR: file %s range %lld-%lld contains garbage\n",
|
||||
tprintf("ERROR: file %s range %lld-%lld contains garbage\n",
|
||||
namestr, regionoffset + checkstart,
|
||||
regionoffset + checkstart + checklen);
|
||||
}
|
||||
|
@@ -72,7 +72,7 @@ do_createfile(unsigned name)
|
||||
if (fd < 0) {
|
||||
err(1, "%s: create", namestr);
|
||||
}
|
||||
printf("create %s\n", namestr);
|
||||
tprintf("create %s\n", namestr);
|
||||
return fd;
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ do_write(int fd, unsigned name, unsigned code, unsigned seq,
|
||||
done += ret;
|
||||
}
|
||||
|
||||
printf("write %s: %lld at %lld\n", namestr, len, pos);
|
||||
tprintf("write %s: %lld at %lld\n", namestr, len, pos);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -134,7 +134,7 @@ do_truncate(int fd, unsigned name, off_t len)
|
||||
if (ftruncate(fd, len) == -1) {
|
||||
err(1, "%s: truncate to %lld", namestr, len);
|
||||
}
|
||||
printf("truncate %s: to %lld\n", namestr, len);
|
||||
tprintf("truncate %s: to %lld\n", namestr, len);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -146,7 +146,7 @@ do_mkdir(unsigned name)
|
||||
if (mkdir(namestr, 0775) == -1) {
|
||||
err(1, "%s: mkdir", namestr);
|
||||
}
|
||||
printf("mkdir %s\n", namestr);
|
||||
tprintf("mkdir %s\n", namestr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -158,7 +158,7 @@ do_rmdir(unsigned name)
|
||||
if (rmdir(namestr) == -1) {
|
||||
err(1, "%s: rmdir", namestr);
|
||||
}
|
||||
printf("rmdir %s\n", namestr);
|
||||
tprintf("rmdir %s\n", namestr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -170,7 +170,7 @@ do_unlink(unsigned name)
|
||||
if (remove(namestr) == -1) {
|
||||
err(1, "%s: remove", namestr);
|
||||
}
|
||||
printf("remove %s\n", namestr);
|
||||
tprintf("remove %s\n", namestr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -183,7 +183,7 @@ do_link(unsigned from, unsigned to)
|
||||
if (link(fromstr, tostr) == -1) {
|
||||
err(1, "link %s to %s", fromstr, tostr);
|
||||
}
|
||||
printf("link %s %s\n", fromstr, tostr);
|
||||
tprintf("link %s %s\n", fromstr, tostr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -196,7 +196,7 @@ do_rename(unsigned from, unsigned to)
|
||||
if (rename(fromstr, tostr) == -1) {
|
||||
err(1, "rename %s to %s", fromstr, tostr);
|
||||
}
|
||||
printf("rename %s %s\n", fromstr, tostr);
|
||||
tprintf("rename %s %s\n", fromstr, tostr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -216,7 +216,7 @@ do_renamexd(unsigned fromdir, unsigned from, unsigned todir, unsigned to)
|
||||
if (rename(frombuf, tobuf) == -1) {
|
||||
err(1, "rename %s to %s", frombuf, tobuf);
|
||||
}
|
||||
printf("rename %s %s\n", frombuf, tobuf);
|
||||
tprintf("rename %s %s\n", frombuf, tobuf);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -228,7 +228,7 @@ do_chdir(unsigned name)
|
||||
if (chdir(namestr) == -1) {
|
||||
err(1, "chdir: %s", namestr);
|
||||
}
|
||||
printf("chdir %s\n", namestr);
|
||||
tprintf("chdir %s\n", namestr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -237,7 +237,7 @@ do_chdirup(void)
|
||||
if (chdir("..") == -1) {
|
||||
err(1, "chdir: ..");
|
||||
}
|
||||
printf("chdir ..\n");
|
||||
tprintf("chdir ..\n");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -246,6 +246,6 @@ do_sync(void)
|
||||
if (sync()) {
|
||||
warn("sync");
|
||||
}
|
||||
printf("sync\n");
|
||||
printf("----------------------------------------\n");
|
||||
tprintf("sync\n");
|
||||
tprintf("----------------------------------------\n");
|
||||
}
|
||||
|
@@ -132,13 +132,13 @@ printworkloads(void)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
printf("Supported workloads:\n");
|
||||
tprintf("Supported workloads:\n");
|
||||
for (i=0; i<numworkloads; i++) {
|
||||
printf(" %s", workloads[i].name);
|
||||
tprintf(" %s", workloads[i].name);
|
||||
if (workloads[i].argname) {
|
||||
printf(" %s", workloads[i].argname);
|
||||
tprintf(" %s", workloads[i].argname);
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -77,7 +77,7 @@ main(int argc, char *argv[])
|
||||
|
||||
close(fd);
|
||||
|
||||
printf("Hash : %d\n", j);
|
||||
tprintf("Hash : %d\n", j);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -39,45 +39,53 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <test161/test161.h>
|
||||
#include <test/test.h>
|
||||
|
||||
#define PageSize 4096
|
||||
#define NumPages 512
|
||||
|
||||
int sparse[NumPages][PageSize]; /* use only the first element in the row */
|
||||
|
||||
#define PROGRESS_INTERVAL 20
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
printf("Entering the huge program - I will stress test your VM\n");
|
||||
tprintf("Entering the huge program - I will stress test your VM\n");
|
||||
|
||||
/* move number in so that sparse[i][0]=i */
|
||||
for (i=0; i<NumPages; i++) {
|
||||
TEST161_LPROGRESS_N(i, PROGRESS_INTERVAL);
|
||||
sparse[i][0]=i;
|
||||
}
|
||||
|
||||
printf("stage [1] done\n");
|
||||
lsay("\nstage [1] done\n");
|
||||
|
||||
/* increment each location 5 times */
|
||||
for (j=0; j<5; j++) {
|
||||
for (i=0; i<NumPages; i++) {
|
||||
TEST161_LPROGRESS_N(i, PROGRESS_INTERVAL);
|
||||
sparse[i][0]++;
|
||||
}
|
||||
printf("stage [2.%d] done\n", j);
|
||||
lsay("\nstage [2.%d] done\n", j);
|
||||
}
|
||||
|
||||
printf("stage [2] done\n");
|
||||
lsay("\nstage [2] done\n");
|
||||
|
||||
/* check if the numbers are sane */
|
||||
for (i=NumPages-1; i>=0; i--) {
|
||||
TEST161_LPROGRESS_N(i, PROGRESS_INTERVAL);
|
||||
if (sparse[i][0]!=i+5) {
|
||||
printf("BAD NEWS!!! - your VM mechanism has a bug!\n");
|
||||
lsay("BAD NEWS!!! - your VM mechanism has a bug!\n");
|
||||
success(TEST161_FAIL, SECRET, "/testbin/huge");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
printf("You passed!\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/huge");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -77,7 +77,7 @@ geti(void)
|
||||
break;
|
||||
}
|
||||
else if ((ch=='\b' || ch==127) && digits>0) {
|
||||
printf("\b \b");
|
||||
tprintf("\b \b");
|
||||
val = val/10;
|
||||
digits--;
|
||||
}
|
||||
@@ -117,11 +117,11 @@ markblock(volatile void *ptr, size_t size, unsigned bias, int doprint)
|
||||
val = ((unsigned long)i ^ (unsigned long)bias);
|
||||
pl[i] = val;
|
||||
if (doprint && (i%64==63)) {
|
||||
printf(".");
|
||||
tprintf(".");
|
||||
}
|
||||
}
|
||||
if (doprint) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,9 +143,9 @@ checkblock(volatile void *ptr, size_t size, unsigned bias, int doprint)
|
||||
val = ((unsigned long)i ^ (unsigned long)bias);
|
||||
if (pl[i] != val) {
|
||||
if (doprint) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
printf("FAILED: data mismatch at offset %lu of block "
|
||||
tprintf("FAILED: data mismatch at offset %lu of block "
|
||||
"at 0x%lx: %lu vs. %lu\n",
|
||||
(unsigned long) (i*sizeof(unsigned long)),
|
||||
(unsigned long)(uintptr_t)pl,
|
||||
@@ -153,11 +153,11 @@ checkblock(volatile void *ptr, size_t size, unsigned bias, int doprint)
|
||||
return -1;
|
||||
}
|
||||
if (doprint && (i%64==63)) {
|
||||
printf(".");
|
||||
tprintf(".");
|
||||
}
|
||||
}
|
||||
if (doprint) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -178,23 +178,23 @@ test1(void)
|
||||
{
|
||||
volatile unsigned *x;
|
||||
|
||||
printf("*** Malloc test 1 ***\n");
|
||||
printf("Allocating %u bytes\n", BIGSIZE);
|
||||
tprintf("*** Malloc test 1 ***\n");
|
||||
tprintf("Allocating %u bytes\n", BIGSIZE);
|
||||
x = malloc(BIGSIZE);
|
||||
if (x==NULL) {
|
||||
printf("FAILED: malloc failed\n");
|
||||
tprintf("FAILED: malloc failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
markblock(x, BIGSIZE, 0, 0);
|
||||
if (checkblock(x, BIGSIZE, 0, 0)) {
|
||||
printf("FAILED: data corrupt\n");
|
||||
tprintf("FAILED: data corrupt\n");
|
||||
return;
|
||||
}
|
||||
|
||||
free((void *)x);
|
||||
|
||||
printf("Passed malloc test 1.\n");
|
||||
tprintf("Passed malloc test 1.\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -237,43 +237,43 @@ test2(void)
|
||||
volatile unsigned *x;
|
||||
size_t size;
|
||||
|
||||
printf("Entering malloc test 2.\n");
|
||||
printf("Make sure you read and understand the comment in malloctest.c "
|
||||
tprintf("Entering malloc test 2.\n");
|
||||
tprintf("Make sure you read and understand the comment in malloctest.c "
|
||||
"that\nexplains the conditions this test assumes.\n\n");
|
||||
|
||||
printf("Testing how much memory we can allocate:\n");
|
||||
tprintf("Testing how much memory we can allocate:\n");
|
||||
|
||||
for (size = HUGESIZE; (x = malloc(size))==NULL; size = size/2) {
|
||||
printf(" %9lu bytes: failed\n", (unsigned long) size);
|
||||
tprintf(" %9lu bytes: failed\n", (unsigned long) size);
|
||||
}
|
||||
printf(" %9lu bytes: succeeded\n", (unsigned long) size);
|
||||
tprintf(" %9lu bytes: succeeded\n", (unsigned long) size);
|
||||
|
||||
printf("Passed part 1\n");
|
||||
tprintf("Passed part 1\n");
|
||||
|
||||
printf("Touching all the words in the block.\n");
|
||||
tprintf("Touching all the words in the block.\n");
|
||||
markblock(x, size, 0, 1);
|
||||
|
||||
printf("Validating the words in the block.\n");
|
||||
tprintf("Validating the words in the block.\n");
|
||||
if (checkblock(x, size, 0, 1)) {
|
||||
printf("FAILED: data corrupt\n");
|
||||
tprintf("FAILED: data corrupt\n");
|
||||
return;
|
||||
}
|
||||
printf("Passed part 2\n");
|
||||
tprintf("Passed part 2\n");
|
||||
|
||||
|
||||
printf("Freeing the block\n");
|
||||
tprintf("Freeing the block\n");
|
||||
free((void *)x);
|
||||
printf("Passed part 3\n");
|
||||
printf("Allocating another block\n");
|
||||
tprintf("Passed part 3\n");
|
||||
tprintf("Allocating another block\n");
|
||||
|
||||
x = malloc(size);
|
||||
if (x==NULL) {
|
||||
printf("FAILED: free didn't return the memory?\n");
|
||||
tprintf("FAILED: free didn't return the memory?\n");
|
||||
return;
|
||||
}
|
||||
free((void *)x);
|
||||
|
||||
printf("Passed malloc test 2.\n");
|
||||
tprintf("Passed malloc test 2.\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -304,11 +304,11 @@ test3(void)
|
||||
int ct=0, failed=0;
|
||||
void *x;
|
||||
|
||||
printf("Entering malloc test 3.\n");
|
||||
printf("Make sure you read and understand the comment in malloctest.c "
|
||||
tprintf("Entering malloc test 3.\n");
|
||||
tprintf("Make sure you read and understand the comment in malloctest.c "
|
||||
"that\nexplains the conditions this test assumes.\n\n");
|
||||
|
||||
printf("Testing how much memory we can allocate:\n");
|
||||
tprintf("Testing how much memory we can allocate:\n");
|
||||
|
||||
while ((tmp = malloc(sizeof(struct test3))) != NULL) {
|
||||
|
||||
@@ -322,33 +322,33 @@ test3(void)
|
||||
|
||||
ct++;
|
||||
if (ct%128==0) {
|
||||
printf(".");
|
||||
tprintf(".");
|
||||
}
|
||||
}
|
||||
|
||||
printf("Allocated %lu bytes\n", (unsigned long) tot);
|
||||
tprintf("Allocated %lu bytes\n", (unsigned long) tot);
|
||||
|
||||
printf("Trying some more allocations which I expect to fail...\n");
|
||||
tprintf("Trying some more allocations which I expect to fail...\n");
|
||||
|
||||
x = malloc(SMALLSIZE);
|
||||
if (x != NULL) {
|
||||
printf("FAILED: malloc(%u) succeeded\n", SMALLSIZE);
|
||||
tprintf("FAILED: malloc(%u) succeeded\n", SMALLSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
x = malloc(MEDIUMSIZE);
|
||||
if (x != NULL) {
|
||||
printf("FAILED: malloc(%u) succeeded\n", MEDIUMSIZE);
|
||||
tprintf("FAILED: malloc(%u) succeeded\n", MEDIUMSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
x = malloc(BIGSIZE);
|
||||
if (x != NULL) {
|
||||
printf("FAILED: malloc(%u) succeeded\n", BIGSIZE);
|
||||
tprintf("FAILED: malloc(%u) succeeded\n", BIGSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Ok, now I'm going to free everything...\n");
|
||||
tprintf("Ok, now I'm going to free everything...\n");
|
||||
|
||||
while (list != NULL) {
|
||||
tmp = list->next;
|
||||
@@ -363,20 +363,20 @@ test3(void)
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
printf("FAILED: data corruption\n");
|
||||
tprintf("FAILED: data corruption\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Let me see if I can allocate some more now...\n");
|
||||
tprintf("Let me see if I can allocate some more now...\n");
|
||||
|
||||
x = malloc(MEDIUMSIZE);
|
||||
if (x == NULL) {
|
||||
printf("FAIL: Nope, I couldn't.\n");
|
||||
tprintf("FAIL: Nope, I couldn't.\n");
|
||||
return;
|
||||
}
|
||||
free(x);
|
||||
|
||||
printf("Passed malloc test 3\n");
|
||||
tprintf("Passed malloc test 3\n");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -397,34 +397,34 @@ test4(void)
|
||||
void *x, *y, *z;
|
||||
unsigned long lx, ly, lz, overhead, zsize;
|
||||
|
||||
printf("Entering malloc test 4.\n");
|
||||
printf("This test is intended for first/best-fit based mallocs.\n");
|
||||
printf("This test may not work correctly if run after other tests.\n");
|
||||
tprintf("Entering malloc test 4.\n");
|
||||
tprintf("This test is intended for first/best-fit based mallocs.\n");
|
||||
tprintf("This test may not work correctly if run after other tests.\n");
|
||||
|
||||
printf("Testing free list coalescing:\n");
|
||||
tprintf("Testing free list coalescing:\n");
|
||||
|
||||
x = malloc(SMALLSIZE);
|
||||
if (x==NULL) {
|
||||
printf("FAILED: malloc(%u) failed\n", SMALLSIZE);
|
||||
tprintf("FAILED: malloc(%u) failed\n", SMALLSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
y = malloc(MEDIUMSIZE);
|
||||
if (y==NULL) {
|
||||
printf("FAILED: malloc(%u) failed\n", MEDIUMSIZE);
|
||||
tprintf("FAILED: malloc(%u) failed\n", MEDIUMSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sizeof(unsigned long) < sizeof(void *)) {
|
||||
printf("Buh? I can't fit a void * in an unsigned long\n");
|
||||
printf("ENVIRONMENT FAILED...\n");
|
||||
tprintf("Buh? I can't fit a void * in an unsigned long\n");
|
||||
tprintf("ENVIRONMENT FAILED...\n");
|
||||
return;
|
||||
}
|
||||
|
||||
lx = (unsigned long)x;
|
||||
ly = (unsigned long)y;
|
||||
|
||||
printf("x is 0x%lx; y is 0x%lx\n", lx, ly);
|
||||
tprintf("x is 0x%lx; y is 0x%lx\n", lx, ly);
|
||||
|
||||
/*
|
||||
* The memory should look something like this:
|
||||
@@ -436,7 +436,7 @@ test4(void)
|
||||
|
||||
/* This is obviously wrong. */
|
||||
if (lx == ly) {
|
||||
printf("FAIL: x == y\n");
|
||||
tprintf("FAIL: x == y\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -447,11 +447,11 @@ test4(void)
|
||||
* or the other block's start is within the first block.)
|
||||
*/
|
||||
if (lx < ly && lx + SMALLSIZE > ly) {
|
||||
printf("FAIL: y starts within x\n");
|
||||
tprintf("FAIL: y starts within x\n");
|
||||
return;
|
||||
}
|
||||
if (ly < lx && ly + MEDIUMSIZE > lx) {
|
||||
printf("FAIL: x starts within y\n");
|
||||
tprintf("FAIL: x starts within y\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -461,7 +461,7 @@ test4(void)
|
||||
* free list.
|
||||
*/
|
||||
if (ly < lx) {
|
||||
printf("TEST UNSUITABLE: y is below x\n");
|
||||
tprintf("TEST UNSUITABLE: y is below x\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -469,39 +469,39 @@ test4(void)
|
||||
* Compute the space used by index structures.
|
||||
*/
|
||||
overhead = ly - (lx + SMALLSIZE);
|
||||
printf("Apparent block overhead: %lu\n", overhead);
|
||||
tprintf("Apparent block overhead: %lu\n", overhead);
|
||||
|
||||
if (overhead > ABSURD_OVERHEAD) {
|
||||
printf("TEST UNSUITABLE: block overhead absurdly large.\n");
|
||||
tprintf("TEST UNSUITABLE: block overhead absurdly large.\n");
|
||||
return;
|
||||
}
|
||||
if (overhead > OVERHEAD) {
|
||||
printf("FAIL: block overhead is too large.\n");
|
||||
tprintf("FAIL: block overhead is too large.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Freeing blocks...\n");
|
||||
tprintf("Freeing blocks...\n");
|
||||
free(x);
|
||||
free(y);
|
||||
|
||||
zsize = SMALLSIZE + MEDIUMSIZE + overhead;
|
||||
|
||||
printf("Now allocating %lu bytes... should reuse the space.\n", zsize);
|
||||
tprintf("Now allocating %lu bytes... should reuse the space.\n", zsize);
|
||||
z = malloc(zsize);
|
||||
if (z == NULL) {
|
||||
printf("FAIL: Allocation failed...\n");
|
||||
tprintf("FAIL: Allocation failed...\n");
|
||||
return;
|
||||
}
|
||||
|
||||
lz = (unsigned long) z;
|
||||
|
||||
printf("z is 0x%lx (x was 0x%lx, y 0x%lx)\n", lz, lx, ly);
|
||||
tprintf("z is 0x%lx (x was 0x%lx, y 0x%lx)\n", lz, lx, ly);
|
||||
|
||||
if (lz==lx) {
|
||||
printf("Passed.\n");
|
||||
tprintf("Passed.\n");
|
||||
}
|
||||
else {
|
||||
printf("Failed.\n");
|
||||
tprintf("Failed.\n");
|
||||
}
|
||||
|
||||
free(z);
|
||||
@@ -530,7 +530,7 @@ test567(int testno, unsigned long seed)
|
||||
int i, n, size, failed=0;
|
||||
|
||||
srandom(seed);
|
||||
printf("Seeded random number generator with %lu.\n", seed);
|
||||
tprintf("Seeded random number generator with %lu.\n", seed);
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
ptrs[i] = NULL;
|
||||
@@ -544,7 +544,7 @@ test567(int testno, unsigned long seed)
|
||||
ptrs[n] = malloc(size);
|
||||
psizes[n] = size;
|
||||
if (ptrs[n] == NULL) {
|
||||
printf("\nmalloc %u failed\n", size);
|
||||
tprintf("\nmalloc %u failed\n", size);
|
||||
failed = 1;
|
||||
break;
|
||||
}
|
||||
@@ -561,10 +561,10 @@ test567(int testno, unsigned long seed)
|
||||
psizes[n] = 0;
|
||||
}
|
||||
if (i%256==0) {
|
||||
printf(".");
|
||||
tprintf(".");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
if (ptrs[i] != NULL) {
|
||||
@@ -573,10 +573,10 @@ test567(int testno, unsigned long seed)
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
printf("FAILED malloc test %d\n", testno);
|
||||
tprintf("FAILED malloc test %d\n", testno);
|
||||
}
|
||||
else {
|
||||
printf("Passed malloc test %d\n", testno);
|
||||
tprintf("Passed malloc test %d\n", testno);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -584,7 +584,7 @@ static
|
||||
void
|
||||
test5(void)
|
||||
{
|
||||
printf("Beginning malloc test 5\n");
|
||||
tprintf("Beginning malloc test 5\n");
|
||||
test567(5, 0);
|
||||
}
|
||||
|
||||
@@ -595,7 +595,7 @@ test6(void)
|
||||
int fd, len;
|
||||
unsigned long seed;
|
||||
|
||||
printf("Beginning malloc test 6\n");
|
||||
tprintf("Beginning malloc test 6\n");
|
||||
|
||||
fd = open(_PATH_RANDOM, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
@@ -619,9 +619,9 @@ test7(void)
|
||||
{
|
||||
unsigned long seed;
|
||||
|
||||
printf("Beginning malloc test 7\n");
|
||||
tprintf("Beginning malloc test 7\n");
|
||||
|
||||
printf("Enter random seed: ");
|
||||
tprintf("Enter random seed: ");
|
||||
seed = geti();
|
||||
|
||||
test567(7, seed);
|
||||
@@ -673,12 +673,12 @@ main(int argc, char *argv[])
|
||||
while (1) {
|
||||
if (menu) {
|
||||
for (i=0; tests[i].num>=0; i++) {
|
||||
printf(" %2d %s\n", tests[i].num,
|
||||
tprintf(" %2d %s\n", tests[i].num,
|
||||
tests[i].desc);
|
||||
}
|
||||
menu = 0;
|
||||
}
|
||||
printf("malloctest: ");
|
||||
tprintf("malloctest: ");
|
||||
tn = geti();
|
||||
if (tn < 0) {
|
||||
break;
|
||||
|
@@ -75,14 +75,14 @@ main(void)
|
||||
for (k = 0; k < Dim; k++)
|
||||
C[i][j] += A[i][k] * B[k][j];
|
||||
|
||||
printf("matmult-orig finished.\n");
|
||||
tprintf("matmult-orig finished.\n");
|
||||
r = C[Dim-1][Dim-1];
|
||||
printf("answer is: %d (should be %d)\n", r, RIGHT);
|
||||
tprintf("answer is: %d (should be %d)\n", r, RIGHT);
|
||||
if (r != RIGHT) {
|
||||
printf("FAILED\n");
|
||||
tprintf("FAILED\n");
|
||||
}
|
||||
else {
|
||||
printf("Passed.\n");
|
||||
tprintf("Passed.\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@@ -41,6 +41,7 @@
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define Dim 72 /* sum total of the arrays doesn't fit in
|
||||
* physical memory
|
||||
@@ -58,33 +59,49 @@ main(void)
|
||||
{
|
||||
int i, j, k, r;
|
||||
|
||||
for (i = 0; i < Dim; i++) /* first initialize the matrices */
|
||||
for (j = 0; j < Dim; j++) {
|
||||
A[i][j] = i;
|
||||
B[i][j] = j;
|
||||
C[i][j] = 0;
|
||||
for (i = 0; i < Dim; i++) { /* first initialize the matrices */
|
||||
for (j = 0; j < Dim; j++) {
|
||||
TEST161_LPROGRESS_N(i*Dim + j, 1000);
|
||||
A[i][j] = i;
|
||||
B[i][j] = j;
|
||||
C[i][j] = 0;
|
||||
}
|
||||
}
|
||||
nprintf("\n");
|
||||
|
||||
for (i = 0; i < Dim; i++) /* then multiply them together */
|
||||
for (j = 0; j < Dim; j++)
|
||||
for (k = 0; k < Dim; k++)
|
||||
T[i][j][k] = A[i][k] * B[k][j];
|
||||
for (i = 0; i < Dim; i++) { /* then multiply them together */
|
||||
for (j = 0; j < Dim; j++) {
|
||||
for (k = 0; k < Dim; k++) {
|
||||
TEST161_LPROGRESS_N(i*j*Dim*Dim + k, 50000);
|
||||
T[i][j][k] = A[i][k] * B[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
nprintf("\n");
|
||||
|
||||
for (i = 0; i < Dim; i++)
|
||||
for (j = 0; j < Dim; j++)
|
||||
for (k = 0; k < Dim; k++)
|
||||
C[i][j] += T[i][j][k];
|
||||
for (i = 0; i < Dim; i++) {
|
||||
for (j = 0; j < Dim; j++) {
|
||||
for (k = 0; k < Dim; k++) {
|
||||
TEST161_LPROGRESS_N(i*j*Dim*Dim + k, 50000);
|
||||
C[i][j] += T[i][j][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
nprintf("\n");
|
||||
|
||||
r = 0;
|
||||
for (i = 0; i < Dim; i++)
|
||||
r += C[i][i];
|
||||
|
||||
printf("matmult finished.\n");
|
||||
printf("answer is: %d (should be %d)\n", r, RIGHT);
|
||||
nprintf("matmult finished.\n");
|
||||
nprintf("answer is: %d (should be %d)\n", r, RIGHT);
|
||||
if (r != RIGHT) {
|
||||
printf("FAILED\n");
|
||||
nprintf("FAILED\n");
|
||||
success(TEST161_FAIL, SECRET, "/testbin/matmult");
|
||||
return 1;
|
||||
}
|
||||
printf("Passed.\n");
|
||||
|
||||
nprintf("Passed.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/matmult");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -169,16 +169,13 @@ spawn(int njobs)
|
||||
semcreate("1", &s1);
|
||||
semcreate("2", &s2);
|
||||
|
||||
printf("Forking %d child processes...\n", njobs);
|
||||
tprintf("Forking %d child processes...\n", njobs);
|
||||
|
||||
for (i=0; i<njobs; i++) {
|
||||
pids[i] = fork();
|
||||
if (pids[i] == -1) {
|
||||
/* continue with the procs we have; cannot kill them */
|
||||
warn("fork");
|
||||
warnx("*** Only started %u processes ***", i);
|
||||
njobs = i;
|
||||
break;
|
||||
/* abandon the other procs; no way to kill them */
|
||||
err(1, "fork");
|
||||
}
|
||||
if (pids[i] == 0) {
|
||||
/* child */
|
||||
@@ -196,9 +193,9 @@ spawn(int njobs)
|
||||
|
||||
semopen(&s1);
|
||||
semopen(&s2);
|
||||
printf("Waiting for fork...\n");
|
||||
tprintf("Waiting for fork...\n");
|
||||
semP(&s1, njobs);
|
||||
printf("Starting the execs...\n");
|
||||
tprintf("Starting the execs...\n");
|
||||
semV(&s2, njobs);
|
||||
|
||||
failed = 0;
|
||||
@@ -222,7 +219,7 @@ spawn(int njobs)
|
||||
warnx("%d children failed", failed);
|
||||
}
|
||||
else {
|
||||
printf("Succeeded\n");
|
||||
tprintf("Succeeded\n");
|
||||
}
|
||||
|
||||
semclose(&s1);
|
||||
|
@@ -83,6 +83,7 @@ a canal - Panama!
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
char palindrome[8000] =
|
||||
"amanaplanacaretabanamyriadasumalacaliarahoopapintacatalpaagasanoil"
|
||||
@@ -175,24 +176,24 @@ main(void)
|
||||
{
|
||||
char *start, *end;
|
||||
|
||||
printf("Welcome to the palindrome tester!\n");
|
||||
printf("I will take a large palindrome and test it.\n");
|
||||
printf("Here it is:\n");
|
||||
printf("%s\n", palindrome);
|
||||
tprintf("Welcome to the palindrome tester!\n");
|
||||
tprintf("I will take a large palindrome and test it.\n");
|
||||
tprintf("Here it is:\n");
|
||||
tprintf("%s\n", palindrome);
|
||||
|
||||
printf("Testing...");
|
||||
tprintf("Testing...");
|
||||
/* skip to end */
|
||||
end = palindrome+strlen(palindrome);
|
||||
end--;
|
||||
|
||||
for (start = palindrome; start <= end; start++, end--) {
|
||||
putchar('.');
|
||||
if (*start != *end) {
|
||||
printf("NOT a palindrome\n");
|
||||
success(TEST161_FAIL, SECRET, "/testbin/palin");
|
||||
tprintf("NOT a palindrome\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
printf("IS a palindrome\n");
|
||||
tprintf("IS a palindrome\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/palin");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -45,6 +45,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <test/test.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define NJOBS 24
|
||||
|
||||
@@ -52,6 +54,8 @@
|
||||
#define NMATS 11
|
||||
#define JOBSIZE ((NMATS+1)*DIM*DIM*sizeof(int))
|
||||
|
||||
#define PROGRESS_INTERVAL 25000
|
||||
|
||||
static const int right_answers[NJOBS] = {
|
||||
-1337312809,
|
||||
356204544,
|
||||
@@ -87,35 +91,20 @@ struct matrix {
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
* Use this instead of just calling printf so we know each printout
|
||||
* is atomic; this prevents the lines from getting intermingled.
|
||||
*/
|
||||
static
|
||||
void
|
||||
say(const char *fmt, ...)
|
||||
{
|
||||
char buf[256];
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
write(STDOUT_FILENO, buf, strlen(buf));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void
|
||||
multiply(struct matrix *res, const struct matrix *m1, const struct matrix *m2)
|
||||
{
|
||||
int i, j, k;
|
||||
int i, j, k, tot;
|
||||
|
||||
tot = 0;
|
||||
for (i=0; i<DIM; i++) {
|
||||
for (j=0; j<DIM; j++) {
|
||||
int val=0;
|
||||
for (k=0; k<DIM; k++) {
|
||||
val += m1->m_data[i][k]*m2->m_data[k][j];
|
||||
TEST161_LPROGRESS_N(tot, PROGRESS_INTERVAL);
|
||||
tot++;
|
||||
}
|
||||
res->m_data[i][j] = val;
|
||||
}
|
||||
@@ -201,18 +190,19 @@ go(int mynum)
|
||||
{
|
||||
int r;
|
||||
|
||||
say("Process %d (pid %d) starting computation...\n", mynum,
|
||||
lsay("Process %d (pid %d) starting computation...\n", mynum,
|
||||
(int) getpid());
|
||||
|
||||
computeall(mynum);
|
||||
r = answer();
|
||||
|
||||
if (r != right_answers[mynum]) {
|
||||
say("Process %d answer %d: FAILED, should be %d\n",
|
||||
tsay("Process %d answer %d: FAILED, should be %d\n",
|
||||
mynum, r, right_answers[mynum]);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/parallelvm");
|
||||
exit(1);
|
||||
}
|
||||
say("Process %d answer %d: passed\n", mynum, r);
|
||||
|
||||
lsay("\nProcess %d: OK\n", mynum, r);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -329,8 +319,8 @@ makeprocs(bool dowait)
|
||||
semcreate("2", &s2);
|
||||
}
|
||||
|
||||
printf("Job size approximately %lu bytes\n", (unsigned long) JOBSIZE);
|
||||
printf("Forking %d jobs; total load %luk\n", NJOBS,
|
||||
tprintf("Job size approximately %lu bytes\n", (unsigned long) JOBSIZE);
|
||||
tprintf("Forking %d jobs; total load %luk\n", NJOBS,
|
||||
(unsigned long) (NJOBS * JOBSIZE)/1024);
|
||||
|
||||
for (i=0; i<NJOBS; i++) {
|
||||
@@ -341,7 +331,7 @@ makeprocs(bool dowait)
|
||||
if (pids[i]==0) {
|
||||
/* child */
|
||||
if (dowait) {
|
||||
say("Process %d forked\n", i);
|
||||
//tsay("Process %d forked\n", i);
|
||||
semopen(&s1);
|
||||
semopen(&s2);
|
||||
semV(&s1, 1);
|
||||
@@ -356,9 +346,9 @@ makeprocs(bool dowait)
|
||||
if (dowait) {
|
||||
semopen(&s1);
|
||||
semopen(&s2);
|
||||
say("Waiting for fork...\n");
|
||||
//tsay("Waiting for fork...\n");
|
||||
semP(&s1, NJOBS);
|
||||
say("Starting computation.\n");
|
||||
//tsay("Starting computation.\n");
|
||||
semV(&s2, NJOBS);
|
||||
}
|
||||
|
||||
@@ -381,7 +371,9 @@ makeprocs(bool dowait)
|
||||
printf("%d subprocesses failed\n", failcount);
|
||||
exit(1);
|
||||
}
|
||||
printf("Test complete\n");
|
||||
nprintf("\n");
|
||||
tprintf("Test complete\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/parallelvm");
|
||||
|
||||
semclose(&s1);
|
||||
semclose(&s2);
|
||||
@@ -404,7 +396,7 @@ main(int argc, char *argv[])
|
||||
dowait = true;
|
||||
}
|
||||
else {
|
||||
printf("Usage: parallelvm [-w]\n");
|
||||
tprintf("Usage: parallelvm [-w]\n");
|
||||
return 1;
|
||||
}
|
||||
makeprocs(dowait);
|
||||
|
@@ -34,6 +34,7 @@ awk < $1 '
|
||||
printf "#include <stdlib.h>\n";
|
||||
printf "#include <errno.h>\n";
|
||||
printf "#include <err.h>\n";
|
||||
printf "#include <test161/test161.h>\n";
|
||||
printf "\n";
|
||||
printf "#include \"extern.h\"\n";
|
||||
printf "\n";
|
||||
@@ -67,7 +68,7 @@ awk < $1 '
|
||||
if (i<NF) printf ", ";
|
||||
}
|
||||
printf ");\n";
|
||||
printf"\tprintf(\"%%-47s\", buf);\n";
|
||||
printf"\ttprintf(\"%%-47s\", buf);\n";
|
||||
#printf "\tfflush(stdout);\n";
|
||||
printf "\n";
|
||||
|
||||
@@ -88,7 +89,7 @@ awk < $1 '
|
||||
}
|
||||
printf ");\n";
|
||||
|
||||
printf "\tprintf(\" result %%d, errno %%d\\n\", result, errno);\n";
|
||||
printf "\ttprintf(\" result %%d, errno %%d\\n\", result, errno);\n";
|
||||
printf "\tif (dofork) {\n";
|
||||
printf "\t\texit(0);\n";
|
||||
printf "\t}\n";
|
||||
@@ -134,9 +135,11 @@ awk < $1 '
|
||||
|
||||
printf "\tfor (i=0; i<count; i++) {\n";
|
||||
printf "\t\tfor (j=0; list[j]; j++) {\n";
|
||||
printf "\t\t\tnprintf(\".\");\n";
|
||||
printf "\t\t\t(*list[j])(dofork);\n";
|
||||
printf "\t\t}\n";
|
||||
printf "\t}\n";
|
||||
printf "nprintf(\"\\n\");\n";
|
||||
printf "}\n";
|
||||
printf "\n";
|
||||
}
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
@@ -113,10 +114,10 @@ static
|
||||
void
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: randcall [-f] [-c count] [-r seed] 2|3|4|all\n");
|
||||
printf(" -f suppress forking\n");
|
||||
printf(" -c set iteration count (default 100)\n");
|
||||
printf(" -r set pseudorandom seed (default 0)\n");
|
||||
tprintf("Usage: randcall [-f] [-c count] [-r seed] 2|3|4|all\n");
|
||||
tprintf(" -f suppress forking\n");
|
||||
tprintf(" -c set iteration count (default 100)\n");
|
||||
tprintf(" -r set pseudorandom seed (default 0)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -157,10 +158,11 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
printf("Seed: %d Count: %d\n", seed, count);
|
||||
tprintf("Seed: %d Count: %d\n", seed, count);
|
||||
|
||||
srandom(seed);
|
||||
trycalls(an, dofork, count);
|
||||
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/randcall");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -43,6 +43,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define PATH_CAT "/bin/cat"
|
||||
#define INFILE "redirect.in"
|
||||
@@ -181,16 +182,23 @@ cat(void)
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
printf("Creating %s...\n", INFILE);
|
||||
tprintf("Creating %s...\n", INFILE);
|
||||
mkfile();
|
||||
nprintf(".");
|
||||
|
||||
printf("Running cat < %s > %s\n", INFILE, OUTFILE);
|
||||
tprintf("Running cat < %s > %s\n", INFILE, OUTFILE);
|
||||
cat();
|
||||
nprintf(".");
|
||||
|
||||
printf("Checking %s...\n", OUTFILE);
|
||||
tprintf("Checking %s...\n", OUTFILE);
|
||||
chkfile();
|
||||
nprintf(".");
|
||||
|
||||
printf("Passed.\n");
|
||||
tprintf("Passed.\n");
|
||||
nprintf(".");
|
||||
nprintf("\n");
|
||||
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/redirect");
|
||||
(void)remove(INFILE);
|
||||
(void)remove(OUTFILE);
|
||||
return 0;
|
||||
|
@@ -116,13 +116,13 @@ static
|
||||
void
|
||||
test1(void)
|
||||
{
|
||||
printf("Making %s\n", testdir);
|
||||
tprintf("Making %s\n", testdir);
|
||||
startup();
|
||||
|
||||
printf("Removing %s while in it\n", testdir);
|
||||
tprintf("Removing %s while in it\n", testdir);
|
||||
killdir();
|
||||
|
||||
printf("Leaving the test directory\n");
|
||||
tprintf("Leaving the test directory\n");
|
||||
finish();
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ test2(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
printf("Now trying with the directory open...\n");
|
||||
tprintf("Now trying with the directory open...\n");
|
||||
startup();
|
||||
fd = open(".", O_RDONLY);
|
||||
if (fd<0) {
|
||||
@@ -162,7 +162,7 @@ test3(void)
|
||||
char buf[PATH_MAX];
|
||||
int fd;
|
||||
|
||||
printf("Checking if . exists after rmdir\n");
|
||||
tprintf("Checking if . exists after rmdir\n");
|
||||
startup();
|
||||
killdir();
|
||||
|
||||
@@ -230,7 +230,7 @@ test4(void)
|
||||
char buf[4096];
|
||||
int fd;
|
||||
|
||||
printf("Checking if creating files works after rmdir...\n");
|
||||
tprintf("Checking if creating files works after rmdir...\n");
|
||||
startup();
|
||||
killdir();
|
||||
|
||||
@@ -272,7 +272,7 @@ static
|
||||
void
|
||||
test5(void)
|
||||
{
|
||||
printf("Checking if creating subdirs works after rmdir...\n");
|
||||
tprintf("Checking if creating subdirs works after rmdir...\n");
|
||||
startup();
|
||||
killdir();
|
||||
|
||||
@@ -315,7 +315,7 @@ test6(void)
|
||||
char buf[PATH_MAX];
|
||||
int fd, len;
|
||||
|
||||
printf("Now trying to list the directory...\n");
|
||||
tprintf("Now trying to list the directory...\n");
|
||||
startup();
|
||||
fd = open(".", O_RDONLY);
|
||||
if (fd<0) {
|
||||
@@ -399,6 +399,6 @@ main(void)
|
||||
test6();
|
||||
test7();
|
||||
|
||||
printf("Whew... survived.\n");
|
||||
tprintf("Whew... survived.\n");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -157,7 +157,7 @@ main(void)
|
||||
err(1, "Unexpected error reopening the file");
|
||||
}
|
||||
|
||||
printf("Succeeded!\n");
|
||||
tprintf("Succeeded!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
#define _PATH_RANDOM "random:"
|
||||
|
||||
@@ -62,7 +63,7 @@ geti(void)
|
||||
break;
|
||||
}
|
||||
else if ((ch=='\b' || ch==127) && digits>0) {
|
||||
printf("\b \b");
|
||||
tprintf("\b \b");
|
||||
val = val/10;
|
||||
digits--;
|
||||
}
|
||||
@@ -141,7 +142,7 @@ static
|
||||
void
|
||||
say(const char *msg)
|
||||
{
|
||||
/* Use one write so it's atomic (printf usually won't be) */
|
||||
/* Use one write so it's atomic (tprintf usually won't be) */
|
||||
write(STDOUT_FILENO, msg, strlen(msg));
|
||||
}
|
||||
|
||||
@@ -194,9 +195,9 @@ checkpage(volatile void *baseptr, unsigned pageoffset, bool neednl)
|
||||
val = ((unsigned long)i ^ (unsigned long)pageoffset);
|
||||
if (pl[i] != val) {
|
||||
if (neednl) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
printf("FAILED: data mismatch at offset %lu of page "
|
||||
tprintf("FAILED: data mismatch at offset %lu of page "
|
||||
"at 0x%lx: %lu vs. %lu\n",
|
||||
(unsigned long) (i*sizeof(unsigned long)),
|
||||
(unsigned long)(uintptr_t)pl,
|
||||
@@ -241,9 +242,9 @@ checkpagelight(volatile void *baseptr, unsigned pageoffset, bool neednl)
|
||||
pl = (volatile unsigned long *)pageptr;
|
||||
if (pl[0] != pageoffset) {
|
||||
if (neednl) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
printf("FAILED: data mismatch at offset 0 of page "
|
||||
tprintf("FAILED: data mismatch at offset 0 of page "
|
||||
"at 0x%lx: %lu vs. %u\n",
|
||||
(unsigned long)(uintptr_t)pl,
|
||||
pl[0], pageoffset);
|
||||
@@ -271,6 +272,37 @@ dosbrk(ssize_t size)
|
||||
return p;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// fork a child that segfaults
|
||||
|
||||
typedef void (*segfault_fn)(void);
|
||||
|
||||
static
|
||||
void
|
||||
expect_segfault(segfault_fn func)
|
||||
{
|
||||
int status;
|
||||
int result;
|
||||
pid_t pid = dofork();
|
||||
|
||||
if (pid == 0) {
|
||||
func(); // This exits
|
||||
} else {
|
||||
result = waitpid(pid, &status, 0);
|
||||
if (result == -1) {
|
||||
err(1, "waitpid");
|
||||
}
|
||||
else if (WIFSIGNALED(status)) {
|
||||
if (WTERMSIG(status) != 11) {
|
||||
errx(1, "child: Signal %d", WTERMSIG(status));
|
||||
}
|
||||
}
|
||||
else {
|
||||
errx(1, "child exited, expected segfault");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// align the heap
|
||||
|
||||
@@ -317,14 +349,13 @@ test1(void)
|
||||
{
|
||||
void *p;
|
||||
|
||||
printf("Allocating a page...\n");
|
||||
tprintf("Allocating a page...\n");
|
||||
p = dosbrk(PAGE_SIZE);
|
||||
markpage(p, 0);
|
||||
if (checkpage(p, 0, false)) {
|
||||
errx(1, "FAILED: data corrupt");
|
||||
}
|
||||
|
||||
printf("Passed sbrk test 1.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -338,7 +369,7 @@ test2(void)
|
||||
|
||||
op = dosbrk(0);
|
||||
|
||||
printf("Allocating a page...\n");
|
||||
tprintf("Allocating a page...\n");
|
||||
p = dosbrk(PAGE_SIZE);
|
||||
if (p != op) {
|
||||
errx(1, "FAILED: sbrk grow didn't return the old break "
|
||||
@@ -351,7 +382,7 @@ test2(void)
|
||||
|
||||
p = dosbrk(0);
|
||||
|
||||
printf("Freeing the page...\n");
|
||||
tprintf("Freeing the page...\n");
|
||||
q = dosbrk(-PAGE_SIZE);
|
||||
if (q != p) {
|
||||
errx(1, "FAILED: sbrk shrink didn't return the old break "
|
||||
@@ -362,8 +393,7 @@ test2(void)
|
||||
errx(1, "FAILED: sbrk shrink didn't restore the heap "
|
||||
"(got %p, expected %p", q, op);
|
||||
}
|
||||
|
||||
printf("Passed sbrk test 2.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -382,7 +412,7 @@ test3(void)
|
||||
|
||||
op = dosbrk(0);
|
||||
|
||||
printf("Allocating %u pages...\n", num);
|
||||
tprintf("Allocating %u pages...\n", num);
|
||||
p = dosbrk(PAGE_SIZE * num);
|
||||
if (p != op) {
|
||||
errx(1, "FAILED: sbrk grow didn't return the old break "
|
||||
@@ -403,7 +433,7 @@ test3(void)
|
||||
|
||||
p = dosbrk(0);
|
||||
|
||||
printf("Freeing the pages...\n");
|
||||
tprintf("Freeing the pages...\n");
|
||||
q = dosbrk(-PAGE_SIZE * num);
|
||||
if (q != p) {
|
||||
errx(1, "FAILED: sbrk shrink didn't return the old break "
|
||||
@@ -414,8 +444,7 @@ test3(void)
|
||||
errx(1, "FAILED: sbrk shrink didn't restore the heap "
|
||||
"(got %p, expected %p", q, op);
|
||||
}
|
||||
|
||||
printf("Passed sbrk test 3.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -435,7 +464,7 @@ test4(void)
|
||||
|
||||
op = dosbrk(0);
|
||||
|
||||
printf("Allocating %u pages...\n", num);
|
||||
tprintf("Allocating %u pages...\n", num);
|
||||
p = dosbrk(PAGE_SIZE * num);
|
||||
if (p != op) {
|
||||
errx(1, "FAILED: sbrk grow didn't return the old break "
|
||||
@@ -454,7 +483,7 @@ test4(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Freeing the pages one at a time...\n");
|
||||
tprintf("Freeing the pages one at a time...\n");
|
||||
for (i=num; i-- > 0; ) {
|
||||
(void)dosbrk(-PAGE_SIZE);
|
||||
for (j=0; j<i; j++) {
|
||||
@@ -474,8 +503,7 @@ test4(void)
|
||||
errx(1, "FAILED: sbrk shrink didn't restore the heap "
|
||||
"(got %p, expected %p", q, op);
|
||||
}
|
||||
|
||||
printf("Passed sbrk test 4.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -487,51 +515,75 @@ test4(void)
|
||||
*/
|
||||
static
|
||||
void
|
||||
test5(void)
|
||||
test5_helper(void)
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = dosbrk(0);
|
||||
printf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
tprintf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
((long *)p)[10] = 0;
|
||||
errx(1, "FAILED: I didn't crash");
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test5(void)
|
||||
{
|
||||
expect_segfault(test5_helper);
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocates a page and checks that the next page past it is not
|
||||
* valid. (Crashes when successful.)
|
||||
*/
|
||||
static
|
||||
void
|
||||
test6(void)
|
||||
test6_helper(void)
|
||||
{
|
||||
void *p;
|
||||
|
||||
(void)dosbrk(PAGE_SIZE);
|
||||
p = dosbrk(0);
|
||||
printf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
tprintf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
((long *)p)[10] = 0;
|
||||
errx(1, "FAILED: I didn't crash");
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test6(void)
|
||||
{
|
||||
expect_segfault(test6_helper);
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocates and frees a page and checks that the page freed is no
|
||||
* longer valid. (Crashes when successful.)
|
||||
*/
|
||||
static
|
||||
void
|
||||
test7(void)
|
||||
test7_helper(void)
|
||||
{
|
||||
void *p;
|
||||
|
||||
(void)dosbrk(PAGE_SIZE);
|
||||
(void)dosbrk(-PAGE_SIZE);
|
||||
p = dosbrk(0);
|
||||
printf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
tprintf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
((long *)p)[10] = 0;
|
||||
errx(1, "FAILED: I didn't crash");
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test7(void)
|
||||
{
|
||||
expect_segfault(test7_helper);
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocates some pages, frees half of them, and checks that the page
|
||||
* past the new end of the heap is no longer valid. (Crashes when
|
||||
@@ -539,18 +591,26 @@ test7(void)
|
||||
*/
|
||||
static
|
||||
void
|
||||
test8(void)
|
||||
test8_helper(void)
|
||||
{
|
||||
void *p;
|
||||
|
||||
(void)dosbrk(PAGE_SIZE * 12);
|
||||
(void)dosbrk(-PAGE_SIZE * 6);
|
||||
p = dosbrk(0);
|
||||
printf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
tprintf("This should produce fatal signal 11 (SIGSEGV).\n");
|
||||
((long *)p)[10] = 0;
|
||||
errx(1, "FAILED: I didn't crash");
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test8(void)
|
||||
{
|
||||
expect_segfault(test8_helper);
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// heap size
|
||||
|
||||
@@ -588,38 +648,38 @@ test9(void)
|
||||
|
||||
#define HUGESIZE (1024 * 1024 * 1024) /* 1G */
|
||||
|
||||
printf("Checking how much memory we can allocate:\n");
|
||||
tprintf("Checking how much memory we can allocate:\n");
|
||||
for (size = HUGESIZE; (p = sbrk(size)) == (void *)-1; size = size/2) {
|
||||
printf(" %9lu bytes: failed\n", (unsigned long) size);
|
||||
tprintf(" %9lu bytes: failed\n", (unsigned long) size);
|
||||
}
|
||||
printf(" %9lu bytes: succeeded\n", (unsigned long) size);
|
||||
printf("Passed sbrk test 9 (part 1/5)\n");
|
||||
tprintf(" %9lu bytes: succeeded\n", (unsigned long) size);
|
||||
tprintf("Passed sbrk test 9 (part 1/5)\n");
|
||||
|
||||
printf("Touching each page.\n");
|
||||
tprintf("Touching each page.\n");
|
||||
pages = size / PAGE_SIZE;
|
||||
dot = pages / 64;
|
||||
for (i=0; i<pages; i++) {
|
||||
markpagelight(p, i);
|
||||
if (dot > 0 && i % dot == 0) {
|
||||
printf(".");
|
||||
if (dot > 0) {
|
||||
TEST161_LPROGRESS_N(i, dot);
|
||||
}
|
||||
}
|
||||
if (dot > 0) {
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("Testing each page.\n");
|
||||
tprintf("Testing each page.\n");
|
||||
bad = false;
|
||||
for (i=0; i<pages; i++) {
|
||||
if (checkpagelight(p, i, dot > 0)) {
|
||||
if (dot > 0) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
warnx("FAILED: data corrupt");
|
||||
bad = true;
|
||||
}
|
||||
if (dot > 0 && i % dot == 0) {
|
||||
printf(".");
|
||||
if (dot > 0) {
|
||||
TEST161_LPROGRESS_N(i, dot);
|
||||
}
|
||||
}
|
||||
if (dot > 0) {
|
||||
@@ -628,19 +688,20 @@ test9(void)
|
||||
if (bad) {
|
||||
exit(1);
|
||||
}
|
||||
printf("Passed sbrk test 9 (part 2/5)\n");
|
||||
tprintf("Passed sbrk test 9 (part 2/5)\n");
|
||||
|
||||
printf("Freeing the memory.\n");
|
||||
tprintf("Freeing the memory.\n");
|
||||
(void)dosbrk(-size);
|
||||
printf("Passed sbrk test 9 (part 3/5)\n");
|
||||
tprintf("Passed sbrk test 9 (part 3/5)\n");
|
||||
|
||||
printf("Allocating the memory again.\n");
|
||||
tprintf("Allocating the memory again.\n");
|
||||
(void)dosbrk(size);
|
||||
printf("Passed sbrk test 9 (part 4/5)\n");
|
||||
tprintf("Passed sbrk test 9 (part 4/5)\n");
|
||||
|
||||
printf("And really freeing it.\n");
|
||||
tprintf("And really freeing it.\n");
|
||||
(void)dosbrk(-size);
|
||||
printf("Passed sbrk test 9 (all)\n");
|
||||
tprintf("Passed sbrk test 9 (all)\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -655,16 +716,16 @@ test10(void)
|
||||
unsigned i, n;
|
||||
bool bad;
|
||||
|
||||
printf("Allocating all of memory one page at a time:\n");
|
||||
tprintf("Allocating all of memory one page at a time:\n");
|
||||
op = dosbrk(0);
|
||||
n = 0;
|
||||
while ((p = sbrk(PAGE_SIZE)) != (void *)-1) {
|
||||
markpagelight(op, n);
|
||||
n++;
|
||||
}
|
||||
printf("Got %u pages (%zu bytes).\n", n, (size_t)PAGE_SIZE * n);
|
||||
tprintf("Got %u pages (%zu bytes).\n", n, (size_t)PAGE_SIZE * n);
|
||||
|
||||
printf("Now freeing them.\n");
|
||||
tprintf("Now freeing them.\n");
|
||||
bad = false;
|
||||
for (i=0; i<n; i++) {
|
||||
if (checkpagelight(op, n - i - 1, false)) {
|
||||
@@ -676,14 +737,14 @@ test10(void)
|
||||
if (bad) {
|
||||
exit(1);
|
||||
}
|
||||
printf("Freed %u pages.\n", n);
|
||||
tprintf("Freed %u pages.\n", n);
|
||||
|
||||
p = dosbrk(0);
|
||||
if (p != op) {
|
||||
errx(1, "FAILURE: break did not return to original value");
|
||||
}
|
||||
|
||||
printf("Now let's see if I can allocate another page.\n");
|
||||
tprintf("Now let's see if I can allocate another page.\n");
|
||||
p = dosbrk(PAGE_SIZE);
|
||||
markpage(p, 0);
|
||||
if (checkpage(p, 0, false)) {
|
||||
@@ -691,7 +752,8 @@ test10(void)
|
||||
}
|
||||
(void)dosbrk(-PAGE_SIZE);
|
||||
|
||||
printf("Passed sbrk test 10.\n");
|
||||
tprintf("Passed sbrk test 10.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -707,37 +769,34 @@ test11(void)
|
||||
unsigned i;
|
||||
bool bad;
|
||||
|
||||
printf("Allocating %u pages (%zu bytes).\n", num,
|
||||
tprintf("Allocating %u pages (%zu bytes).\n", num,
|
||||
(size_t)PAGE_SIZE * num);
|
||||
p = dosbrk(num * PAGE_SIZE);
|
||||
|
||||
printf("Touching the pages.\n");
|
||||
tprintf("Touching the pages.\n");
|
||||
for (i=0; i<num; i++) {
|
||||
markpagelight(p, i);
|
||||
if (i % 4 == 0) {
|
||||
printf(".");
|
||||
}
|
||||
TEST161_LPROGRESS_N(i, 4);
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
|
||||
printf("Checking the pages.\n");
|
||||
tprintf("Checking the pages.\n");
|
||||
bad = false;
|
||||
for (i=0; i<num; i++) {
|
||||
if (checkpagelight(p, i, true)) {
|
||||
warnx("FAILED: data corrupt");
|
||||
bad = true;
|
||||
}
|
||||
if (i % 4 == 0) {
|
||||
printf(".");
|
||||
}
|
||||
TEST161_LPROGRESS_N(i, 4);
|
||||
}
|
||||
printf("\n");
|
||||
if (bad) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Now NOT freeing the pages. They should get freed on exit.\n");
|
||||
printf("If not, you'll notice pretty quickly.\n");
|
||||
tprintf("Now NOT freeing the pages. They should get freed on exit.\n");
|
||||
tprintf("If not, you'll notice pretty quickly.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -756,7 +815,7 @@ test12(void)
|
||||
pid_t pid;
|
||||
void *p;
|
||||
|
||||
printf("Forking...\n");
|
||||
tprintf("Forking...\n");
|
||||
pid = dofork();
|
||||
if (pid == 0) {
|
||||
/* child */
|
||||
@@ -778,7 +837,8 @@ test12(void)
|
||||
}
|
||||
say("Parent done.\n");
|
||||
dowait(pid);
|
||||
printf("Passed sbrk test 12.\n");
|
||||
tprintf("Passed sbrk test 12.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -791,14 +851,14 @@ test13(void)
|
||||
pid_t pid;
|
||||
void *p;
|
||||
|
||||
printf("Allocating a page...\n");
|
||||
tprintf("Allocating a page...\n");
|
||||
p = dosbrk(PAGE_SIZE);
|
||||
markpage(p, 0);
|
||||
if (checkpage(p, 0, false)) {
|
||||
errx(1, "FAILED: data corrupt before forking");
|
||||
}
|
||||
|
||||
printf("Forking...\n");
|
||||
tprintf("Forking...\n");
|
||||
pid = dofork();
|
||||
if (pid == 0) {
|
||||
/* child */
|
||||
@@ -811,7 +871,8 @@ test13(void)
|
||||
errx(1, "FAILED: data corrupt in parent");
|
||||
}
|
||||
dowait(pid);
|
||||
printf("Passed sbrk test 13.\n");
|
||||
tprintf("Passed sbrk test 13.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -824,21 +885,21 @@ test14(void)
|
||||
pid_t pid;
|
||||
void *p;
|
||||
|
||||
printf("Allocating a page...\n");
|
||||
tprintf("Allocating a page...\n");
|
||||
p = dosbrk(PAGE_SIZE);
|
||||
markpage(p, 0);
|
||||
if (checkpage(p, 0, false)) {
|
||||
errx(1, "FAILED: data corrupt before forking");
|
||||
}
|
||||
|
||||
printf("Forking...\n");
|
||||
tprintf("Forking...\n");
|
||||
pid = dofork();
|
||||
if (pid == 0) {
|
||||
/* child */
|
||||
if (checkpage(p, 0, false)) {
|
||||
errx(1, "FAILED: data corrupt in child");
|
||||
}
|
||||
printf("Child freeing a page...\n");
|
||||
tprintf("Child freeing a page...\n");
|
||||
dosbrk(-PAGE_SIZE);
|
||||
exit(0);
|
||||
}
|
||||
@@ -846,7 +907,8 @@ test14(void)
|
||||
if (checkpage(p, 0, false)) {
|
||||
errx(1, "FAILED: data corrupt in parent after child ran");
|
||||
}
|
||||
printf("Passed sbrk test 14.\n");
|
||||
tprintf("Passed sbrk test 14.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -863,7 +925,7 @@ test15(void)
|
||||
unsigned i;
|
||||
void *p;
|
||||
|
||||
printf("Allocating %u pages...\n", num);
|
||||
tprintf("Allocating %u pages...\n", num);
|
||||
p = dosbrk(PAGE_SIZE * num);
|
||||
for (i=0; i<num; i++) {
|
||||
markpage(p, i);
|
||||
@@ -874,7 +936,7 @@ test15(void)
|
||||
}
|
||||
}
|
||||
|
||||
printf("Freeing one page...\n");
|
||||
tprintf("Freeing one page...\n");
|
||||
(void)dosbrk(-PAGE_SIZE);
|
||||
num--;
|
||||
for (i=0; i<num; i++) {
|
||||
@@ -883,7 +945,7 @@ test15(void)
|
||||
}
|
||||
}
|
||||
|
||||
printf("Allocating two pages...\n");
|
||||
tprintf("Allocating two pages...\n");
|
||||
(void)dosbrk(PAGE_SIZE * 2);
|
||||
markpage(p, num++);
|
||||
markpage(p, num++);
|
||||
@@ -893,7 +955,7 @@ test15(void)
|
||||
}
|
||||
}
|
||||
|
||||
printf("Forking...\n");
|
||||
tprintf("Forking...\n");
|
||||
pid = dofork();
|
||||
if (pid == 0) {
|
||||
/* child */
|
||||
@@ -947,7 +1009,9 @@ test15(void)
|
||||
}
|
||||
|
||||
(void)dosbrk(-PAGE_SIZE * num);
|
||||
printf("Passed sbrk test 15.\n");
|
||||
tprintf("Passed sbrk test 15.\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -967,7 +1031,7 @@ stresstest(unsigned long seed, bool large)
|
||||
bool bad, neg;
|
||||
|
||||
srandom(seed);
|
||||
printf("Seeded random number generator with %lu.\n", seed);
|
||||
tprintf("Seeded random number generator with %lu.\n", seed);
|
||||
|
||||
op = dosbrk(0);
|
||||
|
||||
@@ -999,14 +1063,12 @@ stresstest(unsigned long seed, bool large)
|
||||
}
|
||||
for (j=0; j<num; j++) {
|
||||
if (checkpagelight(op, j, true)) {
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
warnx("FAILED: data corrupt on page %u", j);
|
||||
bad = true;
|
||||
}
|
||||
}
|
||||
if (i % dot == 0) {
|
||||
printf(".");
|
||||
}
|
||||
TEST161_LPROGRESS_N(i, dot);
|
||||
}
|
||||
printf("\n");
|
||||
if (bad) {
|
||||
@@ -1015,7 +1077,8 @@ stresstest(unsigned long seed, bool large)
|
||||
}
|
||||
|
||||
dosbrk(-(num * PAGE_SIZE));
|
||||
printf("Passed sbrk %s stress test.\n", large ? "large" : "small");
|
||||
tprintf("Passed sbrk %s stress test.\n", large ? "large" : "small");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
static
|
||||
@@ -1036,7 +1099,7 @@ static
|
||||
void
|
||||
test18(void)
|
||||
{
|
||||
printf("Enter random seed: ");
|
||||
tprintf("Enter random seed: ");
|
||||
stresstest(geti(), false);
|
||||
}
|
||||
|
||||
@@ -1058,10 +1121,65 @@ static
|
||||
void
|
||||
test21(void)
|
||||
{
|
||||
printf("Enter random seed: ");
|
||||
tprintf("Enter random seed: ");
|
||||
stresstest(geti(), true);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test22(void)
|
||||
{
|
||||
int i;
|
||||
void *p, *q;
|
||||
int num = 10;
|
||||
int num_pages = 5 * 1024; // 20MB
|
||||
|
||||
p = dosbrk(num_pages * PAGE_SIZE);
|
||||
q = dosbrk(0);
|
||||
|
||||
if ((unsigned int)q - (unsigned int)p != (unsigned int)(num_pages*PAGE_SIZE)) {
|
||||
errx(1, "Heap size not equal to expected size: p=0x%x q=0x%x", (unsigned int)p, (unsigned int)q);
|
||||
}
|
||||
|
||||
// Just touch the last 10 pages
|
||||
for (i = 0; i < num; i++) {
|
||||
markpage(p, num_pages-(i+1));
|
||||
}
|
||||
|
||||
// Check the last 10 pages
|
||||
for (i = 0; i < num; i++) {
|
||||
if (checkpage(p, num_pages-(i+1), false)) {
|
||||
errx(1, "FAILED: data corrupt");
|
||||
}
|
||||
}
|
||||
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
test23(void)
|
||||
{
|
||||
// Make sure sbrk is freeing memory. This allocates, in total, just over 4M
|
||||
// of memory, but moves the heap breakpoint in such a way that only one page
|
||||
// should ever be required. This test doesn't make much sense to run with
|
||||
// more than 4M or with swap enabled.
|
||||
void *start;
|
||||
int num_pages = 1030;
|
||||
int num;
|
||||
|
||||
start = dosbrk(PAGE_SIZE);
|
||||
|
||||
for (num = 1; num <= num_pages; num++) {
|
||||
TEST161_LPROGRESS(num);
|
||||
start = dosbrk(num*PAGE_SIZE);
|
||||
markpagelight(start, num-1);
|
||||
checkpagelight(start, num-1, true);
|
||||
dosbrk(-(num*PAGE_SIZE));
|
||||
}
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sbrktest");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// main
|
||||
|
||||
@@ -1091,6 +1209,8 @@ static const struct {
|
||||
{ 19, "Large stress test", test19 },
|
||||
{ 20, "Randomized large stress test", test20 },
|
||||
{ 21, "Large stress test with particular seed", test21 },
|
||||
{ 22, "Large sbrk test", test22 },
|
||||
{ 23, "Allocate 4MB in total, but free pages in between", test23 },
|
||||
};
|
||||
static const unsigned numtests = sizeof(tests) / sizeof(tests[0]);
|
||||
|
||||
@@ -1128,12 +1248,12 @@ main(int argc, char *argv[])
|
||||
while (1) {
|
||||
if (menu) {
|
||||
for (j=0; j<numtests; j++) {
|
||||
printf(" %2d %s\n", tests[j].num,
|
||||
tprintf(" %2d %s\n", tests[j].num,
|
||||
tests[j].desc);
|
||||
}
|
||||
menu = false;
|
||||
}
|
||||
printf("sbrktest: ");
|
||||
tprintf("sbrktest: ");
|
||||
tn = geti();
|
||||
if (tn < 0) {
|
||||
break;
|
||||
|
@@ -229,7 +229,7 @@ runit(unsigned numthinkers, unsigned numgrinders,
|
||||
char buf[32];
|
||||
unsigned i;
|
||||
|
||||
printf("Running with %u thinkers, %u grinders, and %u pong groups "
|
||||
tprintf("Running with %u thinkers, %u grinders, and %u pong groups "
|
||||
"of size %u each.\n", numthinkers, numgrinders, numponggroups,
|
||||
ponggroupsize);
|
||||
|
||||
@@ -242,7 +242,7 @@ runit(unsigned numthinkers, unsigned numgrinders,
|
||||
&pids[i+2]);
|
||||
}
|
||||
usem_open(&startsem);
|
||||
printf("Forking done; starting the workload.\n");
|
||||
tprintf("Forking done; starting the workload.\n");
|
||||
__time(&startsecs, &startnsecs);
|
||||
Vn(&startsem, numthinkers + numgrinders +
|
||||
numponggroups * ponggroupsize);
|
||||
@@ -252,20 +252,20 @@ runit(unsigned numthinkers, unsigned numgrinders,
|
||||
|
||||
openresultsfile(O_RDONLY);
|
||||
|
||||
printf("--- Timings ---\n");
|
||||
tprintf("--- Timings ---\n");
|
||||
if (numthinkers > 0) {
|
||||
calcresult(0, startsecs, startnsecs, buf, sizeof(buf));
|
||||
printf("Thinkers: %s\n", buf);
|
||||
tprintf("Thinkers: %s\n", buf);
|
||||
}
|
||||
|
||||
if (numgrinders > 0) {
|
||||
calcresult(1, startsecs, startnsecs, buf, sizeof(buf));
|
||||
printf("Grinders: %s\n", buf);
|
||||
tprintf("Grinders: %s\n", buf);
|
||||
}
|
||||
|
||||
for (i=0; i<numponggroups; i++) {
|
||||
calcresult(i+2, startsecs, startnsecs, buf, sizeof(buf));
|
||||
printf("Pong group %u: %s\n", i, buf);
|
||||
tprintf("Pong group %u: %s\n", i, buf);
|
||||
}
|
||||
|
||||
closeresultsfile();
|
||||
|
@@ -100,7 +100,7 @@ pong_cyclic(unsigned id)
|
||||
P(&sems[id]);
|
||||
}
|
||||
#ifdef VERBOSE_PONG
|
||||
printf(" %u", id);
|
||||
tprintf(" %u", id);
|
||||
#else
|
||||
if (nextid == 0 && i % 16 == 0) {
|
||||
putchar('.');
|
||||
@@ -151,7 +151,7 @@ pong_reciprocating(unsigned id)
|
||||
P(&sems[id]);
|
||||
}
|
||||
#ifdef VERBOSE_PONG
|
||||
printf(" %u", id);
|
||||
tprintf(" %u", id);
|
||||
#else
|
||||
if (id == 0 && i % 16 == 0) {
|
||||
putchar('.');
|
||||
@@ -197,11 +197,11 @@ pong(unsigned groupid, unsigned id)
|
||||
waitstart();
|
||||
pong_cyclic(id);
|
||||
#ifdef VERBOSE_PONG
|
||||
printf("--------------------------------\n");
|
||||
tprintf("--------------------------------\n");
|
||||
#endif
|
||||
pong_reciprocating(id);
|
||||
#ifdef VERBOSE_PONG
|
||||
printf("--------------------------------\n");
|
||||
tprintf("--------------------------------\n");
|
||||
#endif
|
||||
pong_cyclic(id);
|
||||
|
||||
|
@@ -35,14 +35,17 @@
|
||||
* Once the virtual memory assignment is complete, your system
|
||||
* should survive this.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
/* Larger than physical memory */
|
||||
#define SIZE (144*1024)
|
||||
|
||||
#define PROGRESS_INTERVAL 8000
|
||||
#define NEWLINE_FREQ 100
|
||||
|
||||
/*
|
||||
* Quicksort.
|
||||
@@ -54,6 +57,61 @@
|
||||
* Also, quicksort has somewhat more interesting memory usage patterns.
|
||||
*/
|
||||
|
||||
static unsigned iters;
|
||||
|
||||
static inline
|
||||
void
|
||||
progress() {
|
||||
TEST161_LPROGRESS_N(iters, PROGRESS_INTERVAL);
|
||||
if (iters > 0 && (iters % (PROGRESS_INTERVAL * NEWLINE_FREQ)) == 0) {
|
||||
printf("\n");
|
||||
}
|
||||
++iters;
|
||||
}
|
||||
|
||||
static void *
|
||||
local_memcpy(void *dst, const void *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
/*
|
||||
* memcpy does not support overlapping buffers, so always do it
|
||||
* forwards. (Don't change this without adjusting memmove.)
|
||||
*
|
||||
* For speedy copying, optimize the common case where both pointers
|
||||
* and the length are word-aligned, and copy word-at-a-time instead
|
||||
* of byte-at-a-time. Otherwise, copy by bytes.
|
||||
*
|
||||
* The alignment logic below should be portable. We rely on
|
||||
* the compiler to be reasonably intelligent about optimizing
|
||||
* the divides and modulos out. Fortunately, it is.
|
||||
*/
|
||||
|
||||
if ((uintptr_t)dst % sizeof(long) == 0 &&
|
||||
(uintptr_t)src % sizeof(long) == 0 &&
|
||||
len % sizeof(long) == 0) {
|
||||
|
||||
long *d = dst;
|
||||
const long *s = src;
|
||||
|
||||
for (i=0; i<len/sizeof(long); i++) {
|
||||
progress();
|
||||
d[i] = s[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
|
||||
for (i=0; i<len; i++) {
|
||||
progress();
|
||||
d[i] = s[i];
|
||||
}
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
sort(int *arr, int size)
|
||||
@@ -73,6 +131,7 @@ sort(int *arr, int size)
|
||||
j = pivot;
|
||||
k = 0;
|
||||
while (i<pivot && j<size) {
|
||||
progress();
|
||||
if (arr[i] < arr[j]) {
|
||||
tmp[k++] = arr[i++];
|
||||
}
|
||||
@@ -81,13 +140,15 @@ sort(int *arr, int size)
|
||||
}
|
||||
}
|
||||
while (i<pivot) {
|
||||
progress();
|
||||
tmp[k++] = arr[i++];
|
||||
}
|
||||
while (j<size) {
|
||||
progress();
|
||||
tmp[k++] = arr[j++];
|
||||
}
|
||||
|
||||
memcpy(arr, tmp, size*sizeof(int));
|
||||
local_memcpy(arr, tmp, size*sizeof(int));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
@@ -116,13 +177,15 @@ check(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("\nChecking...");
|
||||
for (i=0; i<SIZE-1; i++) {
|
||||
TEST161_LPROGRESS_N(i, PROGRESS_INTERVAL);
|
||||
if (A[i] > A[i+1]) {
|
||||
errx(1, "Failed: A[%d] is %d, A[%d] is %d",
|
||||
i, A[i], i+1, A[i+1]);
|
||||
}
|
||||
}
|
||||
warnx("Passed.");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sort");
|
||||
}
|
||||
|
||||
int
|
||||
|
@@ -41,6 +41,8 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
#include <string.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
@@ -57,15 +59,16 @@ main(int argc, char *argv[])
|
||||
|
||||
filename = argv[1];
|
||||
size = atoi(argv[2]);
|
||||
byte = '\n';
|
||||
byte = '@';
|
||||
|
||||
if (size == 0) {
|
||||
err(1, "Sparse files of length zero are not meaningful");
|
||||
}
|
||||
|
||||
printf("Creating a sparse file of size %d\n", size);
|
||||
tprintf("Creating a sparse file of size %d\n", size);
|
||||
nprintf(".");
|
||||
|
||||
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC);
|
||||
fd = open(filename, O_RDWR|O_CREAT|O_TRUNC);
|
||||
if (fd < 0) {
|
||||
err(1, "%s: create", filename);
|
||||
}
|
||||
@@ -73,6 +76,7 @@ main(int argc, char *argv[])
|
||||
if (lseek(fd, size-1, SEEK_SET) == -1) {
|
||||
err(1, "%s: lseek", filename);
|
||||
}
|
||||
nprintf(".");
|
||||
r = write(fd, &byte, 1);
|
||||
if (r < 0) {
|
||||
err(1, "%s: write", filename);
|
||||
@@ -80,8 +84,30 @@ main(int argc, char *argv[])
|
||||
else if (r != 1) {
|
||||
errx(1, "%s: write: Unexpected result count %d", filename, r);
|
||||
}
|
||||
nprintf(".");
|
||||
|
||||
// Now check this byte.
|
||||
// First seek to the beginning and then seek back to where the byte
|
||||
// should be.
|
||||
if(lseek(fd, 0, SEEK_SET) == -1) {
|
||||
err(1, "lseek failed to seek to beginning of file\n");
|
||||
}
|
||||
nprintf(".");
|
||||
// Now seek back to where the byte should be
|
||||
// While at it, also test SEEK_CUR
|
||||
if(lseek(fd, size-1, SEEK_CUR) == -1) {
|
||||
err(1, "lseek failed to seek to %d of file\n", size-1);
|
||||
}
|
||||
nprintf(".");
|
||||
char test;
|
||||
r = read(fd, &test, 1);
|
||||
if(test != byte) {
|
||||
err(1, "Byte test failed. Expected (%c) != Observed (%c)\n", byte, test);
|
||||
}
|
||||
nprintf(".");
|
||||
close(fd);
|
||||
|
||||
nprintf("\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/sparsefile");
|
||||
return 0;
|
||||
}
|
||||
|
@@ -92,7 +92,7 @@ main(void)
|
||||
win = do_move(player);
|
||||
print_board();
|
||||
if (win) {
|
||||
printf("Player %d, you WON!\n\n", player);
|
||||
tprintf("Player %d, you WON!\n\n", player);
|
||||
break; /* out of for loop */
|
||||
}
|
||||
}
|
||||
@@ -101,7 +101,7 @@ main(void)
|
||||
* tie game.
|
||||
*/
|
||||
if (!win)
|
||||
printf("Tie Game!\n\n");
|
||||
tprintf("Tie Game!\n\n");
|
||||
if (!ask_yesno("Do you wish to play again?"))
|
||||
break; /* out of while loop */
|
||||
}
|
||||
@@ -121,9 +121,9 @@ main(void)
|
||||
void
|
||||
print_instructions(void)
|
||||
{
|
||||
printf("Welcome to tic-tac-toe!\n");
|
||||
printf("Player 1 always plays X and player 2 always play O\n");
|
||||
printf("Good luck!\n\n\n");
|
||||
tprintf("Welcome to tic-tac-toe!\n");
|
||||
tprintf("Player 1 always plays X and player 2 always play O\n");
|
||||
tprintf("Good luck!\n\n\n");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -142,22 +142,22 @@ print_board(void)
|
||||
int i, j;
|
||||
|
||||
/* Print labels across the top */
|
||||
printf("\n 0 1 2\n");
|
||||
tprintf("\n 0 1 2\n");
|
||||
|
||||
for (i = 0; i < DIM; i++) {
|
||||
/* Print row labels */
|
||||
printf(" %d ", i);
|
||||
tprintf(" %d ", i);
|
||||
for (j = 0; j < DIM; j++) {
|
||||
switch (board[i][j]) {
|
||||
case EMPTY: printf(" "); break;
|
||||
case X_MARKER: printf(" X "); break;
|
||||
case O_MARKER: printf(" O "); break;
|
||||
default: printf("???"); break;
|
||||
case EMPTY: tprintf(" "); break;
|
||||
case X_MARKER: tprintf(" X "); break;
|
||||
case O_MARKER: tprintf(" O "); break;
|
||||
default: tprintf("???"); break;
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
tprintf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -181,7 +181,7 @@ ask_yesno(const char *msg)
|
||||
char answer[MAXSTRING];
|
||||
|
||||
while (TRUE) {
|
||||
printf("%s [yes/no] ", msg);
|
||||
tprintf("%s [yes/no] ", msg);
|
||||
if (read_string(answer, MAXSTRING) < 0)
|
||||
return(FALSE);
|
||||
if (Strcmp(answer, "yes"))
|
||||
@@ -189,7 +189,7 @@ ask_yesno(const char *msg)
|
||||
else if (Strcmp(answer, "no"))
|
||||
return(FALSE);
|
||||
else
|
||||
printf("Please answer either yes or no\n");
|
||||
tprintf("Please answer either yes or no\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,32 +216,32 @@ do_move(int player)
|
||||
char answer[MAXSTRING];
|
||||
char cx;
|
||||
|
||||
printf("Player %d (%c), your move\n", player,
|
||||
tprintf("Player %d (%c), your move\n", player,
|
||||
player == X_PLAYER ? 'X' : 'O');
|
||||
|
||||
while (TRUE) {
|
||||
printf("Which row [0-%d]: ", DIM-1);
|
||||
tprintf("Which row [0-%d]: ", DIM-1);
|
||||
if (read_string(answer, MAXSTRING) < 0)
|
||||
return(FALSE);
|
||||
cx = answer[0];
|
||||
x = cx - '0';
|
||||
if (x < 0 || x >= DIM) {
|
||||
printf("Invalid row; must be >= 0 and < %d\n", DIM-1);
|
||||
tprintf("Invalid row; must be >= 0 and < %d\n", DIM-1);
|
||||
continue;
|
||||
}
|
||||
printf("Which column [0-%d]: ", DIM-1);
|
||||
tprintf("Which column [0-%d]: ", DIM-1);
|
||||
if (read_string(answer, MAXSTRING) < 0)
|
||||
return(FALSE);
|
||||
cx = answer[0];
|
||||
y = cx - '0';
|
||||
if (y < 0 || y >= DIM) {
|
||||
printf("Invalid column; must be >= 0 and < %d\n",
|
||||
tprintf("Invalid column; must be >= 0 and < %d\n",
|
||||
DIM-1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (board[x][y] != EMPTY) {
|
||||
printf("That location is occupied; please try again\n");
|
||||
tprintf("That location is occupied; please try again\n");
|
||||
print_board();
|
||||
} else
|
||||
break;
|
||||
|
@@ -79,7 +79,7 @@ main(int argc, char *argv[])
|
||||
threadfork(BladeRunner);
|
||||
}
|
||||
|
||||
printf("Parent has left.\n");
|
||||
tprintf("Parent has left.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ BladeRunner()
|
||||
{
|
||||
while (count < MAX) {
|
||||
if (count % 500 == 0)
|
||||
printf("Blade ");
|
||||
tprintf("Blade ");
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,7 @@ ThreadRunner()
|
||||
{
|
||||
while (count < MAX) {
|
||||
if (count % 513 == 0)
|
||||
printf(" Runner\n");
|
||||
tprintf(" Runner\n");
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <test161/test161.h>
|
||||
|
||||
/*
|
||||
* Some initialized data. This is here to increase the chance that
|
||||
@@ -78,6 +79,7 @@ check_data(void)
|
||||
if (k != SUM_OF_DATA_STUFF) {
|
||||
warnx("My initialized data sums to the wrong value!");
|
||||
warnx("Got: %u Expected: %u", k, SUM_OF_DATA_STUFF);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/zero");
|
||||
errx(1, "FAILED");
|
||||
}
|
||||
}
|
||||
@@ -94,6 +96,7 @@ check_bss(void)
|
||||
warnx("BSS entry at index %u (address %p) not zero!",
|
||||
i, &bss_stuff[i]);
|
||||
warnx("Found: 0x%x", bss_stuff[i]);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/zero");
|
||||
errx(1, "FAILED");
|
||||
}
|
||||
}
|
||||
@@ -112,9 +115,10 @@ check_sbrk(void)
|
||||
base = sbrk(SBRK_SIZE);
|
||||
if (base == (void *)-1) {
|
||||
if (errno == ENOSYS) {
|
||||
printf("I guess you haven't implemented sbrk yet.\n");
|
||||
tprintf("I guess you haven't implemented sbrk yet.\n");
|
||||
return;
|
||||
}
|
||||
success(TEST161_FAIL, SECRET, "/testbin/zero");
|
||||
err(1, "sbrk");
|
||||
}
|
||||
|
||||
@@ -124,6 +128,7 @@ check_sbrk(void)
|
||||
i, &base[i]);
|
||||
warnx("Got: 0x%x", (unsigned char)base[i]);
|
||||
warnx("Base of sbrk region: %p", base);
|
||||
success(TEST161_FAIL, SECRET, "/testbin/zero");
|
||||
errx(1, "FAILED");
|
||||
}
|
||||
}
|
||||
@@ -133,13 +138,13 @@ check_sbrk(void)
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
printf("zero: phase 1: checking .bss\n");
|
||||
tprintf("zero: phase 1: checking .bss\n");
|
||||
check_data();
|
||||
check_bss();
|
||||
|
||||
printf("zero: phase 2: checking sbrk()\n");
|
||||
tprintf("zero: phase 2: checking sbrk()\n");
|
||||
check_sbrk();
|
||||
|
||||
printf("zero: passed\n");
|
||||
success(TEST161_SUCCESS, SECRET, "/testbin/zero");
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user