object manager tests

This commit is contained in:
Jarek Kowalski
2016-03-22 06:48:59 -07:00
parent 0e57838694
commit a891f1558f
3 changed files with 65 additions and 11 deletions

View File

@@ -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

View File

@@ -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)
}
}
}
}

View File

@@ -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 {