From 8da0f7c04d3005f50d13d799a395d0ed8bad95ec Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Sun, 10 Jul 2022 23:32:22 +0200
Subject: init/tests: semaphore pipe-based test

---
 src/init/tests/semaphore.c | 87 ++++++++++++++++++++++++++++------------------
 1 file changed, 53 insertions(+), 34 deletions(-)

diff --git a/src/init/tests/semaphore.c b/src/init/tests/semaphore.c
index e542f0b..cb47d41 100644
--- a/src/init/tests/semaphore.c
+++ b/src/init/tests/semaphore.c
@@ -5,66 +5,85 @@
 #include <shared/flags.h>
 #include <shared/syscalls.h>
 
-static void odd(struct evil_sem *sem1, struct evil_sem *sem2) {
-	printf("1");
+static void odd(handle_t out, struct evil_sem *sem1, struct evil_sem *sem2) {
+	_syscall_write(out, "1", 1, -1);
 	esem_signal(sem1);
 
 	esem_wait(sem2);
-	printf("3");
+	_syscall_write(out, "3", 1, -1);
 	esem_signal(sem1);
 
 	esem_wait(sem2);
-	printf("5");
+	_syscall_write(out, "5", 1, -1);
 	esem_signal(sem1);
 }
 
-static void even(struct evil_sem *sem1, struct evil_sem *sem2) {
+static void even(handle_t out, struct evil_sem *sem1, struct evil_sem *sem2) {
 	esem_wait(sem1);
-	printf("2");
+	_syscall_write(out, "2", 1, -1);
 	esem_signal(sem2);
 
 	esem_wait(sem1);
-	printf("4");
+	_syscall_write(out, "4", 1, -1);
 	esem_signal(sem2);
 
 	esem_wait(sem1);
-	printf("6");
+	_syscall_write(out, "6", 1, -1);
 	esem_signal(sem2);
 }
 
 void test_semaphore(void) {
 	struct evil_sem *sem1, *sem2;
+	handle_t pipe[2];
+	assert(_syscall_pipe(pipe, 0) >= 0);
 
-	// TODO pipe-based test
-
-	sem1 = esem_new(0);
-	sem2 = esem_new(0);
-	assert(sem1 && sem2);
 	if (!_syscall_fork(0, NULL)) {
-		odd(sem1, sem2);
-		_syscall_exit(69);
-	} else {
-		even(sem1, sem2);
-		assert(_syscall_await() == 69);
-	}
-	esem_free(sem1);
-	esem_free(sem2);
+		sem1 = esem_new(0);
+		sem2 = esem_new(0);
+		assert(sem1 && sem2);
+		if (!_syscall_fork(0, NULL)) {
+			odd(pipe[1], sem1, sem2);
+			_syscall_exit(69);
+		} else {
+			even(pipe[1], sem1, sem2);
+			assert(_syscall_await() == 69);
+		}
+		esem_free(sem1);
+		esem_free(sem2);
 
-	printf("\n");
+		_syscall_write(pipe[1], "|", 1, -1);
 
-	sem1 = esem_new(0);
-	sem2 = esem_new(0);
-	assert(sem1 && sem2);
-	if (!_syscall_fork(0, NULL)) {
-		even(sem1, sem2);
-		_syscall_exit(69);
+		sem1 = esem_new(0);
+		sem2 = esem_new(0);
+		assert(sem1 && sem2);
+		if (!_syscall_fork(0, NULL)) {
+			even(pipe[1], sem1, sem2);
+			_syscall_exit(69);
+		} else {
+			odd(pipe[1], sem1, sem2);
+			assert(_syscall_await() == 69);
+			_syscall_await();
+		}
+		esem_free(sem1);
+		esem_free(sem2);
+
+		_syscall_exit(0);
 	} else {
-		odd(sem1, sem2);
-		assert(_syscall_await() == 69);
+		_syscall_close(pipe[1]);
+
+		char buf[16];
+		size_t pos = 0;
+		for (;;) {
+			int ret = _syscall_read(pipe[0], buf + pos, sizeof(buf) - pos, 0);
+			if (ret < 0) break;
+			pos += ret;
+		}
+		buf[pos] = '\0'; // idc about the "potential" overflow
+		if (strcmp(buf, "123456|123456")) {
+			printf("%s\n", buf);
+			test_fail();
+		}
+
 		_syscall_await();
 	}
-	esem_free(sem1);
-	esem_free(sem2);
-
-	printf("\n");
 }
-- 
cgit v1.2.3