restic/bloblist_test.go

137 lines
2.4 KiB
Go
Raw Normal View History

2014-12-05 20:45:49 +00:00
package restic_test
2014-11-21 20:21:44 +00:00
import (
"crypto/rand"
"encoding/json"
"flag"
"io"
mrand "math/rand"
"sync"
"testing"
"time"
2014-12-05 20:45:49 +00:00
"github.com/restic/restic"
"github.com/restic/restic/backend"
2014-11-21 20:21:44 +00:00
)
var maxWorkers = flag.Uint("workers", 100, "number of workers to test BlobList concurrent access against")
func randomID() []byte {
buf := make([]byte, backend.IDSize)
2014-11-21 20:21:44 +00:00
_, err := io.ReadFull(rand.Reader, buf)
if err != nil {
panic(err)
}
return buf
}
2014-12-05 20:45:49 +00:00
func newBlob() restic.Blob {
return restic.Blob{ID: randomID(), Size: uint64(mrand.Uint32())}
2014-11-21 20:21:44 +00:00
}
// Test basic functionality
func TestBlobList(t *testing.T) {
2014-12-05 20:45:49 +00:00
bl := restic.NewBlobList()
2014-11-21 20:21:44 +00:00
b := newBlob()
bl.Insert(b)
for i := 0; i < 1000; i++ {
bl.Insert(newBlob())
}
2014-12-05 20:45:49 +00:00
b2, err := bl.Find(restic.Blob{ID: b.ID})
2014-11-21 20:21:44 +00:00
ok(t, err)
assert(t, b2.Compare(b) == 0, "items are not equal: want %v, got %v", b, b2)
2014-12-05 20:45:49 +00:00
bl2 := restic.NewBlobList()
2014-11-21 20:21:44 +00:00
for i := 0; i < 1000; i++ {
bl.Insert(newBlob())
}
b2, err = bl2.Find(b)
2014-12-05 20:45:49 +00:00
assert(t, err != nil, "found ID in restic that was never inserted: %v", b2)
2014-11-21 20:21:44 +00:00
bl2.Merge(bl)
b2, err = bl2.Find(b)
if err != nil {
t.Fatal(err)
}
if b.Compare(b2) != 0 {
t.Fatalf("items are not equal: want %v, got %v", b, b2)
}
}
// Test JSON encode/decode
func TestBlobListJSON(t *testing.T) {
2014-12-05 20:45:49 +00:00
bl := restic.NewBlobList()
b := restic.Blob{ID: randomID()}
2014-11-21 20:21:44 +00:00
bl.Insert(b)
b2, err := bl.Find(b)
ok(t, err)
assert(t, b2.Compare(b) == 0, "items are not equal: want %v, got %v", b, b2)
buf, err := json.Marshal(bl)
ok(t, err)
2014-12-05 20:45:49 +00:00
bl2 := restic.BlobList{}
2014-11-21 20:21:44 +00:00
json.Unmarshal(buf, &bl2)
b2, err = bl2.Find(b)
ok(t, err)
assert(t, b2.Compare(b) == 0, "items are not equal: want %v, got %v", b, b2)
buf, err = json.Marshal(bl2)
ok(t, err)
}
// random insert/find access by several goroutines
func TestBlobListRandom(t *testing.T) {
var wg sync.WaitGroup
2014-12-05 20:45:49 +00:00
worker := func(bl *restic.BlobList) {
2014-11-21 20:21:44 +00:00
defer wg.Done()
b := newBlob()
bl.Insert(b)
for i := 0; i < 200; i++ {
bl.Insert(newBlob())
}
d := time.Duration(mrand.Intn(10)*100) * time.Millisecond
time.Sleep(d)
for i := 0; i < 100; i++ {
b2, err := bl.Find(b)
if err != nil {
t.Fatal(err)
}
if b.Compare(b2) != 0 {
t.Fatalf("items are not equal: want %v, got %v", b, b2)
}
}
2014-12-05 20:45:49 +00:00
bl2 := restic.NewBlobList()
2014-11-21 20:21:44 +00:00
for i := 0; i < 200; i++ {
bl2.Insert(newBlob())
}
bl2.Merge(bl)
}
2014-12-05 20:45:49 +00:00
bl := restic.NewBlobList()
2014-11-21 20:21:44 +00:00
for i := 0; uint(i) < *maxWorkers; i++ {
wg.Add(1)
go worker(bl)
}
wg.Wait()
}