summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>1999-02-12 18:41:36 +0000
committerwtc%netscape.com <devnull@localhost>1999-02-12 18:41:36 +0000
commitbe33bc6f908bb8dc03e1aa8907188d41c02458b7 (patch)
treefbf13aaf7f6ce59627b88cde40570b8c514f3c0e
parent1c226926d80f909816c203f15654374da0909612 (diff)
downloadnspr-hg-be33bc6f908bb8dc03e1aa8907188d41c02458b7.tar.gz
Completely rewrote the test.
-rw-r--r--pr/tests/pipeself.c156
1 files changed, 110 insertions, 46 deletions
diff --git a/pr/tests/pipeself.c b/pr/tests/pipeself.c
index 6379a034..4c4b9bba 100644
--- a/pr/tests/pipeself.c
+++ b/pr/tests/pipeself.c
@@ -20,79 +20,143 @@
* File: pipeself.c
*
* Description:
- * This test creates a pipe, writes to it, and reads from it.
+ * This test has two threads communicating with each other using
+ * two unidirectional pipes. The primordial thread is the ping
+ * thread and the other thread is the pong thread. The ping
+ * thread writes "ping" to the pong thread and the pong thread
+ * writes "pong" back.
*/
#include "prio.h"
#include "prerror.h"
+#include "prthread.h"
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#define NUM_ITERATIONS 10
-#define ENGLISH_GREETING "Hello"
-#define SPANISH_GREETING "Hola"
+static PRFileDesc *ping_in, *ping_out;
+static PRFileDesc *pong_in, *pong_out;
-int main()
+static void PongThreadFunc(void *arg)
{
- PRFileDesc *readPipe, *writePipe;
- char buf[128];
- int len;
+ char buf[1024];
int idx;
-
- if (PR_CreatePipe(&readPipe, &writePipe) == PR_FAILURE) {
- fprintf(stderr, "cannot create pipe: (%d, %d)\n",
- PR_GetError(), PR_GetOSError());
- return 1;
- }
+ PRInt32 nBytes;
+ PRStatus status;
for (idx = 0; idx < NUM_ITERATIONS; idx++) {
- strcpy(buf, ENGLISH_GREETING);
- len = strlen(buf) + 1;
- if (PR_Write(writePipe, buf, len) < len) {
- fprintf(stderr, "write failed\n");
- return 1;
- }
memset(buf, 0, sizeof(buf));
- if (PR_Read(readPipe, buf, sizeof(buf)) == -1) {
- fprintf(stderr, "read failed: (%d, %d)\n",
- PR_GetError(), PR_GetOSError());
- return 1;
+ nBytes = PR_Read(pong_in, buf, sizeof(buf));
+ if (nBytes == -1) {
+ fprintf(stderr, "PR_Read failed\n");
+ exit(1);
+ }
+ printf("pong thread: received \"%s\"\n", buf);
+ if (nBytes != 5) {
+ fprintf(stderr, "pong thread: expected 5 bytes but got %d bytes\n",
+ nBytes);
+ exit(1);
+ }
+ if (strcmp(buf, "ping") != 0) {
+ fprintf(stderr, "pong thread: expected \"ping\" but got \"%s\"\n",
+ buf);
+ exit(1);
}
- if (strcmp(buf, ENGLISH_GREETING) != 0) {
- fprintf(stderr, "expected \"%s\" but got \"%s\"\n",
- ENGLISH_GREETING, buf);
- return 1;
+ strcpy(buf, "pong");
+ printf("pong thread: sending \"%s\"\n", buf);
+ nBytes = PR_Write(pong_out, buf, 5);
+ if (nBytes == -1) {
+ fprintf(stderr, "PR_Write failed: (%d, %d)\n", PR_GetError(),
+ PR_GetOSError());
+ exit(1);
}
+ }
+
+ status = PR_Close(pong_in);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_Close failed\n");
+ exit(1);
+ }
+ status = PR_Close(pong_out);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_Close failed\n");
+ exit(1);
+ }
+}
+
+int main()
+{
+ PRStatus status;
+ PRThread *pongThread;
+ char buf[1024];
+ PRInt32 nBytes;
+ int idx;
+
+ status = PR_CreatePipe(&ping_in, &pong_out);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_CreatePipe failed\n");
+ exit(1);
+ }
+ status = PR_CreatePipe(&pong_in, &ping_out);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_CreatePipe failed\n");
+ exit(1);
+ }
- strcpy(buf, SPANISH_GREETING);
- len = strlen(buf) + 1;
- if (PR_Write(writePipe, buf, len) < len) {
- fprintf(stderr, "write failed\n");
- return 1;
+ pongThread = PR_CreateThread(PR_USER_THREAD, PongThreadFunc, NULL,
+ PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0);
+ if (pongThread == NULL) {
+ fprintf(stderr, "PR_CreateThread failed\n");
+ exit(1);
+ }
+
+ for (idx = 0; idx < NUM_ITERATIONS; idx++) {
+ strcpy(buf, "ping");
+ printf("ping thread: sending \"%s\"\n", buf);
+ nBytes = PR_Write(ping_out, buf, 5);
+ if (nBytes == -1) {
+ fprintf(stderr, "PR_Write failed: (%d, %d)\n", PR_GetError(),
+ PR_GetOSError());
+ exit(1);
}
memset(buf, 0, sizeof(buf));
- if (PR_Read(readPipe, buf, sizeof(buf)) == -1) {
- fprintf(stderr, "read failed: (%d, %d)\n",
- PR_GetError(), PR_GetOSError());
- return 1;
+ nBytes = PR_Read(ping_in, buf, sizeof(buf));
+ if (nBytes == -1) {
+ fprintf(stderr, "PR_Read failed\n");
+ exit(1);
}
- if (strcmp(buf, SPANISH_GREETING) != 0) {
- fprintf(stderr, "expected \"%s\" but got \"%s\"\n",
- SPANISH_GREETING, buf);
- return 1;
+ printf("ping thread: received \"%s\"\n", buf);
+ if (nBytes != 5) {
+ fprintf(stderr, "ping thread: expected 5 bytes but got %d bytes\n",
+ nBytes);
+ exit(1);
+ }
+ if (strcmp(buf, "pong") != 0) {
+ fprintf(stderr, "ping thread: expected \"pong\" but got \"%s\"\n",
+ buf);
+ exit(1);
}
}
- if (PR_Close(readPipe) == PR_FAILURE) {
- fprintf(stderr, "close failed\n");
- return 1;
+ status = PR_Close(ping_in);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_Close failed\n");
+ exit(1);
+ }
+ status = PR_Close(ping_out);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_Close failed\n");
+ exit(1);
}
- if (PR_Close(writePipe) == PR_FAILURE) {
- fprintf(stderr, "close failed\n");
- return 1;
+ status = PR_JoinThread(pongThread);
+ if (status == PR_FAILURE) {
+ fprintf(stderr, "PR_JoinThread failed\n");
+ exit(1);
}
+
printf("PASS\n");
return 0;
}