forked from mirror/afero
153 lines
3.5 KiB
Go
153 lines
3.5 KiB
Go
package afero
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestNormalizePath(t *testing.T) {
|
|
type test struct {
|
|
input string
|
|
expected string
|
|
}
|
|
|
|
data := []test{
|
|
{".", FilePathSeparator},
|
|
{"./", FilePathSeparator},
|
|
{"..", FilePathSeparator},
|
|
{"../", FilePathSeparator},
|
|
{"./..", FilePathSeparator},
|
|
{"./../", FilePathSeparator},
|
|
}
|
|
|
|
for i, d := range data {
|
|
cpath := normalizePath(d.input)
|
|
if d.expected != cpath {
|
|
t.Errorf("Test %d failed. Expected %q got %q", i, d.expected, cpath)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPathErrors(t *testing.T) {
|
|
path := filepath.Join(".", "some", "path")
|
|
path2 := filepath.Join(".", "different", "path")
|
|
fs := &MemMapFs{}
|
|
perm := os.FileMode(0755)
|
|
|
|
// relevant functions:
|
|
// func (m *MemMapFs) Chmod(name string, mode os.FileMode) error
|
|
// func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error
|
|
// func (m *MemMapFs) Create(name string) (File, error)
|
|
// func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error
|
|
// func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error
|
|
// func (m *MemMapFs) Open(name string) (File, error)
|
|
// func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error)
|
|
// func (m *MemMapFs) Remove(name string) error
|
|
// func (m *MemMapFs) Rename(oldname, newname string) error
|
|
// func (m *MemMapFs) Stat(name string) (os.FileInfo, error)
|
|
|
|
err := fs.Chmod(path, perm)
|
|
checkPathError(t, err, "Chmod")
|
|
|
|
err = fs.Chtimes(path, time.Now(), time.Now())
|
|
checkPathError(t, err, "Chtimes")
|
|
|
|
// fs.Create doesn't return an error
|
|
|
|
err = fs.Mkdir(path2, perm)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
err = fs.Mkdir(path2, perm)
|
|
checkPathError(t, err, "Mkdir")
|
|
|
|
err = fs.MkdirAll(path2, perm)
|
|
if err != nil {
|
|
t.Error("MkdirAll:", err)
|
|
}
|
|
|
|
_, err = fs.Open(path)
|
|
checkPathError(t, err, "Open")
|
|
|
|
_, err = fs.OpenFile(path, os.O_RDWR, perm)
|
|
checkPathError(t, err, "OpenFile")
|
|
|
|
err = fs.Remove(path)
|
|
checkPathError(t, err, "Remove")
|
|
|
|
err = fs.RemoveAll(path)
|
|
if err != nil {
|
|
t.Error("RemoveAll:", err)
|
|
}
|
|
|
|
err = fs.Rename(path, path2)
|
|
checkPathError(t, err, "Rename")
|
|
|
|
_, err = fs.Stat(path)
|
|
checkPathError(t, err, "Stat")
|
|
}
|
|
|
|
func checkPathError(t *testing.T, err error, op string) {
|
|
pathErr, ok := err.(*os.PathError)
|
|
if !ok {
|
|
t.Error(op+":", err, "is not a os.PathError")
|
|
return
|
|
}
|
|
_, ok = pathErr.Err.(*os.PathError)
|
|
if ok {
|
|
t.Error(op+":", err, "contains another os.PathError")
|
|
}
|
|
}
|
|
|
|
// Fails if multiple file objects use the same file.at counter in MemMapFs
|
|
func TestMultipleOpenFiles(t *testing.T) {
|
|
defer removeAllTestFiles(t)
|
|
const fileName = "./afero-demo2.txt"
|
|
|
|
var fss = []Fs{&OsFs{}, &MemMapFs{}}
|
|
var data = make([][]byte, len(fss))
|
|
|
|
for i, fs := range fss {
|
|
dir := testDir(fs)
|
|
path := filepath.Join(dir, fileName)
|
|
fh1, err := fs.Create(path)
|
|
if err != nil {
|
|
t.Error("os.Create failed: " + err.Error())
|
|
}
|
|
_, err = fh1.Write([]byte("test"))
|
|
if err != nil {
|
|
t.Error("fh.Write failed: " + err.Error())
|
|
}
|
|
fh1.Seek(0, os.SEEK_SET)
|
|
|
|
fh2, err := fs.OpenFile(path, os.O_RDWR, 0777)
|
|
if err != nil {
|
|
t.Error("fs.OpenFile failed: " + err.Error())
|
|
}
|
|
fh2.Seek(0, os.SEEK_END)
|
|
fh2.Write([]byte("data"))
|
|
fh2.Close()
|
|
|
|
fh1.Write([]byte("data"))
|
|
fh1.Close()
|
|
// the file now should contain "datadata"
|
|
data[i], err = ReadFile(fs, path)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
for i, fs := range fss {
|
|
if i == 0 {
|
|
continue
|
|
}
|
|
if string(data[0]) != string(data[i]) {
|
|
t.Errorf("OsFs and %s don't behave the same\n"+
|
|
"OsFs: \"%s\"\n%s: \"%s\"\n",
|
|
fs.Name(), data[0], fs.Name(), data[i])
|
|
}
|
|
}
|
|
}
|