diff options
author | Yang Tse <yangsita@gmail.com> | 2008-04-23 23:55:34 +0000 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2008-04-23 23:55:34 +0000 |
commit | 96edebf4d9ec656ec6ed83dca3bbc3947033c71d (patch) | |
tree | 85232db570c48e6f7258bc68f9966b5981cac3a5 /tests/server | |
parent | 3783b455c08d48cb8a487b16046ffdf71ba46dae (diff) |
improve synchronization between test harness runtests.pl script
and test harness servers to minimize risk of false test failures.
http://curl.haxx.se/mail/lib-2008-04/0392.html
Diffstat (limited to 'tests/server')
-rw-r--r-- | tests/server/sws.c | 6 | ||||
-rw-r--r-- | tests/server/tftpd.c | 24 | ||||
-rw-r--r-- | tests/server/util.c | 36 | ||||
-rw-r--r-- | tests/server/util.h | 6 |
4 files changed, 67 insertions, 5 deletions
diff --git a/tests/server/sws.c b/tests/server/sws.c index fc4123538..023fe270e 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -988,6 +988,8 @@ int main(int argc, char *argv[]) break; } + set_advisor_read_lock(SERVERLOGS_LOCK); + #ifdef CURL_SWS_FORK_ENABLED if(use_fork) { /* The fork enabled version just forks off the child and don't care @@ -1063,6 +1065,8 @@ int main(int argc, char *argv[]) logmsg("====> Client disconnect"); sclose(msgsock); + clear_advisor_read_lock(SERVERLOGS_LOCK); + if (req.testno == DOCNUMBER_QUIT) break; #ifdef CURL_SWS_FORK_ENABLED @@ -1072,6 +1076,8 @@ int main(int argc, char *argv[]) sclose(sock); + clear_advisor_read_lock(SERVERLOGS_LOCK); + return 0; } diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c index a98791de6..bafe47cf6 100644 --- a/tests/server/tftpd.c +++ b/tests/server/tftpd.c @@ -415,6 +415,7 @@ int main(int argc, char **argv) int flag; int rc; struct testcase test; + int result = 0; while(argc>arg) { if(!strcmp("--version", argv[arg])) { @@ -518,20 +519,25 @@ int main(int argc, char **argv) (struct sockaddr *)&from, &fromlen); if (n < 0) { logmsg("recvfrom:\n"); - return 3; + result = 3; + break; } + set_advisor_read_lock(SERVERLOGS_LOCK); + from.sin_family = AF_INET; peer = socket(AF_INET, SOCK_DGRAM, 0); if (peer < 0) { logmsg("socket:\n"); - return 2; + result = 2; + break; } if (connect(peer, (struct sockaddr *)&from, sizeof(from)) < 0) { logmsg("connect: fail\n"); - return 1; + result = 1; + break; } maxtimeout = 5*TIMEOUT; @@ -545,8 +551,14 @@ int main(int argc, char **argv) free(test.buffer); } sclose(peer); + + clear_advisor_read_lock(SERVERLOGS_LOCK); + } while(1); - return 0; + + clear_advisor_read_lock(SERVERLOGS_LOCK); + + return result; } struct formats { @@ -734,8 +746,10 @@ static void timer(int signum) logmsg("alarm!"); timeout += rexmtval; - if (timeout >= maxtimeout) + if(timeout >= maxtimeout) { + clear_advisor_read_lock(SERVERLOGS_LOCK); exit(1); + } #ifdef HAVE_SIGSETJMP siglongjmp(timeoutbuf, 1); #endif diff --git a/tests/server/util.c b/tests/server/util.c index 8a2fa8814..64684545e 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -234,3 +234,39 @@ int write_pidfile(const char *filename) logmsg("Wrote pid %ld to %s", pid, filename); return 1; /* success */ } + +void set_advisor_read_lock(const char *filename) +{ + FILE *lockfile; + int error; + int res; + + do { + lockfile = fopen(filename, "wb"); + } while((lockfile == NULL) && ((error = ERRNO) == EINTR)); + if(lockfile == NULL) { + logmsg("Error creating lock file %s error: %d %s", + filename, error, strerror(error)); + return; + } + + do { + res = fclose(lockfile); + } while(res && ((error = ERRNO) == EINTR)); + if(res) + logmsg("Error closing lock file %s error: %d %s", + filename, error, strerror(error)); +} + +void clear_advisor_read_lock(const char *filename) +{ + int error; + int res; + + do { + res = unlink(filename); + } while(res && ((error = ERRNO) == EINTR)); + if(res) + logmsg("Error removing lock file %s error: %d %s", + filename, error, strerror(error)); +} diff --git a/tests/server/util.h b/tests/server/util.h index 4f07fcb05..9b9dd598b 100644 --- a/tests/server/util.h +++ b/tests/server/util.h @@ -27,6 +27,8 @@ void logmsg(const char *msg, ...); #define TEST_DATA_PATH "%s/data/test%ld" +#define SERVERLOGS_LOCK "log/serverlogs.lock" + /* global variable, where to find the 'data' dir */ extern const char *path; @@ -53,4 +55,8 @@ int wait_ms(int timeout_ms); int write_pidfile(const char *filename); +void set_advisor_read_lock(const char *filename); + +void clear_advisor_read_lock(const char *filename); + #endif /* __SERVER_UTIL_H */ |