github.com/hanwen/go-fuse@v1.0.0/fuse/pathfs/owner_test.go (about) 1 // Copyright 2016 the Go-FUSE Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package pathfs 6 7 import ( 8 "os" 9 "syscall" 10 "testing" 11 12 "github.com/hanwen/go-fuse/fuse" 13 "github.com/hanwen/go-fuse/fuse/nodefs" 14 "github.com/hanwen/go-fuse/internal/testutil" 15 ) 16 17 type ownerFs struct { 18 FileSystem 19 } 20 21 const _RANDOM_OWNER = 31415265 22 23 func (fs *ownerFs) GetAttr(name string, context *fuse.Context) (*fuse.Attr, fuse.Status) { 24 if name == "" { 25 return &fuse.Attr{ 26 Mode: fuse.S_IFDIR | 0755, 27 }, fuse.OK 28 } 29 a := &fuse.Attr{ 30 Mode: fuse.S_IFREG | 0644, 31 } 32 a.Uid = _RANDOM_OWNER 33 a.Gid = _RANDOM_OWNER 34 return a, fuse.OK 35 } 36 37 func setupOwnerTest(t *testing.T, opts *nodefs.Options) (workdir string, cleanup func()) { 38 wd := testutil.TempDir() 39 40 opts.Debug = testutil.VerboseTest() 41 fs := &ownerFs{NewDefaultFileSystem()} 42 nfs := NewPathNodeFs(fs, nil) 43 state, _, err := nodefs.MountRoot(wd, nfs.Root(), opts) 44 if err != nil { 45 t.Fatalf("MountNodeFileSystem failed: %v", err) 46 } 47 go state.Serve() 48 if err := state.WaitMount(); err != nil { 49 t.Fatalf("WaitMount: %v", err) 50 } 51 return wd, func() { 52 state.Unmount() 53 os.RemoveAll(wd) 54 } 55 } 56 57 func TestOwnerDefault(t *testing.T) { 58 wd, cleanup := setupOwnerTest(t, nodefs.NewOptions()) 59 defer cleanup() 60 61 var stat syscall.Stat_t 62 err := syscall.Lstat(wd+"/foo", &stat) 63 if err != nil { 64 t.Fatalf("Lstat failed: %v", err) 65 } 66 67 if int(stat.Uid) != os.Getuid() || int(stat.Gid) != os.Getgid() { 68 t.Fatal("Should use current uid for mount") 69 } 70 } 71 72 func TestOwnerRoot(t *testing.T) { 73 wd, cleanup := setupOwnerTest(t, &nodefs.Options{}) 74 defer cleanup() 75 76 var st syscall.Stat_t 77 err := syscall.Lstat(wd+"/foo", &st) 78 if err != nil { 79 t.Fatalf("Lstat failed: %v", err) 80 } 81 82 if st.Uid != _RANDOM_OWNER || st.Gid != _RANDOM_OWNER { 83 t.Fatal("Should use FS owner uid") 84 } 85 } 86 87 func TestOwnerOverride(t *testing.T) { 88 wd, cleanup := setupOwnerTest(t, &nodefs.Options{Owner: &fuse.Owner{Uid: 42, Gid: 43}}) 89 defer cleanup() 90 91 var stat syscall.Stat_t 92 err := syscall.Lstat(wd+"/foo", &stat) 93 if err != nil { 94 t.Fatalf("Lstat failed: %v", err) 95 } 96 97 if stat.Uid != 42 || stat.Gid != 43 { 98 t.Fatal("Should use current uid for mount") 99 } 100 }