sysfs: requires all methods to return syscall.Errno
This forces all syscall functions, notably filesystem, to return numeric codes as opposed to mapping in two different areas. The result of this change is better consolidation in call sites of `sysfs.FS`, while further refactoring is needed to address consolidation of file errors. Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
@@ -19,22 +19,22 @@ func TestNewDirFS(t *testing.T) {
|
||||
testFS := NewDirFS(".")
|
||||
|
||||
// Guest can look up /
|
||||
f, err := testFS.OpenFile("/", os.O_RDONLY, 0)
|
||||
require.NoError(t, err)
|
||||
f, errno := testFS.OpenFile("/", os.O_RDONLY, 0)
|
||||
require.Zero(t, errno)
|
||||
require.NoError(t, f.Close())
|
||||
|
||||
t.Run("host path not found", func(t *testing.T) {
|
||||
testFS := NewDirFS("a")
|
||||
_, err = testFS.OpenFile(".", os.O_RDONLY, 0)
|
||||
require.EqualErrno(t, syscall.ENOENT, err)
|
||||
_, errno = testFS.OpenFile(".", os.O_RDONLY, 0)
|
||||
require.EqualErrno(t, syscall.ENOENT, errno)
|
||||
})
|
||||
t.Run("host path not a directory", func(t *testing.T) {
|
||||
arg0 := os.Args[0] // should be safe in scratch tests which don't have the source mounted.
|
||||
|
||||
testFS := NewDirFS(arg0)
|
||||
d, err := testFS.OpenFile(".", os.O_RDONLY, 0)
|
||||
require.NoError(t, err)
|
||||
_, err = d.(fs.ReadDirFile).ReadDir(-1)
|
||||
d, errno := testFS.OpenFile(".", os.O_RDONLY, 0)
|
||||
require.Zero(t, errno)
|
||||
_, err := d.(fs.ReadDirFile).ReadDir(-1)
|
||||
require.EqualErrno(t, syscall.ENOTDIR, platform.UnwrapOSError(err))
|
||||
})
|
||||
}
|
||||
@@ -66,7 +66,7 @@ func TestDirFS_Lstat(t *testing.T) {
|
||||
|
||||
testFS := NewDirFS(tmpDir)
|
||||
for _, path := range []string{"animals.txt", "sub", "sub-link"} {
|
||||
require.NoError(t, testFS.Symlink(path, path+"-link"))
|
||||
require.Zero(t, testFS.Symlink(path, path+"-link"))
|
||||
}
|
||||
|
||||
testLstat(t, testFS)
|
||||
@@ -80,9 +80,11 @@ func TestDirFS_MkDir(t *testing.T) {
|
||||
realPath := path.Join(tmpDir, name)
|
||||
|
||||
t.Run("doesn't exist", func(t *testing.T) {
|
||||
require.NoError(t, testFS.Mkdir(name, fs.ModeDir))
|
||||
require.Zero(t, testFS.Mkdir(name, fs.ModeDir))
|
||||
|
||||
stat, err := os.Stat(realPath)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, name, stat.Name())
|
||||
require.True(t, stat.IsDir())
|
||||
})
|
||||
@@ -129,19 +131,20 @@ func testChmod(t *testing.T, testFS FS, path string) {
|
||||
requireMode(t, testFS, path, 0o444)
|
||||
|
||||
// Test adding write, using 0o666 not 0o600 for read-back on windows.
|
||||
require.NoError(t, testFS.Chmod(path, 0o666))
|
||||
require.Zero(t, testFS.Chmod(path, 0o666))
|
||||
requireMode(t, testFS, path, 0o666)
|
||||
|
||||
if runtime.GOOS != "windows" {
|
||||
// Test clearing group and world, setting owner read+execute.
|
||||
require.NoError(t, testFS.Chmod(path, 0o500))
|
||||
require.Zero(t, testFS.Chmod(path, 0o500))
|
||||
requireMode(t, testFS, path, 0o500)
|
||||
}
|
||||
}
|
||||
|
||||
func requireMode(t *testing.T, testFS FS, path string, mode fs.FileMode) {
|
||||
st, err := testFS.Stat(path)
|
||||
require.NoError(t, err)
|
||||
st, errno := testFS.Stat(path)
|
||||
require.Zero(t, errno)
|
||||
|
||||
require.Equal(t, mode, st.Mode.Perm())
|
||||
}
|
||||
|
||||
@@ -165,17 +168,17 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
file1 := "file1"
|
||||
file1Path := path.Join(tmpDir, file1)
|
||||
file1Contents := []byte{1}
|
||||
err := os.WriteFile(file1Path, file1Contents, 0o600)
|
||||
require.NoError(t, err)
|
||||
errno := os.WriteFile(file1Path, file1Contents, 0o600)
|
||||
require.NoError(t, errno)
|
||||
|
||||
file2 := "file2"
|
||||
file2Path := path.Join(tmpDir, file2)
|
||||
err = testFS.Rename(file1, file2)
|
||||
require.NoError(t, err)
|
||||
errno = testFS.Rename(file1, file2)
|
||||
require.Zero(t, errno)
|
||||
|
||||
// Show the prior path no longer exists
|
||||
_, err = os.Stat(file1Path)
|
||||
require.EqualErrno(t, syscall.ENOENT, platform.UnwrapOSError(err))
|
||||
_, errno = os.Stat(file1Path)
|
||||
require.EqualErrno(t, syscall.ENOENT, platform.UnwrapOSError(errno))
|
||||
|
||||
s, err := os.Stat(file2Path)
|
||||
require.NoError(t, err)
|
||||
@@ -191,11 +194,11 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
|
||||
dir2 := "dir2"
|
||||
dir2Path := path.Join(tmpDir, dir2)
|
||||
err := testFS.Rename(dir1, dir2)
|
||||
require.NoError(t, err)
|
||||
errrno := testFS.Rename(dir1, dir2)
|
||||
require.Zero(t, errrno)
|
||||
|
||||
// Show the prior path no longer exists
|
||||
_, err = os.Stat(dir1Path)
|
||||
_, err := os.Stat(dir1Path)
|
||||
require.EqualErrno(t, syscall.ENOENT, platform.UnwrapOSError(err))
|
||||
|
||||
s, err := os.Stat(dir2Path)
|
||||
@@ -218,8 +221,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, f.Close())
|
||||
|
||||
err = testFS.Rename(dir1, dir2)
|
||||
require.EqualErrno(t, syscall.ENOTDIR, err)
|
||||
errno := testFS.Rename(dir1, dir2)
|
||||
require.EqualErrno(t, syscall.ENOTDIR, errno)
|
||||
})
|
||||
t.Run("file to dir", func(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
@@ -235,8 +238,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
dir1Path := path.Join(tmpDir, dir1)
|
||||
require.NoError(t, os.Mkdir(dir1Path, 0o700))
|
||||
|
||||
err = testFS.Rename(file1, dir1)
|
||||
require.EqualErrno(t, syscall.EISDIR, err)
|
||||
errno := testFS.Rename(file1, dir1)
|
||||
require.EqualErrno(t, syscall.EISDIR, errno)
|
||||
})
|
||||
|
||||
// Similar to https://github.com/ziglang/zig/blob/0.10.1/lib/std/fs/test.zig#L567-L582
|
||||
@@ -259,8 +262,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
dir2Path := path.Join(tmpDir, dir2)
|
||||
require.NoError(t, os.Mkdir(dir2Path, 0o700))
|
||||
|
||||
err = testFS.Rename(dir1, dir2)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Rename(dir1, dir2)
|
||||
require.Zero(t, errno)
|
||||
|
||||
// Show the prior path no longer exists
|
||||
_, err = os.Stat(dir1Path)
|
||||
@@ -296,8 +299,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
err = os.WriteFile(path.Join(dir2Path, "existing.txt"), []byte("any thing"), 0o600)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testFS.Rename(dir1, dir2)
|
||||
require.EqualErrno(t, syscall.ENOTEMPTY, err)
|
||||
errno := testFS.Rename(dir1, dir2)
|
||||
require.EqualErrno(t, syscall.ENOTEMPTY, errno)
|
||||
})
|
||||
|
||||
t.Run("file to file", func(t *testing.T) {
|
||||
@@ -316,8 +319,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
err = os.WriteFile(file2Path, file2Contents, 0o600)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testFS.Rename(file1, file2)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Rename(file1, file2)
|
||||
require.Zero(t, errno)
|
||||
|
||||
// Show the prior path no longer exists
|
||||
_, err = os.Stat(file1Path)
|
||||
@@ -336,8 +339,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
dir1Path := path.Join(tmpDir, dir1)
|
||||
require.NoError(t, os.Mkdir(dir1Path, 0o700))
|
||||
|
||||
err := testFS.Rename(dir1, dir1)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Rename(dir1, dir1)
|
||||
require.Zero(t, errno)
|
||||
|
||||
s, err := os.Stat(dir1Path)
|
||||
require.NoError(t, err)
|
||||
@@ -353,8 +356,8 @@ func TestDirFS_Rename(t *testing.T) {
|
||||
err := os.WriteFile(file1Path, file1Contents, 0o600)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testFS.Rename(file1, file1)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Rename(file1, file1)
|
||||
require.Zero(t, errno)
|
||||
|
||||
b, err := os.ReadFile(file1Path)
|
||||
require.NoError(t, err)
|
||||
@@ -404,8 +407,8 @@ func TestDirFS_Rmdir(t *testing.T) {
|
||||
require.NoError(t, os.Remove(fileInDir))
|
||||
|
||||
// After deletion, try removing directory.
|
||||
err := testFS.Rmdir(name)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Rmdir(name)
|
||||
require.Zero(t, errno)
|
||||
})
|
||||
|
||||
t.Run("dir empty", func(t *testing.T) {
|
||||
@@ -415,7 +418,7 @@ func TestDirFS_Rmdir(t *testing.T) {
|
||||
name := "rmdir"
|
||||
realPath := path.Join(tmpDir, name)
|
||||
require.NoError(t, os.Mkdir(realPath, 0o700))
|
||||
require.NoError(t, testFS.Rmdir(name))
|
||||
require.Zero(t, testFS.Rmdir(name))
|
||||
_, err := os.Stat(realPath)
|
||||
require.Error(t, err)
|
||||
})
|
||||
@@ -428,14 +431,14 @@ func TestDirFS_Rmdir(t *testing.T) {
|
||||
realPath := path.Join(tmpDir, name)
|
||||
require.NoError(t, os.Mkdir(realPath, 0o700))
|
||||
|
||||
f, err := testFS.OpenFile(name, platform.O_DIRECTORY, 0o700)
|
||||
require.NoError(t, err)
|
||||
f, errno := testFS.OpenFile(name, platform.O_DIRECTORY, 0o700)
|
||||
require.Zero(t, errno)
|
||||
defer func() {
|
||||
require.NoError(t, f.Close())
|
||||
}()
|
||||
|
||||
require.NoError(t, testFS.Rmdir(name))
|
||||
_, err = os.Stat(realPath)
|
||||
require.Zero(t, testFS.Rmdir(name))
|
||||
_, err := os.Stat(realPath)
|
||||
require.Error(t, err)
|
||||
})
|
||||
|
||||
@@ -491,11 +494,11 @@ func TestDirFS_Unlink(t *testing.T) {
|
||||
|
||||
// Create a symlink to the subdirectory.
|
||||
const symlinkName = "symlink-to-dir"
|
||||
require.NoError(t, testFS.Symlink("subdir", symlinkName))
|
||||
require.Zero(t, testFS.Symlink("subdir", symlinkName))
|
||||
|
||||
// Unlinking the symlink should suceed.
|
||||
err := testFS.Unlink(symlinkName)
|
||||
require.NoError(t, err)
|
||||
require.Zero(t, err)
|
||||
})
|
||||
|
||||
t.Run("file exists", func(t *testing.T) {
|
||||
@@ -507,7 +510,8 @@ func TestDirFS_Unlink(t *testing.T) {
|
||||
|
||||
require.NoError(t, os.WriteFile(realPath, []byte{}, 0o600))
|
||||
|
||||
require.NoError(t, testFS.Unlink(name))
|
||||
require.Zero(t, testFS.Unlink(name))
|
||||
|
||||
_, err := os.Stat(realPath)
|
||||
require.Error(t, err)
|
||||
})
|
||||
@@ -610,15 +614,15 @@ func TestDirFS_Utimesns(t *testing.T) {
|
||||
testFS := NewDirFS(tmpDir)
|
||||
|
||||
file := path.Join(tmpDir, "file")
|
||||
err := os.WriteFile(file, []byte{}, 0o700)
|
||||
require.NoError(t, err)
|
||||
errno := os.WriteFile(file, []byte{}, 0o700)
|
||||
require.NoError(t, errno)
|
||||
|
||||
link := file + "-link"
|
||||
require.NoError(t, os.Symlink(file, link))
|
||||
|
||||
dir := path.Join(tmpDir, "dir")
|
||||
err = os.Mkdir(dir, 0o700)
|
||||
require.NoError(t, err)
|
||||
errno = os.Mkdir(dir, 0o700)
|
||||
require.NoError(t, errno)
|
||||
|
||||
var path, statPath string
|
||||
switch fileType {
|
||||
@@ -638,18 +642,18 @@ func TestDirFS_Utimesns(t *testing.T) {
|
||||
panic(tc)
|
||||
}
|
||||
|
||||
oldSt, err := testFS.Lstat(statPath)
|
||||
require.NoError(t, err)
|
||||
oldSt, errno := testFS.Lstat(statPath)
|
||||
require.Zero(t, errno)
|
||||
|
||||
err = testFS.Utimens(path, tc.times, !symlinkNoFollow)
|
||||
errno = testFS.Utimens(path, tc.times, !symlinkNoFollow)
|
||||
if symlinkNoFollow && !platform.SupportsSymlinkNoFollow {
|
||||
require.EqualErrno(t, syscall.ENOSYS, err)
|
||||
require.EqualErrno(t, syscall.ENOSYS, errno)
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
require.Zero(t, errno)
|
||||
|
||||
newSt, err := testFS.Lstat(statPath)
|
||||
require.NoError(t, err)
|
||||
newSt, errno := testFS.Lstat(statPath)
|
||||
require.Zero(t, errno)
|
||||
|
||||
if platform.CompilerSupported() {
|
||||
if tc.times != nil && tc.times[0].Nsec == platform.UTIME_OMIT {
|
||||
@@ -711,8 +715,8 @@ func TestDirFS_Stat(t *testing.T) {
|
||||
name := `e:xperi\ment.txt`
|
||||
require.NoError(t, os.WriteFile(path.Join(tmpDir, name), nil, 0o600))
|
||||
|
||||
_, err := testFS.Stat(name)
|
||||
require.NoError(t, err)
|
||||
_, errno := testFS.Stat(name)
|
||||
require.Zero(t, errno)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -758,8 +762,8 @@ func TestDirFS_Truncate(t *testing.T) {
|
||||
realPath := path.Join(tmpDir, name)
|
||||
require.NoError(t, os.WriteFile(realPath, content, 0o0600))
|
||||
|
||||
err := testFS.Truncate(name, tc.size)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Truncate(name, tc.size)
|
||||
require.Zero(t, errno)
|
||||
|
||||
actual, err := os.ReadFile(realPath)
|
||||
require.NoError(t, err)
|
||||
@@ -821,12 +825,12 @@ func Test_fdReaddir_opened_file_written(t *testing.T) {
|
||||
testFS := NewDirFS(root)
|
||||
|
||||
const readDirTarget = "dir"
|
||||
err := testFS.Mkdir(readDirTarget, 0o700)
|
||||
require.NoError(t, err)
|
||||
errno := testFS.Mkdir(readDirTarget, 0o700)
|
||||
require.Zero(t, errno)
|
||||
|
||||
// Open the directory, before writing files!
|
||||
dirFile, err := testFS.OpenFile(readDirTarget, os.O_RDONLY, 0)
|
||||
require.NoError(t, err)
|
||||
dirFile, errno := testFS.OpenFile(readDirTarget, os.O_RDONLY, 0)
|
||||
require.Zero(t, errno)
|
||||
defer dirFile.Close()
|
||||
|
||||
// Then write a file to the directory.
|
||||
@@ -853,12 +857,12 @@ func TestDirFS_Link(t *testing.T) {
|
||||
|
||||
testFS := NewDirFS(tmpDir)
|
||||
|
||||
require.ErrorIs(t, testFS.Link("cat", ""), syscall.ENOENT)
|
||||
require.ErrorIs(t, testFS.Link("sub/test.txt", "sub/test.txt"), syscall.EEXIST)
|
||||
require.ErrorIs(t, testFS.Link("sub/test.txt", "."), syscall.EEXIST)
|
||||
require.ErrorIs(t, testFS.Link("sub/test.txt", ""), syscall.EEXIST)
|
||||
require.ErrorIs(t, testFS.Link("sub/test.txt", "/"), syscall.EEXIST)
|
||||
require.NoError(t, testFS.Link("sub/test.txt", "foo"))
|
||||
require.EqualErrno(t, testFS.Link("cat", ""), syscall.ENOENT)
|
||||
require.EqualErrno(t, testFS.Link("sub/test.txt", "sub/test.txt"), syscall.EEXIST)
|
||||
require.EqualErrno(t, testFS.Link("sub/test.txt", "."), syscall.EEXIST)
|
||||
require.EqualErrno(t, testFS.Link("sub/test.txt", ""), syscall.EEXIST)
|
||||
require.EqualErrno(t, testFS.Link("sub/test.txt", "/"), syscall.EEXIST)
|
||||
require.Zero(t, testFS.Link("sub/test.txt", "foo"))
|
||||
}
|
||||
|
||||
func TestDirFS_Symlink(t *testing.T) {
|
||||
@@ -870,10 +874,10 @@ func TestDirFS_Symlink(t *testing.T) {
|
||||
|
||||
testFS := NewDirFS(tmpDir)
|
||||
|
||||
require.ErrorIs(t, testFS.Symlink("sub/test.txt", "sub/test.txt"), syscall.EEXIST)
|
||||
require.EqualErrno(t, testFS.Symlink("sub/test.txt", "sub/test.txt"), syscall.EEXIST)
|
||||
// Non-existing old name is allowed.
|
||||
require.NoError(t, testFS.Symlink("non-existing", "aa"))
|
||||
require.NoError(t, testFS.Symlink("sub/", "symlinked-subdir"))
|
||||
require.Zero(t, testFS.Symlink("non-existing", "aa"))
|
||||
require.Zero(t, testFS.Symlink("sub/", "symlinked-subdir"))
|
||||
|
||||
st, err := os.Lstat(path.Join(tmpDir, "aa"))
|
||||
require.NoError(t, err)
|
||||
|
||||
Reference in New Issue
Block a user