1 package afero
2
3 import (
4 "os"
5 "path/filepath"
6 "runtime"
7 "testing"
8 )
9
10 func TestBasePath(t *testing.T) {
11 baseFs := &MemMapFs{}
12 baseFs.MkdirAll("/base/path/tmp", 0o777)
13 bp := NewBasePathFs(baseFs, "/base/path")
14
15 if _, err := bp.Create("/tmp/foo"); err != nil {
16 t.Errorf("Failed to set real path")
17 }
18
19 if fh, err := bp.Create("../tmp/bar"); err == nil {
20 t.Errorf("succeeded in creating %s ...", fh.Name())
21 }
22 }
23
24 func TestBasePathRoot(t *testing.T) {
25 baseFs := &MemMapFs{}
26 baseFs.MkdirAll("/base/path/foo/baz", 0o777)
27 baseFs.MkdirAll("/base/path/boo/", 0o777)
28 bp := NewBasePathFs(baseFs, "/base/path")
29
30 rd, err := ReadDir(bp, string(os.PathSeparator))
31
32 if len(rd) != 2 {
33 t.Errorf("base path doesn't respect root")
34 }
35
36 if err != nil {
37 t.Error(err)
38 }
39 }
40
41 func TestRealPath(t *testing.T) {
42 fs := NewOsFs()
43 baseDir, err := TempDir(fs, "", "base")
44 if err != nil {
45 t.Fatal("error creating tempDir", err)
46 }
47 defer fs.RemoveAll(baseDir)
48 anotherDir, err := TempDir(fs, "", "another")
49 if err != nil {
50 t.Fatal("error creating tempDir", err)
51 }
52 defer fs.RemoveAll(anotherDir)
53
54 bp := NewBasePathFs(fs, baseDir).(*BasePathFs)
55
56 subDir := filepath.Join(baseDir, "s1")
57
58 realPath, err := bp.RealPath("/s1")
59 if err != nil {
60 t.Errorf("Got error %s", err)
61 }
62
63 if realPath != subDir {
64 t.Errorf("Expected \n%s got \n%s", subDir, realPath)
65 }
66
67 if runtime.GOOS == "windows" {
68 _, err = bp.RealPath(anotherDir)
69
70 if err != os.ErrNotExist {
71 t.Errorf("Expected os.ErrNotExist")
72 }
73
74 } else {
75
76
77
78 surrealPath, err := bp.RealPath(anotherDir)
79 if err != nil {
80 t.Errorf("Got error %s", err)
81 }
82
83 excpected := filepath.Join(baseDir, anotherDir)
84
85 if surrealPath != excpected {
86 t.Errorf("Expected \n%s got \n%s", excpected, surrealPath)
87 }
88 }
89 }
90
91 func TestNestedBasePaths(t *testing.T) {
92 type dirSpec struct {
93 Dir1, Dir2, Dir3 string
94 }
95 dirSpecs := []dirSpec{
96 {Dir1: "/", Dir2: "/", Dir3: "/"},
97 {Dir1: "/", Dir2: "/path2", Dir3: "/"},
98 {Dir1: "/path1/dir", Dir2: "/path2/dir/", Dir3: "/path3/dir"},
99 {Dir1: "C:/path1", Dir2: "path2/dir", Dir3: "/path3/dir/"},
100 }
101
102 for _, ds := range dirSpecs {
103 memFs := NewMemMapFs()
104 level1Fs := NewBasePathFs(memFs, ds.Dir1)
105 level2Fs := NewBasePathFs(level1Fs, ds.Dir2)
106 level3Fs := NewBasePathFs(level2Fs, ds.Dir3)
107
108 type spec struct {
109 BaseFs Fs
110 FileName string
111 }
112 specs := []spec{
113 {BaseFs: level3Fs, FileName: "f.txt"},
114 {BaseFs: level2Fs, FileName: "f.txt"},
115 {BaseFs: level1Fs, FileName: "f.txt"},
116 }
117
118 for _, s := range specs {
119 if err := s.BaseFs.MkdirAll(s.FileName, 0o755); err != nil {
120 t.Errorf("Got error %s", err.Error())
121 }
122 if _, err := s.BaseFs.Stat(s.FileName); err != nil {
123 t.Errorf("Got error %s", err.Error())
124 }
125
126 if s.BaseFs == level3Fs {
127 pathToExist := filepath.Join(ds.Dir3, s.FileName)
128 if _, err := level2Fs.Stat(pathToExist); err != nil {
129 t.Errorf("Got error %s (path %s)", err.Error(), pathToExist)
130 }
131 } else if s.BaseFs == level2Fs {
132 pathToExist := filepath.Join(ds.Dir2, ds.Dir3, s.FileName)
133 if _, err := level1Fs.Stat(pathToExist); err != nil {
134 t.Errorf("Got error %s (path %s)", err.Error(), pathToExist)
135 }
136 }
137 }
138 }
139 }
140
141 func TestBasePathOpenFile(t *testing.T) {
142 baseFs := &MemMapFs{}
143 baseFs.MkdirAll("/base/path/tmp", 0o777)
144 bp := NewBasePathFs(baseFs, "/base/path")
145 f, err := bp.OpenFile("/tmp/file.txt", os.O_CREATE, 0o600)
146 if err != nil {
147 t.Fatalf("failed to open file: %v", err)
148 }
149 if filepath.Dir(f.Name()) != filepath.Clean("/tmp") {
150 t.Fatalf("realpath leaked: %s", f.Name())
151 }
152 }
153
154 func TestBasePathCreate(t *testing.T) {
155 baseFs := &MemMapFs{}
156 baseFs.MkdirAll("/base/path/tmp", 0o777)
157 bp := NewBasePathFs(baseFs, "/base/path")
158 f, err := bp.Create("/tmp/file.txt")
159 if err != nil {
160 t.Fatalf("failed to create file: %v", err)
161 }
162 if filepath.Dir(f.Name()) != filepath.Clean("/tmp") {
163 t.Fatalf("realpath leaked: %s", f.Name())
164 }
165 }
166
167 func TestBasePathTempFile(t *testing.T) {
168 baseFs := &MemMapFs{}
169 baseFs.MkdirAll("/base/path/tmp", 0o777)
170 bp := NewBasePathFs(baseFs, "/base/path")
171
172 tDir, err := TempDir(bp, "/tmp", "")
173 if err != nil {
174 t.Fatalf("Failed to TempDir: %v", err)
175 }
176 if filepath.Dir(tDir) != filepath.Clean("/tmp") {
177 t.Fatalf("Tempdir realpath leaked: %s", tDir)
178 }
179 tempFile, err := TempFile(bp, tDir, "")
180 if err != nil {
181 t.Fatalf("Failed to TempFile: %v", err)
182 }
183 defer tempFile.Close()
184 if expected, actual := tDir, filepath.Dir(tempFile.Name()); expected != actual {
185 t.Fatalf("TempFile realpath leaked: expected %s, got %s", expected, actual)
186 }
187 }
188
View as plain text