Commit 060980b2 authored by Han-Wen Nienhuys's avatar Han-Wen Nienhuys

Drop CheckSuccess from rest of tests too.

parent ff72948e
...@@ -28,9 +28,11 @@ func (fs *cacheFs) Open(name string, flags uint32, context *Context) (fuseFile F ...@@ -28,9 +28,11 @@ func (fs *cacheFs) Open(name string, flags uint32, context *Context) (fuseFile F
} }
func setupCacheTest() (string, *PathNodeFs, func()) { func setupCacheTest(t *testing.T) (string, *PathNodeFs, func()) {
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
os.Mkdir(dir+"/mnt", 0755) os.Mkdir(dir+"/mnt", 0755)
os.Mkdir(dir+"/orig", 0755) os.Mkdir(dir+"/orig", 0755)
...@@ -39,7 +41,9 @@ func setupCacheTest() (string, *PathNodeFs, func()) { ...@@ -39,7 +41,9 @@ func setupCacheTest() (string, *PathNodeFs, func()) {
} }
pfs := NewPathNodeFs(fs, nil) pfs := NewPathNodeFs(fs, nil)
state, conn, err := MountNodeFileSystem(dir+"/mnt", pfs, nil) state, conn, err := MountNodeFileSystem(dir+"/mnt", pfs, nil)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
conn.Debug = VerboseTest() conn.Debug = VerboseTest()
pfs.Debug = VerboseTest() pfs.Debug = VerboseTest()
...@@ -54,26 +58,34 @@ func setupCacheTest() (string, *PathNodeFs, func()) { ...@@ -54,26 +58,34 @@ func setupCacheTest() (string, *PathNodeFs, func()) {
} }
func TestCacheFs(t *testing.T) { func TestCacheFs(t *testing.T) {
wd, pathfs, clean := setupCacheTest() wd, pathfs, clean := setupCacheTest(t)
defer clean() defer clean()
content1 := "hello" content1 := "hello"
content2 := "qqqq" content2 := "qqqq"
err := ioutil.WriteFile(wd+"/orig/file.txt", []byte(content1), 0644) err := ioutil.WriteFile(wd+"/orig/file.txt", []byte(content1), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
c, err := ioutil.ReadFile(wd + "/mnt/file.txt") c, err := ioutil.ReadFile(wd + "/mnt/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if string(c) != "hello" { if string(c) != "hello" {
t.Fatalf("expect 'hello' %q", string(c)) t.Fatalf("expect 'hello' %q", string(c))
} }
err = ioutil.WriteFile(wd+"/orig/file.txt", []byte(content2), 0644) err = ioutil.WriteFile(wd+"/orig/file.txt", []byte(content2), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
c, err = ioutil.ReadFile(wd + "/mnt/file.txt") c, err = ioutil.ReadFile(wd + "/mnt/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if string(c) != "hello" { if string(c) != "hello" {
t.Fatalf("Page cache skipped: expect 'hello' %q", string(c)) t.Fatalf("Page cache skipped: expect 'hello' %q", string(c))
...@@ -85,7 +97,9 @@ func TestCacheFs(t *testing.T) { ...@@ -85,7 +97,9 @@ func TestCacheFs(t *testing.T) {
} }
c, err = ioutil.ReadFile(wd + "/mnt/file.txt") c, err = ioutil.ReadFile(wd + "/mnt/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if string(c) != string(content2) { if string(c) != string(content2) {
t.Fatalf("Mismatch after notify expect '%s' %q", content2, string(c)) t.Fatalf("Mismatch after notify expect '%s' %q", content2, string(c))
} }
...@@ -121,18 +135,24 @@ func TestNonseekable(t *testing.T) { ...@@ -121,18 +135,24 @@ func TestNonseekable(t *testing.T) {
fs.Length = 200 * 1024 fs.Length = 200 * 1024
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("failed: %v", err)
}
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
nfs := NewPathNodeFs(fs, nil) nfs := NewPathNodeFs(fs, nil)
state, _, err := MountNodeFileSystem(dir, nfs, nil) state, _, err := MountNodeFileSystem(dir, nfs, nil)
CheckSuccess(err) if err != nil {
t.Fatalf("failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
defer state.Unmount() defer state.Unmount()
go state.Loop() go state.Loop()
f, err := os.Open(dir + "/file") f, err := os.Open(dir + "/file")
CheckSuccess(err) if err != nil {
t.Fatalf("failed: %v", err)
}
defer f.Close() defer f.Close()
b := make([]byte, 200) b := make([]byte, 200)
...@@ -144,7 +164,9 @@ func TestNonseekable(t *testing.T) { ...@@ -144,7 +164,9 @@ func TestNonseekable(t *testing.T) {
func TestGetAttrRace(t *testing.T) { func TestGetAttrRace(t *testing.T) {
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("failed: %v", err)
}
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
os.Mkdir(dir+"/mnt", 0755) os.Mkdir(dir+"/mnt", 0755)
os.Mkdir(dir+"/orig", 0755) os.Mkdir(dir+"/orig", 0755)
...@@ -153,7 +175,9 @@ func TestGetAttrRace(t *testing.T) { ...@@ -153,7 +175,9 @@ func TestGetAttrRace(t *testing.T) {
pfs := NewPathNodeFs(fs, nil) pfs := NewPathNodeFs(fs, nil)
state, conn, err := MountNodeFileSystem(dir+"/mnt", pfs, state, conn, err := MountNodeFileSystem(dir+"/mnt", pfs,
&FileSystemOptions{}) &FileSystemOptions{})
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
conn.Debug = VerboseTest() conn.Debug = VerboseTest()
pfs.Debug = VerboseTest() pfs.Debug = VerboseTest()
......
...@@ -8,10 +8,14 @@ import ( ...@@ -8,10 +8,14 @@ import (
func TestCopyFile(t *testing.T) { func TestCopyFile(t *testing.T) {
d1, err := ioutil.TempDir("", "go-fuse") d1, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
defer os.RemoveAll(d1) defer os.RemoveAll(d1)
d2, err := ioutil.TempDir("", "go-fuse") d2, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
defer os.RemoveAll(d2) defer os.RemoveAll(d2)
fs1 := NewLoopbackFileSystem(d1) fs1 := NewLoopbackFileSystem(d1)
...@@ -20,7 +24,9 @@ func TestCopyFile(t *testing.T) { ...@@ -20,7 +24,9 @@ func TestCopyFile(t *testing.T) {
content1 := "blabla" content1 := "blabla"
err = ioutil.WriteFile(d1+"/file", []byte(content1), 0644) err = ioutil.WriteFile(d1+"/file", []byte(content1), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
code := CopyFile(fs1, fs2, "file", "file", nil) code := CopyFile(fs1, fs2, "file", "file", nil)
if !code.Ok() { if !code.Ok() {
...@@ -35,7 +41,9 @@ func TestCopyFile(t *testing.T) { ...@@ -35,7 +41,9 @@ func TestCopyFile(t *testing.T) {
content2 := "foobar" content2 := "foobar"
err = ioutil.WriteFile(d2+"/file", []byte(content2), 0644) err = ioutil.WriteFile(d2+"/file", []byte(content2), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
// Copy back: should overwrite. // Copy back: should overwrite.
code = CopyFile(fs2, fs1, "file", "file", nil) code = CopyFile(fs2, fs1, "file", "file", nil)
......
...@@ -29,14 +29,18 @@ func (fs *DefaultReadFS) Open(name string, f uint32, context *Context) (File, St ...@@ -29,14 +29,18 @@ func (fs *DefaultReadFS) Open(name string, f uint32, context *Context) (File, St
return &DefaultFile{}, OK return &DefaultFile{}, OK
} }
func defaultReadTest() (root string, cleanup func()) { func defaultReadTest(t *testing.T) (root string, cleanup func()) {
fs := &DefaultReadFS{} fs := &DefaultReadFS{}
var err error var err error
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
pathfs := NewPathNodeFs(fs, nil) pathfs := NewPathNodeFs(fs, nil)
state, _, err := MountNodeFileSystem(dir, pathfs, nil) state, _, err := MountNodeFileSystem(dir, pathfs, nil)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
go state.Loop() go state.Loop()
...@@ -47,7 +51,7 @@ func defaultReadTest() (root string, cleanup func()) { ...@@ -47,7 +51,7 @@ func defaultReadTest() (root string, cleanup func()) {
} }
func TestDefaultRead(t *testing.T) { func TestDefaultRead(t *testing.T) {
root, clean := defaultReadTest() root, clean := defaultReadTest(t)
defer clean() defer clean()
_, err := ioutil.ReadFile(root + "/file") _, err := ioutil.ReadFile(root + "/file")
......
...@@ -132,10 +132,14 @@ func NewFile() *MutableDataFile { ...@@ -132,10 +132,14 @@ func NewFile() *MutableDataFile {
func setupFAttrTest(t *testing.T, fs FileSystem) (dir string, clean func(), sync func()) { func setupFAttrTest(t *testing.T, fs FileSystem) (dir string, clean func(), sync func()) {
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
nfs := NewPathNodeFs(fs, nil) nfs := NewPathNodeFs(fs, nil)
state, _, err := MountNodeFileSystem(dir, nfs, nil) state, _, err := MountNodeFileSystem(dir, nfs, nil)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
go state.Loop() go state.Loop()
...@@ -163,10 +167,14 @@ func TestDataReadLarge(t *testing.T) { ...@@ -163,10 +167,14 @@ func TestDataReadLarge(t *testing.T) {
content := RandomData(385 * 1023) content := RandomData(385 * 1023)
fn := dir + "/file" fn := dir + "/file"
err := ioutil.WriteFile(fn, []byte(content), 0644) err := ioutil.WriteFile(fn, []byte(content), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
back, err := ioutil.ReadFile(fn) back, err := ioutil.ReadFile(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
CompareSlices(t, back, content) CompareSlices(t, back, content)
} }
...@@ -178,13 +186,19 @@ func TestFSetAttr(t *testing.T) { ...@@ -178,13 +186,19 @@ func TestFSetAttr(t *testing.T) {
fn := dir + "/file" fn := dir + "/file"
f, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY, 0755) f, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY, 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
defer f.Close() defer f.Close()
fi, err := f.Stat() fi, err := f.Stat()
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
_, err = f.WriteString("hello") _, err = f.WriteString("hello")
CheckSuccess(err) if err != nil {
t.Fatalf("WriteString failed: %v", err)
}
code := syscall.Ftruncate(int(f.Fd()), 3) code := syscall.Ftruncate(int(f.Fd()), 3)
if code != nil { if code != nil {
...@@ -197,14 +211,18 @@ func TestFSetAttr(t *testing.T) { ...@@ -197,14 +211,18 @@ func TestFSetAttr(t *testing.T) {
} }
err = f.Chmod(024) err = f.Chmod(024)
CheckSuccess(err) if err != nil {
t.Fatalf("Chmod failed: %v", err)
}
sync() sync()
if fs.file.Attr.Mode&07777 != 024 { if fs.file.Attr.Mode&07777 != 024 {
t.Error("chmod") t.Error("chmod")
} }
err = os.Chtimes(fn, time.Unix(0, 100e3), time.Unix(0, 101e3)) err = os.Chtimes(fn, time.Unix(0, 100e3), time.Unix(0, 101e3))
CheckSuccess(err) if err != nil {
t.Fatalf("Chtimes failed: %v", err)
}
sync() sync()
if fs.file.Attr.Atimensec != 100e3 || fs.file.Attr.Mtimensec != 101e3 { if fs.file.Attr.Atimensec != 100e3 || fs.file.Attr.Mtimensec != 101e3 {
t.Errorf("Utimens: atime %d != 100e3 mtime %d != 101e3", t.Errorf("Utimens: atime %d != 100e3 mtime %d != 101e3",
...@@ -212,7 +230,9 @@ func TestFSetAttr(t *testing.T) { ...@@ -212,7 +230,9 @@ func TestFSetAttr(t *testing.T) {
} }
newFi, err := f.Stat() newFi, err := f.Stat()
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
i1 := ToStatT(fi).Ino i1 := ToStatT(fi).Ino
i2 := ToStatT(newFi).Ino i2 := ToStatT(newFi).Ino
if i1 != i2 { if i1 != i2 {
......
package fuse package fuse
import ( import (
"syscall" "syscall"
) )
......
...@@ -14,13 +14,19 @@ func TestTouch(t *testing.T) { ...@@ -14,13 +14,19 @@ func TestTouch(t *testing.T) {
contents := []byte{1, 2, 3} contents := []byte{1, 2, 3}
err := ioutil.WriteFile(ts.origFile, []byte(contents), 0700) err := ioutil.WriteFile(ts.origFile, []byte(contents), 0700)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
err = os.Chtimes(ts.mountFile, time.Unix(42, 0), time.Unix(43, 0)) err = os.Chtimes(ts.mountFile, time.Unix(42, 0), time.Unix(43, 0))
CheckSuccess(err) if err != nil {
t.Fatalf("Chtimes failed: %v", err)
}
var stat syscall.Stat_t var stat syscall.Stat_t
err = syscall.Lstat(ts.mountFile, &stat) err = syscall.Lstat(ts.mountFile, &stat)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if stat.Atim.Sec != 42 || stat.Mtim.Sec != 43 { if stat.Atim.Sec != 42 || stat.Mtim.Sec != 43 {
t.Errorf("Got wrong timestamps %v", stat) t.Errorf("Got wrong timestamps %v", stat)
} }
......
...@@ -55,7 +55,9 @@ func NewTestCase(t *testing.T) *testCase { ...@@ -55,7 +55,9 @@ func NewTestCase(t *testing.T) *testCase {
var err error var err error
me.tmpDir, err = ioutil.TempDir("", "go-fuse") me.tmpDir, err = ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
me.orig = me.tmpDir + "/orig" me.orig = me.tmpDir + "/orig"
me.mnt = me.tmpDir + "/mnt" me.mnt = me.tmpDir + "/mnt"
...@@ -99,7 +101,9 @@ func NewTestCase(t *testing.T) *testCase { ...@@ -99,7 +101,9 @@ func NewTestCase(t *testing.T) *testCase {
// Unmount and del. // Unmount and del.
func (tc *testCase) Cleanup() { func (tc *testCase) Cleanup() {
err := tc.state.Unmount() err := tc.state.Unmount()
CheckSuccess(err) if err != nil {
tc.tester.Fatalf("Unmount failed: %v", err)
}
os.RemoveAll(tc.tmpDir) os.RemoveAll(tc.tmpDir)
} }
...@@ -126,17 +130,17 @@ func TestReadThrough(t *testing.T) { ...@@ -126,17 +130,17 @@ func TestReadThrough(t *testing.T) {
content := RandomData(125) content := RandomData(125)
err := ioutil.WriteFile(ts.origFile, content, 0700) err := ioutil.WriteFile(ts.origFile, content, 0700)
if err != nil { if err != nil {
t.Fatalf(" failed: %v", err) t.Fatalf("WriteFile failed: %v", err)
} }
err = os.Chmod(ts.mountFile, os.FileMode(mode)) err = os.Chmod(ts.mountFile, os.FileMode(mode))
if err != nil { if err != nil {
t.Fatalf(" failed: %v", err) t.Fatalf("Chmod failed: %v", err)
} }
fi, err := os.Lstat(ts.mountFile) fi, err := os.Lstat(ts.mountFile)
if err != nil { if err != nil {
t.Fatalf(" failed: %v", err) t.Fatalf("Lstat failed: %v", err)
} }
if uint32(fi.Mode().Perm()) != mode { if uint32(fi.Mode().Perm()) != mode {
t.Errorf("Wrong mode %o != %o", int(fi.Mode().Perm()), mode) t.Errorf("Wrong mode %o != %o", int(fi.Mode().Perm()), mode)
...@@ -145,7 +149,7 @@ func TestReadThrough(t *testing.T) { ...@@ -145,7 +149,7 @@ func TestReadThrough(t *testing.T) {
// Open (for read), read. // Open (for read), read.
f, err := os.Open(ts.mountFile) f, err := os.Open(ts.mountFile)
if err != nil { if err != nil {
t.Fatalf(" failed: %v", err) t.Fatalf("Open failed: %v", err)
} }
defer f.Close() defer f.Close()
...@@ -992,7 +996,7 @@ func TestFallocate(t *testing.T) { ...@@ -992,7 +996,7 @@ func TestFallocate(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Lstat failed: %v", err) t.Fatalf("Lstat failed: %v", err)
} }
if fi.Size() < (1024+4096) { if fi.Size() < (1024 + 4096) {
t.Fatalf("fallocate should have changed file size. Got %d bytes", t.Fatalf("fallocate should have changed file size. Got %d bytes",
fi.Size()) fi.Size())
} }
......
...@@ -11,7 +11,9 @@ var _ = log.Println ...@@ -11,7 +11,9 @@ var _ = log.Println
func setupMemNodeTest(t *testing.T) (wd string, fs *MemNodeFs, clean func()) { func setupMemNodeTest(t *testing.T) (wd string, fs *MemNodeFs, clean func()) {
tmp, err := ioutil.TempDir("", "go-fuse") tmp, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
back := tmp + "/backing" back := tmp + "/backing"
os.Mkdir(back, 0700) os.Mkdir(back, 0700)
fs = NewMemNodeFs(back) fs = NewMemNodeFs(back)
...@@ -46,7 +48,9 @@ func TestMemNodeFsWrite(t *testing.T) { ...@@ -46,7 +48,9 @@ func TestMemNodeFsWrite(t *testing.T) {
want := "hello" want := "hello"
err := ioutil.WriteFile(wd+"/test", []byte(want), 0644) err := ioutil.WriteFile(wd+"/test", []byte(want), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
content, err := ioutil.ReadFile(wd + "/test") content, err := ioutil.ReadFile(wd + "/test")
if string(content) != want { if string(content) != want {
...@@ -59,10 +63,14 @@ func TestMemNodeFs(t *testing.T) { ...@@ -59,10 +63,14 @@ func TestMemNodeFs(t *testing.T) {
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/test", []byte{42}, 0644) err := ioutil.WriteFile(wd+"/test", []byte{42}, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
fi, err := os.Lstat(wd + "/test") fi, err := os.Lstat(wd + "/test")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Size() != 1 { if fi.Size() != 1 {
t.Errorf("Size after write incorrect: got %d want 1", fi.Size()) t.Errorf("Size after write incorrect: got %d want 1", fi.Size())
} }
...@@ -78,14 +86,20 @@ func TestMemNodeSetattr(t *testing.T) { ...@@ -78,14 +86,20 @@ func TestMemNodeSetattr(t *testing.T) {
defer clean() defer clean()
f, err := os.OpenFile(wd+"/test", os.O_CREATE|os.O_WRONLY, 0644) f, err := os.OpenFile(wd+"/test", os.O_CREATE|os.O_WRONLY, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
defer f.Close() defer f.Close()
err = f.Truncate(4096) err = f.Truncate(4096)
CheckSuccess(err) if err != nil {
t.Fatalf("Truncate failed: %v", err)
}
fi, err := f.Stat() fi, err := f.Stat()
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
if fi.Size() != 4096 { if fi.Size() != 4096 {
t.Errorf("Size should be 4096 after Truncate: %d", fi.Size()) t.Errorf("Size should be 4096 after Truncate: %d", fi.Size())
} }
......
...@@ -71,12 +71,6 @@ func ModeToType(mode uint32) uint32 { ...@@ -71,12 +71,6 @@ func ModeToType(mode uint32) uint32 {
return (mode & 0170000) >> 12 return (mode & 0170000) >> 12
} }
func CheckSuccess(e error) {
if e != nil {
log.Panicf("Unexpected error: %v", e)
}
}
// Thanks to Andrew Gerrand for this hack. // Thanks to Andrew Gerrand for this hack.
func toSlice(dest *[]byte, ptr unsafe.Pointer, byteCount uintptr) { func toSlice(dest *[]byte, ptr unsafe.Pointer, byteCount uintptr) {
h := (*reflect.SliceHeader)(unsafe.Pointer(dest)) h := (*reflect.SliceHeader)(unsafe.Pointer(dest))
......
...@@ -13,7 +13,9 @@ func TestMountOnExisting(t *testing.T) { ...@@ -13,7 +13,9 @@ func TestMountOnExisting(t *testing.T) {
defer ts.Cleanup() defer ts.Cleanup()
err := os.Mkdir(ts.mnt+"/mnt", 0777) err := os.Mkdir(ts.mnt+"/mnt", 0777)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
nfs := &DefaultNodeFileSystem{} nfs := &DefaultNodeFileSystem{}
code := ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil) code := ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil)
if code != EBUSY { if code != EBUSY {
...@@ -21,7 +23,9 @@ func TestMountOnExisting(t *testing.T) { ...@@ -21,7 +23,9 @@ func TestMountOnExisting(t *testing.T) {
} }
err = os.Remove(ts.mnt + "/mnt") err = os.Remove(ts.mnt + "/mnt")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
code = ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil) code = ts.connector.Mount(ts.rootNode(), "mnt", nfs, nil)
if !code.Ok() { if !code.Ok() {
t.Fatal("expect OK:", code) t.Fatal("expect OK:", code)
...@@ -60,7 +64,9 @@ func TestMountReaddir(t *testing.T) { ...@@ -60,7 +64,9 @@ func TestMountReaddir(t *testing.T) {
} }
entries, err := ioutil.ReadDir(ts.mnt) entries, err := ioutil.ReadDir(ts.mnt)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(entries) != 1 || entries[0].Name() != "mnt" { if len(entries) != 1 || entries[0].Name() != "mnt" {
t.Error("wrong readdir result", entries) t.Error("wrong readdir result", entries)
} }
...@@ -72,7 +78,9 @@ func TestRecursiveMount(t *testing.T) { ...@@ -72,7 +78,9 @@ func TestRecursiveMount(t *testing.T) {
defer ts.Cleanup() defer ts.Cleanup()
err := ioutil.WriteFile(ts.orig+"/hello.txt", []byte("blabla"), 0644) err := ioutil.WriteFile(ts.orig+"/hello.txt", []byte("blabla"), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
fs := NewPathNodeFs(NewLoopbackFileSystem(ts.orig), nil) fs := NewPathNodeFs(NewLoopbackFileSystem(ts.orig), nil)
code := ts.connector.Mount(ts.rootNode(), "mnt", fs, nil) code := ts.connector.Mount(ts.rootNode(), "mnt", fs, nil)
...@@ -82,12 +90,18 @@ func TestRecursiveMount(t *testing.T) { ...@@ -82,12 +90,18 @@ func TestRecursiveMount(t *testing.T) {
submnt := ts.mnt + "/mnt" submnt := ts.mnt + "/mnt"
_, err = os.Lstat(submnt) _, err = os.Lstat(submnt)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
_, err = os.Lstat(filepath.Join(submnt, "hello.txt")) _, err = os.Lstat(filepath.Join(submnt, "hello.txt"))
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
f, err := os.Open(filepath.Join(submnt, "hello.txt")) f, err := os.Open(filepath.Join(submnt, "hello.txt"))
CheckSuccess(err) if err != nil {
t.Fatalf("Open failed: %v", err)
}
t.Log("Attempting unmount, should fail") t.Log("Attempting unmount, should fail")
code = ts.pathFs.Unmount("mnt") code = ts.pathFs.Unmount("mnt")
if code != EBUSY { if code != EBUSY {
...@@ -116,15 +130,21 @@ func TestDeletedUnmount(t *testing.T) { ...@@ -116,15 +130,21 @@ func TestDeletedUnmount(t *testing.T) {
t.Fatal("Mount error", code) t.Fatal("Mount error", code)
} }
f, err := os.Create(filepath.Join(submnt, "hello.txt")) f, err := os.Create(filepath.Join(submnt, "hello.txt"))
CheckSuccess(err) if err != nil {
t.Fatalf("Create failed: %v", err)
}
t.Log("Removing") t.Log("Removing")
err = os.Remove(filepath.Join(submnt, "hello.txt")) err = os.Remove(filepath.Join(submnt, "hello.txt"))
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
t.Log("Removing") t.Log("Removing")
_, err = f.Write([]byte("bla")) _, err = f.Write([]byte("bla"))
CheckSuccess(err) if err != nil {
t.Fatalf("Write failed: %v", err)
}
code = ts.pathFs.Unmount("mnt") code = ts.pathFs.Unmount("mnt")
if code != EBUSY { if code != EBUSY {
......
...@@ -41,12 +41,14 @@ type NotifyTest struct { ...@@ -41,12 +41,14 @@ type NotifyTest struct {
state *MountState state *MountState
} }
func NewNotifyTest() *NotifyTest { func NewNotifyTest(t *testing.T) *NotifyTest {
me := &NotifyTest{} me := &NotifyTest{}
me.fs = &NotifyFs{} me.fs = &NotifyFs{}
var err error var err error
me.dir, err = ioutil.TempDir("", "go-fuse") me.dir, err = ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
entryTtl := 100 * time.Millisecond entryTtl := 100 * time.Millisecond
opts := &FileSystemOptions{ opts := &FileSystemOptions{
EntryTimeout: entryTtl, EntryTimeout: entryTtl,
...@@ -56,7 +58,9 @@ func NewNotifyTest() *NotifyTest { ...@@ -56,7 +58,9 @@ func NewNotifyTest() *NotifyTest {
me.pathfs = NewPathNodeFs(me.fs, nil) me.pathfs = NewPathNodeFs(me.fs, nil)
me.state, me.connector, err = MountNodeFileSystem(me.dir, me.pathfs, opts) me.state, me.connector, err = MountNodeFileSystem(me.dir, me.pathfs, opts)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
me.state.Debug = VerboseTest() me.state.Debug = VerboseTest()
go me.state.Loop() go me.state.Loop()
...@@ -71,7 +75,7 @@ func (t *NotifyTest) Clean() { ...@@ -71,7 +75,7 @@ func (t *NotifyTest) Clean() {
} }
func TestInodeNotify(t *testing.T) { func TestInodeNotify(t *testing.T) {
test := NewNotifyTest() test := NewNotifyTest(t)
defer test.Clean() defer test.Clean()
fs := test.fs fs := test.fs
...@@ -81,7 +85,9 @@ func TestInodeNotify(t *testing.T) { ...@@ -81,7 +85,9 @@ func TestInodeNotify(t *testing.T) {
test.state.ThreadSanitizerSync() test.state.ThreadSanitizerSync()
fi, err := os.Lstat(dir + "/file") fi, err := os.Lstat(dir + "/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&os.ModeType != 0 || fi.Size() != 42 { if fi.Mode()&os.ModeType != 0 || fi.Size() != 42 {
t.Error(fi) t.Error(fi)
} }
...@@ -90,7 +96,9 @@ func TestInodeNotify(t *testing.T) { ...@@ -90,7 +96,9 @@ func TestInodeNotify(t *testing.T) {
fs.size = 666 fs.size = 666
fi, err = os.Lstat(dir + "/file") fi, err = os.Lstat(dir + "/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&os.ModeType != 0 || fi.Size() == 666 { if fi.Mode()&os.ModeType != 0 || fi.Size() == 666 {
t.Error(fi) t.Error(fi)
} }
...@@ -101,14 +109,16 @@ func TestInodeNotify(t *testing.T) { ...@@ -101,14 +109,16 @@ func TestInodeNotify(t *testing.T) {
} }
fi, err = os.Lstat(dir + "/file") fi, err = os.Lstat(dir + "/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&os.ModeType != 0 || fi.Size() != 666 { if fi.Mode()&os.ModeType != 0 || fi.Size() != 666 {
t.Error(fi) t.Error(fi)
} }
} }
func TestEntryNotify(t *testing.T) { func TestEntryNotify(t *testing.T) {
test := NewNotifyTest() test := NewNotifyTest(t)
defer test.Clean() defer test.Clean()
dir := test.dir dir := test.dir
...@@ -135,5 +145,7 @@ func TestEntryNotify(t *testing.T) { ...@@ -135,5 +145,7 @@ func TestEntryNotify(t *testing.T) {
} }
fi, err := os.Lstat(fn) fi, err := os.Lstat(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
} }
...@@ -27,13 +27,15 @@ func (fs *ownerFs) GetAttr(name string, context *Context) (*Attr, Status) { ...@@ -27,13 +27,15 @@ func (fs *ownerFs) GetAttr(name string, context *Context) (*Attr, Status) {
return a, OK return a, OK
} }
func setupOwnerTest(opts *FileSystemOptions) (workdir string, cleanup func()) { func setupOwnerTest(t *testing.T, opts *FileSystemOptions) (workdir string, cleanup func()) {
wd, err := ioutil.TempDir("", "go-fuse") wd, err := ioutil.TempDir("", "go-fuse")
fs := &ownerFs{} fs := &ownerFs{}
nfs := NewPathNodeFs(fs, nil) nfs := NewPathNodeFs(fs, nil)
state, _, err := MountNodeFileSystem(wd, nfs, opts) state, _, err := MountNodeFileSystem(wd, nfs, opts)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
go state.Loop() go state.Loop()
return wd, func() { return wd, func() {
state.Unmount() state.Unmount()
...@@ -42,12 +44,14 @@ func setupOwnerTest(opts *FileSystemOptions) (workdir string, cleanup func()) { ...@@ -42,12 +44,14 @@ func setupOwnerTest(opts *FileSystemOptions) (workdir string, cleanup func()) {
} }
func TestOwnerDefault(t *testing.T) { func TestOwnerDefault(t *testing.T) {
wd, cleanup := setupOwnerTest(NewFileSystemOptions()) wd, cleanup := setupOwnerTest(t, NewFileSystemOptions())
defer cleanup() defer cleanup()
var stat syscall.Stat_t var stat syscall.Stat_t
err := syscall.Lstat(wd+"/foo", &stat) err := syscall.Lstat(wd+"/foo", &stat)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if int(stat.Uid) != os.Getuid() || int(stat.Gid) != os.Getgid() { if int(stat.Uid) != os.Getuid() || int(stat.Gid) != os.Getgid() {
t.Fatal("Should use current uid for mount") t.Fatal("Should use current uid for mount")
...@@ -55,12 +59,14 @@ func TestOwnerDefault(t *testing.T) { ...@@ -55,12 +59,14 @@ func TestOwnerDefault(t *testing.T) {
} }
func TestOwnerRoot(t *testing.T) { func TestOwnerRoot(t *testing.T) {
wd, cleanup := setupOwnerTest(&FileSystemOptions{}) wd, cleanup := setupOwnerTest(t, &FileSystemOptions{})
defer cleanup() defer cleanup()
var st syscall.Stat_t var st syscall.Stat_t
err := syscall.Lstat(wd+"/foo", &st) err := syscall.Lstat(wd+"/foo", &st)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if st.Uid != _RANDOM_OWNER || st.Gid != _RANDOM_OWNER { if st.Uid != _RANDOM_OWNER || st.Gid != _RANDOM_OWNER {
t.Fatal("Should use FS owner uid") t.Fatal("Should use FS owner uid")
...@@ -68,12 +74,14 @@ func TestOwnerRoot(t *testing.T) { ...@@ -68,12 +74,14 @@ func TestOwnerRoot(t *testing.T) {
} }
func TestOwnerOverride(t *testing.T) { func TestOwnerOverride(t *testing.T) {
wd, cleanup := setupOwnerTest(&FileSystemOptions{Owner: &Owner{42, 43}}) wd, cleanup := setupOwnerTest(t, &FileSystemOptions{Owner: &Owner{42, 43}})
defer cleanup() defer cleanup()
var stat syscall.Stat_t var stat syscall.Stat_t
err := syscall.Lstat(wd+"/foo", &stat) err := syscall.Lstat(wd+"/foo", &stat)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if stat.Uid != 42 || stat.Gid != 43 { if stat.Uid != 42 || stat.Gid != 43 {
t.Fatal("Should use current uid for mount") t.Fatal("Should use current uid for mount")
......
...@@ -42,7 +42,9 @@ func TestMemoryPressure(t *testing.T) { ...@@ -42,7 +42,9 @@ func TestMemoryPressure(t *testing.T) {
} }
dir, err := ioutil.TempDir("", "go-fuse") dir, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
nfs := NewPathNodeFs(fs, nil) nfs := NewPathNodeFs(fs, nil)
o := &FileSystemOptions{PortableInodes: true} o := &FileSystemOptions{PortableInodes: true}
......
...@@ -104,12 +104,16 @@ func xattrTestCase(t *testing.T, nm string) (mountPoint string, cleanup func()) ...@@ -104,12 +104,16 @@ func xattrTestCase(t *testing.T, nm string) (mountPoint string, cleanup func())
xfs := NewXAttrFs(nm, xattrGolden) xfs := NewXAttrFs(nm, xattrGolden)
xfs.tester = t xfs.tester = t
mountPoint, err := ioutil.TempDir("", "go-fuse") mountPoint, err := ioutil.TempDir("", "go-fuse")
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
defer os.RemoveAll(mountPoint) defer os.RemoveAll(mountPoint)
nfs := NewPathNodeFs(xfs, nil) nfs := NewPathNodeFs(xfs, nil)
state, _, err := MountNodeFileSystem(mountPoint, nfs, nil) state, _, err := MountNodeFileSystem(mountPoint, nfs, nil)
CheckSuccess(err) if err != nil {
t.Fatalf("TempDir failed: %v", err)
}
state.Debug = VerboseTest() state.Debug = VerboseTest()
go state.Loop() go state.Loop()
......
...@@ -13,8 +13,6 @@ import ( ...@@ -13,8 +13,6 @@ import (
var _ = fmt.Print var _ = fmt.Print
var _ = log.Print var _ = log.Print
var CheckSuccess = fuse.CheckSuccess
const entryTtl = 100 * time.Millisecond const entryTtl = 100 * time.Millisecond
var testAOpts = AutoUnionFsOptions{ var testAOpts = AutoUnionFsOptions{
...@@ -27,29 +25,39 @@ var testAOpts = AutoUnionFsOptions{ ...@@ -27,29 +25,39 @@ var testAOpts = AutoUnionFsOptions{
HideReadonly: true, HideReadonly: true,
} }
func WriteFile(name string, contents string) { func WriteFile(t *testing.T, name string, contents string) {
err := ioutil.WriteFile(name, []byte(contents), 0644) err := ioutil.WriteFile(name, []byte(contents), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
} }
func setup(t *testing.T) (workdir string, cleanup func()) { func setup(t *testing.T) (workdir string, cleanup func()) {
wd, _ := ioutil.TempDir("", "") wd, _ := ioutil.TempDir("", "")
err := os.Mkdir(wd+"/mnt", 0700) err := os.Mkdir(wd+"/mnt", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Mkdir(wd+"/store", 0700) err = os.Mkdir(wd+"/store", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Mkdir(wd+"/ro", 0700) os.Mkdir(wd+"/ro", 0700)
fuse.CheckSuccess(err) if err != nil {
WriteFile(wd+"/ro/file1", "file1") t.Fatalf("Mkdir failed: %v", err)
WriteFile(wd+"/ro/file2", "file2") }
WriteFile(t, wd+"/ro/file1", "file1")
WriteFile(t, wd+"/ro/file2", "file2")
fs := NewAutoUnionFs(wd+"/store", testAOpts) fs := NewAutoUnionFs(wd+"/store", testAOpts)
nfs := fuse.NewPathNodeFs(fs, nil) nfs := fuse.NewPathNodeFs(fs, nil)
state, conn, err := fuse.MountNodeFileSystem(wd+"/mnt", nfs, &testAOpts.FileSystemOptions) state, conn, err := fuse.MountNodeFileSystem(wd+"/mnt", nfs, &testAOpts.FileSystemOptions)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = fuse.VerboseTest() state.Debug = fuse.VerboseTest()
conn.Debug = fuse.VerboseTest() conn.Debug = fuse.VerboseTest()
go state.Loop() go state.Loop()
...@@ -65,7 +73,9 @@ func TestDebug(t *testing.T) { ...@@ -65,7 +73,9 @@ func TestDebug(t *testing.T) {
defer clean() defer clean()
c, err := ioutil.ReadFile(wd + "/mnt/status/debug") c, err := ioutil.ReadFile(wd + "/mnt/status/debug")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if len(c) == 0 { if len(c) == 0 {
t.Fatal("No debug found.") t.Fatal("No debug found.")
} }
...@@ -77,7 +87,9 @@ func TestVersion(t *testing.T) { ...@@ -77,7 +87,9 @@ func TestVersion(t *testing.T) {
defer clean() defer clean()
c, err := ioutil.ReadFile(wd + "/mnt/status/gounionfs_version") c, err := ioutil.ReadFile(wd + "/mnt/status/gounionfs_version")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if len(c) == 0 { if len(c) == 0 {
t.Fatal("No version found.") t.Fatal("No version found.")
} }
...@@ -89,25 +101,37 @@ func TestAutoFsSymlink(t *testing.T) { ...@@ -89,25 +101,37 @@ func TestAutoFsSymlink(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/store/backing1", 0755) err := os.Mkdir(wd+"/store/backing1", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Symlink(wd+"/ro", wd+"/store/backing1/READONLY") err = os.Symlink(wd+"/ro", wd+"/store/backing1/READONLY")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Symlink(wd+"/store/backing1", wd+"/mnt/config/manual1") err = os.Symlink(wd+"/store/backing1", wd+"/mnt/config/manual1")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
fi, err := os.Lstat(wd + "/mnt/manual1/file1") fi, err := os.Lstat(wd + "/mnt/manual1/file1")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
entries, err := ioutil.ReadDir(wd + "/mnt") entries, err := ioutil.ReadDir(wd + "/mnt")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(entries) != 3 { if len(entries) != 3 {
t.Error("readdir mismatch", entries) t.Error("readdir mismatch", entries)
} }
err = os.Remove(wd + "/mnt/config/manual1") err = os.Remove(wd + "/mnt/config/manual1")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
scan := wd + "/mnt/config/" + _SCAN_CONFIG scan := wd + "/mnt/config/" + _SCAN_CONFIG
err = ioutil.WriteFile(scan, []byte("something"), 0644) err = ioutil.WriteFile(scan, []byte("something"), 0644)
...@@ -121,10 +145,14 @@ func TestAutoFsSymlink(t *testing.T) { ...@@ -121,10 +145,14 @@ func TestAutoFsSymlink(t *testing.T) {
} }
_, err = ioutil.ReadDir(wd + "/mnt/config") _, err = ioutil.ReadDir(wd + "/mnt/config")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/backing1/file1") _, err = os.Lstat(wd + "/mnt/backing1/file1")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
} }
func TestDetectSymlinkedDirectories(t *testing.T) { func TestDetectSymlinkedDirectories(t *testing.T) {
...@@ -132,13 +160,19 @@ func TestDetectSymlinkedDirectories(t *testing.T) { ...@@ -132,13 +160,19 @@ func TestDetectSymlinkedDirectories(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/backing1", 0755) err := os.Mkdir(wd+"/backing1", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Symlink(wd+"/ro", wd+"/backing1/READONLY") err = os.Symlink(wd+"/ro", wd+"/backing1/READONLY")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Symlink(wd+"/backing1", wd+"/store/backing1") err = os.Symlink(wd+"/backing1", wd+"/store/backing1")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
scan := wd + "/mnt/config/" + _SCAN_CONFIG scan := wd + "/mnt/config/" + _SCAN_CONFIG
err = ioutil.WriteFile(scan, []byte("something"), 0644) err = ioutil.WriteFile(scan, []byte("something"), 0644)
...@@ -147,7 +181,9 @@ func TestDetectSymlinkedDirectories(t *testing.T) { ...@@ -147,7 +181,9 @@ func TestDetectSymlinkedDirectories(t *testing.T) {
} }
_, err = os.Lstat(wd + "/mnt/backing1") _, err = os.Lstat(wd + "/mnt/backing1")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
} }
func TestExplicitScan(t *testing.T) { func TestExplicitScan(t *testing.T) {
...@@ -155,9 +191,13 @@ func TestExplicitScan(t *testing.T) { ...@@ -155,9 +191,13 @@ func TestExplicitScan(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/store/backing1", 0755) err := os.Mkdir(wd+"/store/backing1", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Symlink(wd+"/ro", wd+"/store/backing1/READONLY") os.Symlink(wd+"/ro", wd+"/store/backing1/READONLY")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
fi, _ := os.Lstat(wd + "/mnt/backing1") fi, _ := os.Lstat(wd + "/mnt/backing1")
if fi != nil { if fi != nil {
...@@ -186,17 +226,27 @@ func TestCreationChecks(t *testing.T) { ...@@ -186,17 +226,27 @@ func TestCreationChecks(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/store/foo", 0755) err := os.Mkdir(wd+"/store/foo", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Symlink(wd+"/ro", wd+"/store/foo/READONLY") os.Symlink(wd+"/ro", wd+"/store/foo/READONLY")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Mkdir(wd+"/store/ws2", 0755) err = os.Mkdir(wd+"/store/ws2", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Symlink(wd+"/ro", wd+"/store/ws2/READONLY") os.Symlink(wd+"/ro", wd+"/store/ws2/READONLY")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Symlink(wd+"/store/foo", wd+"/mnt/config/bar") err = os.Symlink(wd+"/store/foo", wd+"/mnt/config/bar")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Symlink(wd+"/store/foo", wd+"/mnt/config/foo") err = os.Symlink(wd+"/store/foo", wd+"/mnt/config/foo")
code := fuse.ToStatus(err) code := fuse.ToStatus(err)
......
...@@ -31,14 +31,16 @@ var testOpts = UnionFsOptions{ ...@@ -31,14 +31,16 @@ var testOpts = UnionFsOptions{
HiddenFiles: []string{"hidden"}, HiddenFiles: []string{"hidden"},
} }
func freezeRo(dir string) { func freezeRo(t *testing.T, dir string) {
err := filepath.Walk( err := filepath.Walk(
dir, dir,
func(path string, fi os.FileInfo, err error) error { func(path string, fi os.FileInfo, err error) error {
newMode := uint32(fi.Mode().Perm()) &^ 0222 newMode := uint32(fi.Mode().Perm()) &^ 0222
return os.Chmod(path, os.FileMode(newMode)) return os.Chmod(path, os.FileMode(newMode))
}) })
CheckSuccess(err) if err != nil {
t.Fatalf("Walk failed: %v", err)
}
} }
// Creates 3 directories on a temporary dir: /mnt with the overlayed // Creates 3 directories on a temporary dir: /mnt with the overlayed
...@@ -49,13 +51,19 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) { ...@@ -49,13 +51,19 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) {
wd, _ := ioutil.TempDir("", "") wd, _ := ioutil.TempDir("", "")
err := os.Mkdir(wd+"/mnt", 0700) err := os.Mkdir(wd+"/mnt", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Mkdir(wd+"/rw", 0700) err = os.Mkdir(wd+"/rw", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Mkdir(wd+"/ro", 0700) os.Mkdir(wd+"/ro", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
var fses []fuse.FileSystem var fses []fuse.FileSystem
fses = append(fses, fuse.NewLoopbackFileSystem(wd+"/rw")) fses = append(fses, fuse.NewLoopbackFileSystem(wd+"/rw"))
...@@ -74,7 +82,9 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) { ...@@ -74,7 +82,9 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) {
pathfs := fuse.NewPathNodeFs(ufs, pathfs := fuse.NewPathNodeFs(ufs,
&fuse.PathNodeFsOptions{ClientInodes: true}) &fuse.PathNodeFsOptions{ClientInodes: true})
state, conn, err := fuse.MountNodeFileSystem(wd+"/mnt", pathfs, opts) state, conn, err := fuse.MountNodeFileSystem(wd+"/mnt", pathfs, opts)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
conn.Debug = fuse.VerboseTest() conn.Debug = fuse.VerboseTest()
state.Debug = fuse.VerboseTest() state.Debug = fuse.VerboseTest()
go state.Loop() go state.Loop()
...@@ -85,26 +95,29 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) { ...@@ -85,26 +95,29 @@ func setupUfs(t *testing.T) (workdir string, cleanup func()) {
} }
} }
func writeToFile(path string, contents string) { func readFromFile(t *testing.T, path string) string {
err := ioutil.WriteFile(path, []byte(contents), 0644)
CheckSuccess(err)
}
func readFromFile(path string) string {
b, err := ioutil.ReadFile(path) b, err := ioutil.ReadFile(path)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
return string(b) return string(b)
} }
func dirNames(path string) map[string]bool { func dirNames(t *testing.T, path string) map[string]bool {
f, err := os.Open(path) f, err := os.Open(path)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Open failed: %v", err)
}
result := make(map[string]bool) result := make(map[string]bool)
names, err := f.Readdirnames(-1) names, err := f.Readdirnames(-1)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
err = f.Close() err = f.Close()
CheckSuccess(err) if err != nil {
t.Fatalf("Close failed: %v", err)
}
for _, nm := range names { for _, nm := range names {
result[nm] = true result[nm] = true
...@@ -138,23 +151,24 @@ func fileExists(path string) bool { ...@@ -138,23 +151,24 @@ func fileExists(path string) bool {
return err == nil && f != nil return err == nil && f != nil
} }
func remove(path string) {
err := os.Remove(path)
fuse.CheckSuccess(err)
}
func TestUnionFsAutocreateDeletionDir(t *testing.T) { func TestUnionFsAutocreateDeletionDir(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
err := os.Remove(wd + "/rw/DELETIONS") err := os.Remove(wd + "/rw/DELETIONS")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
err = os.Mkdir(wd+"/mnt/dir", 0755) err = os.Mkdir(wd+"/mnt/dir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
_, err = ioutil.ReadDir(wd + "/mnt/dir") _, err = ioutil.ReadDir(wd + "/mnt/dir")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
} }
func TestUnionFsSymlink(t *testing.T) { func TestUnionFsSymlink(t *testing.T) {
...@@ -162,10 +176,14 @@ func TestUnionFsSymlink(t *testing.T) { ...@@ -162,10 +176,14 @@ func TestUnionFsSymlink(t *testing.T) {
defer clean() defer clean()
err := os.Symlink("/foobar", wd+"/mnt/link") err := os.Symlink("/foobar", wd+"/mnt/link")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
val, err := os.Readlink(wd + "/mnt/link") val, err := os.Readlink(wd + "/mnt/link")
CheckSuccess(err) if err != nil {
t.Fatalf("Readlink failed: %v", err)
}
if val != "/foobar" { if val != "/foobar" {
t.Errorf("symlink mismatch: %v", val) t.Errorf("symlink mismatch: %v", val)
...@@ -177,22 +195,30 @@ func TestUnionFsSymlinkPromote(t *testing.T) { ...@@ -177,22 +195,30 @@ func TestUnionFsSymlinkPromote(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/ro/subdir", 0755) err := os.Mkdir(wd+"/ro/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Symlink("/foobar", wd+"/mnt/subdir/link") err = os.Symlink("/foobar", wd+"/mnt/subdir/link")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
} }
func TestUnionFsChtimes(t *testing.T) { func TestUnionFsChtimes(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
writeToFile(wd+"/ro/file", "a") WriteFile(t, wd+"/ro/file", "a")
err := os.Chtimes(wd+"/ro/file", time.Unix(42, 0), time.Unix(43, 0)) err := os.Chtimes(wd+"/ro/file", time.Unix(42, 0), time.Unix(43, 0))
CheckSuccess(err) if err != nil {
t.Fatalf("Chtimes failed: %v", err)
}
err = os.Chtimes(wd+"/mnt/file", time.Unix(82, 0), time.Unix(83, 0)) err = os.Chtimes(wd+"/mnt/file", time.Unix(82, 0), time.Unix(83, 0))
CheckSuccess(err) if err != nil {
t.Fatalf("Chtimes failed: %v", err)
}
fi, err := os.Lstat(wd + "/mnt/file") fi, err := os.Lstat(wd + "/mnt/file")
stat := fuse.ToStatT(fi) stat := fuse.ToStatT(fi)
...@@ -207,12 +233,16 @@ func TestUnionFsChmod(t *testing.T) { ...@@ -207,12 +233,16 @@ func TestUnionFsChmod(t *testing.T) {
ro_fn := wd + "/ro/file" ro_fn := wd + "/ro/file"
m_fn := wd + "/mnt/file" m_fn := wd + "/mnt/file"
writeToFile(ro_fn, "a") WriteFile(t, ro_fn, "a")
err := os.Chmod(m_fn, 00070) err := os.Chmod(m_fn, 00070)
CheckSuccess(err) if err != nil {
t.Fatalf("Chmod failed: %v", err)
}
fi, err := os.Lstat(m_fn) fi, err := os.Lstat(m_fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&07777 != 00270 { if fi.Mode()&07777 != 00270 {
t.Errorf("Unexpected mode found: %o", uint32(fi.Mode().Perm())) t.Errorf("Unexpected mode found: %o", uint32(fi.Mode().Perm()))
} }
...@@ -228,7 +258,7 @@ func TestUnionFsChown(t *testing.T) { ...@@ -228,7 +258,7 @@ func TestUnionFsChown(t *testing.T) {
ro_fn := wd + "/ro/file" ro_fn := wd + "/ro/file"
m_fn := wd + "/mnt/file" m_fn := wd + "/mnt/file"
writeToFile(ro_fn, "a") WriteFile(t, ro_fn, "a")
err := os.Chown(m_fn, 0, 0) err := os.Chown(m_fn, 0, 0)
code := fuse.ToStatus(err) code := fuse.ToStatus(err)
...@@ -241,26 +271,32 @@ func TestUnionFsDelete(t *testing.T) { ...@@ -241,26 +271,32 @@ func TestUnionFsDelete(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
writeToFile(wd+"/ro/file", "a") WriteFile(t, wd+"/ro/file", "a")
_, err := os.Lstat(wd + "/mnt/file") _, err := os.Lstat(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
err = os.Remove(wd + "/mnt/file") err = os.Remove(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/file") _, err = os.Lstat(wd + "/mnt/file")
if err == nil { if err == nil {
t.Fatal("should have disappeared.") t.Fatal("should have disappeared.")
} }
delPath := wd + "/rw/" + testOpts.DeletionDirName delPath := wd + "/rw/" + testOpts.DeletionDirName
names := dirNames(delPath) names := dirNames(t, delPath)
if len(names) != 1 { if len(names) != 1 {
t.Fatal("Should have 1 deletion", names) t.Fatal("Should have 1 deletion", names)
} }
for k := range names { for k := range names {
c, err := ioutil.ReadFile(delPath + "/" + k) c, err := ioutil.ReadFile(delPath + "/" + k)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
if string(c) != "file" { if string(c) != "file" {
t.Fatal("content mismatch", string(c)) t.Fatal("content mismatch", string(c))
} }
...@@ -271,58 +307,65 @@ func TestUnionFsBasic(t *testing.T) { ...@@ -271,58 +307,65 @@ func TestUnionFsBasic(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
writeToFile(wd+"/rw/rw", "a") WriteFile(t, wd+"/rw/rw", "a")
writeToFile(wd+"/ro/ro1", "a") WriteFile(t, wd+"/ro/ro1", "a")
writeToFile(wd+"/ro/ro2", "b") WriteFile(t, wd+"/ro/ro2", "b")
names := dirNames(wd + "/mnt") names := dirNames(t, wd+"/mnt")
expected := map[string]bool{ expected := map[string]bool{
"rw": true, "ro1": true, "ro2": true, "rw": true, "ro1": true, "ro2": true,
} }
checkMapEq(t, names, expected) checkMapEq(t, names, expected)
writeToFile(wd+"/mnt/new", "new contents") WriteFile(t, wd+"/mnt/new", "new contents")
if !fileExists(wd + "/rw/new") { if !fileExists(wd + "/rw/new") {
t.Errorf("missing file in rw layer", names) t.Errorf("missing file in rw layer", names)
} }
contents := readFromFile(wd + "/mnt/new") contents := readFromFile(t, wd+"/mnt/new")
if contents != "new contents" { if contents != "new contents" {
t.Errorf("read mismatch: '%v'", contents) t.Errorf("read mismatch: '%v'", contents)
} }
writeToFile(wd+"/mnt/ro1", "promote me") WriteFile(t, wd+"/mnt/ro1", "promote me")
if !fileExists(wd + "/rw/ro1") { if !fileExists(wd + "/rw/ro1") {
t.Errorf("missing file in rw layer", names) t.Errorf("missing file in rw layer", names)
} }
remove(wd + "/mnt/new") err := os.Remove(wd + "/mnt/new")
names = dirNames(wd + "/mnt") if err != nil {
t.Fatalf("Remove failed: %v", err)
}
names = dirNames(t, wd+"/mnt")
checkMapEq(t, names, map[string]bool{ checkMapEq(t, names, map[string]bool{
"rw": true, "ro1": true, "ro2": true, "rw": true, "ro1": true, "ro2": true,
}) })
names = dirNames(wd + "/rw") names = dirNames(t, wd+"/rw")
checkMapEq(t, names, map[string]bool{ checkMapEq(t, names, map[string]bool{
testOpts.DeletionDirName: true, testOpts.DeletionDirName: true,
"rw": true, "ro1": true, "rw": true, "ro1": true,
}) })
names = dirNames(wd + "/rw/" + testOpts.DeletionDirName) names = dirNames(t, wd+"/rw/"+testOpts.DeletionDirName)
if len(names) != 0 { if len(names) != 0 {
t.Errorf("Expected 0 entry in %v", names) t.Errorf("Expected 0 entry in %v", names)
} }
remove(wd + "/mnt/ro1") err = os.Remove(wd + "/mnt/ro1")
names = dirNames(wd + "/mnt") if err != nil {
t.Fatalf("Remove failed: %v", err)
}
names = dirNames(t, wd+"/mnt")
checkMapEq(t, names, map[string]bool{ checkMapEq(t, names, map[string]bool{
"rw": true, "ro2": true, "rw": true, "ro2": true,
}) })
names = dirNames(wd + "/rw") names = dirNames(t, wd+"/rw")
checkMapEq(t, names, map[string]bool{ checkMapEq(t, names, map[string]bool{
"rw": true, testOpts.DeletionDirName: true, "rw": true, testOpts.DeletionDirName: true,
}) })
names = dirNames(wd + "/rw/" + testOpts.DeletionDirName) names = dirNames(t, wd+"/rw/"+testOpts.DeletionDirName)
if len(names) != 1 { if len(names) != 1 {
t.Errorf("Expected 1 entry in %v", names) t.Errorf("Expected 1 entry in %v", names)
} }
...@@ -333,9 +376,11 @@ func TestUnionFsPromote(t *testing.T) { ...@@ -333,9 +376,11 @@ func TestUnionFsPromote(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/ro/subdir", 0755) err := os.Mkdir(wd+"/ro/subdir", 0755)
CheckSuccess(err) if err != nil {
writeToFile(wd+"/ro/subdir/file", "content") t.Fatalf("Mkdir failed: %v", err)
writeToFile(wd+"/mnt/subdir/file", "other-content") }
WriteFile(t, wd+"/ro/subdir/file", "content")
WriteFile(t, wd+"/mnt/subdir/file", "other-content")
} }
func TestUnionFsCreate(t *testing.T) { func TestUnionFsCreate(t *testing.T) {
...@@ -343,22 +388,30 @@ func TestUnionFsCreate(t *testing.T) { ...@@ -343,22 +388,30 @@ func TestUnionFsCreate(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/subdir/sub2", 0755) err := os.MkdirAll(wd+"/ro/subdir/sub2", 0755)
CheckSuccess(err) if err != nil {
writeToFile(wd+"/mnt/subdir/sub2/file", "other-content") t.Fatalf("MkdirAll failed: %v", err)
}
WriteFile(t, wd+"/mnt/subdir/sub2/file", "other-content")
_, err = os.Lstat(wd + "/mnt/subdir/sub2/file") _, err = os.Lstat(wd + "/mnt/subdir/sub2/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
} }
func TestUnionFsOpenUndeletes(t *testing.T) { func TestUnionFsOpenUndeletes(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
writeToFile(wd+"/ro/file", "X") WriteFile(t, wd+"/ro/file", "X")
err := os.Remove(wd + "/mnt/file") err := os.Remove(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
writeToFile(wd+"/mnt/file", "X") t.Fatalf("Remove failed: %v", err)
}
WriteFile(t, wd+"/mnt/file", "X")
_, err = os.Lstat(wd + "/mnt/file") _, err = os.Lstat(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
} }
func TestUnionFsMkdir(t *testing.T) { func TestUnionFsMkdir(t *testing.T) {
...@@ -367,10 +420,14 @@ func TestUnionFsMkdir(t *testing.T) { ...@@ -367,10 +420,14 @@ func TestUnionFsMkdir(t *testing.T) {
dirname := wd + "/mnt/subdir" dirname := wd + "/mnt/subdir"
err := os.Mkdir(dirname, 0755) err := os.Mkdir(dirname, 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Remove(dirname) err = os.Remove(dirname)
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
} }
func TestUnionFsMkdirPromote(t *testing.T) { func TestUnionFsMkdirPromote(t *testing.T) {
...@@ -379,12 +436,18 @@ func TestUnionFsMkdirPromote(t *testing.T) { ...@@ -379,12 +436,18 @@ func TestUnionFsMkdirPromote(t *testing.T) {
dirname := wd + "/ro/subdir/subdir2" dirname := wd + "/ro/subdir/subdir2"
err := os.MkdirAll(dirname, 0755) err := os.MkdirAll(dirname, 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
err = os.Mkdir(wd+"/mnt/subdir/subdir2/dir3", 0755) err = os.Mkdir(wd+"/mnt/subdir/subdir2/dir3", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
fi, _ := os.Lstat(wd + "/rw/subdir/subdir2/dir3") fi, _ := os.Lstat(wd + "/rw/subdir/subdir2/dir3")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi == nil || !fi.IsDir() { if fi == nil || !fi.IsDir() {
t.Error("is not a directory: ", fi) t.Error("is not a directory: ", fi)
} }
...@@ -395,14 +458,20 @@ func TestUnionFsRmdirMkdir(t *testing.T) { ...@@ -395,14 +458,20 @@ func TestUnionFsRmdirMkdir(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/ro/subdir", 0755) err := os.Mkdir(wd+"/ro/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
dirname := wd + "/mnt/subdir" dirname := wd + "/mnt/subdir"
err = os.Remove(dirname) err = os.Remove(dirname)
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
err = os.Mkdir(dirname, 0755) err = os.Mkdir(dirname, 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
} }
func TestUnionFsRename(t *testing.T) { func TestUnionFsRename(t *testing.T) {
...@@ -427,20 +496,22 @@ func TestUnionFsRename(t *testing.T) { ...@@ -427,20 +496,22 @@ func TestUnionFsRename(t *testing.T) {
t.Log("Config", i, c) t.Log("Config", i, c)
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
if c.f1_ro { if c.f1_ro {
writeToFile(wd+"/ro/file1", "c1") WriteFile(t, wd+"/ro/file1", "c1")
} }
if c.f1_rw { if c.f1_rw {
writeToFile(wd+"/rw/file1", "c2") WriteFile(t, wd+"/rw/file1", "c2")
} }
if c.f2_ro { if c.f2_ro {
writeToFile(wd+"/ro/file2", "c3") WriteFile(t, wd+"/ro/file2", "c3")
} }
if c.f2_rw { if c.f2_rw {
writeToFile(wd+"/rw/file2", "c4") WriteFile(t, wd+"/rw/file2", "c4")
} }
err := os.Rename(wd+"/mnt/file1", wd+"/mnt/file2") err := os.Rename(wd+"/mnt/file1", wd+"/mnt/file2")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/file1") _, err = os.Lstat(wd + "/mnt/file1")
if err == nil { if err == nil {
...@@ -451,7 +522,9 @@ func TestUnionFsRename(t *testing.T) { ...@@ -451,7 +522,9 @@ func TestUnionFsRename(t *testing.T) {
t.Errorf("Should have gotten file2: %v", err) t.Errorf("Should have gotten file2: %v", err)
} }
err = os.Rename(wd+"/mnt/file2", wd+"/mnt/file1") err = os.Rename(wd+"/mnt/file2", wd+"/mnt/file1")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/file2") _, err = os.Lstat(wd + "/mnt/file2")
if err == nil { if err == nil {
...@@ -470,10 +543,14 @@ func TestUnionFsRenameDirBasic(t *testing.T) { ...@@ -470,10 +543,14 @@ func TestUnionFsRenameDirBasic(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/dir/subdir", 0755) err := os.MkdirAll(wd+"/ro/dir/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed") err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
if fi, _ := os.Lstat(wd + "/mnt/dir"); fi != nil { if fi, _ := os.Lstat(wd + "/mnt/dir"); fi != nil {
t.Fatalf("%s/mnt/dir should have disappeared: %v", wd, fi) t.Fatalf("%s/mnt/dir should have disappeared: %v", wd, fi)
...@@ -498,16 +575,22 @@ func TestUnionFsRenameDirAllSourcesGone(t *testing.T) { ...@@ -498,16 +575,22 @@ func TestUnionFsRenameDirAllSourcesGone(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/dir", 0755) err := os.MkdirAll(wd+"/ro/dir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
err = ioutil.WriteFile(wd+"/ro/dir/file.txt", []byte{42}, 0644) err = ioutil.WriteFile(wd+"/ro/dir/file.txt", []byte{42}, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(wd + "/ro") freezeRo(t, wd+"/ro")
err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed") err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
names := dirNames(wd + "/rw/" + testOpts.DeletionDirName) names := dirNames(t, wd+"/rw/"+testOpts.DeletionDirName)
if len(names) != 2 { if len(names) != 2 {
t.Errorf("Expected 2 entries in %v", names) t.Errorf("Expected 2 entries in %v", names)
} }
...@@ -518,24 +601,34 @@ func TestUnionFsRenameDirWithDeletions(t *testing.T) { ...@@ -518,24 +601,34 @@ func TestUnionFsRenameDirWithDeletions(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/dir/subdir", 0755) err := os.MkdirAll(wd+"/ro/dir/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
err = ioutil.WriteFile(wd+"/ro/dir/file.txt", []byte{42}, 0644) err = ioutil.WriteFile(wd+"/ro/dir/file.txt", []byte{42}, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
err = ioutil.WriteFile(wd+"/ro/dir/subdir/file.txt", []byte{42}, 0644) err = ioutil.WriteFile(wd+"/ro/dir/subdir/file.txt", []byte{42}, 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
if fi, _ := os.Lstat(wd + "/mnt/dir/subdir/file.txt"); fi == nil || fi.Mode()&os.ModeType != 0 { if fi, _ := os.Lstat(wd + "/mnt/dir/subdir/file.txt"); fi == nil || fi.Mode()&os.ModeType != 0 {
t.Fatalf("%s/mnt/dir/subdir/file.txt should be file: %v", wd, fi) t.Fatalf("%s/mnt/dir/subdir/file.txt should be file: %v", wd, fi)
} }
err = os.Remove(wd + "/mnt/dir/file.txt") err = os.Remove(wd + "/mnt/dir/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed") err = os.Rename(wd+"/mnt/dir", wd+"/mnt/renamed")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
if fi, _ := os.Lstat(wd + "/mnt/dir/subdir/file.txt"); fi != nil { if fi, _ := os.Lstat(wd + "/mnt/dir/subdir/file.txt"); fi != nil {
t.Fatalf("%s/mnt/dir/subdir/file.txt should have disappeared: %v", wd, fi) t.Fatalf("%s/mnt/dir/subdir/file.txt should have disappeared: %v", wd, fi)
...@@ -567,10 +660,14 @@ func TestUnionFsRenameSymlink(t *testing.T) { ...@@ -567,10 +660,14 @@ func TestUnionFsRenameSymlink(t *testing.T) {
defer clean() defer clean()
err := os.Symlink("linktarget", wd+"/ro/link") err := os.Symlink("linktarget", wd+"/ro/link")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
err = os.Rename(wd+"/mnt/link", wd+"/mnt/renamed") err = os.Rename(wd+"/mnt/link", wd+"/mnt/renamed")
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
if fi, _ := os.Lstat(wd + "/mnt/link"); fi != nil { if fi, _ := os.Lstat(wd + "/mnt/link"); fi != nil {
t.Fatalf("%s/mnt/link should have disappeared: %v", wd, fi) t.Fatalf("%s/mnt/link should have disappeared: %v", wd, fi)
...@@ -591,11 +688,15 @@ func TestUnionFsWritableDir(t *testing.T) { ...@@ -591,11 +688,15 @@ func TestUnionFsWritableDir(t *testing.T) {
dirname := wd + "/ro/subdir" dirname := wd + "/ro/subdir"
err := os.Mkdir(dirname, 0555) err := os.Mkdir(dirname, 0555)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("Mkdir failed: %v", err)
}
freezeRo(t, wd+"/ro")
fi, err := os.Lstat(wd + "/mnt/subdir") fi, err := os.Lstat(wd + "/mnt/subdir")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode().Perm()&0222 == 0 { if fi.Mode().Perm()&0222 == 0 {
t.Errorf("unexpected permission %o", fi.Mode().Perm()) t.Errorf("unexpected permission %o", fi.Mode().Perm())
} }
...@@ -608,12 +709,16 @@ func TestUnionFsWriteAccess(t *testing.T) { ...@@ -608,12 +709,16 @@ func TestUnionFsWriteAccess(t *testing.T) {
fn := wd + "/ro/file" fn := wd + "/ro/file"
// No write perms. // No write perms.
err := ioutil.WriteFile(fn, []byte("foo"), 0444) err := ioutil.WriteFile(fn, []byte("foo"), 0444)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
err = syscall.Access(wd+"/mnt/file", raw.W_OK) err = syscall.Access(wd+"/mnt/file", raw.W_OK)
if err != nil { if err != nil {
CheckSuccess(err) if err != nil {
t.Fatalf("Access failed: %v", err)
}
} }
} }
...@@ -624,17 +729,25 @@ func TestUnionFsLink(t *testing.T) { ...@@ -624,17 +729,25 @@ func TestUnionFsLink(t *testing.T) {
content := "blabla" content := "blabla"
fn := wd + "/ro/file" fn := wd + "/ro/file"
err := ioutil.WriteFile(fn, []byte(content), 0666) err := ioutil.WriteFile(fn, []byte(content), 0666)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
err = os.Link(wd+"/mnt/file", wd+"/mnt/linked") err = os.Link(wd+"/mnt/file", wd+"/mnt/linked")
CheckSuccess(err) if err != nil {
t.Fatalf("Link failed: %v", err)
}
fi2, err := os.Lstat(wd + "/mnt/linked") fi2, err := os.Lstat(wd + "/mnt/linked")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
fi1, err := os.Lstat(wd + "/mnt/file") fi1, err := os.Lstat(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
s1 := fuse.ToStatT(fi1) s1 := fuse.ToStatT(fi1)
s2 := fuse.ToStatT(fi2) s2 := fuse.ToStatT(fi2)
...@@ -651,15 +764,15 @@ func TestUnionFsTruncate(t *testing.T) { ...@@ -651,15 +764,15 @@ func TestUnionFsTruncate(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
writeToFile(wd+"/ro/file", "hello") WriteFile(t, wd+"/ro/file", "hello")
freezeRo(wd + "/ro") freezeRo(t, wd+"/ro")
os.Truncate(wd+"/mnt/file", 2) os.Truncate(wd+"/mnt/file", 2)
content := readFromFile(wd + "/mnt/file") content := readFromFile(t, wd+"/mnt/file")
if content != "he" { if content != "he" {
t.Errorf("unexpected content %v", content) t.Errorf("unexpected content %v", content)
} }
content2 := readFromFile(wd + "/rw/file") content2 := readFromFile(t, wd+"/rw/file")
if content2 != content { if content2 != content {
t.Errorf("unexpected rw content %v", content2) t.Errorf("unexpected rw content %v", content2)
} }
...@@ -672,19 +785,27 @@ func TestUnionFsCopyChmod(t *testing.T) { ...@@ -672,19 +785,27 @@ func TestUnionFsCopyChmod(t *testing.T) {
contents := "hello" contents := "hello"
fn := wd + "/mnt/y" fn := wd + "/mnt/y"
err := ioutil.WriteFile(fn, []byte(contents), 0644) err := ioutil.WriteFile(fn, []byte(contents), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
err = os.Chmod(fn, 0755) err = os.Chmod(fn, 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("Chmod failed: %v", err)
}
fi, err := os.Lstat(fn) fi, err := os.Lstat(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&0111 == 0 { if fi.Mode()&0111 == 0 {
t.Errorf("1st attr error %o", fi.Mode()) t.Errorf("1st attr error %o", fi.Mode())
} }
time.Sleep(entryTtl) time.Sleep(entryTtl)
fi, err = os.Lstat(fn) fi, err = os.Lstat(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Mode()&0111 == 0 { if fi.Mode()&0111 == 0 {
t.Errorf("uncached attr error %o", fi.Mode()) t.Errorf("uncached attr error %o", fi.Mode())
} }
...@@ -704,15 +825,21 @@ func TestUnionFsTruncateTimestamp(t *testing.T) { ...@@ -704,15 +825,21 @@ func TestUnionFsTruncateTimestamp(t *testing.T) {
contents := "hello" contents := "hello"
fn := wd + "/mnt/y" fn := wd + "/mnt/y"
err := ioutil.WriteFile(fn, []byte(contents), 0644) err := ioutil.WriteFile(fn, []byte(contents), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
truncTs := time.Now() truncTs := time.Now()
err = os.Truncate(fn, 3) err = os.Truncate(fn, 3)
CheckSuccess(err) if err != nil {
t.Fatalf("Truncate failed: %v", err)
}
fi, err := os.Lstat(fn) fi, err := os.Lstat(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if truncTs.Sub(fi.ModTime()) > 100*time.Millisecond { if truncTs.Sub(fi.ModTime()) > 100*time.Millisecond {
t.Error("timestamp drift", truncTs, fi.ModTime()) t.Error("timestamp drift", truncTs, fi.ModTime())
...@@ -724,13 +851,17 @@ func TestUnionFsRemoveAll(t *testing.T) { ...@@ -724,13 +851,17 @@ func TestUnionFsRemoveAll(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/dir/subdir", 0755) err := os.MkdirAll(wd+"/ro/dir/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
contents := "hello" contents := "hello"
fn := wd + "/ro/dir/subdir/y" fn := wd + "/ro/dir/subdir/y"
err = ioutil.WriteFile(fn, []byte(contents), 0644) err = ioutil.WriteFile(fn, []byte(contents), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
err = os.RemoveAll(wd + "/mnt/dir") err = os.RemoveAll(wd + "/mnt/dir")
if err != nil { if err != nil {
...@@ -744,7 +875,9 @@ func TestUnionFsRemoveAll(t *testing.T) { ...@@ -744,7 +875,9 @@ func TestUnionFsRemoveAll(t *testing.T) {
} }
names, err := Readdirnames(wd + "/rw/DELETIONS") names, err := Readdirnames(wd + "/rw/DELETIONS")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names) != 3 { if len(names) != 3 {
t.Fatal("unexpected names", names) t.Fatal("unexpected names", names)
} }
...@@ -757,16 +890,22 @@ func TestUnionFsRmRf(t *testing.T) { ...@@ -757,16 +890,22 @@ func TestUnionFsRmRf(t *testing.T) {
defer clean() defer clean()
err := os.MkdirAll(wd+"/ro/dir/subdir", 0755) err := os.MkdirAll(wd+"/ro/dir/subdir", 0755)
CheckSuccess(err) if err != nil {
t.Fatalf("MkdirAll failed: %v", err)
}
contents := "hello" contents := "hello"
fn := wd + "/ro/dir/subdir/y" fn := wd + "/ro/dir/subdir/y"
err = ioutil.WriteFile(fn, []byte(contents), 0644) err = ioutil.WriteFile(fn, []byte(contents), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
bin, err := exec.LookPath("rm") bin, err := exec.LookPath("rm")
CheckSuccess(err) if err != nil {
t.Fatalf("LookPath failed: %v", err)
}
command := fmt.Sprintf("%s -f %s/mnt/dir", bin, wd) command := fmt.Sprintf("%s -f %s/mnt/dir", bin, wd)
log.Printf("Command: %s", command) log.Printf("Command: %s", command)
names, _ := Readdirnames(wd + "/mnt/dir") names, _ := Readdirnames(wd + "/mnt/dir")
...@@ -784,7 +923,9 @@ func TestUnionFsRmRf(t *testing.T) { ...@@ -784,7 +923,9 @@ func TestUnionFsRmRf(t *testing.T) {
} }
names, err = Readdirnames(wd + "/rw/DELETIONS") names, err = Readdirnames(wd + "/rw/DELETIONS")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names) != 3 { if len(names) != 3 {
t.Fatal("unexpected names", names) t.Fatal("unexpected names", names)
} }
...@@ -805,20 +946,28 @@ func TestUnionFsDropDeletionCache(t *testing.T) { ...@@ -805,20 +946,28 @@ func TestUnionFsDropDeletionCache(t *testing.T) {
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/ro/file", []byte("bla"), 0644) err := ioutil.WriteFile(wd+"/ro/file", []byte("bla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
_, err = os.Lstat(wd + "/mnt/file") _, err = os.Lstat(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
err = os.Remove(wd + "/mnt/file") err = os.Remove(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
fi, _ := os.Lstat(wd + "/mnt/file") fi, _ := os.Lstat(wd + "/mnt/file")
if fi != nil { if fi != nil {
t.Fatal("Lstat() should have failed", fi) t.Fatal("Lstat() should have failed", fi)
} }
names, err := Readdirnames(wd + "/rw/DELETIONS") names, err := Readdirnames(wd + "/rw/DELETIONS")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names) != 1 { if len(names) != 1 {
t.Fatal("unexpected names", names) t.Fatal("unexpected names", names)
} }
...@@ -831,7 +980,9 @@ func TestUnionFsDropDeletionCache(t *testing.T) { ...@@ -831,7 +980,9 @@ func TestUnionFsDropDeletionCache(t *testing.T) {
// Expire kernel entry. // Expire kernel entry.
time.Sleep((6 * entryTtl) / 10) time.Sleep((6 * entryTtl) / 10)
err = ioutil.WriteFile(wd+"/mnt/.drop_cache", []byte(""), 0644) err = ioutil.WriteFile(wd+"/mnt/.drop_cache", []byte(""), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/file") _, err = os.Lstat(wd + "/mnt/file")
if err != nil { if err != nil {
t.Fatal("Lstat() should have succeeded", err) t.Fatal("Lstat() should have succeeded", err)
...@@ -843,26 +994,36 @@ func TestUnionFsDropCache(t *testing.T) { ...@@ -843,26 +994,36 @@ func TestUnionFsDropCache(t *testing.T) {
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/ro/file", []byte("bla"), 0644) err := ioutil.WriteFile(wd+"/ro/file", []byte("bla"), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
_, err = os.Lstat(wd + "/mnt/.drop_cache") _, err = os.Lstat(wd + "/mnt/.drop_cache")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
names, err := Readdirnames(wd + "/mnt") names, err := Readdirnames(wd + "/mnt")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names) != 1 || names[0] != "file" { if len(names) != 1 || names[0] != "file" {
t.Fatal("unexpected names", names) t.Fatal("unexpected names", names)
} }
err = ioutil.WriteFile(wd+"/ro/file2", []byte("blabla"), 0644) err = ioutil.WriteFile(wd+"/ro/file2", []byte("blabla"), 0644)
names2, err := Readdirnames(wd + "/mnt") names2, err := Readdirnames(wd + "/mnt")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names2) != len(names) { if len(names2) != len(names) {
t.Fatal("mismatch", names2) t.Fatal("mismatch", names2)
} }
err = ioutil.WriteFile(wd+"/mnt/.drop_cache", []byte("does not matter"), 0644) err = ioutil.WriteFile(wd+"/mnt/.drop_cache", []byte("does not matter"), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
names2, err = Readdirnames(wd + "/mnt") names2, err = Readdirnames(wd + "/mnt")
if len(names2) != 2 { if len(names2) != 2 {
t.Fatal("mismatch 2", names2) t.Fatal("mismatch 2", names2)
...@@ -875,13 +1036,19 @@ func TestUnionFsDisappearing(t *testing.T) { ...@@ -875,13 +1036,19 @@ func TestUnionFsDisappearing(t *testing.T) {
wd, _ := ioutil.TempDir("", "") wd, _ := ioutil.TempDir("", "")
defer os.RemoveAll(wd) defer os.RemoveAll(wd)
err := os.Mkdir(wd+"/mnt", 0700) err := os.Mkdir(wd+"/mnt", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = os.Mkdir(wd+"/rw", 0700) err = os.Mkdir(wd+"/rw", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
os.Mkdir(wd+"/ro", 0700) os.Mkdir(wd+"/ro", 0700)
fuse.CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
wrFs := fuse.NewLoopbackFileSystem(wd + "/rw") wrFs := fuse.NewLoopbackFileSystem(wd + "/rw")
var fses []fuse.FileSystem var fses []fuse.FileSystem
...@@ -897,7 +1064,9 @@ func TestUnionFsDisappearing(t *testing.T) { ...@@ -897,7 +1064,9 @@ func TestUnionFsDisappearing(t *testing.T) {
nfs := fuse.NewPathNodeFs(ufs, nil) nfs := fuse.NewPathNodeFs(ufs, nil)
state, _, err := fuse.MountNodeFileSystem(wd+"/mnt", nfs, opts) state, _, err := fuse.MountNodeFileSystem(wd+"/mnt", nfs, opts)
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
defer state.Unmount() defer state.Unmount()
state.Debug = fuse.VerboseTest() state.Debug = fuse.VerboseTest()
go state.Loop() go state.Loop()
...@@ -905,11 +1074,15 @@ func TestUnionFsDisappearing(t *testing.T) { ...@@ -905,11 +1074,15 @@ func TestUnionFsDisappearing(t *testing.T) {
log.Println("TestUnionFsDisappearing2") log.Println("TestUnionFsDisappearing2")
err = ioutil.WriteFile(wd+"/ro/file", []byte("blabla"), 0644) err = ioutil.WriteFile(wd+"/ro/file", []byte("blabla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
err = os.Remove(wd + "/mnt/file") err = os.Remove(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
state.ThreadSanitizerSync() state.ThreadSanitizerSync()
oldRoot := wrFs.Root oldRoot := wrFs.Root
...@@ -949,15 +1122,21 @@ func TestUnionFsDeletedGetAttr(t *testing.T) { ...@@ -949,15 +1122,21 @@ func TestUnionFsDeletedGetAttr(t *testing.T) {
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/ro/file", []byte("blabla"), 0644) err := ioutil.WriteFile(wd+"/ro/file", []byte("blabla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
f, err := os.Open(wd + "/mnt/file") f, err := os.Open(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Open failed: %v", err)
}
defer f.Close() defer f.Close()
err = os.Remove(wd + "/mnt/file") err = os.Remove(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
if fi, err := f.Stat(); err != nil || fi.Mode()&os.ModeType != 0 { if fi, err := f.Stat(); err != nil || fi.Mode()&os.ModeType != 0 {
t.Fatalf("stat returned error or non-file: %v %v", err, fi) t.Fatalf("stat returned error or non-file: %v %v", err, fi)
...@@ -968,31 +1147,43 @@ func TestUnionFsDoubleOpen(t *testing.T) { ...@@ -968,31 +1147,43 @@ func TestUnionFsDoubleOpen(t *testing.T) {
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/ro/file", []byte("blablabla"), 0644) err := ioutil.WriteFile(wd+"/ro/file", []byte("blablabla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
roFile, err := os.Open(wd + "/mnt/file") roFile, err := os.Open(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("Open failed: %v", err)
}
defer roFile.Close() defer roFile.Close()
rwFile, err := os.OpenFile(wd+"/mnt/file", os.O_WRONLY|os.O_TRUNC, 0666) rwFile, err := os.OpenFile(wd+"/mnt/file", os.O_WRONLY|os.O_TRUNC, 0666)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
defer rwFile.Close() defer rwFile.Close()
output, err := ioutil.ReadAll(roFile) output, err := ioutil.ReadAll(roFile)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadAll failed: %v", err)
}
if len(output) != 0 { if len(output) != 0 {
t.Errorf("After r/w truncation, r/o file should be empty too: %q", string(output)) t.Errorf("After r/w truncation, r/o file should be empty too: %q", string(output))
} }
want := "hello" want := "hello"
_, err = rwFile.Write([]byte(want)) _, err = rwFile.Write([]byte(want))
CheckSuccess(err) if err != nil {
t.Fatalf("Write failed: %v", err)
}
b := make([]byte, 100) b := make([]byte, 100)
roFile.Seek(0, 0) roFile.Seek(0, 0)
n, err := roFile.Read(b) n, err := roFile.Read(b)
CheckSuccess(err) if err != nil {
t.Fatalf("Read failed: %v", err)
}
b = b[:n] b = b[:n]
if string(b) != "hello" { if string(b) != "hello" {
...@@ -1002,23 +1193,33 @@ func TestUnionFsDoubleOpen(t *testing.T) { ...@@ -1002,23 +1193,33 @@ func TestUnionFsDoubleOpen(t *testing.T) {
func TestUnionFsFdLeak(t *testing.T) { func TestUnionFsFdLeak(t *testing.T) {
beforeEntries, err := ioutil.ReadDir("/proc/self/fd") beforeEntries, err := ioutil.ReadDir("/proc/self/fd")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
wd, clean := setupUfs(t) wd, clean := setupUfs(t)
err = ioutil.WriteFile(wd+"/ro/file", []byte("blablabla"), 0644) err = ioutil.WriteFile(wd+"/ro/file", []byte("blablabla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
contents, err := ioutil.ReadFile(wd + "/mnt/file") contents, err := ioutil.ReadFile(wd + "/mnt/file")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadFile failed: %v", err)
}
err = ioutil.WriteFile(wd+"/mnt/file", contents, 0644) err = ioutil.WriteFile(wd+"/mnt/file", contents, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
clean() clean()
afterEntries, err := ioutil.ReadDir("/proc/self/fd") afterEntries, err := ioutil.ReadDir("/proc/self/fd")
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(afterEntries) != len(beforeEntries) { if len(afterEntries) != len(beforeEntries) {
t.Errorf("/proc/self/fd changed size: after %v before %v", len(beforeEntries), len(afterEntries)) t.Errorf("/proc/self/fd changed size: after %v before %v", len(beforeEntries), len(afterEntries))
...@@ -1045,16 +1246,24 @@ func TestUnionFsFlushSize(t *testing.T) { ...@@ -1045,16 +1246,24 @@ func TestUnionFsFlushSize(t *testing.T) {
fn := wd + "/mnt/file" fn := wd + "/mnt/file"
f, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0644) f, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
fi, err := f.Stat() fi, err := f.Stat()
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
n, err := f.Write([]byte("hello")) n, err := f.Write([]byte("hello"))
CheckSuccess(err) if err != nil {
t.Fatalf("Write failed: %v", err)
}
f.Close() f.Close()
fi, err = os.Lstat(fn) fi, err = os.Lstat(fn)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Size() != int64(n) { if fi.Size() != int64(n) {
t.Errorf("got %d from Stat().Size, want %d", fi.Size(), n) t.Errorf("got %d from Stat().Size, want %d", fi.Size(), n)
} }
...@@ -1068,20 +1277,30 @@ func TestUnionFsFlushRename(t *testing.T) { ...@@ -1068,20 +1277,30 @@ func TestUnionFsFlushRename(t *testing.T) {
fn := wd + "/mnt/tmp" fn := wd + "/mnt/tmp"
f, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0644) f, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
fi, err := f.Stat() fi, err := f.Stat()
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
n, err := f.Write([]byte("hello")) n, err := f.Write([]byte("hello"))
CheckSuccess(err) if err != nil {
t.Fatalf("Write failed: %v", err)
}
f.Close() f.Close()
dst := wd + "/mnt/file" dst := wd + "/mnt/file"
err = os.Rename(fn, dst) err = os.Rename(fn, dst)
CheckSuccess(err) if err != nil {
t.Fatalf("Rename failed: %v", err)
}
fi, err = os.Lstat(dst) fi, err = os.Lstat(dst)
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if fi.Size() != int64(n) { if fi.Size() != int64(n) {
t.Errorf("got %d from Stat().Size, want %d", fi.Size(), n) t.Errorf("got %d from Stat().Size, want %d", fi.Size(), n)
} }
...@@ -1093,11 +1312,17 @@ func TestUnionFsTruncGetAttr(t *testing.T) { ...@@ -1093,11 +1312,17 @@ func TestUnionFsTruncGetAttr(t *testing.T) {
c := []byte("hello") c := []byte("hello")
f, err := os.OpenFile(wd+"/mnt/file", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644) f, err := os.OpenFile(wd+"/mnt/file", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("OpenFile failed: %v", err)
}
_, err = f.Write(c) _, err = f.Write(c)
CheckSuccess(err) if err != nil {
t.Fatalf("Write failed: %v", err)
}
err = f.Close() err = f.Close()
CheckSuccess(err) if err != nil {
t.Fatalf("Close failed: %v", err)
}
fi, err := os.Lstat(wd + "/mnt/file") fi, err := os.Lstat(wd + "/mnt/file")
if fi.Size() != int64(len(c)) { if fi.Size() != int64(len(c)) {
...@@ -1110,18 +1335,28 @@ func TestUnionFsPromoteDirTimeStamp(t *testing.T) { ...@@ -1110,18 +1335,28 @@ func TestUnionFsPromoteDirTimeStamp(t *testing.T) {
defer clean() defer clean()
err := os.Mkdir(wd+"/ro/subdir", 0750) err := os.Mkdir(wd+"/ro/subdir", 0750)
CheckSuccess(err) if err != nil {
t.Fatalf("Mkdir failed: %v", err)
}
err = ioutil.WriteFile(wd+"/ro/subdir/file", []byte("hello"), 0644) err = ioutil.WriteFile(wd+"/ro/subdir/file", []byte("hello"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
err = os.Chmod(wd+"/mnt/subdir/file", 0060) err = os.Chmod(wd+"/mnt/subdir/file", 0060)
CheckSuccess(err) if err != nil {
t.Fatalf("Chmod failed: %v", err)
}
fRo, err := os.Lstat(wd + "/ro/subdir") fRo, err := os.Lstat(wd + "/ro/subdir")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
fRw, err := os.Lstat(wd + "/rw/subdir") fRw, err := os.Lstat(wd + "/rw/subdir")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
// TODO - need to update timestamps after promoteDirsTo calls, // TODO - need to update timestamps after promoteDirsTo calls,
// not during. // not during.
...@@ -1139,20 +1374,28 @@ func TestUnionFsCheckHiddenFiles(t *testing.T) { ...@@ -1139,20 +1374,28 @@ func TestUnionFsCheckHiddenFiles(t *testing.T) {
defer clean() defer clean()
err := ioutil.WriteFile(wd+"/ro/hidden", []byte("bla"), 0644) err := ioutil.WriteFile(wd+"/ro/hidden", []byte("bla"), 0644)
CheckSuccess(err) if err != nil {
t.Fatalf("WriteFile failed: %v", err)
}
err = ioutil.WriteFile(wd+"/ro/not_hidden", []byte("bla"), 0644) err = ioutil.WriteFile(wd+"/ro/not_hidden", []byte("bla"), 0644)
CheckSuccess(err) if err != nil {
freezeRo(wd + "/ro") t.Fatalf("WriteFile failed: %v", err)
}
freezeRo(t, wd+"/ro")
fi, _ := os.Lstat(wd + "/mnt/hidden") fi, _ := os.Lstat(wd + "/mnt/hidden")
if fi != nil { if fi != nil {
t.Fatal("Lstat() should have failed", fi) t.Fatal("Lstat() should have failed", fi)
} }
_, err = os.Lstat(wd + "/mnt/not_hidden") _, err = os.Lstat(wd + "/mnt/not_hidden")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
names, err := Readdirnames(wd + "/mnt") names, err := Readdirnames(wd + "/mnt")
CheckSuccess(err) if err != nil {
t.Fatalf("Readdirnames failed: %v", err)
}
if len(names) != 1 || names[0] != "not_hidden" { if len(names) != 1 || names[0] != "not_hidden" {
t.Fatal("unexpected names", names) t.Fatal("unexpected names", names)
} }
......
...@@ -10,11 +10,10 @@ import ( ...@@ -10,11 +10,10 @@ import (
) )
var _ = log.Printf var _ = log.Printf
var CheckSuccess = fuse.CheckSuccess
const testTtl = 100 * time.Millisecond const testTtl = 100 * time.Millisecond
func setupMzfs() (mountPoint string, cleanup func()) { func setupMzfs(t *testing.T) (mountPoint string, cleanup func()) {
fs := NewMultiZipFs() fs := NewMultiZipFs()
mountPoint, _ = ioutil.TempDir("", "") mountPoint, _ = ioutil.TempDir("", "")
nfs := fuse.NewPathNodeFs(fs, nil) nfs := fuse.NewPathNodeFs(fs, nil)
...@@ -23,7 +22,9 @@ func setupMzfs() (mountPoint string, cleanup func()) { ...@@ -23,7 +22,9 @@ func setupMzfs() (mountPoint string, cleanup func()) {
AttrTimeout: testTtl, AttrTimeout: testTtl,
NegativeTimeout: 0.0, NegativeTimeout: 0.0,
}) })
CheckSuccess(err) if err != nil {
t.Fatalf("MountNodeFileSystem failed: %v", err)
}
state.Debug = fuse.VerboseTest() state.Debug = fuse.VerboseTest()
go state.Loop() go state.Loop()
...@@ -34,7 +35,7 @@ func setupMzfs() (mountPoint string, cleanup func()) { ...@@ -34,7 +35,7 @@ func setupMzfs() (mountPoint string, cleanup func()) {
} }
func TestMultiZipReadonly(t *testing.T) { func TestMultiZipReadonly(t *testing.T) {
mountPoint, cleanup := setupMzfs() mountPoint, cleanup := setupMzfs(t)
defer cleanup() defer cleanup()
_, err := os.Create(mountPoint + "/random") _, err := os.Create(mountPoint + "/random")
...@@ -49,19 +50,23 @@ func TestMultiZipReadonly(t *testing.T) { ...@@ -49,19 +50,23 @@ func TestMultiZipReadonly(t *testing.T) {
} }
func TestMultiZipFs(t *testing.T) { func TestMultiZipFs(t *testing.T) {
mountPoint, cleanup := setupMzfs() mountPoint, cleanup := setupMzfs(t)
defer cleanup() defer cleanup()
zipFile := testZipFile() zipFile := testZipFile()
entries, err := ioutil.ReadDir(mountPoint) entries, err := ioutil.ReadDir(mountPoint)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(entries) != 1 || string(entries[0].Name()) != "config" { if len(entries) != 1 || string(entries[0].Name()) != "config" {
t.Errorf("wrong names return. %v", entries) t.Errorf("wrong names return. %v", entries)
} }
err = os.Symlink(zipFile, mountPoint+"/config/zipmount") err = os.Symlink(zipFile, mountPoint+"/config/zipmount")
CheckSuccess(err) if err != nil {
t.Fatalf("Symlink failed: %v", err)
}
fi, err := os.Lstat(mountPoint + "/zipmount") fi, err := os.Lstat(mountPoint + "/zipmount")
if !fi.IsDir() { if !fi.IsDir() {
...@@ -69,33 +74,43 @@ func TestMultiZipFs(t *testing.T) { ...@@ -69,33 +74,43 @@ func TestMultiZipFs(t *testing.T) {
} }
entries, err = ioutil.ReadDir(mountPoint) entries, err = ioutil.ReadDir(mountPoint)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(entries) != 2 { if len(entries) != 2 {
t.Error("Expect 2 entries", entries) t.Error("Expect 2 entries", entries)
} }
val, err := os.Readlink(mountPoint + "/config/zipmount") val, err := os.Readlink(mountPoint + "/config/zipmount")
CheckSuccess(err) if err != nil {
t.Fatalf("Readlink failed: %v", err)
}
if val != zipFile { if val != zipFile {
t.Errorf("expected %v got %v", zipFile, val) t.Errorf("expected %v got %v", zipFile, val)
} }
fi, err = os.Lstat(mountPoint + "/zipmount") fi, err = os.Lstat(mountPoint + "/zipmount")
CheckSuccess(err) if err != nil {
t.Fatalf("Lstat failed: %v", err)
}
if !fi.IsDir() { if !fi.IsDir() {
t.Fatal("expect directory for /zipmount, got %v", fi) t.Fatal("expect directory for /zipmount, got %v", fi)
} }
// Check that zipfs itself works. // Check that zipfs itself works.
fi, err = os.Stat(mountPoint + "/zipmount/subdir") fi, err = os.Stat(mountPoint + "/zipmount/subdir")
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
if !fi.IsDir() { if !fi.IsDir() {
t.Error("directory type", fi) t.Error("directory type", fi)
} }
// Removing the config dir unmount // Removing the config dir unmount
err = os.Remove(mountPoint + "/config/zipmount") err = os.Remove(mountPoint + "/config/zipmount")
CheckSuccess(err) if err != nil {
t.Fatalf("Remove failed: %v", err)
}
fi, err = os.Stat(mountPoint + "/zipmount") fi, err = os.Stat(mountPoint + "/zipmount")
if err == nil { if err == nil {
......
...@@ -18,9 +18,11 @@ func testZipFile() string { ...@@ -18,9 +18,11 @@ func testZipFile() string {
return filepath.Join(dir, "test.zip") return filepath.Join(dir, "test.zip")
} }
func setupZipfs() (mountPoint string, cleanup func()) { func setupZipfs(t *testing.T) (mountPoint string, cleanup func()) {
zfs, err := NewArchiveFileSystem(testZipFile()) zfs, err := NewArchiveFileSystem(testZipFile())
CheckSuccess(err) if err != nil {
t.Fatalf("NewArchiveFileSystem failed: %v", err)
}
mountPoint, _ = ioutil.TempDir("", "") mountPoint, _ = ioutil.TempDir("", "")
state, _, err := fuse.MountNodeFileSystem(mountPoint, zfs, nil) state, _, err := fuse.MountNodeFileSystem(mountPoint, zfs, nil)
...@@ -35,29 +37,37 @@ func setupZipfs() (mountPoint string, cleanup func()) { ...@@ -35,29 +37,37 @@ func setupZipfs() (mountPoint string, cleanup func()) {
} }
func TestZipFs(t *testing.T) { func TestZipFs(t *testing.T) {
mountPoint, clean := setupZipfs() mountPoint, clean := setupZipfs(t)
defer clean() defer clean()
entries, err := ioutil.ReadDir(mountPoint) entries, err := ioutil.ReadDir(mountPoint)
CheckSuccess(err) if err != nil {
t.Fatalf("ReadDir failed: %v", err)
}
if len(entries) != 2 { if len(entries) != 2 {
t.Error("wrong length", entries) t.Error("wrong length", entries)
} }
fi, err := os.Stat(mountPoint + "/subdir") fi, err := os.Stat(mountPoint + "/subdir")
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
if !fi.IsDir() { if !fi.IsDir() {
t.Error("directory type", fi) t.Error("directory type", fi)
} }
fi, err = os.Stat(mountPoint + "/file.txt") fi, err = os.Stat(mountPoint + "/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
if fi.IsDir() { if fi.IsDir() {
t.Error("file type", fi) t.Error("file type", fi)
} }
f, err := os.Open(mountPoint + "/file.txt") f, err := os.Open(mountPoint + "/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("Open failed: %v", err)
}
b := make([]byte, 1024) b := make([]byte, 1024)
n, err := f.Read(b) n, err := f.Read(b)
...@@ -70,11 +80,13 @@ func TestZipFs(t *testing.T) { ...@@ -70,11 +80,13 @@ func TestZipFs(t *testing.T) {
} }
func TestLinkCount(t *testing.T) { func TestLinkCount(t *testing.T) {
mp, clean := setupZipfs() mp, clean := setupZipfs(t)
defer clean() defer clean()
fi, err := os.Stat(mp + "/file.txt") fi, err := os.Stat(mp + "/file.txt")
CheckSuccess(err) if err != nil {
t.Fatalf("Stat failed: %v", err)
}
if fuse.ToStatT(fi).Nlink != 1 { if fuse.ToStatT(fi).Nlink != 1 {
t.Fatal("wrong link count", fuse.ToStatT(fi).Nlink) t.Fatal("wrong link count", fuse.ToStatT(fi).Nlink)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment