Make tests public. Rewrite most tests. Add tests.
[pintos-anon] / src / tests / filesys / extended / dir-rm-tree.c
diff --git a/src/tests/filesys/extended/dir-rm-tree.c b/src/tests/filesys/extended/dir-rm-tree.c
new file mode 100644 (file)
index 0000000..c4186f9
--- /dev/null
@@ -0,0 +1,59 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <syscall.h>
+#include "tests/filesys/extended/mk-tree.h"
+#include "tests/lib.h"
+#include "tests/main.h"
+
+static void remove_tree (int at, int bt, int ct, int dt);
+
+void
+test_main (void) 
+{
+  make_tree (4, 3, 3, 4);
+  remove_tree (4, 3, 3, 4);
+}
+
+static void do_remove (const char *format, ...) PRINTF_FORMAT (1, 2);
+
+static void
+remove_tree (int at, int bt, int ct, int dt) 
+{
+  char try[128];
+  int a, b, c, d;
+
+  msg ("removing /0/0/0/0 through /%d/%d/%d/%d...",
+       at - 1, bt - 1, ct - 1, dt - 1);
+  quiet = true;
+  for (a = 0; a < at; a++) 
+    {
+      for (b = 0; b < bt; b++) 
+        {
+          for (c = 0; c < ct; c++) 
+            {
+              for (d = 0; d < dt; d++)
+                do_remove ("/%d/%d/%d/%d", a, b, c, d);
+              do_remove ("/%d/%d/%d", a, b, c);
+            }
+          do_remove ("/%d/%d", a, b);
+        }
+      do_remove ("/%d", a);
+    }
+  quiet = false;
+
+  snprintf (try, sizeof (try), "/%d/%d/%d/%d", at - 1, 0, ct - 1, 0);
+  CHECK (open (try) == -1, "open \"%s\" (must return -1)", try);
+}
+
+static void
+do_remove (const char *format, ...) 
+{
+  char name[128];
+  va_list args;
+
+  va_start (args, format);
+  vsnprintf (name, sizeof name, format, args);
+  va_end (args);
+
+  CHECK (remove (name), "remove \"%s\"", name);
+}