mirror of
https://github.com/hanzoai/go-fuse.git
synced 2026-10-30 14:46:18 +00:00
109 lines
2.1 KiB
Go
109 lines
2.1 KiB
Go
// Copyright 2018 the Go-FUSE Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package test
|
|
|
|
import (
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/hanzoai/go-fuse/v2/fuse"
|
|
"github.com/hanzoai/go-fuse/v2/fuse/nodefs"
|
|
"github.com/hanzoai/go-fuse/v2/internal/testutil"
|
|
)
|
|
|
|
type rootNode struct {
|
|
nodefs.Node
|
|
// represents backing store.
|
|
mu sync.Mutex
|
|
backing map[string]string
|
|
}
|
|
|
|
type blobNode struct {
|
|
nodefs.Node
|
|
content string
|
|
}
|
|
|
|
func (n *blobNode) GetAttr(out *fuse.Attr, file nodefs.File, context *fuse.Context) (code fuse.Status) {
|
|
out.Mode = fuse.S_IFREG | 0777
|
|
out.Size = uint64(len(n.content))
|
|
return fuse.OK
|
|
}
|
|
|
|
func (n *rootNode) Lookup(out *fuse.Attr, name string, context *fuse.Context) (*nodefs.Inode, fuse.Status) {
|
|
n.mu.Lock()
|
|
defer n.mu.Unlock()
|
|
want := n.backing[name]
|
|
|
|
if want == "" {
|
|
return nil, fuse.ENOENT
|
|
}
|
|
|
|
ch := n.Inode().GetChild(name)
|
|
var blob *blobNode
|
|
if ch != nil {
|
|
blob = ch.Node().(*blobNode)
|
|
if blob.content != want {
|
|
n.Inode().RmChild(name)
|
|
ch = nil
|
|
}
|
|
}
|
|
|
|
if ch == nil {
|
|
blob = &blobNode{nodefs.NewDefaultNode(), want}
|
|
ch = n.Inode().NewChild(name, false, blob)
|
|
}
|
|
|
|
status := blob.GetAttr(out, nil, nil)
|
|
return ch, status
|
|
}
|
|
|
|
func TestUpdateNode(t *testing.T) {
|
|
dir := t.TempDir()
|
|
root := &rootNode{
|
|
Node: nodefs.NewDefaultNode(),
|
|
backing: map[string]string{"a": "aaa"},
|
|
}
|
|
|
|
opts := nodefs.NewOptions()
|
|
opts.Debug = testutil.VerboseTest()
|
|
opts.EntryTimeout = 0
|
|
opts.LookupKnownChildren = true
|
|
|
|
server, _, err := nodefs.MountRoot(dir, root, opts)
|
|
if err != nil {
|
|
t.Fatalf("MountRoot: %v", err)
|
|
}
|
|
go server.Serve()
|
|
|
|
if err := server.WaitMount(); err != nil {
|
|
t.Fatalf("WaitMount: %v", err)
|
|
}
|
|
|
|
defer server.Unmount()
|
|
|
|
fi1, err := os.Lstat(dir + "/a")
|
|
if err != nil {
|
|
t.Fatal("Lstat", err)
|
|
}
|
|
|
|
if fi1.Size() != 3 {
|
|
t.Fatalf("got %v, want sz 3", fi1.Size())
|
|
}
|
|
|
|
root.mu.Lock()
|
|
root.backing["a"] = "x"
|
|
root.mu.Unlock()
|
|
|
|
fi2, err := os.Lstat(dir + "/a")
|
|
if err != nil {
|
|
t.Fatal("Lstat", err)
|
|
}
|
|
|
|
if fi2.Size() != 1 {
|
|
t.Fatalf("got %#v, want sz 1", fi2)
|
|
}
|
|
}
|