2
2
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:
Michael Eischer 2022-04-29 23:16:16 +02:00
parent abe5935693
commit 9ffb8920f1
6 changed files with 117 additions and 25 deletions

View File

@ -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()

View File

@ -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())

View File

@ -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()

View File

@ -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)

View File

@ -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))
})
}
}

View File

@ -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
} }