| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package os |
| |
| import ( |
| "fmt"; |
| "os"; |
| "testing"; |
| ) |
| |
| var dot = []string( |
| "dir_amd64_darwin.go", |
| "dir_amd64_linux.go", |
| "env.go", |
| "error.go", |
| "file.go", |
| "os_test.go", |
| "time.go", |
| "types.go", |
| "stat_amd64_darwin.go", |
| "stat_amd64_linux.go" |
| ) |
| |
| var etc = []string( |
| "group", |
| "hosts", |
| "passwd", |
| ) |
| |
| func size(file string, t *testing.T) uint64 { |
| fd, err := Open(file, O_RDONLY, 0); |
| defer fd.Close(); |
| if err != nil { |
| t.Fatal("open failed:", err); |
| } |
| var buf [100]byte; |
| len := 0; |
| for { |
| n, e := fd.Read(buf); |
| if n < 0 || e != nil { |
| t.Fatal("read failed:", err); |
| } |
| if n == 0 { |
| break |
| } |
| len += n; |
| } |
| return uint64(len) |
| } |
| |
| func TestStat(t *testing.T) { |
| dir, err := Stat("/etc/passwd"); |
| if err != nil { |
| t.Fatal("stat failed:", err); |
| } |
| if dir.Name != "passwd" { |
| t.Error("name should be passwd; is", dir.Name); |
| } |
| filesize := size("/etc/passwd", t); |
| if dir.Size != filesize { |
| t.Error("size should be ", filesize, "; is", dir.Size); |
| } |
| } |
| |
| func TestFstat(t *testing.T) { |
| fd, err1 := Open("/etc/passwd", O_RDONLY, 0); |
| defer fd.Close(); |
| if err1 != nil { |
| t.Fatal("open failed:", err1); |
| } |
| dir, err2 := Fstat(fd); |
| if err2 != nil { |
| t.Fatal("fstat failed:", err2); |
| } |
| if dir.Name != "passwd" { |
| t.Error("name should be passwd; is", dir.Name); |
| } |
| filesize := size("/etc/passwd", t); |
| if dir.Size != filesize { |
| t.Error("size should be ", filesize, "; is", dir.Size); |
| } |
| } |
| |
| func TestLstat(t *testing.T) { |
| dir, err := Lstat("/etc/passwd"); |
| if err != nil { |
| t.Fatal("lstat failed:", err); |
| } |
| if dir.Name != "passwd" { |
| t.Error("name should be passwd; is", dir.Name); |
| } |
| filesize := size("/etc/passwd", t); |
| if dir.Size != filesize { |
| t.Error("size should be ", filesize, "; is", dir.Size); |
| } |
| } |
| |
| func testReaddirnames(dir string, contents []string, t *testing.T) { |
| fd, err := Open(dir, O_RDONLY, 0); |
| defer fd.Close(); |
| if err != nil { |
| t.Fatalf("open %q failed: %v", dir, err); |
| } |
| s, err2 := Readdirnames(fd, -1); |
| if err2 != nil { |
| t.Fatalf("readdirnames %q failed: %v", err2); |
| } |
| for i, m := range contents { |
| found := false; |
| for j, n := range s { |
| if m == n { |
| if found { |
| t.Error("present twice:", m); |
| } |
| found = true |
| } |
| } |
| if !found { |
| t.Error("could not find", m); |
| } |
| } |
| } |
| |
| func testReaddir(dir string, contents []string, t *testing.T) { |
| fd, err := Open(dir, O_RDONLY, 0); |
| defer fd.Close(); |
| if err != nil { |
| t.Fatalf("open %q failed: %v", dir, err); |
| } |
| s, err2 := Readdir(fd, -1); |
| if err2 != nil { |
| t.Fatalf("readdir %q failed: %v", dir, err2); |
| } |
| for i, m := range contents { |
| found := false; |
| for j, n := range s { |
| if m == n.Name { |
| if found { |
| t.Error("present twice:", m); |
| } |
| found = true |
| } |
| } |
| if !found { |
| t.Error("could not find", m); |
| } |
| } |
| } |
| |
| func TestReaddirnames(t *testing.T) { |
| testReaddirnames(".", dot, t); |
| testReaddirnames("/etc", etc, t); |
| } |
| |
| func TestReaddir(t *testing.T) { |
| testReaddir(".", dot, t); |
| testReaddir("/etc", etc, t); |
| } |
| |
| // Read the directory one entry at a time. |
| func smallReaddirnames(fd *FD, length int, t *testing.T) []string { |
| names := make([]string, length); |
| count := 0; |
| for { |
| d, err := Readdirnames(fd, 1); |
| if err != nil { |
| t.Fatalf("readdir %q failed: %v", fd.Name(), err); |
| } |
| if len(d) == 0 { |
| break |
| } |
| names[count] = d[0]; |
| count++; |
| } |
| return names[0:count] |
| } |
| |
| // Check that reading a directory one entry at a time gives the same result |
| // as reading it all at once. |
| func TestReaddirnamesOneAtATime(t *testing.T) { |
| dir := "/usr/bin"; // big directory that doesn't change often. |
| fd, err := Open(dir, O_RDONLY, 0); |
| defer fd.Close(); |
| if err != nil { |
| t.Fatalf("open %q failed: %v", dir, err); |
| } |
| all, err1 := Readdirnames(fd, -1); |
| if err1 != nil { |
| t.Fatalf("readdirnames %q failed: %v", dir, err1); |
| } |
| fd1, err2 := Open(dir, O_RDONLY, 0); |
| if err2 != nil { |
| t.Fatalf("open %q failed: %v", dir, err2); |
| } |
| small := smallReaddirnames(fd1, len(all)+100, t); // +100 in case we screw up |
| for i, n := range all { |
| if small[i] != n { |
| t.Errorf("small read %q %q mismatch: %v", small[i], n); |
| } |
| } |
| } |
| |