summaryrefslogtreecommitdiffstats
path: root/tests/filesys/extended/dir-rm-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/filesys/extended/dir-rm-tree.c')
-rw-r--r--tests/filesys/extended/dir-rm-tree.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/filesys/extended/dir-rm-tree.c b/tests/filesys/extended/dir-rm-tree.c
new file mode 100644
index 0000000..bab41a6
--- /dev/null
+++ b/tests/filesys/extended/dir-rm-tree.c
@@ -0,0 +1,62 @@
1/* Creates directories /0/0/0 through /3/2/2 and files in the
2 leaf directories, then removes them. */
3
4#include <stdarg.h>
5#include <stdio.h>
6#include <syscall.h>
7#include "tests/filesys/extended/mk-tree.h"
8#include "tests/lib.h"
9#include "tests/main.h"
10
11static void remove_tree (int at, int bt, int ct, int dt);
12
13void
14test_main (void)
15{
16 make_tree (4, 3, 3, 4);
17 remove_tree (4, 3, 3, 4);
18}
19
20static void do_remove (const char *format, ...) PRINTF_FORMAT (1, 2);
21
22static void
23remove_tree (int at, int bt, int ct, int dt)
24{
25 char try[128];
26 int a, b, c, d;
27
28 msg ("removing /0/0/0/0 through /%d/%d/%d/%d...",
29 at - 1, bt - 1, ct - 1, dt - 1);
30 quiet = true;
31 for (a = 0; a < at; a++)
32 {
33 for (b = 0; b < bt; b++)
34 {
35 for (c = 0; c < ct; c++)
36 {
37 for (d = 0; d < dt; d++)
38 do_remove ("/%d/%d/%d/%d", a, b, c, d);
39 do_remove ("/%d/%d/%d", a, b, c);
40 }
41 do_remove ("/%d/%d", a, b);
42 }
43 do_remove ("/%d", a);
44 }
45 quiet = false;
46
47 snprintf (try, sizeof (try), "/%d/%d/%d/%d", at - 1, 0, ct - 1, 0);
48 CHECK (open (try) == -1, "open \"%s\" (must return -1)", try);
49}
50
51static void
52do_remove (const char *format, ...)
53{
54 char name[128];
55 va_list args;
56
57 va_start (args, format);
58 vsnprintf (name, sizeof name, format, args);
59 va_end (args);
60
61 CHECK (remove (name), "remove \"%s\"", name);
62}