From a891f1558fb14ebdae78c4084299ea484d4e9045 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Tue, 22 Mar 2016 06:48:59 -0700 Subject: [PATCH] object manager tests --- cas/object_manager.go | 4 ++++ cas/object_manager_test.go | 42 +++++++++++++++++++++++++++++++++++++- cas/object_writer.go | 30 ++++++++++++++++++--------- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/cas/object_manager.go b/cas/object_manager.go index 151057fb4..b34be2308 100644 --- a/cas/object_manager.go +++ b/cas/object_manager.go @@ -147,6 +147,10 @@ func NewObjectManager( maxBlobSize: f.MaxBlobSize, } + if mgr.maxBlobSize == 0 { + mgr.maxBlobSize = 16 * 1024 * 1024 + } + var hashFunc func() hash.Hash hashAlgo := f.Algorithm diff --git a/cas/object_manager_test.go b/cas/object_manager_test.go index 44f41c933..d54ec35f6 100644 --- a/cas/object_manager_test.go +++ b/cas/object_manager_test.go @@ -229,7 +229,7 @@ func TestWriterListOfListsOfListsChunk(t *testing.T) { } } -func TestEncryption(t *testing.T) { +func TestHMAC(t *testing.T) { data := map[string][]byte{} content := bytes.Repeat([]byte{0xcd}, 50) @@ -350,3 +350,43 @@ func TestEndToEndReadAndSeek(t *testing.T) { } } } + +func TestFormats(t *testing.T) { + cases := []struct { + format Format + hashes map[string]content.ObjectID + }{ + { + format: Format{ + Algorithm: "md5", + }, + hashes: map[string]content.ObjectID{ + "": "Cd41d8cd98f00b204e9800998ecf8427e", + "The quick brown fox jumps over the lazy dog": "C9e107d9d372bb6826bd81d3542a419d6", + }, + }, + } + + for _, c := range cases { + data := map[string][]byte{} + st := storage.NewMapRepository(data) + + mgr, err := NewObjectManager(st, c.format) + if err != nil { + t.Errorf("cannot create manager: %v", err) + continue + } + + for k, v := range c.hashes { + w := mgr.NewWriter() + w.Write([]byte(k)) + oid, err := w.Result(true) + if err != nil { + t.Errorf("error: %v", err) + } + if oid != v { + t.Errorf("invalid oid for %v/%v: %v expected %v", c.format.Algorithm, k, oid, v) + } + } + } +} diff --git a/cas/object_writer.go b/cas/object_writer.go index dc7b67044..6ef2b5080 100644 --- a/cas/object_writer.go +++ b/cas/object_writer.go @@ -6,6 +6,7 @@ "encoding/json" "fmt" "io" + "io/ioutil" "unicode/utf8" "github.com/kopia/kopia/content" @@ -78,7 +79,7 @@ func (w *objectWriter) Write(data []byte) (n int, err error) { // We're at the beginning of a buffer, fail if the buffer is too small. return 0, fmt.Errorf("object writer buffer too small, need: %v, have: %v", remaining, room) } - if err := w.flushBuffer(); err != nil { + if err := w.flushBuffer(false); err != nil { return 0, err } @@ -87,7 +88,7 @@ func (w *objectWriter) Write(data []byte) (n int, err error) { w.buffer.Write(data[0:room]) - if err := w.flushBuffer(); err != nil { + if err := w.flushBuffer(false); err != nil { return 0, err } data = data[room:] @@ -97,13 +98,20 @@ func (w *objectWriter) Write(data []byte) (n int, err error) { return len(data), nil } -func (w *objectWriter) flushBuffer() error { - if w.buffer != nil { - data := w.buffer.Bytes() - length := w.buffer.Len() +func (w *objectWriter) flushBuffer(force bool) error { + if w.buffer != nil || force { + var data []byte + var b io.ReadCloser + var length int + if w.buffer != nil { + data = w.buffer.Bytes() + length = w.buffer.Len() - b := w.mgr.bufferManager.returnBufferOnClose(w.buffer) - w.buffer = nil + b = w.mgr.bufferManager.returnBufferOnClose(w.buffer) + w.buffer = nil + } else { + b = ioutil.NopCloser(bytes.NewBuffer(nil)) + } objectID, transformer := w.mgr.formatter.Do(data, string(w.objectType)+w.prefix) b = transformer(b) @@ -165,9 +173,11 @@ func (w *objectWriter) Result(forceStored bool) (content.ObjectID, error) { } } - w.flushBuffer() + w.flushBuffer(forceStored) defer func() { - w.listWriter.Close() + if w.listWriter != nil { + w.listWriter.Close() + } }() if w.flushedObjectCount == 1 {