From b8ea62986f2d0261d16ca52801dd3840bc5b8a95 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 05:02:20 +1100 Subject: [PATCH] Dumped in posix tests. --- samples/memfs/memfs_test.go | 178 +++++++++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 2 deletions(-) diff --git a/samples/memfs/memfs_test.go b/samples/memfs/memfs_test.go index 24b3a6d..2529005 100644 --- a/samples/memfs/memfs_test.go +++ b/samples/memfs/memfs_test.go @@ -15,6 +15,7 @@ package memfs_test import ( + "io" "io/ioutil" "log" "os" @@ -79,6 +80,9 @@ func timespecToTime(ts syscall.Timespec) time.Time { type MemFSTest struct { clock timeutil.SimulatedClock mfs *fuse.MountedFileSystem + + // Files to close when tearing down. Nil entries are skipped. + toClose []io.Closer } var _ SetUpInterface = &MemFSTest{} @@ -110,6 +114,18 @@ func (t *MemFSTest) SetUp(ti *TestInfo) { } func (t *MemFSTest) TearDown() { + // Close any files we opened. + for _, c := range t.toClose { + if c == nil { + continue + } + + err := c.Close() + if err != nil { + panic(err) + } + } + // Unmount the file system. Try again on "resource busy" errors. delay := 10 * time.Millisecond for { @@ -558,6 +574,164 @@ func (t *MemFSTest) FileReadsAndWrites() { AssertTrue(false, "TODO") } -func (t *MemFSTest) FileReadsAndWrites_BeyondEOF() { - AssertTrue(false, "TODO") +func (t *MemFSTest) WriteOverlapsEndOfFile() { + var err error + var n int + + // Create a file. + f, err := os.Create(path.Join(t.mfs.Dir(), "foo")) + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Make it 4 bytes long. + err = f.Truncate(4) + AssertEq(nil, err) + + // Write the range [2, 6). + n, err = f.WriteAt([]byte("taco"), 2) + AssertEq(nil, err) + AssertEq(4, n) + + // Read the full contents of the file. + contents, err := ioutil.ReadAll(f) + AssertEq(nil, err) + ExpectEq("\x00\x00taco", string(contents)) +} + +func (t *MemFSTest) WriteStartsAtEndOfFile() { + var err error + var n int + + // Create a file. + f, err := os.Create(path.Join(t.mfs.Dir(), "foo")) + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Make it 2 bytes long. + err = f.Truncate(2) + AssertEq(nil, err) + + // Write the range [2, 6). + n, err = f.WriteAt([]byte("taco"), 2) + AssertEq(nil, err) + AssertEq(4, n) + + // Read the full contents of the file. + contents, err := ioutil.ReadAll(f) + AssertEq(nil, err) + ExpectEq("\x00\x00taco", string(contents)) +} + +func (t *MemFSTest) WriteStartsPastEndOfFile() { + var err error + var n int + + // Create a file. + f, err := os.Create(path.Join(t.mfs.Dir(), "foo")) + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Write the range [2, 6). + n, err = f.WriteAt([]byte("taco"), 2) + AssertEq(nil, err) + AssertEq(4, n) + + // Read the full contents of the file. + contents, err := ioutil.ReadAll(f) + AssertEq(nil, err) + ExpectEq("\x00\x00taco", string(contents)) +} + +func (t *MemFSTest) WriteAtDoesntChangeOffset_NotAppendMode() { + var err error + var n int + + // Create a file. + f, err := os.Create(path.Join(t.mfs.Dir(), "foo")) + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Make it 16 bytes long. + err = f.Truncate(16) + AssertEq(nil, err) + + // Seek to offset 4. + _, err = f.Seek(4, 0) + AssertEq(nil, err) + + // Write the range [10, 14). + n, err = f.WriteAt([]byte("taco"), 2) + AssertEq(nil, err) + AssertEq(4, n) + + // We should still be at offset 4. + offset, err := getFileOffset(f) + AssertEq(nil, err) + ExpectEq(4, offset) +} + +func (t *MemFSTest) WriteAtDoesntChangeOffset_AppendMode() { + var err error + var n int + + // Create a file in append mode. + f, err := os.OpenFile( + path.Join(t.mfs.Dir(), "foo"), + os.O_RDWR|os.O_APPEND|os.O_CREATE, + 0600) + + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Make it 16 bytes long. + err = f.Truncate(16) + AssertEq(nil, err) + + // Seek to offset 4. + _, err = f.Seek(4, 0) + AssertEq(nil, err) + + // Write the range [10, 14). + n, err = f.WriteAt([]byte("taco"), 2) + AssertEq(nil, err) + AssertEq(4, n) + + // We should still be at offset 4. + offset, err := getFileOffset(f) + AssertEq(nil, err) + ExpectEq(4, offset) +} + +func (t *MemFSTest) ReadsPastEndOfFile() { + var err error + var n int + buf := make([]byte, 1024) + + // Create a file. + f, err := os.Create(path.Join(t.mfs.Dir(), "foo")) + t.toClose = append(t.toClose, f) + AssertEq(nil, err) + + // Give it some contents. + n, err = f.Write([]byte("taco")) + AssertEq(nil, err) + AssertEq(4, n) + + // Read a range overlapping EOF. + n, err = f.ReadAt(buf[:4], 2) + AssertEq(io.EOF, err) + ExpectEq(2, n) + ExpectEq("co", string(buf[:n])) + + // Read a range starting at EOF. + n, err = f.ReadAt(buf[:4], 4) + AssertEq(io.EOF, err) + ExpectEq(0, n) + ExpectEq("", string(buf[:n])) + + // Read a range starting past EOF. + n, err = f.ReadAt(buf[:4], 100) + AssertEq(io.EOF, err) + ExpectEq(0, n) + ExpectEq("", string(buf[:n])) }