I have two object writers, first one encapsulates io.Writer
and along writes it also coputes SHA1 checksum of content, and second encapsulates first and writes zlib compressed data.
My unit test case with some test data passes for first writer, but fails with second.
Where and what I'm doing wrong?
code snippet:
import (
"compress/zlib"
"crypto/sha1"
"hash"
"io"
)
type ObjectWriter interface {
io.Writer
Commit() ([]byte, error)
}
type oWriter struct {
writer io.Writer
sum hash.Hash
}
func (ow *oWriter) Write(b []byte) (int, error) {
ow.sum.Write(b) // Hash writer never returs error -> hash.Hash docs
return ow.writer.Write(b)
}
func (ow *oWriter) Commit() ([]byte, error) {
return ow.sum.Sum(nil), nil
}
func NewWriter(w io.Writer) ObjectWriter {
return &oWriter{w, sha1.New()}
}
type compressedWriter struct {
oWriter ObjectWriter
zWriter io.WriteCloser
}
func (ow *compressedWriter) Write(b []byte) (int, error) {
return ow.zWriter.Write(b)
}
func (ow *compressedWriter) Commit() ([]byte, error) {
if err := ow.zWriter.Close(); err != nil {
return nil, err
}
return ow.oWriter.Commit()
}
func NewCompressedWriter(w io.Writer) ObjectWriter {
ow := NewWriter(w)
zw := zlib.NewWriter(ow)
return &compressedWriter{ow, zw}
}
passing test case:
func TestObjectWriter(t *testing.T) {
var buf bytes.Buffer
ow := NewWriter(&buf)
ow.Write([]byte("test content"))
sum, err := ow.Commit()
if err != nil {
t.Errorf("Commit error: %s", err)
}
expected := "1eebdf4fdc9fc7bf283031b93f9aef3338de9052"
given := fmt.Sprintf("%x", sum)
if expected != given {
t.Errorf("Invalid SHA1 sum: <%s> != <%s>", expected, given)
}
}
failing test case:
func TestCompressedObjectWriter(t *testing.T) {
var buf bytes.Buffer
ow := NewCompressedWriter(&buf)
ow.Write([]byte("test content"))
sum, err := ow.Commit()
if err != nil {
t.Errorf("Commit error: %s", err)
}
expected := "7efbe4015afd95478282c3774f47b4195031d27e"
given := fmt.Sprintf("%x", sum)
if expected != given {
t.Errorf("Invalid SHA1 sum: <%s> != <%s>", expected, given)
}
}