Skip to content

Commit

Permalink
Improved the test for reads within large files.
Browse files Browse the repository at this point in the history
For #103.
  • Loading branch information
jacobsa committed Aug 4, 2015
1 parent c90473c commit 9cc3b00
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 43 deletions.
76 changes: 40 additions & 36 deletions fs/foreign_modifications_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
package fs_test

import (
"encoding/hex"
"bytes"
"io"
"io/ioutil"
"math/rand"
"os"
Expand Down Expand Up @@ -519,51 +520,54 @@ func (t *ForeignModsTest) ReadFromFile_Small() {
}

func (t *ForeignModsTest) ReadFromFile_Large() {
const contentLen = 1 << 20
contents := randString(contentLen)
// Create some random contents.
const contentLen = 1 << 22
contents := randBytes(contentLen)

// Create an object.
AssertEq(nil, t.createWithContents("foo", contents))

// Wait for it to show up in the file system.
_, err := fusetesting.ReadDirPicky(t.mfs.Dir())
AssertEq(nil, err)
// Repeatedly:
//
// * Create an object with the random contents.
// * Read a random range of it.
// * Verify the result.
//
var buf [contentLen]byte
runOnce := func() {
// Create an object.
_, err := gcsutil.CreateObject(
t.ctx,
t.bucket,
"foo",
contents)

// Attempt to open it.
f, err := os.Open(path.Join(t.mfs.Dir(), "foo"))
AssertEq(nil, err)
defer func() { AssertEq(nil, f.Close()) }()
AssertEq(nil, err)

// Read its entire contents.
slice, err := ioutil.ReadAll(f)
AssertEq(nil, err)
if contents != string(slice) {
ExpectTrue(
false,
"Expected:\n%v\n\nActual:\n%v",
hex.Dump([]byte(contents)),
hex.Dump(slice))
}
// Attempt to open it.
f, err := os.Open(path.Join(t.mfs.Dir(), "foo"))
AssertEq(nil, err)
defer func() { AssertEq(nil, f.Close()) }()

// Read from parts of it.
referenceReader := strings.NewReader(contents)
for trial := 0; trial < 1000; trial++ {
// Read part of it.
offset := rand.Int63n(contentLen + 1)
size := rand.Intn(int(contentLen - offset))

expected, err := readRange(referenceReader, offset, size)
AssertEq(nil, err)
n, err := f.ReadAt(buf[:size], offset)
if offset+int64(size) == contentLen && err == io.EOF {
err = nil
}

actual, err := readRange(f, offset, size)
AssertEq(nil, err)
AssertEq(size, n)
AssertTrue(
bytes.Equal(contents[offset:offset+int64(size)], buf[:n]),
"offset: %d\n"+
"size:%d\n",
offset,
size)
}

if expected != actual {
AssertTrue(
expected == actual,
"Expected:\n%s\nActual:\n%s",
hex.Dump([]byte(expected)),
hex.Dump([]byte(actual)))
}
start := time.Now()
for time.Since(start) < 2*time.Second {
runOnce()
}
}

Expand Down
18 changes: 11 additions & 7 deletions fs/fs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,17 +210,21 @@ func getFileNames(entries []os.FileInfo) (names []string) {
}

// REQUIRES: n % 4 == 0
func randString(n int) string {
bytes := make([]byte, n)
func randBytes(n int) (b []byte) {
if n%4 != 0 {
panic(fmt.Sprintf("Illegal size: %d", n))
}

b = make([]byte, n)
for i := 0; i < n; i += 4 {
u32 := rand.Uint32()
bytes[i] = byte(u32 >> 0)
bytes[i+1] = byte(u32 >> 8)
bytes[i+2] = byte(u32 >> 16)
bytes[i+3] = byte(u32 >> 24)
b[i] = byte(u32 >> 0)
b[i+1] = byte(u32 >> 8)
b[i+2] = byte(u32 >> 16)
b[i+3] = byte(u32 >> 24)
}

return string(bytes)
return
}

func readRange(r io.ReadSeeker, offset int64, n int) (s string, err error) {
Expand Down

0 comments on commit 9cc3b00

Please sign in to comment.