mirror of
https://github.com/octoleo/restic.git
synced 2024-11-26 14:56:29 +00:00
repository: run blackbox tests using old and new repo version
This commit is contained in:
parent
abe5935693
commit
9ffb8920f1
@ -1894,7 +1894,7 @@ func TestArchiverContextCanceled(t *testing.T) {
|
|||||||
defer removeTempdir()
|
defer removeTempdir()
|
||||||
|
|
||||||
// Ensure that the archiver itself reports the canceled context and not just the backend
|
// Ensure that the archiver itself reports the canceled context and not just the backend
|
||||||
repo, _ := repository.TestRepositoryWithBackend(t, &noCancelBackend{mem.New()})
|
repo, _ := repository.TestRepositoryWithBackend(t, &noCancelBackend{mem.New()}, 0)
|
||||||
|
|
||||||
back := restictest.Chdir(t, tempdir)
|
back := restictest.Chdir(t, tempdir)
|
||||||
defer back()
|
defer back()
|
||||||
|
@ -335,8 +335,8 @@ var (
|
|||||||
depth = 3
|
depth = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
func createFilledRepo(t testing.TB, snapshots int, dup float32) (restic.Repository, func()) {
|
func createFilledRepo(t testing.TB, snapshots int, dup float32, version uint) (restic.Repository, func()) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
|
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
restic.TestCreateSnapshot(t, repo, snapshotTime.Add(time.Duration(i)*time.Second), depth, dup)
|
restic.TestCreateSnapshot(t, repo, snapshotTime.Add(time.Duration(i)*time.Second), depth, dup)
|
||||||
@ -346,7 +346,11 @@ func createFilledRepo(t testing.TB, snapshots int, dup float32) (restic.Reposito
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestIndexSave(t *testing.T) {
|
func TestIndexSave(t *testing.T) {
|
||||||
repo, cleanup := createFilledRepo(t, 3, 0)
|
repository.TestAllVersions(t, testIndexSave)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testIndexSave(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := createFilledRepo(t, 3, 0, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
err := repo.LoadIndex(context.TODO())
|
err := repo.LoadIndex(context.TODO())
|
||||||
|
@ -212,7 +212,11 @@ func reloadIndex(t *testing.T, repo restic.Repository) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRepack(t *testing.T) {
|
func TestRepack(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testRepack)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRepack(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
seed := time.Now().UnixNano()
|
seed := time.Now().UnixNano()
|
||||||
@ -279,9 +283,13 @@ func TestRepack(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRepackCopy(t *testing.T) {
|
func TestRepackCopy(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testRepackCopy)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRepackCopy(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
dstRepo, dstCleanup := repository.TestRepository(t)
|
dstRepo, dstCleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer dstCleanup()
|
defer dstCleanup()
|
||||||
|
|
||||||
seed := time.Now().UnixNano()
|
seed := time.Now().UnixNano()
|
||||||
@ -318,7 +326,11 @@ func TestRepackCopy(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRepackWrongBlob(t *testing.T) {
|
func TestRepackWrongBlob(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testRepackWrongBlob)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRepackWrongBlob(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
seed := time.Now().UnixNano()
|
seed := time.Now().UnixNano()
|
||||||
|
@ -28,7 +28,11 @@ var testSizes = []int{5, 23, 2<<18 + 23, 1 << 20}
|
|||||||
var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
|
var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
func TestSave(t *testing.T) {
|
func TestSave(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testSave)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testSave(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
for _, size := range testSizes {
|
for _, size := range testSizes {
|
||||||
@ -63,7 +67,11 @@ func TestSave(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSaveFrom(t *testing.T) {
|
func TestSaveFrom(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testSaveFrom)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testSaveFrom(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
for _, size := range testSizes {
|
for _, size := range testSizes {
|
||||||
@ -96,7 +104,11 @@ func TestSaveFrom(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkSaveAndEncrypt(t *testing.B) {
|
func BenchmarkSaveAndEncrypt(t *testing.B) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.BenchmarkAllVersions(t, benchmarkSaveAndEncrypt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkSaveAndEncrypt(t *testing.B, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
size := 4 << 20 // 4MiB
|
size := 4 << 20 // 4MiB
|
||||||
@ -118,7 +130,11 @@ func BenchmarkSaveAndEncrypt(t *testing.B) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadTree(t *testing.T) {
|
func TestLoadTree(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testLoadTree)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLoadTree(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
if rtest.BenchArchiveDirectory == "" {
|
if rtest.BenchArchiveDirectory == "" {
|
||||||
@ -134,7 +150,11 @@ func TestLoadTree(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLoadTree(t *testing.B) {
|
func BenchmarkLoadTree(t *testing.B) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.BenchmarkAllVersions(t, benchmarkLoadTree)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkLoadTree(t *testing.B, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
if rtest.BenchArchiveDirectory == "" {
|
if rtest.BenchArchiveDirectory == "" {
|
||||||
@ -154,7 +174,11 @@ func BenchmarkLoadTree(t *testing.B) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadBlob(t *testing.T) {
|
func TestLoadBlob(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testLoadBlob)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLoadBlob(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
length := 1000000
|
length := 1000000
|
||||||
@ -183,7 +207,11 @@ func TestLoadBlob(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLoadBlob(b *testing.B) {
|
func BenchmarkLoadBlob(b *testing.B) {
|
||||||
repo, cleanup := repository.TestRepository(b)
|
repository.BenchmarkAllVersions(b, benchmarkLoadBlob)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkLoadBlob(b *testing.B, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(b, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
length := 1000000
|
length := 1000000
|
||||||
@ -219,7 +247,11 @@ func BenchmarkLoadBlob(b *testing.B) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLoadUnpacked(b *testing.B) {
|
func BenchmarkLoadUnpacked(b *testing.B) {
|
||||||
repo, cleanup := repository.TestRepository(b)
|
repository.BenchmarkAllVersions(b, benchmarkLoadUnpacked)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkLoadUnpacked(b *testing.B, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(b, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
length := 1000000
|
length := 1000000
|
||||||
@ -255,7 +287,11 @@ func BenchmarkLoadUnpacked(b *testing.B) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadJSONUnpacked(t *testing.T) {
|
func TestLoadJSONUnpacked(t *testing.T) {
|
||||||
repo, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testLoadJSONUnpacked)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLoadJSONUnpacked(t *testing.T, version uint) {
|
||||||
|
repo, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
if rtest.BenchArchiveDirectory == "" {
|
if rtest.BenchArchiveDirectory == "" {
|
||||||
@ -313,9 +349,13 @@ func loadIndex(ctx context.Context, repo restic.Repository, id restic.ID) (*repo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLoadIndex(b *testing.B) {
|
func BenchmarkLoadIndex(b *testing.B) {
|
||||||
|
repository.BenchmarkAllVersions(b, benchmarkLoadIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkLoadIndex(b *testing.B, version uint) {
|
||||||
repository.TestUseLowSecurityKDFParameters(b)
|
repository.TestUseLowSecurityKDFParameters(b)
|
||||||
|
|
||||||
repo, cleanup := repository.TestRepository(b)
|
repo, cleanup := repository.TestRepositoryWithVersion(b, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
idx := repository.NewIndex()
|
idx := repository.NewIndex()
|
||||||
@ -362,7 +402,11 @@ func saveRandomDataBlobs(t testing.TB, repo restic.Repository, num int, sizeMax
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRepositoryIncrementalIndex(t *testing.T) {
|
func TestRepositoryIncrementalIndex(t *testing.T) {
|
||||||
r, cleanup := repository.TestRepository(t)
|
repository.TestAllVersions(t, testRepositoryIncrementalIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRepositoryIncrementalIndex(t *testing.T, version uint) {
|
||||||
|
r, cleanup := repository.TestRepositoryWithVersion(t, version)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
repo := r.(*repository.Repository)
|
repo := r.(*repository.Repository)
|
||||||
|
@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ const TestChunkerPol = chunker.Pol(0x3DA3358B4DC173)
|
|||||||
// TestRepositoryWithBackend returns a repository initialized with a test
|
// TestRepositoryWithBackend returns a repository initialized with a test
|
||||||
// password. If be is nil, an in-memory backend is used. A constant polynomial
|
// password. If be is nil, an in-memory backend is used. A constant polynomial
|
||||||
// is used for the chunker and low-security test parameters.
|
// is used for the chunker and low-security test parameters.
|
||||||
func TestRepositoryWithBackend(t testing.TB, be restic.Backend) (r restic.Repository, cleanup func()) {
|
func TestRepositoryWithBackend(t testing.TB, be restic.Backend, version uint) (r restic.Repository, cleanup func()) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
TestUseLowSecurityKDFParameters(t)
|
TestUseLowSecurityKDFParameters(t)
|
||||||
restic.TestDisableCheckPolynomial(t)
|
restic.TestDisableCheckPolynomial(t)
|
||||||
@ -53,7 +54,7 @@ func TestRepositoryWithBackend(t testing.TB, be restic.Backend) (r restic.Reposi
|
|||||||
|
|
||||||
repo := New(be, Options{})
|
repo := New(be, Options{})
|
||||||
|
|
||||||
cfg := restic.TestCreateConfig(t, TestChunkerPol)
|
cfg := restic.TestCreateConfig(t, TestChunkerPol, version)
|
||||||
err := repo.init(context.TODO(), test.TestPassword, cfg)
|
err := repo.init(context.TODO(), test.TestPassword, cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("TestRepository(): initialize repo failed: %v", err)
|
t.Fatalf("TestRepository(): initialize repo failed: %v", err)
|
||||||
@ -71,6 +72,11 @@ func TestRepositoryWithBackend(t testing.TB, be restic.Backend) (r restic.Reposi
|
|||||||
// a non-existing directory, a local backend is created there and this is used
|
// a non-existing directory, a local backend is created there and this is used
|
||||||
// instead. The directory is not removed, but left there for inspection.
|
// instead. The directory is not removed, but left there for inspection.
|
||||||
func TestRepository(t testing.TB) (r restic.Repository, cleanup func()) {
|
func TestRepository(t testing.TB) (r restic.Repository, cleanup func()) {
|
||||||
|
t.Helper()
|
||||||
|
return TestRepositoryWithVersion(t, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRepositoryWithVersion(t testing.TB, version uint) (r restic.Repository, cleanup func()) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
dir := os.Getenv("RESTIC_TEST_REPO")
|
dir := os.Getenv("RESTIC_TEST_REPO")
|
||||||
if dir != "" {
|
if dir != "" {
|
||||||
@ -80,7 +86,7 @@ func TestRepository(t testing.TB) (r restic.Repository, cleanup func()) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error creating local backend at %v: %v", dir, err)
|
t.Fatalf("error creating local backend at %v: %v", dir, err)
|
||||||
}
|
}
|
||||||
return TestRepositoryWithBackend(t, be)
|
return TestRepositoryWithBackend(t, be, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -88,7 +94,7 @@ func TestRepository(t testing.TB) (r restic.Repository, cleanup func()) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TestRepositoryWithBackend(t, nil)
|
return TestRepositoryWithBackend(t, nil, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestOpenLocal opens a local repository.
|
// TestOpenLocal opens a local repository.
|
||||||
@ -106,3 +112,23 @@ func TestOpenLocal(t testing.TB, dir string) (r restic.Repository) {
|
|||||||
|
|
||||||
return repo
|
return repo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type VersionedTest func(t *testing.T, version uint)
|
||||||
|
|
||||||
|
func TestAllVersions(t *testing.T, test VersionedTest) {
|
||||||
|
for version := restic.MinRepoVersion; version <= restic.MaxRepoVersion; version++ {
|
||||||
|
t.Run(fmt.Sprintf("v%d", version), func(t *testing.T) {
|
||||||
|
test(t, uint(version))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type VersionedBenchmark func(b *testing.B, version uint)
|
||||||
|
|
||||||
|
func BenchmarkAllVersions(b *testing.B, bench VersionedBenchmark) {
|
||||||
|
for version := restic.MinRepoVersion; version <= restic.MaxRepoVersion; version++ {
|
||||||
|
b.Run(fmt.Sprintf("v%d", version), func(b *testing.B) {
|
||||||
|
bench(b, uint(version))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -51,11 +51,17 @@ func CreateConfig(version uint) (Config, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TestCreateConfig creates a config for use within tests.
|
// TestCreateConfig creates a config for use within tests.
|
||||||
func TestCreateConfig(t testing.TB, pol chunker.Pol) (cfg Config) {
|
func TestCreateConfig(t testing.TB, pol chunker.Pol, version uint) (cfg Config) {
|
||||||
cfg.ChunkerPolynomial = pol
|
cfg.ChunkerPolynomial = pol
|
||||||
|
|
||||||
cfg.ID = NewRandomID().String()
|
cfg.ID = NewRandomID().String()
|
||||||
cfg.Version = StableRepoVersion
|
if version == 0 {
|
||||||
|
version = StableRepoVersion
|
||||||
|
}
|
||||||
|
if version < MinRepoVersion || version > MaxRepoVersion {
|
||||||
|
t.Fatalf("version %d is out of range", version)
|
||||||
|
}
|
||||||
|
cfg.Version = version
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user