github.com/fawick/restic@v0.1.1-0.20171126184616-c02923fbfc79/internal/backend/swift/swift_test.go (about) 1 package swift_test 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "testing" 8 "time" 9 10 "github.com/restic/restic/internal/backend" 11 "github.com/restic/restic/internal/backend/swift" 12 "github.com/restic/restic/internal/backend/test" 13 "github.com/restic/restic/internal/errors" 14 "github.com/restic/restic/internal/restic" 15 rtest "github.com/restic/restic/internal/test" 16 ) 17 18 func newSwiftTestSuite(t testing.TB) *test.Suite { 19 tr, err := backend.Transport(nil) 20 if err != nil { 21 t.Fatalf("cannot create transport for tests: %v", err) 22 } 23 24 return &test.Suite{ 25 // do not use excessive data 26 MinimalData: true, 27 28 // wait for removals for at least 5m 29 WaitForDelayedRemoval: 5 * time.Minute, 30 31 ErrorHandler: func(t testing.TB, be restic.Backend, err error) error { 32 if err == nil { 33 return nil 34 } 35 36 if be.IsNotExist(err) { 37 t.Logf("swift: ignoring error %v", err) 38 return nil 39 } 40 41 return err 42 }, 43 44 // NewConfig returns a config for a new temporary backend that will be used in tests. 45 NewConfig: func() (interface{}, error) { 46 swiftcfg, err := swift.ParseConfig(os.Getenv("RESTIC_TEST_SWIFT")) 47 if err != nil { 48 return nil, err 49 } 50 51 cfg := swiftcfg.(swift.Config) 52 if err = swift.ApplyEnvironment("RESTIC_TEST_", &cfg); err != nil { 53 return nil, err 54 } 55 cfg.Prefix += fmt.Sprintf("/test-%d", time.Now().UnixNano()) 56 t.Logf("using prefix %v", cfg.Prefix) 57 return cfg, nil 58 }, 59 60 // CreateFn is a function that creates a temporary repository for the tests. 61 Create: func(config interface{}) (restic.Backend, error) { 62 cfg := config.(swift.Config) 63 64 be, err := swift.Open(cfg, tr) 65 if err != nil { 66 return nil, err 67 } 68 69 exists, err := be.Test(context.TODO(), restic.Handle{Type: restic.ConfigFile}) 70 if err != nil { 71 return nil, err 72 } 73 74 if exists { 75 return nil, errors.New("config already exists") 76 } 77 78 return be, nil 79 }, 80 81 // OpenFn is a function that opens a previously created temporary repository. 82 Open: func(config interface{}) (restic.Backend, error) { 83 cfg := config.(swift.Config) 84 return swift.Open(cfg, tr) 85 }, 86 87 // CleanupFn removes data created during the tests. 88 Cleanup: func(config interface{}) error { 89 cfg := config.(swift.Config) 90 91 be, err := swift.Open(cfg, tr) 92 if err != nil { 93 return err 94 } 95 96 return be.Delete(context.TODO()) 97 }, 98 } 99 } 100 101 func TestBackendSwift(t *testing.T) { 102 defer func() { 103 if t.Skipped() { 104 rtest.SkipDisallowed(t, "restic/backend/swift.TestBackendSwift") 105 } 106 }() 107 108 if os.Getenv("RESTIC_TEST_SWIFT") == "" { 109 t.Skip("RESTIC_TEST_SWIFT unset, skipping test") 110 return 111 } 112 113 t.Logf("run tests") 114 newSwiftTestSuite(t).RunTests(t) 115 } 116 117 func BenchmarkBackendSwift(t *testing.B) { 118 if os.Getenv("RESTIC_TEST_SWIFT") == "" { 119 t.Skip("RESTIC_TEST_SWIFT unset, skipping test") 120 return 121 } 122 123 t.Logf("run tests") 124 newSwiftTestSuite(t).RunBenchmarks(t) 125 }