From: Brad Fitzpatrick Date: Fri, 27 May 2011 19:14:48 +0000 (-0700) Subject: os: improve Readdir test coverage, fix Readdir(0) on EOF X-Git-Tag: weekly.2011-06-02~83 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0e865ab8e79e2a067419df3d2f1df05dc35d2536;p=gostls13.git os: improve Readdir test coverage, fix Readdir(0) on EOF Adds tests for Readdir and Readdirnames with different n values. No good way to inject faults during full reads, though. Also fixes bug report from fshahriar: Readdir(0) wasn't behaving like Readdir(-1). R=rsc, fshahriar CC=golang-dev https://golang.org/cl/4529092 --- diff --git a/src/pkg/os/dir_unix.go b/src/pkg/os/dir_unix.go index 9c543838e7..80ffda71df 100644 --- a/src/pkg/os/dir_unix.go +++ b/src/pkg/os/dir_unix.go @@ -32,7 +32,7 @@ func (f *File) Readdirnames(n int) (names []string, err Error) { f.dirinfo.buf = make([]byte, blockSize) } d := f.dirinfo - wantAll := n < 0 + wantAll := n <= 0 size := n if size < 0 { diff --git a/src/pkg/os/os_test.go b/src/pkg/os/os_test.go index 9a993cd6ed..d9535be6db 100644 --- a/src/pkg/os/os_test.go +++ b/src/pkg/os/os_test.go @@ -286,6 +286,71 @@ func TestReaddirnamesOneAtATime(t *testing.T) { } } +func TestReaddirNValues(t *testing.T) { + if testing.Short() { + t.Logf("test.short; skipping") + return + } + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + defer RemoveAll(dir) + for i := 1; i <= 20; i++ { + f, err := Create(filepath.Join(dir, fmt.Sprintf("%d", i))) + if err != nil { + t.Fatalf("Create: %v", err) + } + f.Write([]byte(strings.Repeat("X", i))) + f.Close() + } + + var d *File + openDir := func() { + var err Error + d, err = Open(dir) + if err != nil { + t.Fatalf("Open directory: %v", err) + } + } + + readDirExpect := func(n, want int, wantErr Error) { + fi, err := d.Readdir(n) + if err != wantErr { + t.Fatalf("Readdir of %d got error %v, want %v", n, err, wantErr) + } + if g, e := len(fi), want; g != e { + t.Errorf("Readdir of %d got %d files, want %d", n, g, e) + } + } + + readDirNamesExpect := func(n, want int, wantErr Error) { + fi, err := d.Readdirnames(n) + if err != wantErr { + t.Fatalf("Readdirnames of %d got error %v, want %v", n, err, wantErr) + } + if g, e := len(fi), want; g != e { + t.Errorf("Readdirnames of %d got %d files, want %d", n, g, e) + } + } + + for _, fn := range []func(int, int, Error){readDirExpect, readDirNamesExpect} { + // Test the -1 case + openDir() + fn(-1, 20, nil) + fn(-2, 0, nil) + fn(0, 0, nil) + d.Close() + + // Test the bounded case + openDir() + fn(19, 19, nil) + fn(18, 1, nil) + fn(17, 0, EOF) + d.Close() + } +} + func TestHardLink(t *testing.T) { // Hardlinks are not supported under windows. if syscall.OS == "windows" {