|  | // Copyright 2009 The Go 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 fileutils | 
|  |  | 
|  | import ( | 
|  | "os" | 
|  | "runtime" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | var isReadonlyError = func(error) bool { return false } | 
|  |  | 
|  | func TestRemoveAll(t *testing.T) { | 
|  | tmpDir := os.TempDir() | 
|  | // Work directory. | 
|  | path := tmpDir + "/_TestRemoveAll_" | 
|  | fpath := path + "/file" | 
|  | dpath := path + "/dir" | 
|  |  | 
|  | // Make directory with 1 file and remove. | 
|  | if err := os.MkdirAll(path, 0777); err != nil { | 
|  | t.Fatalf("MkdirAll %q: %s", path, err) | 
|  | } | 
|  | fd, err := os.Create(fpath) | 
|  | if err != nil { | 
|  | t.Fatalf("create %q: %s", fpath, err) | 
|  | } | 
|  | fd.Close() | 
|  | if err = RemoveAll(path); err != nil { | 
|  | t.Fatalf("RemoveAll %q (first): %s", path, err) | 
|  | } | 
|  | if _, err = os.Lstat(path); err == nil { | 
|  | t.Fatalf("Lstat %q succeeded after RemoveAll (first)", path) | 
|  | } | 
|  |  | 
|  | // Make directory with file and subdirectory and remove. | 
|  | if err = os.MkdirAll(dpath, 0777); err != nil { | 
|  | t.Fatalf("MkdirAll %q: %s", dpath, err) | 
|  | } | 
|  | fd, err = os.Create(fpath) | 
|  | if err != nil { | 
|  | t.Fatalf("create %q: %s", fpath, err) | 
|  | } | 
|  | fd.Close() | 
|  | fd, err = os.Create(dpath + "/file") | 
|  | if err != nil { | 
|  | t.Fatalf("create %q: %s", fpath, err) | 
|  | } | 
|  | fd.Close() | 
|  | if err = RemoveAll(path); err != nil { | 
|  | t.Fatalf("RemoveAll %q (second): %s", path, err) | 
|  | } | 
|  | if _, err := os.Lstat(path); err == nil { | 
|  | t.Fatalf("Lstat %q succeeded after RemoveAll (second)", path) | 
|  | } | 
|  |  | 
|  | // Determine if we should run the following test. | 
|  | testit := true | 
|  | if runtime.GOOS == "windows" { | 
|  | // Chmod is not supported under windows. | 
|  | testit = false | 
|  | } else { | 
|  | // Test fails as root. | 
|  | testit = os.Getuid() != 0 | 
|  | } | 
|  | if testit { | 
|  | // Make directory with file and subdirectory and trigger error. | 
|  | if err = os.MkdirAll(dpath, 0777); err != nil { | 
|  | t.Fatalf("MkdirAll %q: %s", dpath, err) | 
|  | } | 
|  |  | 
|  | for _, s := range []string{fpath, dpath + "/file1", path + "/zzz"} { | 
|  | fd, err = os.Create(s) | 
|  | if err != nil { | 
|  | t.Fatalf("create %q: %s", s, err) | 
|  | } | 
|  | fd.Close() | 
|  | } | 
|  | if err = os.Chmod(dpath, 0); err != nil { | 
|  | t.Fatalf("Chmod %q 0: %s", dpath, err) | 
|  | } | 
|  |  | 
|  | // No error checking here: either RemoveAll | 
|  | // will or won't be able to remove dpath; | 
|  | // either way we want to see if it removes fpath | 
|  | // and path/zzz.  Reasons why RemoveAll might | 
|  | // succeed in removing dpath as well include: | 
|  | //	* running as root | 
|  | //	* running on a file system without permissions (FAT) | 
|  | RemoveAll(path) | 
|  | os.Chmod(dpath, 0777) | 
|  |  | 
|  | for _, s := range []string{fpath, path + "/zzz"} { | 
|  | if _, err = os.Lstat(s); err == nil { | 
|  | t.Fatalf("Lstat %q succeeded after partial RemoveAll", s) | 
|  | } | 
|  | } | 
|  | } | 
|  | if err = RemoveAll(path); err != nil { | 
|  | t.Fatalf("RemoveAll %q after partial RemoveAll: %s", path, err) | 
|  | } | 
|  | if _, err = os.Lstat(path); err == nil { | 
|  | t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path) | 
|  | } | 
|  | } |