mirror of
https://github.com/kopia/kopia.git
synced 2026-05-14 17:56:59 -04:00
object manager tests
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user