diff --git a/go.mod b/go.mod index 28ec8cc..e653f69 100644 --- a/go.mod +++ b/go.mod @@ -9,5 +9,6 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/jessevdk/go-flags v1.4.0 github.com/nkovacs/streamquote v1.0.0 + github.com/stretchr/testify v1.6.1 github.com/valyala/fasttemplate v1.0.1 ) diff --git a/go.sum b/go.sum index 513cc3a..1aadb50 100644 --- a/go.sum +++ b/go.sum @@ -4,13 +4,22 @@ github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/testdata/test.txt b/testdata/test.txt new file mode 100644 index 0000000..3b12464 --- /dev/null +++ b/testdata/test.txt @@ -0,0 +1 @@ +TEST \ No newline at end of file diff --git a/virtual.go b/virtual.go index b175849..d01ef4f 100644 --- a/virtual.go +++ b/virtual.go @@ -88,13 +88,14 @@ func (vf *virtualFile) read(bts []byte) (int, error) { } } + if vf.offset == int64(len(vf.Content)) { + return 0, io.EOF + } + end := vf.offset + int64(len(bts)) if end >= int64(len(vf.Content)) { - // end of file, so return what we have + EOF - n := copy(bts, vf.Content[vf.offset:]) - vf.offset = 0 - return n, io.EOF + end = int64(len(vf.Content)) } n := copy(bts, vf.Content[vf.offset:end]) diff --git a/virtual_test.go b/virtual_test.go new file mode 100644 index 0000000..891f34c --- /dev/null +++ b/virtual_test.go @@ -0,0 +1,40 @@ +package rice + +import ( + "fmt" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/GeertJohan/go.rice/embedded" + "github.com/stretchr/testify/require" +) + +func TestVirtualFileRead(t *testing.T) { + // define virtual file + data, err := ioutil.ReadFile("testdata/test.txt") + require.NoError(t, err) + virtFile := newVirtualFile(&embedded.EmbeddedFile{ + Filename: "test.txt", + FileModTime: time.Unix(1594051142, 0), + Content: string(data), + }) + + realFile, err := os.Open("testdata/test.txt") + require.NoError(t, err) + + checkRead := func(buff []byte) { + // Compare results with a real *os.File + realN, realErr := realFile.Read(buff) + real := fmt.Sprintf("n=%v err=%v buff=%v", realN, realErr, buff) + virtN, virtErr := virtFile.read(buff) + virt := fmt.Sprintf("n=%v err=%v buff=%v", virtN, virtErr, buff) + require.Equal(t, real, virt) + } + + buff := make([]byte, 4) + checkRead(buff) + checkRead(buff) + checkRead(buff) +}