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  }