wasi: implements fd_filestat_set_size and fd_filestat_set_times (#1082)

This implements fd_filestat_set_size and fd_filestat_set_times, which
passes one more test in the rust wasi-testsuite.

Signed-off-by: Adrian Cole <adrian@tetrate.io>
Co-authored-by: Takeshi Yoneda <takeshi@tetrate.io>
This commit is contained in:
Crypt Keeper
2023-01-30 19:08:10 +02:00
committed by GitHub
parent f9db80624d
commit a60debc8d2
19 changed files with 567 additions and 48 deletions

View File

@@ -369,6 +369,88 @@ func TestDirFS_Open(t *testing.T) {
})
}
func TestDirFS_Truncate(t *testing.T) {
content := []byte("123456")
tests := []struct {
name string
size int64
expectedContent []byte
expectedErr error
}{
{
name: "one less",
size: 5,
expectedContent: []byte("12345"),
},
{
name: "same",
size: 6,
expectedContent: content,
},
{
name: "zero",
size: 0,
expectedContent: []byte(""),
},
{
name: "larger",
size: 106,
expectedContent: append(content, make([]byte, 100)...),
},
}
for _, tt := range tests {
tc := tt
t.Run(tc.name, func(t *testing.T) {
tmpDir := t.TempDir()
testFS := NewDirFS(tmpDir)
name := "truncate"
realPath := pathutil.Join(tmpDir, name)
require.NoError(t, os.WriteFile(realPath, content, 0o0600))
err := testFS.Truncate(name, tc.size)
require.NoError(t, err)
actual, err := os.ReadFile(realPath)
require.NoError(t, err)
require.Equal(t, tc.expectedContent, actual)
})
}
tmpDir := t.TempDir()
testFS := NewDirFS(tmpDir)
name := "truncate"
realPath := pathutil.Join(tmpDir, name)
if runtime.GOOS != "windows" {
// TODO: os.Truncate on windows can create the file even when it
// doesn't exist.
t.Run("doesn't exist", func(t *testing.T) {
err := testFS.Truncate(name, 0)
require.Equal(t, syscall.ENOENT, err)
})
}
t.Run("not file", func(t *testing.T) {
require.NoError(t, os.Mkdir(realPath, 0o700))
err := testFS.Truncate(name, 0)
require.Equal(t, syscall.EISDIR, err)
require.NoError(t, os.Remove(realPath))
})
t.Run("negative", func(t *testing.T) {
require.NoError(t, os.WriteFile(realPath, []byte{}, 0o600))
err := testFS.Truncate(name, -1)
require.Equal(t, syscall.EINVAL, err)
})
}
func TestDirFS_TestFS(t *testing.T) {
t.Parallel()