github.com/tetratelabs/wazero@v1.2.1/internal/sysfs/readfs_test.go (about) 1 package sysfs 2 3 import ( 4 "io/fs" 5 "os" 6 "runtime" 7 "syscall" 8 "testing" 9 10 "github.com/tetratelabs/wazero/internal/fsapi" 11 "github.com/tetratelabs/wazero/internal/fstest" 12 "github.com/tetratelabs/wazero/internal/testing/require" 13 ) 14 15 func TestNewReadFS(t *testing.T) { 16 tmpDir := t.TempDir() 17 18 // Doesn't double-wrap file systems that are already read-only 19 require.Equal(t, fsapi.UnimplementedFS{}, NewReadFS(fsapi.UnimplementedFS{})) 20 21 // Wraps a fsapi.FS because it allows access to Write 22 adapted := Adapt(os.DirFS(tmpDir)) 23 require.NotEqual(t, adapted, NewReadFS(adapted)) 24 25 // Wraps a writeable file system 26 writeable := NewDirFS(tmpDir) 27 readFS := NewReadFS(writeable) 28 require.NotEqual(t, writeable, readFS) 29 } 30 31 func TestReadFS_String(t *testing.T) { 32 writeable := NewDirFS("/tmp") 33 34 readFS := NewReadFS(writeable) 35 require.NotEqual(t, writeable, readFS) 36 require.Equal(t, "/tmp", readFS.String()) 37 } 38 39 func TestReadFS_Lstat(t *testing.T) { 40 tmpDir := t.TempDir() 41 require.NoError(t, fstest.WriteTestFiles(tmpDir)) 42 43 writeable := NewDirFS(tmpDir) 44 for _, path := range []string{"animals.txt", "sub", "sub-link"} { 45 require.EqualErrno(t, 0, writeable.Symlink(path, path+"-link")) 46 } 47 48 testFS := NewReadFS(writeable) 49 50 testLstat(t, testFS) 51 } 52 53 func TestReadFS_MkDir(t *testing.T) { 54 writeable := NewDirFS(t.TempDir()) 55 testFS := NewReadFS(writeable) 56 57 err := testFS.Mkdir("mkdir", fs.ModeDir) 58 require.EqualErrno(t, syscall.EROFS, err) 59 } 60 61 func TestReadFS_Chmod(t *testing.T) { 62 writeable := NewDirFS(t.TempDir()) 63 testFS := NewReadFS(writeable) 64 65 err := testFS.Chmod("chmod", fs.ModeDir) 66 require.EqualErrno(t, syscall.EROFS, err) 67 } 68 69 func TestReadFS_Rename(t *testing.T) { 70 tmpDir := t.TempDir() 71 writeable := NewDirFS(tmpDir) 72 testFS := NewReadFS(writeable) 73 74 file1 := "file1" 75 file1Path := joinPath(tmpDir, file1) 76 file1Contents := []byte{1} 77 err := os.WriteFile(file1Path, file1Contents, 0o600) 78 require.NoError(t, err) 79 80 file2 := "file2" 81 file2Path := joinPath(tmpDir, file2) 82 file2Contents := []byte{2} 83 err = os.WriteFile(file2Path, file2Contents, 0o600) 84 require.NoError(t, err) 85 86 err = testFS.Rename(file1, file2) 87 require.EqualErrno(t, syscall.EROFS, err) 88 } 89 90 func TestReadFS_Rmdir(t *testing.T) { 91 tmpDir := t.TempDir() 92 writeable := NewDirFS(tmpDir) 93 testFS := NewReadFS(writeable) 94 95 path := "rmdir" 96 realPath := joinPath(tmpDir, path) 97 require.NoError(t, os.Mkdir(realPath, 0o700)) 98 99 err := testFS.Rmdir(path) 100 require.EqualErrno(t, syscall.EROFS, err) 101 } 102 103 func TestReadFS_Unlink(t *testing.T) { 104 tmpDir := t.TempDir() 105 writeable := NewDirFS(tmpDir) 106 testFS := NewReadFS(writeable) 107 108 path := "unlink" 109 realPath := joinPath(tmpDir, path) 110 require.NoError(t, os.WriteFile(realPath, []byte{}, 0o600)) 111 112 err := testFS.Unlink(path) 113 require.EqualErrno(t, syscall.EROFS, err) 114 } 115 116 func TestReadFS_UtimesNano(t *testing.T) { 117 tmpDir := t.TempDir() 118 writeable := NewDirFS(tmpDir) 119 testFS := NewReadFS(writeable) 120 121 path := "utimes" 122 realPath := joinPath(tmpDir, path) 123 require.NoError(t, os.WriteFile(realPath, []byte{}, 0o600)) 124 125 err := testFS.Utimens(path, nil, true) 126 require.EqualErrno(t, syscall.EROFS, err) 127 } 128 129 func TestReadFS_Open_Read(t *testing.T) { 130 t.Parallel() 131 132 tmpDir := t.TempDir() 133 require.NoError(t, fstest.WriteTestFiles(tmpDir)) 134 135 type test struct { 136 name string 137 fs fsapi.FS 138 expectIno bool 139 } 140 141 tests := []test{ 142 {name: "DirFS", fs: NewReadFS(NewDirFS(tmpDir)), expectIno: true}, 143 {name: "fstest.MapFS", fs: NewReadFS(Adapt(fstest.FS)), expectIno: false}, 144 } 145 146 // We can't correct operating system portability issues with os.DirFS on 147 // windows. Use syscall.DirFS instead! 148 if runtime.GOOS != "windows" { 149 tests = append(tests, test{name: "os.DirFS", fs: NewReadFS(Adapt(os.DirFS(tmpDir))), expectIno: true}) 150 } 151 152 for _, tc := range tests { 153 tc := tc 154 155 t.Run(tc.name, func(t *testing.T) { 156 testOpen_Read(t, tc.fs, tc.expectIno) 157 }) 158 } 159 } 160 161 func TestReadFS_Stat(t *testing.T) { 162 tmpDir := t.TempDir() 163 require.NoError(t, fstest.WriteTestFiles(tmpDir)) 164 165 writeable := NewDirFS(tmpDir) 166 testFS := NewReadFS(writeable) 167 testStat(t, testFS) 168 } 169 170 func TestReadFS_Readlink(t *testing.T) { 171 tmpDir := t.TempDir() 172 require.NoError(t, fstest.WriteTestFiles(tmpDir)) 173 174 writeable := NewDirFS(tmpDir) 175 testFS := NewReadFS(writeable) 176 testReadlink(t, testFS, writeable) 177 }