github.com/advanderveer/restic@v0.8.1-0.20171209104529-42a8c19aaea6/internal/restic/tree_test.go (about)

     1  package restic_test
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"github.com/restic/restic/internal/repository"
    12  	"github.com/restic/restic/internal/restic"
    13  	rtest "github.com/restic/restic/internal/test"
    14  )
    15  
    16  var testFiles = []struct {
    17  	name    string
    18  	content []byte
    19  }{
    20  	{"foo", []byte("bar")},
    21  	{"bar/foo2", []byte("bar2")},
    22  	{"bar/bla/blubb", []byte("This is just a test!\n")},
    23  }
    24  
    25  func createTempDir(t *testing.T) string {
    26  	tempdir, err := ioutil.TempDir(rtest.TestTempDir, "restic-test-")
    27  	rtest.OK(t, err)
    28  
    29  	for _, test := range testFiles {
    30  		file := filepath.Join(tempdir, test.name)
    31  		dir := filepath.Dir(file)
    32  		if dir != "." {
    33  			rtest.OK(t, os.MkdirAll(dir, 0755))
    34  		}
    35  
    36  		f, err := os.Create(file)
    37  		defer func() {
    38  			rtest.OK(t, f.Close())
    39  		}()
    40  
    41  		rtest.OK(t, err)
    42  
    43  		_, err = f.Write(test.content)
    44  		rtest.OK(t, err)
    45  	}
    46  
    47  	return tempdir
    48  }
    49  
    50  func TestTree(t *testing.T) {
    51  	dir := createTempDir(t)
    52  	defer func() {
    53  		if rtest.TestCleanupTempDirs {
    54  			rtest.RemoveAll(t, dir)
    55  		}
    56  	}()
    57  }
    58  
    59  var testNodes = []restic.Node{
    60  	{Name: "normal"},
    61  	{Name: "with backslashes \\zzz"},
    62  	{Name: "test utf-8 föbärß"},
    63  	{Name: "test invalid \x00\x01\x02\x03\x04"},
    64  	{Name: "test latin1 \x75\x6d\x6c\xe4\xfc\x74\xf6\x6e\xdf\x6e\x6c\x6c"},
    65  }
    66  
    67  func TestNodeMarshal(t *testing.T) {
    68  	for i, n := range testNodes {
    69  		data, err := json.Marshal(&n)
    70  		rtest.OK(t, err)
    71  
    72  		var node restic.Node
    73  		err = json.Unmarshal(data, &node)
    74  		rtest.OK(t, err)
    75  
    76  		if n.Name != node.Name {
    77  			t.Fatalf("Node %d: Names are not equal, want: %q got: %q", i, n.Name, node.Name)
    78  		}
    79  	}
    80  }
    81  
    82  func TestNodeComparison(t *testing.T) {
    83  	fi, err := os.Lstat("tree_test.go")
    84  	rtest.OK(t, err)
    85  
    86  	node, err := restic.NodeFromFileInfo("tree_test.go", fi)
    87  	rtest.OK(t, err)
    88  
    89  	n2 := *node
    90  	rtest.Assert(t, node.Equals(n2), "nodes aren't equal")
    91  
    92  	n2.Size--
    93  	rtest.Assert(t, !node.Equals(n2), "nodes are equal")
    94  }
    95  
    96  func TestLoadTree(t *testing.T) {
    97  	repo, cleanup := repository.TestRepository(t)
    98  	defer cleanup()
    99  
   100  	// save tree
   101  	tree := restic.NewTree()
   102  	id, err := repo.SaveTree(context.TODO(), tree)
   103  	rtest.OK(t, err)
   104  
   105  	// save packs
   106  	rtest.OK(t, repo.Flush(context.Background()))
   107  
   108  	// load tree again
   109  	tree2, err := repo.LoadTree(context.TODO(), id)
   110  	rtest.OK(t, err)
   111  
   112  	rtest.Assert(t, tree.Equals(tree2),
   113  		"trees are not equal: want %v, got %v",
   114  		tree, tree2)
   115  }