func TestSuccessfulMount(t *testing.T) { ctx := context.Background() // Set up a temporary directory. dir, err := ioutil.TempDir("", "mount_test") if err != nil { t.Fatal("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 TestNonexistentMountPoint(t *testing.T) { ctx := context.Background() // Set up a temporary directory. dir, err := ioutil.TempDir("", "mount_test") if err != nil { t.Fatal("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) } }
func (s *GoofysTest) TestIssue69(t *C) { s.fs.flags.StatCacheTTL = 0 mountPoint := "/tmp/mnt" + s.fs.bucket err := os.MkdirAll(mountPoint, 0700) t.Assert(err, IsNil) s.mount(t, mountPoint) defer func() { err := os.Chdir("/") t.Assert(err, IsNil) err = fuse.Unmount(mountPoint) t.Assert(err, IsNil) }() err = os.Chdir(mountPoint) t.Assert(err, IsNil) _, err = os.Stat("dir1") t.Assert(err, IsNil) err = os.Remove("dir1/file3") t.Assert(err, IsNil) // don't really care about error code, but it should be a PathError os.Stat("dir1") os.Stat("dir1") }
func (s *GoofysTest) runFuseTest(t *C, mountPoint string, umount bool, cmdArgs ...string) { s.mount(t, mountPoint) if umount { defer func() { err := fuse.Unmount(mountPoint) t.Assert(err, IsNil) }() } cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, "TRAVIS=true") cmd.Env = append(cmd.Env, "FAST=true") if isTravis() { logger := NewLogger("test") lvl := logrus.InfoLevel logger.Formatter.(*logHandle).lvl = &lvl w := logger.Writer() cmd.Stdout = w cmd.Stderr = w } err := cmd.Run() t.Assert(err, IsNil) }
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.Fatal("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) } }
// Unmount the file system mounted at the supplied directory. Try again on // "resource busy" errors, which happen from time to time on OS X (due to weird // requests from the Finder). func unmount(dir string) (err error) { delay := 10 * time.Millisecond for { err = fuse.Unmount(dir) if err == nil { return } if strings.Contains(err.Error(), "resource busy") { log.Println("Resource busy error while unmounting; trying again") time.Sleep(delay) delay = time.Duration(1.3 * float64(delay)) continue } err = fmt.Errorf("Unmount: %v", err) return } }
func (t *fsTest) TearDown() { var err error // Close any files we opened. if t.f1 != nil { ExpectEq(nil, t.f1.Close()) } if t.f2 != nil { ExpectEq(nil, t.f2.Close()) } // Unmount the file system. Try again on "resource busy" errors. delay := 10 * time.Millisecond for { err := fuse.Unmount(t.mfs.Dir()) if err == nil { break } if strings.Contains(err.Error(), "resource busy") { log.Println("Resource busy error while unmounting; trying again") time.Sleep(delay) delay = time.Duration(1.3 * float64(delay)) continue } AddFailure("MountedFileSystem.Unmount: %v", err) AbortTest() } if err := t.mfs.Join(t.ctx); err != nil { AssertEq(nil, err) } // Unlink the mount point. if err = os.Remove(t.Dir); err != nil { err = fmt.Errorf("Unlinking mount point: %v", err) return } }
func registerSIGINTHandler(mountPoint string) { // Register for SIGINT. signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, os.Interrupt) // Start a goroutine that will unmount when the signal is received. go func() { for { <-signalChan log.Println("Received SIGINT, attempting to unmount...") err := fuse.Unmount(mountPoint) if err != nil { log.Printf("Failed to unmount in response to SIGINT: %v", err) } else { log.Printf("Successfully unmounted in response to SIGINT.") return } } }() }
func registerSIGINTHandler(mountPoint string) { // Register for SIGINT. signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) // Start a goroutine that will unmount when the signal is received. go func() { for { s := <-signalChan log.Infof("Received %v, attempting to unmount...", s) err := fuse.Unmount(mountPoint) if err != nil { log.Errorf("Failed to unmount in response to %v: %v", s, err) } else { log.Printf("Successfully unmounted %v in response to %v", s, mountPoint) return } } }() }
func (s *GoofysTest) runFuseTest(t *C, mountPoint string, umount bool, cmdArgs ...string) { server := fuseutil.NewFileSystemServer(s.fs) // Mount the file system. mountCfg := &fuse.MountConfig{ FSName: s.fs.bucket, Options: s.fs.flags.MountOptions, ErrorLogger: GetStdLogger(NewLogger("fuse"), logrus.ErrorLevel), DisableWritebackCaching: true, } _, err := fuse.Mount(mountPoint, server, mountCfg) t.Assert(err, IsNil) if umount { defer func() { err := fuse.Unmount(mountPoint) t.Assert(err, IsNil) }() } cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, "TRAVIS=true") cmd.Env = append(cmd.Env, "FAST=true") if isTravis() { logger := NewLogger("test") lvl := logrus.InfoLevel logger.Formatter.(*logHandle).lvl = &lvl w := logger.Writer() cmd.Stdout = w cmd.Stderr = w } err = cmd.Run() t.Assert(err, IsNil) }
func unmount(dir string) error { return fuse.Unmount(dir) }