forked from jacobsa/fuse
-
Notifications
You must be signed in to change notification settings - Fork 6
/
mount_test.go
141 lines (114 loc) · 2.98 KB
/
mount_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package fuse_test
import (
"context"
"io/ioutil"
"os"
"path"
"runtime"
"strings"
"testing"
"github.com/jacobsa/fuse"
"github.com/jacobsa/fuse/fuseops"
"github.com/jacobsa/fuse/fuseutil"
)
////////////////////////////////////////////////////////////////////////
// minimalFS
////////////////////////////////////////////////////////////////////////
// A minimal fuseutil.FileSystem that can successfully mount but do nothing
// else.
type minimalFS struct {
fuseutil.NotImplementedFileSystem
}
func (fs *minimalFS) StatFS(
ctx context.Context,
op *fuseops.StatFSOp) error {
return nil
}
////////////////////////////////////////////////////////////////////////
// Tests
////////////////////////////////////////////////////////////////////////
func TestSuccessfulMount(t *testing.T) {
ctx := context.Background()
// Set up a temporary directory.
dir, err := ioutil.TempDir("", "mount_test")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(dir)
// Mount.
fs := &minimalFS{}
mfs, err := fuse.Mount(
dir,
fuseutil.NewFileSystemServer(fs),
&fuse.MountConfig{})
if err != nil {
t.Fatalf("fuse.Mount: %v", err)
}
defer func() {
if err := mfs.Join(ctx); err != nil {
t.Errorf("Joining: %v", err)
}
}()
defer fuse.Unmount(mfs.Dir())
}
func TestNonEmptyMountPoint(t *testing.T) {
ctx := context.Background()
// osxfuse appears to be happy to mount over a non-empty mount point.
//
// We leave this test in for Linux, because it tickles the behavior of
// fusermount writing to stderr and exiting with an error code. We want to
// make sure that a descriptive error makes it back to the user.
if runtime.GOOS == "darwin" {
return
}
// Set up a temporary directory.
dir, err := ioutil.TempDir("", "mount_test")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(dir)
// Add a file within it.
err = ioutil.WriteFile(path.Join(dir, "foo"), []byte{}, 0600)
if err != nil {
t.Fatalf("ioutil.WriteFile: %v", err)
}
// Attempt to mount.
fs := &minimalFS{}
mfs, err := fuse.Mount(
dir,
fuseutil.NewFileSystemServer(fs),
&fuse.MountConfig{})
if err == nil {
fuse.Unmount(mfs.Dir())
mfs.Join(ctx)
t.Fatal("fuse.Mount returned nil")
}
const want = "not empty"
if got := err.Error(); !strings.Contains(got, want) {
t.Errorf("Unexpected error: %v", got)
}
}
func TestNonexistentMountPoint(t *testing.T) {
ctx := context.Background()
// Set up a temporary directory.
dir, err := ioutil.TempDir("", "mount_test")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(dir)
// Attempt to mount into a sub-directory that doesn't exist.
fs := &minimalFS{}
mfs, err := fuse.Mount(
path.Join(dir, "foo"),
fuseutil.NewFileSystemServer(fs),
&fuse.MountConfig{})
if err == nil {
fuse.Unmount(mfs.Dir())
mfs.Join(ctx)
t.Fatal("fuse.Mount returned nil")
}
const want = "no such file"
if got := err.Error(); !strings.Contains(got, want) {
t.Errorf("Unexpected error: %v", got)
}
}