blob: 2790d98931d4c1eb8118cc0b78f155b6d0668e40 [file] [log] [blame]
Russ Cox66f5e892009-05-15 14:11:24 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Russ Cox3b864e42009-08-12 13:18:37 -07005package os_test
Russ Cox66f5e892009-05-15 14:11:24 -07006
7import (
Russ Cox3b864e42009-08-12 13:18:37 -07008 . "os";
Russ Cox66f5e892009-05-15 14:11:24 -07009 "testing";
10)
11
12func TestMkdirAll(t *testing.T) {
13 // Create new dir, in _obj so it will get
14 // cleaned up by make if not by us.
15 path := "_obj/_TestMkdirAll_/dir/./dir2";
16 err := MkdirAll(path, 0777);
17 if err != nil {
18 t.Fatalf("MkdirAll %q: %s", path, err);
19 }
20
21 // Already exists, should succeed.
22 err = MkdirAll(path, 0777);
23 if err != nil {
24 t.Fatalf("MkdirAll %q (second time): %s", path, err);
25 }
26
27 // Make file.
28 fpath := path + "/file";
Russ Cox04960402009-08-10 22:02:51 -070029 fd, err := Open(fpath, O_WRONLY | O_CREAT, 0666);
Russ Cox66f5e892009-05-15 14:11:24 -070030 if err != nil {
31 t.Fatalf("create %q: %s", fpath, err);
32 }
33
34 // Can't make directory named after file.
35 err = MkdirAll(fpath, 0777);
36 if err == nil {
37 t.Fatalf("MkdirAll %q: no error");
38 }
39 perr, ok := err.(*PathError);
40 if !ok {
41 t.Fatalf("MkdirAll %q returned %T, not *PathError", fpath, err);
42 }
43 if perr.Path != fpath {
44 t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", fpath, perr.Path, fpath);
45 }
46
47 // Can't make subdirectory of file.
48 ffpath := fpath + "/subdir";
49 err = MkdirAll(ffpath, 0777);
50 if err == nil {
51 t.Fatalf("MkdirAll %q: no error");
52 }
53 perr, ok = err.(*PathError);
54 if !ok {
55 t.Fatalf("MkdirAll %q returned %T, not *PathError", ffpath, err);
56 }
57 if perr.Path != fpath {
58 t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", ffpath, perr.Path, fpath);
59 }
60
61 RemoveAll("_obj/_TestMkdirAll_");
62}
63
64func TestRemoveAll(t *testing.T) {
65 // Work directory.
66 path := "_obj/_TestRemoveAll_";
67 fpath := path + "/file";
68 dpath := path + "/dir";
69
70 // Make directory with 1 file and remove.
71 if err := MkdirAll(path, 0777); err != nil {
72 t.Fatalf("MkdirAll %q: %s", path, err);
73 }
Russ Cox04960402009-08-10 22:02:51 -070074 fd, err := Open(fpath, O_WRONLY | O_CREAT, 0666);
Russ Cox66f5e892009-05-15 14:11:24 -070075 if err != nil {
76 t.Fatalf("create %q: %s", fpath, err);
77 }
78 fd.Close();
79 if err = RemoveAll(path); err != nil {
80 t.Fatalf("RemoveAll %q (first): %s", path, err);
81 }
Russ Cox04960402009-08-10 22:02:51 -070082 if dir, err := Lstat(path); err == nil {
Russ Cox66f5e892009-05-15 14:11:24 -070083 t.Fatalf("Lstat %q succeeded after RemoveAll (first)", path);
84 }
85
86 // Make directory with file and subdirectory and remove.
87 if err = MkdirAll(dpath, 0777); err != nil {
88 t.Fatalf("MkdirAll %q: %s", dpath, err);
89 }
Russ Cox04960402009-08-10 22:02:51 -070090 fd, err = Open(fpath, O_WRONLY | O_CREAT, 0666);
Russ Cox66f5e892009-05-15 14:11:24 -070091 if err != nil {
92 t.Fatalf("create %q: %s", fpath, err);
93 }
94 fd.Close();
Russ Cox04960402009-08-10 22:02:51 -070095 fd, err = Open(dpath+"/file", O_WRONLY | O_CREAT, 0666);
Russ Cox66f5e892009-05-15 14:11:24 -070096 if err != nil {
97 t.Fatalf("create %q: %s", fpath, err);
98 }
99 fd.Close();
100 if err = RemoveAll(path); err != nil {
101 t.Fatalf("RemoveAll %q (second): %s", path, err);
102 }
Russ Cox04960402009-08-10 22:02:51 -0700103 if dir, err := Lstat(path); err == nil {
Russ Cox66f5e892009-05-15 14:11:24 -0700104 t.Fatalf("Lstat %q succeeded after RemoveAll (second)", path);
105 }
106
107 // Make directory with file and subdirectory and trigger error.
108 if err = MkdirAll(dpath, 0777); err != nil {
109 t.Fatalf("MkdirAll %q: %s", dpath, err);
110 }
111
Russ Cox55e790a2009-07-01 07:32:04 -0700112 for i, s := range []string{fpath, dpath+"/file1", path+"/zzz"} {
Russ Cox04960402009-08-10 22:02:51 -0700113 fd, err = Open(s, O_WRONLY | O_CREAT, 0666);
Russ Cox66f5e892009-05-15 14:11:24 -0700114 if err != nil {
115 t.Fatalf("create %q: %s", s, err);
116 }
117 fd.Close();
118 }
Russ Cox04960402009-08-10 22:02:51 -0700119 if err = Chmod(dpath, 0); err != nil {
Russ Cox66f5e892009-05-15 14:11:24 -0700120 t.Fatalf("Chmod %q 0: %s", dpath, err);
121 }
122 if err = RemoveAll(path); err == nil {
123 dir, err := Lstat(path);
124 if err == nil {
125 t.Errorf("Can lstat %q after supposed RemoveAll", path);
126 }
127 t.Fatalf("RemoveAll %q succeeded with chmod 0 subdirectory", path, err);
128 }
129 perr, ok := err.(*PathError);
130 if !ok {
131 t.Fatalf("RemoveAll %q returned %T not *PathError", path, err);
132 }
133 if perr.Path != dpath {
134 t.Fatalf("RemoveAll %q failed at %q not %q", path, perr.Path, dpath);
135 }
Russ Cox04960402009-08-10 22:02:51 -0700136 if err = Chmod(dpath, 0777); err != nil {
Russ Cox66f5e892009-05-15 14:11:24 -0700137 t.Fatalf("Chmod %q 0777: %s", dpath, err);
138 }
139 for i, s := range []string{fpath, path+"/zzz"} {
Russ Cox04960402009-08-10 22:02:51 -0700140 if dir, err := Lstat(s); err == nil {
Russ Cox66f5e892009-05-15 14:11:24 -0700141 t.Fatalf("Lstat %q succeeded after partial RemoveAll", s);
142 }
143 }
144 if err = RemoveAll(path); err != nil {
145 t.Fatalf("RemoveAll %q after partial RemoveAll: %s", path, err);
146 }
Russ Cox04960402009-08-10 22:02:51 -0700147 if dir, err := Lstat(path); err == nil {
Russ Cox66f5e892009-05-15 14:11:24 -0700148 t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path);
149 }
150}