radix: Implement radix_tree_destroy()
[akaros.git] / user / utest / file-posix.c
index 99a1b71..1aab4fe 100644 (file)
@@ -10,6 +10,7 @@
 #include <dirent.h>
 #include <stdlib.h>
 #include <string.h>
+#include <parlib/parlib.h>
 
 #include <utest/utest.h>
 
@@ -30,10 +31,55 @@ bool test_openat(void)
        return TRUE;
 }
 
+/* This tests opening a lot of files, enough to grow our file/chan table, then
+ * forking/spawning with DUP_FGRP.  It caused a panic at one point. */
+bool test_open_lots_and_spawn(void)
+{
+       char *p_argv[] = {0, 0, 0};
+       char *p_envp[] = {"LD_LIBRARY_PATH=/lib", 0};
+       #define NR_LOOPS 128
+       int fd[NR_LOOPS];
+       int pid;
+       const char *filename = "/bin/hello";
+
+       /* the kernel-internal number is 32 at the moment. */
+       for (int i = 0; i < NR_LOOPS; i++) {
+               fd[i] = open("hello.txt", O_RDONLY);
+               UT_ASSERT(fd[i] >= 0);
+       }
+       pid = sys_proc_create(filename, strlen(filename), p_argv, p_envp,
+                             PROC_DUP_FGRP);
+       UT_ASSERT(pid > 0);
+       sys_proc_destroy(pid, 0);
+       for (int i = 0; i < NR_LOOPS; i++)
+               close(fd[i]);
+       return TRUE;
+}
+
+bool test_pipe_dup2(void)
+{
+       int pipefd[2];
+       int ret;
+
+       ret = pipe(pipefd);
+       UT_ASSERT(!ret);
+       ret = dup2(pipefd[0], 100);
+       UT_ASSERT(ret == 100);
+       ret = close(100);
+       UT_ASSERT(!ret);
+       ret = close(pipefd[0]);
+       UT_ASSERT(!ret);
+       ret = close(pipefd[1]);
+       UT_ASSERT(!ret);
+       return TRUE;
+}
+
 /* <--- End definition of test cases ---> */
 
 struct utest utests[] = {
        UTEST_REG(openat),
+       UTEST_REG(open_lots_and_spawn),
+       UTEST_REG(pipe_dup2),
 };
 int num_utests = sizeof(utests) / sizeof(struct utest);