14 func NewTempOsBaseFs(t *testing.T) Fs {
15 name, err := TempDir(NewOsFs(), "", "")
17 t.Error("error creating tempDir", err)
20 tempDirs = append(tempDirs, name)
22 return NewBasePathFs(NewOsFs(), name)
25 func CleanupTempDirs(t *testing.T) {
34 for _, x := range tempDirs {
35 err := osfs.RemoveAll(x)
37 errs = append(errs, ev{path: x, e: err})
41 for _, e := range errs {
42 fmt.Println("error removing tempDir", e.path, e.e)
46 t.Error("error cleaning up tempDirs")
51 func TestUnionCreateExisting(t *testing.T) {
53 roBase := &ReadOnlyFs{source: base}
55 ufs := NewCopyOnWriteFs(roBase, &MemMapFs{})
57 base.MkdirAll("/home/test", 0777)
58 fh, _ := base.Create("/home/test/file.txt")
59 fh.WriteString("This is a test")
62 fh, err := ufs.OpenFile("/home/test/file.txt", os.O_RDWR, 0666)
64 t.Errorf("Failed to open file r/w: %s", err)
67 _, err = fh.Write([]byte("####"))
69 t.Errorf("Failed to write file: %s", err)
72 data, err := ioutil.ReadAll(fh)
74 t.Errorf("Failed to read file: %s", err)
76 if string(data) != "#### is a test" {
77 t.Errorf("Got wrong data")
81 fh, _ = base.Open("/home/test/file.txt")
82 data, err = ioutil.ReadAll(fh)
83 if string(data) != "This is a test" {
84 t.Errorf("Got wrong data in base file")
88 fh, err = ufs.Create("/home/test/file.txt")
91 if fi, _ := fh.Stat(); fi.Size() != 0 {
92 t.Errorf("Create did not truncate file")
96 t.Errorf("Create failed on existing file")
101 func TestUnionMergeReaddir(t *testing.T) {
103 roBase := &ReadOnlyFs{source: base}
105 ufs := &CopyOnWriteFs{base: roBase, layer: &MemMapFs{}}
107 base.MkdirAll("/home/test", 0777)
108 fh, _ := base.Create("/home/test/file.txt")
109 fh.WriteString("This is a test")
112 fh, _ = ufs.Create("/home/test/file2.txt")
113 fh.WriteString("This is a test")
116 fh, _ = ufs.Open("/home/test")
117 files, err := fh.Readdirnames(-1)
119 t.Errorf("Readdirnames failed")
122 t.Errorf("Got wrong number of files: %v", files)
126 func TestExistingDirectoryCollisionReaddir(t *testing.T) {
128 roBase := &ReadOnlyFs{source: base}
129 overlay := &MemMapFs{}
131 ufs := &CopyOnWriteFs{base: roBase, layer: overlay}
133 base.MkdirAll("/home/test", 0777)
134 fh, _ := base.Create("/home/test/file.txt")
135 fh.WriteString("This is a test")
138 overlay.MkdirAll("home/test", 0777)
139 fh, _ = overlay.Create("/home/test/file2.txt")
140 fh.WriteString("This is a test")
143 fh, _ = ufs.Create("/home/test/file3.txt")
144 fh.WriteString("This is a test")
147 fh, _ = ufs.Open("/home/test")
148 files, err := fh.Readdirnames(-1)
150 t.Errorf("Readdirnames failed")
153 t.Errorf("Got wrong number of files in union: %v", files)
156 fh, _ = overlay.Open("/home/test")
157 files, err = fh.Readdirnames(-1)
159 t.Errorf("Readdirnames failed")
162 t.Errorf("Got wrong number of files in overlay: %v", files)
166 func TestNestedDirBaseReaddir(t *testing.T) {
168 roBase := &ReadOnlyFs{source: base}
169 overlay := &MemMapFs{}
171 ufs := &CopyOnWriteFs{base: roBase, layer: overlay}
173 base.MkdirAll("/home/test/foo/bar", 0777)
174 fh, _ := base.Create("/home/test/file.txt")
175 fh.WriteString("This is a test")
178 fh, _ = base.Create("/home/test/foo/file2.txt")
179 fh.WriteString("This is a test")
181 fh, _ = base.Create("/home/test/foo/bar/file3.txt")
182 fh.WriteString("This is a test")
185 overlay.MkdirAll("/", 0777)
187 // Opening something only in the base
188 fh, _ = ufs.Open("/home/test/foo")
189 list, err := fh.Readdir(-1)
191 t.Errorf("Readdir failed %s", err)
194 for _, x := range list {
195 fmt.Println(x.Name())
197 t.Errorf("Got wrong number of files in union: %v", len(list))
201 func TestNestedDirOverlayReaddir(t *testing.T) {
203 roBase := &ReadOnlyFs{source: base}
204 overlay := &MemMapFs{}
206 ufs := &CopyOnWriteFs{base: roBase, layer: overlay}
208 base.MkdirAll("/", 0777)
209 overlay.MkdirAll("/home/test/foo/bar", 0777)
210 fh, _ := overlay.Create("/home/test/file.txt")
211 fh.WriteString("This is a test")
213 fh, _ = overlay.Create("/home/test/foo/file2.txt")
214 fh.WriteString("This is a test")
216 fh, _ = overlay.Create("/home/test/foo/bar/file3.txt")
217 fh.WriteString("This is a test")
220 // Opening nested dir only in the overlay
221 fh, _ = ufs.Open("/home/test/foo")
222 list, err := fh.Readdir(-1)
224 t.Errorf("Readdir failed %s", err)
227 for _, x := range list {
228 fmt.Println(x.Name())
230 t.Errorf("Got wrong number of files in union: %v", len(list))
234 func TestNestedDirOverlayOsFsReaddir(t *testing.T) {
235 defer CleanupTempDirs(t)
236 base := NewTempOsBaseFs(t)
237 roBase := &ReadOnlyFs{source: base}
238 overlay := NewTempOsBaseFs(t)
240 ufs := &CopyOnWriteFs{base: roBase, layer: overlay}
242 base.MkdirAll("/", 0777)
243 overlay.MkdirAll("/home/test/foo/bar", 0777)
244 fh, _ := overlay.Create("/home/test/file.txt")
245 fh.WriteString("This is a test")
247 fh, _ = overlay.Create("/home/test/foo/file2.txt")
248 fh.WriteString("This is a test")
250 fh, _ = overlay.Create("/home/test/foo/bar/file3.txt")
251 fh.WriteString("This is a test")
254 // Opening nested dir only in the overlay
255 fh, _ = ufs.Open("/home/test/foo")
256 list, err := fh.Readdir(-1)
259 t.Errorf("Readdir failed %s", err)
262 for _, x := range list {
263 fmt.Println(x.Name())
265 t.Errorf("Got wrong number of files in union: %v", len(list))
269 func TestCopyOnWriteFsWithOsFs(t *testing.T) {
270 defer CleanupTempDirs(t)
271 base := NewTempOsBaseFs(t)
272 roBase := &ReadOnlyFs{source: base}
273 overlay := NewTempOsBaseFs(t)
275 ufs := &CopyOnWriteFs{base: roBase, layer: overlay}
277 base.MkdirAll("/home/test", 0777)
278 fh, _ := base.Create("/home/test/file.txt")
279 fh.WriteString("This is a test")
282 overlay.MkdirAll("home/test", 0777)
283 fh, _ = overlay.Create("/home/test/file2.txt")
284 fh.WriteString("This is a test")
287 fh, _ = ufs.Create("/home/test/file3.txt")
288 fh.WriteString("This is a test")
291 fh, _ = ufs.Open("/home/test")
292 files, err := fh.Readdirnames(-1)
295 t.Errorf("Readdirnames failed")
298 t.Errorf("Got wrong number of files in union: %v", files)
301 fh, _ = overlay.Open("/home/test")
302 files, err = fh.Readdirnames(-1)
305 t.Errorf("Readdirnames failed")
308 t.Errorf("Got wrong number of files in overlay: %v", files)
312 func TestUnionCacheWrite(t *testing.T) {
316 ufs := NewCacheOnReadFs(base, layer, 0)
318 base.Mkdir("/data", 0777)
320 fh, err := ufs.Create("/data/file.txt")
322 t.Errorf("Failed to create file")
324 _, err = fh.Write([]byte("This is a test"))
326 t.Errorf("Failed to write file")
329 fh.Seek(0, os.SEEK_SET)
330 buf := make([]byte, 4)
331 _, err = fh.Read(buf)
332 fh.Write([]byte(" IS A"))
335 baseData, _ := ReadFile(base, "/data/file.txt")
336 layerData, _ := ReadFile(layer, "/data/file.txt")
337 if string(baseData) != string(layerData) {
338 t.Errorf("Different data: %s <=> %s", baseData, layerData)
342 func TestUnionCacheExpire(t *testing.T) {
345 ufs := &CacheOnReadFs{base: base, layer: layer, cacheTime: 1 * time.Second}
347 base.Mkdir("/data", 0777)
349 fh, err := ufs.Create("/data/file.txt")
351 t.Errorf("Failed to create file")
353 _, err = fh.Write([]byte("This is a test"))
355 t.Errorf("Failed to write file")
359 fh, _ = base.Create("/data/file.txt")
360 // sleep some time, so we really get a different time.Now() on write...
361 time.Sleep(2 * time.Second)
362 fh.WriteString("Another test")
365 data, _ := ReadFile(ufs, "/data/file.txt")
366 if string(data) != "Another test" {
367 t.Errorf("cache time failed: <%s>", data)
371 func TestCacheOnReadFsNotInLayer(t *testing.T) {
372 base := NewMemMapFs()
373 layer := NewMemMapFs()
374 fs := NewCacheOnReadFs(base, layer, 0)
376 fh, err := base.Create("/file.txt")
378 t.Fatal("unable to create file: ", err)
381 txt := []byte("This is a test")
385 fh, err = fs.Open("/file.txt")
387 t.Fatal("could not open file: ", err)
390 b, err := ReadAll(fh)
394 t.Fatal("could not read file: ", err)
395 } else if !bytes.Equal(txt, b) {
396 t.Fatalf("wanted file text %q, got %q", txt, b)
399 fh, err = layer.Open("/file.txt")
401 t.Fatal("could not open file from layer: ", err)