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  }