From a0fe3404bf91136124e8416ddabd03998a89e826 Mon Sep 17 00:00:00 2001 From: Victor Gaydov Date: Tue, 12 Jul 2016 10:42:39 +0400 Subject: [PATCH] Add test for fsSmallFileReader.WriteTo and fix bug (#128) The bug raises when io.Writer passed to fsSmallFileReader.WriteTo doesn't support ReadFrom interface. --- fs.go | 2 +- fs_test.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/fs.go b/fs.go index 4ea097a..c36073d 100644 --- a/fs.go +++ b/fs.go @@ -593,7 +593,7 @@ func (r *fsSmallFileReader) WriteTo(w io.Writer) (int64, error) { curPos := r.startPos bufv := copyBufPool.Get() buf := bufv.([]byte) - for err != nil { + for err == nil { tailLen := r.endPos - curPos if tailLen <= 0 { break diff --git a/fs_test.go b/fs_test.go index d502f1a..9eda008 100644 --- a/fs_test.go +++ b/fs_test.go @@ -4,9 +4,11 @@ import ( "bufio" "bytes" "fmt" + "io" "io/ioutil" "math/rand" "os" + "path" "sort" "testing" "time" @@ -88,6 +90,57 @@ func TestServeFileHead(t *testing.T) { } } +func TestServeFileSmallNoReadFrom(t *testing.T) { + teststr := "hello, world!" + + tempdir, err := ioutil.TempDir("", "httpexpect") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempdir) + + if err := ioutil.WriteFile( + path.Join(tempdir, "hello"), []byte(teststr), 0666); err != nil { + t.Fatal(err) + } + + var ctx RequestCtx + var req Request + req.SetRequestURI("http://foobar.com/baz") + ctx.Init(&req, nil, nil) + + ServeFile(&ctx, path.Join(tempdir, "hello")) + + reader, ok := ctx.Response.bodyStream.(*fsSmallFileReader) + if !ok { + t.Fatal("expected fsSmallFileReader") + } + + buf := bytes.NewBuffer(nil) + + n, err := reader.WriteTo(pureWriter{buf}) + if err != nil { + t.Fatal(err) + } + + if n != int64(len(teststr)) { + t.Fatalf("expected %d bytes, got %d bytes", len(teststr), n) + } + + body := string(buf.Bytes()) + if body != teststr { + t.Fatalf("expected '%s'", teststr) + } +} + +type pureWriter struct { + w io.Writer +} + +func (pw pureWriter) Write(p []byte) (nn int, err error) { + return pw.w.Write(p) +} + func TestServeFileCompressed(t *testing.T) { var ctx RequestCtx var req Request