| package shared_tests |
| |
| import ( |
| "context" |
| "io" |
| "os" |
| "path" |
| "path/filepath" |
| "time" |
| |
| "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/sktest" |
| "go.skia.org/infra/go/vfs" |
| ) |
| |
| const ( |
| FakeFileName = "rootFile" |
| ) |
| |
| var ( |
| FakeContents = []byte(`hello world`) |
| FakeFileInfo = vfs.FileInfo{ |
| Name: FakeFileName, |
| Size: int64(len(FakeContents)), |
| Mode: 0666, |
| ModTime: time.Time{}, |
| IsDir: false, |
| Sys: nil, |
| }.Get() |
| ) |
| |
| // TestFS tests a vfs.FS implementation. It expects the passed-in FS to have the |
| // following structure: |
| // |
| // ./ |
| // subDir/ |
| // subDirFile => "subDirFile contents" |
| // rootFile => FakeContents |
| func TestFS(ctx context.Context, t sktest.TestingT, fs vfs.FS) { |
| defer func() { |
| require.NoError(t, fs.Close(ctx)) |
| }() |
| rootDir, err := fs.Open(ctx, ".") |
| require.NoError(t, err) |
| require.NotNil(t, rootDir) |
| defer func() { |
| require.NoError(t, rootDir.Close(ctx)) |
| }() |
| |
| // Stat. |
| fi, err := rootDir.Stat(ctx) |
| require.NoError(t, err) |
| require.NotNil(t, fi) |
| require.Equal(t, true, fi.IsDir()) |
| require.Equal(t, os.ModeDir, fi.Mode()&os.ModeDir) |
| |
| // ReadDir. |
| contents, err := rootDir.ReadDir(ctx, -1) |
| require.NoError(t, err) |
| require.Equal(t, 2, len(contents)) |
| // Fix ordering if necessary. |
| if contents[0].Name() == FakeFileName { |
| contents[0], contents[1] = contents[1], contents[0] |
| } |
| require.Equal(t, "subdir", contents[0].Name()) |
| require.True(t, contents[0].IsDir()) |
| require.Equal(t, os.ModeDir, contents[0].Mode()&os.ModeDir) |
| require.Equal(t, FakeFileName, contents[1].Name()) |
| require.False(t, contents[1].IsDir()) |
| require.Equal(t, os.FileMode(0), contents[1].Mode()&os.ModeDir) |
| |
| // Read. |
| rootFile, err := fs.Open(ctx, FakeFileName) |
| require.NoError(t, err) |
| rootFileContents, err := io.ReadAll(vfs.WithContext(ctx, rootFile)) |
| require.NoError(t, err) |
| require.Equal(t, []byte(FakeContents), rootFileContents) |
| st, err := rootFile.Stat(ctx) |
| require.NoError(t, err) |
| // Check that the mode is the same. We already know the content and name are the same, so |
| // everything else should be ok too. Asserting other things, like access/creation time can be |
| // a little flaky, so we do not do that. |
| require.Equal(t, contents[1].Mode(), st.Mode()) |
| require.NoError(t, rootFile.Close(ctx)) |
| |
| // Walk. |
| visited := map[string]bool{} |
| require.NoError(t, vfs.Walk(ctx, fs, ".", func(fp string, fi os.FileInfo, err error) error { |
| if err != nil { |
| return err |
| } |
| visited[fp] = true |
| return nil |
| })) |
| require.True(t, visited["."]) |
| require.True(t, visited[FakeFileName]) |
| require.True(t, visited["subdir"]) |
| require.True(t, visited[path.Join("subdir", "subDirFile")]) |
| } |
| |
| // MakeTestFiles creates a temporary directory containing the files and |
| // directories expected by TestFS. |
| func MakeTestFiles(t sktest.TestingT) string { |
| tmp := t.TempDir() |
| require.NoError(t, os.MkdirAll(filepath.Join(tmp, "subdir"), os.ModePerm)) |
| require.NoError(t, os.WriteFile(filepath.Join(tmp, FakeFileName), FakeContents, os.ModePerm)) |
| require.NoError(t, os.WriteFile(filepath.Join(tmp, "subdir", "subDirFile"), []byte("subDirFile contents"), os.ModePerm)) |
| return tmp |
| } |
| |
| func TestVFS_ReadOnly(t sktest.TestingT, fs vfs.FS) { |
| ctx := context.Background() |
| contents, err := vfs.ReadFile(ctx, fs, FakeFileName) |
| require.NoError(t, err) |
| require.Equal(t, FakeContents, contents) |
| } |
| |
| func TestVFS_ReadWrite(t sktest.TestingT, fs vfs.FS) { |
| ctx := context.Background() |
| contents, err := vfs.ReadFile(ctx, fs, FakeFileName) |
| require.NoError(t, err) |
| require.Equal(t, FakeContents, contents) |
| newContent := []byte("new contents") |
| require.NoError(t, vfs.WriteFile(ctx, fs, FakeFileName, newContent)) |
| contents, err = vfs.ReadFile(ctx, fs, FakeFileName) |
| require.NoError(t, err) |
| require.Equal(t, newContent, contents) |
| } |
| |
| func TestVFS_MultiWrite_ChangedToOriginal(t sktest.TestingT, fs vfs.FS) { |
| ctx := context.Background() |
| newContent := []byte("new contents") |
| require.NoError(t, vfs.WriteFile(ctx, fs, FakeFileName, newContent)) |
| contents, err := vfs.ReadFile(ctx, fs, FakeFileName) |
| require.NoError(t, err) |
| require.Equal(t, newContent, contents) |
| require.NoError(t, vfs.WriteFile(ctx, fs, FakeFileName, FakeContents)) |
| contents, err = vfs.ReadFile(ctx, fs, FakeFileName) |
| require.NoError(t, err) |
| require.Equal(t, FakeContents, contents) |
| } |