diff options
-rw-r--r-- | tests/ChangeLog | 30 | ||||
-rw-r--r-- | tests/Makefile | 14 | ||||
-rw-r--r-- | tests/README | 9 | ||||
-rw-r--r-- | tests/count1.c | 62 | ||||
-rw-r--r-- | tests/create1.c | 9 | ||||
-rw-r--r-- | tests/equal1.c | 39 | ||||
-rw-r--r-- | tests/exit2.c | 27 | ||||
-rw-r--r-- | tests/exit3.c | 36 | ||||
-rw-r--r-- | tests/mutex1.c | 17 | ||||
-rw-r--r-- | tests/mutex2.c | 12 | ||||
-rw-r--r-- | tests/once1.c | 18 | ||||
-rw-r--r-- | tests/self2.c | 8 | ||||
-rw-r--r-- | tests/self3.c | 12 | ||||
-rw-r--r-- | tests/tsd1.c | 8 |
14 files changed, 244 insertions, 57 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog index 27834cb..cb1abab 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,33 @@ +1999-02-21 Ben Elliston <bje@cygnus.com> + + * README: Update. + + * Makefile: New file. Run all tests automatically. Primitive tests + are run first; more complex tests are run last. + + * count1.c: New test. Validate the thread count. + + * exit2.c: Perform a simpler test. + + * exit3.c: New test. Replaces exit2.c, since exit2.c needs to + perform simpler checking first. + + * create1.c: Update to use the new testsuite exiting convention. + + * equal1.c: Likewise. + + * mutex1.c: Likewise. + + * mutex2.c: Likewise. + + * once1.c: Likewise. + + * self2.c: Likewise. + + * self3.c: Likewise. + + * tsd1.c: Likewise. + 1999-02-20 Ross Johnson <rpj@ise.canberra.edu.au> * mutex2.c: Test static mutex initialisation. diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..82c1d44 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,14 @@ +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES = count1.pass create1.pass equal1.pass exit1.pass exit2.pass \ + exit3.pass eyal1.pass mutex1.pass mutex2.pass mutex3.pass \ + once1.pass self1.pass self2.pass self3.pass tsd1.pass + +all: $(PASSES) + +%.pass: %.exe + touch $@ diff --git a/tests/README b/tests/README index cce2924..fa3c0bf 100644 --- a/tests/README +++ b/tests/README @@ -9,3 +9,12 @@ Usage: runtest cl|gcc testname "gcc" calls the GNU gcc compiler/linker "testname" is the name of the C source file without the .c +Tests written in this test suite should behave in the following manner: + + * If a test fails, leave main() with a result of 1. + + * If a test succeeds, leave main() with a result of 0. + + * No diagnostic output should appear when the test is succeeding. + Diagnostic output may be emitted if something in the test + fails, to help determine the cause of the test failure. diff --git a/tests/count1.c b/tests/count1.c new file mode 100644 index 0000000..c4e0c4e --- /dev/null +++ b/tests/count1.c @@ -0,0 +1,62 @@ +/* + * count1.c + * + * Written by Ben Elliston <bje@cygnus.com>. + * + * Description: + * Test some basic assertions about the number of threads at runtime. + */ + +#include <windows.h> +#include <pthread.h> + +static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_t threads[10]; +static unsigned numThreads = 1; + +void * +myfunc(void *arg) +{ + pthread_mutex_lock(&lock); + numThreads++; + pthread_mutex_unlock(&lock); + + Sleep(1000); + return 0; +} +int +main() +{ + int i, result; + int maxThreads = sizeof(threads) / sizeof(pthread_t); + + /* Spawn ten threads. Each thread should increment the numThreads + variable, sleep for one second, decrement the variable and then + exit. The final result of numThreads should be 1 again. */ + for (i = 0; i < maxThreads; i++) + { + result = pthread_create(&threads[i], NULL, myfunc, 0); + if (result != 0) + { + return 1; + } + } + + /* Wait for all the threads to exit. */ + for (i = 0; i < maxThreads; i++) + { + pthread_join(threads[i], NULL); + pthread_mutex_lock(&lock); + numThreads--; + pthread_mutex_unlock(&lock); + } + + /* Check the number of live threads. */ + if (numThreads != 1) + { + return 1; + } + + /* Success. */ + return 0; +} diff --git a/tests/create1.c b/tests/create1.c index 841c565..2741401 100644 --- a/tests/create1.c +++ b/tests/create1.c @@ -4,7 +4,6 @@ void * func(void * arg) { - printf("Hello world\n"); return 0; } @@ -12,8 +11,14 @@ int main() { pthread_t t; - pthread_create(&t, NULL, func, NULL); + if (pthread_create(&t, NULL, func, NULL) != 0) + { + return 1; + } + /* A dirty hack, but we cannot rely on pthread_join in this + primitive test. */ Sleep(5000); + return 0; } diff --git a/tests/equal1.c b/tests/equal1.c index e877990..d882adc 100644 --- a/tests/equal1.c +++ b/tests/equal1.c @@ -1,34 +1,47 @@ +/* + * Test for pthread_equal. + * + * Depends on functions: pthread_create(). + */ + #include <pthread.h> #include <stdio.h> #include <windows.h> void * func(void * arg) { - printf("Hello world %d\n", (int) arg); Sleep(2000); - return arg; + return 0; } main() { int rc; pthread_t t1, t2; - rc = pthread_create(&t1, NULL, func, (void *) 1); - rc = pthread_create(&t2, NULL, func, (void *) 2); + if (pthread_create(&t1, NULL, func, (void *) 1) != 0) + { + return 1; + } + + if (pthread_create(&t2, NULL, func, (void *) 2) != 0) + { + return 1; + } - puts("testing t1 and t2: "); if (pthread_equal(t1, t2)) - printf("equal\n"); - else - printf("not equal\n"); + { + return 1; + } - puts("testing t1 on itself: "); - if (pthread_equal(t1,t1)) - printf("equal\n"); - else - printf("not equal\n"); + if (pthread_equal(t1,t1) == 0) + { + return 1; + } + /* This is a hack. We don't want to rely on pthread_join + yet if we can help it. */ Sleep(8000); + /* Success. */ return 0; } diff --git a/tests/exit2.c b/tests/exit2.c index af906eb..48ad5d0 100644 --- a/tests/exit2.c +++ b/tests/exit2.c @@ -1,35 +1,12 @@ /* * Test for pthread_exit(). - * - * Depends on API functions: pthread_create(). */ #include <pthread.h> -#include <stdio.h> - -void * -func(void * arg) -{ - printf("Hello world\n"); - pthread_exit(arg); - - /* Never reached. */ - return 0; -} int main(int argc, char * argv[]) { - pthread_t id[4]; - int i; - - /* Create a few threads, make them say hello and then exit. */ - - for (i = 0; i < 4; i++) - { - pthread_create(&id[i], NULL, func, (void *) i); - } - - /* Semantics should be the same as POSIX. Wait for the workers. */ - pthread_exit((void *) 0); + /* Should be the same as return 0; */ + pthread_exit(0); } diff --git a/tests/exit3.c b/tests/exit3.c new file mode 100644 index 0000000..f15b39d --- /dev/null +++ b/tests/exit3.c @@ -0,0 +1,36 @@ +/* + * Test for pthread_exit(). + * + * Depends on API functions: pthread_create(). + */ + +#include <pthread.h> +#include <stdio.h> + +void * +func(void * arg) +{ + pthread_exit(arg); + + /* Never reached. */ + return 0; +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[4]; + int i; + + /* Create a few threads and then exit. */ + for (i = 0; i < 4; i++) + { + if (pthread_create(&id[i], NULL, func, (void *) i) != 0) + { + return 1; + } + } + + /* Success. */ + return 0; +} diff --git a/tests/mutex1.c b/tests/mutex1.c index 27e2a82..f1c9240 100644 --- a/tests/mutex1.c +++ b/tests/mutex1.c @@ -12,9 +12,20 @@ pthread_mutex_t mutex1; int main() { - pthread_mutex_init(&mutex1, NULL); - pthread_mutex_lock(&mutex1); - pthread_mutex_unlock(&mutex1); + if (pthread_mutex_init(&mutex1, NULL) != 0) + { + return 1; + } + + if (pthread_mutex_lock(&mutex1) != 0) + { + return 1; + } + + if (pthread_mutex_unlock(&mutex1) != 0) + { + return 1; + } return 0; } diff --git a/tests/mutex2.c b/tests/mutex2.c index d0885fc..cfbebdc 100644 --- a/tests/mutex2.c +++ b/tests/mutex2.c @@ -15,11 +15,15 @@ main() result = pthread_mutex_trylock(&mutex1); printf("pthread_mutex_trylock returned %s\n", error_string[result]); + if (result != 0) + { + return 1; + } - if (result == 0) - { - pthread_mutex_unlock(&mutex1); - } + if (pthread_mutex_unlock(&mutex1) != 0) + { + return 1; + } return 0; } diff --git a/tests/once1.c b/tests/once1.c index f4164ac..661d322 100644 --- a/tests/once1.c +++ b/tests/once1.c @@ -1,3 +1,9 @@ +/* + * Test for pthread_once(). + * + * Depends on functions: pthread_create. + */ + #include <pthread.h> #include <stdio.h> @@ -24,11 +30,15 @@ main() int rc; pthread_t t1, t2; - rc = pthread_create(&t1, NULL, mythread, NULL); - printf("pthread_create returned %d\n", rc); + if (pthread_create(&t1, NULL, mythread, NULL) != 0) + { + return 1; + } - rc = pthread_create(&t2, NULL, mythread, NULL); - printf("pthread_create returned %d\n", rc); + if (pthread_create(&t2, NULL, mythread, NULL) != 0) + { + return 1; + } Sleep(2000); return 0; diff --git a/tests/self2.c b/tests/self2.c index 76d7b71..51cc129 100644 --- a/tests/self2.c +++ b/tests/self2.c @@ -23,9 +23,13 @@ main() int rc; pthread_t t; - rc = pthread_create(&t, NULL, entry, NULL); - assert(rc == 0); + if (pthread_create(&t, NULL, entry, NULL) != 0) + { + return 1; + } Sleep(2000); + + /* Success. */ return 0; } diff --git a/tests/self3.c b/tests/self3.c index 17d5ed3..5cc8296 100644 --- a/tests/self3.c +++ b/tests/self3.c @@ -23,11 +23,15 @@ main() int rc; pthread_t t[2]; - rc = pthread_create(&t[0], NULL, entry, (void *) 1); - assert(rc == 0); + if (pthread_create(&t[0], NULL, entry, (void *) 1) != 0) + { + return 1; + } - rc = pthread_create(&t[1], NULL, entry, (void *) 2); - assert(rc == 0); + if (pthread_create(&t[1], NULL, entry, (void *) 2) != 0) + { + return 1; + } Sleep(2000); return 0; diff --git a/tests/tsd1.c b/tests/tsd1.c index 5236fe7..8137a64 100644 --- a/tests/tsd1.c +++ b/tests/tsd1.c @@ -130,6 +130,10 @@ main() { rc = pthread_create(&thread[t], NULL, mythread, (void *) (t + 1)); printf("pthread_create returned %d\n", rc); + if (rc != 0) + { + return 1; + } } (void) pthread_once(&key_once, make_key); @@ -143,6 +147,10 @@ main() { rc = pthread_create(&thread[t], NULL, mythread, (void *) (t + 1)); printf("pthread_create returned %d\n", rc); + if (rc != 0) + { + return 1; + } } Sleep(2000); |