restic/src/restic/find_test.go

139 lines
2.9 KiB
Go
Raw Normal View History

2016-08-31 18:29:54 +00:00
package restic_test
2016-08-01 16:31:44 +00:00
import (
2016-08-01 16:40:08 +00:00
"bufio"
"encoding/json"
2016-08-01 16:40:08 +00:00
"flag"
"fmt"
"os"
"path/filepath"
2016-08-31 18:29:54 +00:00
"restic"
2016-08-01 16:40:08 +00:00
"sort"
2016-08-01 16:31:44 +00:00
"testing"
"time"
"restic/repository"
)
2016-08-31 18:58:57 +00:00
func loadIDSet(t testing.TB, filename string) BlobSet {
2016-08-01 16:40:08 +00:00
f, err := os.Open(filename)
if err != nil {
t.Logf("unable to open golden file %v: %v", filename, err)
2016-08-31 18:58:57 +00:00
return NewBlobSet()
2016-08-01 16:40:08 +00:00
}
sc := bufio.NewScanner(f)
2016-08-31 18:58:57 +00:00
blobs := NewBlobSet()
2016-08-01 16:40:08 +00:00
for sc.Scan() {
2016-08-31 18:58:57 +00:00
var h Handle
err := json.Unmarshal([]byte(sc.Text()), &h)
2016-08-01 16:40:08 +00:00
if err != nil {
t.Errorf("file %v contained invalid blob: %#v", filename, err)
continue
2016-08-01 16:40:08 +00:00
}
blobs.Insert(h)
2016-08-01 16:40:08 +00:00
}
if err = f.Close(); err != nil {
t.Errorf("closing file %v failed with error %v", filename, err)
}
return blobs
2016-08-01 16:40:08 +00:00
}
2016-08-31 18:58:57 +00:00
func saveIDSet(t testing.TB, filename string, s BlobSet) {
2016-08-01 16:40:08 +00:00
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
t.Fatalf("unable to update golden file %v: %v", filename, err)
return
}
2016-08-31 18:58:57 +00:00
var hs Handles
for h := range s {
hs = append(hs, h)
2016-08-01 16:40:08 +00:00
}
sort.Sort(hs)
enc := json.NewEncoder(f)
for _, h := range hs {
err = enc.Encode(h)
if err != nil {
t.Fatalf("Encode() returned error: %v", err)
}
2016-08-01 16:40:08 +00:00
}
if err = f.Close(); err != nil {
t.Fatalf("close file %v returned error: %v", filename, err)
}
}
var updateGoldenFiles = flag.Bool("update", false, "update golden files in testdata/")
2016-08-01 16:31:44 +00:00
const (
findTestSnapshots = 3
findTestDepth = 2
2016-08-01 16:31:44 +00:00
)
var findTestTime = time.Unix(1469960361, 23)
2016-08-01 16:31:44 +00:00
func TestFindUsedBlobs(t *testing.T) {
repo, cleanup := repository.TestRepository(t)
defer cleanup()
var snapshots []*Snapshot
for i := 0; i < findTestSnapshots; i++ {
sn := TestCreateSnapshot(t, repo, findTestTime.Add(time.Duration(i)*time.Second), findTestDepth, 0)
2016-08-01 16:31:44 +00:00
t.Logf("snapshot %v saved, tree %v", sn.ID().Str(), sn.Tree.Str())
snapshots = append(snapshots, sn)
}
2016-08-01 16:40:08 +00:00
for i, sn := range snapshots {
2016-08-31 18:58:57 +00:00
usedBlobs := NewBlobSet()
err := restic.FindUsedBlobs(repo, *sn.Tree, usedBlobs, NewBlobSet())
2016-08-01 16:31:44 +00:00
if err != nil {
t.Errorf("FindUsedBlobs returned error: %v", err)
continue
}
if len(usedBlobs) == 0 {
t.Errorf("FindUsedBlobs returned an empty set")
continue
}
2016-08-01 16:40:08 +00:00
goldenFilename := filepath.Join("testdata", fmt.Sprintf("used_blobs_snapshot%d", i))
want := loadIDSet(t, goldenFilename)
if !want.Equals(usedBlobs) {
t.Errorf("snapshot %d: wrong list of blobs returned:\n missing blobs: %v\n extra blobs: %v",
i, want.Sub(usedBlobs), usedBlobs.Sub(want))
}
if *updateGoldenFiles {
saveIDSet(t, goldenFilename, usedBlobs)
}
2016-08-01 16:31:44 +00:00
}
}
2016-08-15 19:37:19 +00:00
func BenchmarkFindUsedBlobs(b *testing.B) {
repo, cleanup := repository.TestRepository(b)
defer cleanup()
sn := TestCreateSnapshot(b, repo, findTestTime, findTestDepth, 0)
b.ResetTimer()
for i := 0; i < b.N; i++ {
2016-08-31 18:58:57 +00:00
seen := NewBlobSet()
blobs := NewBlobSet()
2016-08-31 18:29:54 +00:00
err := restic.FindUsedBlobs(repo, *sn.Tree, blobs, seen)
2016-08-15 19:37:19 +00:00
if err != nil {
b.Error(err)
}
b.Logf("found %v blobs", len(blobs))
}
}