ext: IterDirent unit tests.

PiperOrigin-RevId: 262226761
This commit is contained in:
Ayush Ranjan 2019-08-07 15:23:19 -07:00 committed by gVisor bot
parent 1c9781a4ed
commit ad67e5a7a0
1 changed files with 115 additions and 0 deletions

View File

@ -18,6 +18,7 @@ import (
"fmt"
"os"
"path"
"sort"
"testing"
"github.com/google/go-cmp/cmp"
@ -79,6 +80,120 @@ func setUp(t *testing.T, imagePath string) (context.Context, *vfs.VirtualFilesys
return ctx, vfsObj, &root, tearDown, nil
}
// iterDirentsCb is a simple callback which just keeps adding the dirents to an
// internal list. Implements vfs.IterDirentsCallback.
type iterDirentsCb struct {
dirents []vfs.Dirent
}
// Compiles only if iterDirentCb implements vfs.IterDirentsCallback.
var _ vfs.IterDirentsCallback = (*iterDirentsCb)(nil)
// newIterDirentsCb is the iterDirent
func newIterDirentCb() *iterDirentsCb {
return &iterDirentsCb{dirents: make([]vfs.Dirent, 0)}
}
// Handle implements vfs.IterDirentsCallback.Handle.
func (cb *iterDirentsCb) Handle(dirent vfs.Dirent) bool {
cb.dirents = append(cb.dirents, dirent)
return true
}
// TestIterDirents tests the FileDescriptionImpl.IterDirents functionality.
func TestIterDirents(t *testing.T) {
type iterDirentTest struct {
name string
image string
path string
want []vfs.Dirent
}
wantDirents := []vfs.Dirent{
vfs.Dirent{
Name: ".",
Type: linux.DT_DIR,
},
vfs.Dirent{
Name: "..",
Type: linux.DT_DIR,
},
vfs.Dirent{
Name: "lost+found",
Type: linux.DT_DIR,
},
vfs.Dirent{
Name: "file.txt",
Type: linux.DT_REG,
},
vfs.Dirent{
Name: "bigfile.txt",
Type: linux.DT_REG,
},
vfs.Dirent{
Name: "symlink.txt",
Type: linux.DT_LNK,
},
}
tests := []iterDirentTest{
{
name: "ext4 root dir iteration",
image: ext4ImagePath,
path: "/",
want: wantDirents,
},
{
name: "ext3 root dir iteration",
image: ext3ImagePath,
path: "/",
want: wantDirents,
},
{
name: "ext2 root dir iteration",
image: ext2ImagePath,
path: "/",
want: wantDirents,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctx, vfsfs, root, tearDown, err := setUp(t, test.image)
if err != nil {
t.Fatalf("setUp failed: %v", err)
}
defer tearDown()
fd, err := vfsfs.OpenAt(
ctx,
auth.CredentialsFromContext(ctx),
&vfs.PathOperation{Root: *root, Start: *root, Pathname: test.path},
&vfs.OpenOptions{},
)
if err != nil {
t.Fatalf("vfsfs.OpenAt failed: %v", err)
}
cb := &iterDirentsCb{}
if err = fd.Impl().IterDirents(ctx, cb); err != nil {
t.Fatalf("dir fd.IterDirents() failed: %v", err)
}
sort.Slice(cb.dirents, func(i int, j int) bool { return cb.dirents[i].Name < cb.dirents[j].Name })
sort.Slice(test.want, func(i int, j int) bool { return test.want[i].Name < test.want[j].Name })
// Ignore the inode number and offset of dirents because those are likely to
// change as the underlying image changes.
cmpIgnoreFields := cmp.FilterPath(func(p cmp.Path) bool {
return p.String() == "Ino" || p.String() == "Off"
}, cmp.Ignore())
if diff := cmp.Diff(cb.dirents, test.want, cmpIgnoreFields); diff != "" {
t.Errorf("dirents mismatch (-want +got):\n%s", diff)
}
})
}
}
// TestRootDir tests that the root directory inode is correctly initialized and
// returned from setUp.
func TestRootDir(t *testing.T) {