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  }