restic/server_test.go

200 lines
4.3 KiB
Go
Raw Normal View History

package restic_test
import (
"bytes"
2015-02-16 19:00:23 +00:00
"crypto/rand"
"crypto/sha256"
"encoding/json"
2015-02-16 19:00:23 +00:00
"io"
"testing"
"github.com/restic/restic"
"github.com/restic/restic/backend"
2015-04-09 19:15:48 +00:00
. "github.com/restic/restic/test"
)
type testJSONStruct struct {
Foo uint32
Bar string
Baz []byte
}
var serverTests = []testJSONStruct{
testJSONStruct{Foo: 23, Bar: "Teststring", Baz: []byte("xx")},
}
func TestSaveJSON(t *testing.T) {
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
for _, obj := range serverTests {
data, err := json.Marshal(obj)
2015-04-09 19:15:48 +00:00
OK(t, err)
data = append(data, '\n')
h := sha256.Sum256(data)
blob, err := server.SaveJSON(backend.Tree, obj)
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-04-09 19:15:48 +00:00
Assert(t, bytes.Equal(h[:], blob.ID),
"TestSaveJSON: wrong plaintext ID: expected %02x, got %02x",
h, blob.ID)
}
}
func BenchmarkSaveJSON(t *testing.B) {
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
obj := serverTests[0]
data, err := json.Marshal(obj)
2015-04-09 19:15:48 +00:00
OK(t, err)
data = append(data, '\n')
h := sha256.Sum256(data)
2015-02-16 19:00:23 +00:00
t.ResetTimer()
for i := 0; i < t.N; i++ {
blob, err := server.SaveJSON(backend.Tree, obj)
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-04-09 19:15:48 +00:00
Assert(t, bytes.Equal(h[:], blob.ID),
"TestSaveJSON: wrong plaintext ID: expected %02x, got %02x",
h, blob.ID)
}
}
2015-02-16 19:00:23 +00:00
var testSizes = []int{5, 23, 2<<18 + 23, 1 << 20}
func TestSaveFrom(t *testing.T) {
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
2015-02-16 19:00:23 +00:00
for _, size := range testSizes {
data := make([]byte, size)
_, err := io.ReadFull(rand.Reader, data)
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-02-16 19:00:23 +00:00
id := sha256.Sum256(data)
// save
blob, err := server.SaveFrom(backend.Data, id[:], uint(size), bytes.NewReader(data))
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-02-16 19:00:23 +00:00
// read back
buf, err := server.Load(backend.Data, blob)
2015-04-09 19:15:48 +00:00
Assert(t, len(buf) == len(data),
2015-02-16 19:00:23 +00:00
"number of bytes read back does not match: expected %d, got %d",
len(data), len(buf))
2015-04-09 19:15:48 +00:00
Assert(t, bytes.Equal(buf, data),
2015-02-16 19:00:23 +00:00
"data does not match: expected %02x, got %02x",
data, buf)
}
}
func BenchmarkSaveFrom(t *testing.B) {
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
2015-02-16 19:00:23 +00:00
size := 4 << 20 // 4MiB
data := make([]byte, size)
_, err := io.ReadFull(rand.Reader, data)
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-02-16 19:00:23 +00:00
id := sha256.Sum256(data)
t.ResetTimer()
t.SetBytes(int64(size))
for i := 0; i < t.N; i++ {
// save
_, err := server.SaveFrom(backend.Data, id[:], uint(size), bytes.NewReader(data))
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-02-16 19:00:23 +00:00
}
}
2015-02-17 22:05:23 +00:00
func TestServerStats(t *testing.T) {
2015-02-17 22:40:37 +00:00
if *benchArchiveDirectory == "" {
t.Skip("benchdir not set, skipping TestServerStats")
}
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
2015-02-17 22:05:23 +00:00
// archive a few files
2015-03-09 21:58:17 +00:00
sn := snapshot(t, server, *benchArchiveDirectory, nil)
t.Logf("archived snapshot %v", sn.ID())
2015-02-17 22:05:23 +00:00
stats, err := server.Stats()
2015-04-09 19:15:48 +00:00
OK(t, err)
2015-02-17 22:05:23 +00:00
t.Logf("stats: %v", stats)
}
func TestLoadJSONID(t *testing.T) {
if *benchArchiveDirectory == "" {
t.Skip("benchdir not set, skipping TestServerStats")
}
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
// archive a few files
2015-03-09 21:58:17 +00:00
sn := snapshot(t, server, *benchArchiveDirectory, nil)
t.Logf("archived snapshot %v", sn.ID())
// benchmark loading first tree
2015-03-28 10:50:23 +00:00
done := make(chan struct{})
first, found := <-server.List(backend.Tree, done)
2015-04-09 19:15:48 +00:00
Assert(t, found, "no Trees in repository found")
2015-03-28 10:50:23 +00:00
close(done)
id, err := backend.ParseID(first)
2015-04-09 19:15:48 +00:00
OK(t, err)
tree := restic.NewTree()
err = server.LoadJSONID(backend.Tree, id, &tree)
2015-04-09 19:15:48 +00:00
OK(t, err)
}
func BenchmarkLoadJSONID(t *testing.B) {
if *benchArchiveDirectory == "" {
t.Skip("benchdir not set, skipping TestServerStats")
}
server := setupBackend(t)
defer teardownBackend(t, server)
key := setupKey(t, server, "geheim")
server.SetKey(key)
// archive a few files
2015-03-09 21:58:17 +00:00
sn := snapshot(t, server, *benchArchiveDirectory, nil)
t.Logf("archived snapshot %v", sn.ID())
t.ResetTimer()
tree := restic.NewTree()
for i := 0; i < t.N; i++ {
for name := range server.List(backend.Tree, nil) {
id, err := backend.ParseID(name)
2015-04-09 19:15:48 +00:00
OK(t, err)
OK(t, server.LoadJSONID(backend.Tree, id, &tree))
}
}
}