github.com/mckael/restic@v0.8.3/internal/backend/local/local_test.go (about)

     1  package local_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/restic/restic/internal/backend/local"
    10  	"github.com/restic/restic/internal/backend/test"
    11  	"github.com/restic/restic/internal/restic"
    12  	rtest "github.com/restic/restic/internal/test"
    13  )
    14  
    15  func newTestSuite(t testing.TB) *test.Suite {
    16  	return &test.Suite{
    17  		// NewConfig returns a config for a new temporary backend that will be used in tests.
    18  		NewConfig: func() (interface{}, error) {
    19  			dir, err := ioutil.TempDir(rtest.TestTempDir, "restic-test-local-")
    20  			if err != nil {
    21  				t.Fatal(err)
    22  			}
    23  
    24  			t.Logf("create new backend at %v", dir)
    25  
    26  			cfg := local.Config{
    27  				Path: dir,
    28  			}
    29  			return cfg, nil
    30  		},
    31  
    32  		// CreateFn is a function that creates a temporary repository for the tests.
    33  		Create: func(config interface{}) (restic.Backend, error) {
    34  			cfg := config.(local.Config)
    35  			return local.Create(cfg)
    36  		},
    37  
    38  		// OpenFn is a function that opens a previously created temporary repository.
    39  		Open: func(config interface{}) (restic.Backend, error) {
    40  			cfg := config.(local.Config)
    41  			return local.Open(cfg)
    42  		},
    43  
    44  		// CleanupFn removes data created during the tests.
    45  		Cleanup: func(config interface{}) error {
    46  			cfg := config.(local.Config)
    47  			if !rtest.TestCleanupTempDirs {
    48  				t.Logf("leaving test backend dir at %v", cfg.Path)
    49  			}
    50  
    51  			rtest.RemoveAll(t, cfg.Path)
    52  			return nil
    53  		},
    54  	}
    55  }
    56  
    57  func TestBackend(t *testing.T) {
    58  	newTestSuite(t).RunTests(t)
    59  }
    60  
    61  func BenchmarkBackend(t *testing.B) {
    62  	newTestSuite(t).RunBenchmarks(t)
    63  }
    64  
    65  func readdirnames(t testing.TB, dir string) []string {
    66  	f, err := os.Open(dir)
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	entries, err := f.Readdirnames(-1)
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  
    76  	err = f.Close()
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	}
    80  
    81  	return entries
    82  }
    83  
    84  func empty(t testing.TB, dir string) {
    85  	entries := readdirnames(t, dir)
    86  	if len(entries) != 0 {
    87  		t.Fatalf("directory %v is not empty, contains: %v", dir, entries)
    88  	}
    89  }
    90  
    91  func openclose(t testing.TB, dir string) {
    92  	cfg := local.Config{Path: dir}
    93  
    94  	be, err := local.Open(cfg)
    95  	if err != nil {
    96  		t.Logf("Open returned error %v", err)
    97  	}
    98  
    99  	if be != nil {
   100  		err = be.Close()
   101  		if err != nil {
   102  			t.Logf("Close returned error %v", err)
   103  		}
   104  	}
   105  }
   106  
   107  func mkdir(t testing.TB, dir string) {
   108  	err := os.Mkdir(dir, 0700)
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  }
   113  
   114  func removeAll(t testing.TB, dir string) {
   115  	err := os.RemoveAll(dir)
   116  	if err != nil {
   117  		t.Fatal(err)
   118  	}
   119  }
   120  
   121  func TestOpenNotExistingDirectory(t *testing.T) {
   122  	dir, cleanup := rtest.TempDir(t)
   123  	defer cleanup()
   124  
   125  	// local.Open must not create any files dirs in the repo
   126  	openclose(t, filepath.Join(dir, "repo"))
   127  	empty(t, dir)
   128  
   129  	openclose(t, dir)
   130  	empty(t, dir)
   131  
   132  	mkdir(t, filepath.Join(dir, "data"))
   133  	openclose(t, dir)
   134  	removeAll(t, filepath.Join(dir, "data"))
   135  	empty(t, dir)
   136  }